From a82e39c840ef86e19e67f19d9c989d35813a09ce Mon Sep 17 00:00:00 2001 From: Harun <66576442+caticHarun@users.noreply.github.com> Date: Tue, 14 Apr 2026 11:21:15 +0200 Subject: [PATCH 01/10] =?UTF-8?q?Rename=20special=5F=20=5F%20=5F@&=C3=A9"'?= =?UTF-8?q?(=C2=A7=C3=A8!=C3=A7=C3=A0)-^$=C3=B9`,;:=3D=3F.+%=C2=A3=C2=A8*.jpg=20to=20special=5Ffilename=5Fbreaks=5Fon=5Fwindows.jpg?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../assets/special_filename_breaks_on_windows.jpg | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename "packages/image/tests/assets/special_ _%20_@&\303\251\"'(\302\247\303\250!\303\247\303\240)-^$\303\271`,;:=?.+%\302\243\302\250*<>.jpg" => packages/image/tests/assets/special_filename_breaks_on_windows.jpg (100%) diff --git "a/packages/image/tests/assets/special_ _%20_@&\303\251\"'(\302\247\303\250!\303\247\303\240)-^$\303\271`,;:=?.+%\302\243\302\250*<>.jpg" b/packages/image/tests/assets/special_filename_breaks_on_windows.jpg similarity index 100% rename from "packages/image/tests/assets/special_ _%20_@&\303\251\"'(\302\247\303\250!\303\247\303\240)-^$\303\271`,;:=?.+%\302\243\302\250*<>.jpg" rename to packages/image/tests/assets/special_filename_breaks_on_windows.jpg From d5f13adff0990d254e986f70de61d8f0919627b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Harun=20=C4=86ati=C4=87?= Date: Tue, 14 Apr 2026 11:22:55 +0200 Subject: [PATCH 02/10] filename change --- packages/image/tests/resolve.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/image/tests/resolve.test.ts b/packages/image/tests/resolve.test.ts index d3d92eab8..3b700ff67 100644 --- a/packages/image/tests/resolve.test.ts +++ b/packages/image/tests/resolve.test.ts @@ -133,7 +133,7 @@ describe('image resolveImage', () => { test('Should render a local image with special characters in filename', async () => { const image = await resolveImage({ - uri: './packages/image/tests/assets/special_ _%20_@&é"\'(§è!çà)-^$ù`,;:=?.+%£¨*<>.jpg', + uri: './packages/image/tests/assets/special_filename_breaks_on_windows.jpg', }); expect(image?.data).toBeTruthy(); From 09b95ea02b16c2e03b00a34313830f2150438eea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Harun=20=C4=86ati=C4=87?= Date: Tue, 14 Apr 2026 11:23:15 +0200 Subject: [PATCH 03/10] save --- packages/image/tests/resolve.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/image/tests/resolve.test.ts b/packages/image/tests/resolve.test.ts index 3b700ff67..5ddee009b 100644 --- a/packages/image/tests/resolve.test.ts +++ b/packages/image/tests/resolve.test.ts @@ -133,7 +133,7 @@ describe('image resolveImage', () => { test('Should render a local image with special characters in filename', async () => { const image = await resolveImage({ - uri: './packages/image/tests/assets/special_filename_breaks_on_windows.jpg', + uri: './packages/image/tests/assets/special_filename_breaks_on_windows.jpg', //HC_UPDATE bring back to the weird one }); expect(image?.data).toBeTruthy(); From ae6355721182c60b816da41017ff9d03d4b789d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Harun=20=C4=86ati=C4=87?= Date: Tue, 14 Apr 2026 12:14:31 +0200 Subject: [PATCH 04/10] Added breakWhenNeeded property --- .changeset/fuzzy-pans-happen.md | 7 ++ packages/layout/src/node/shouldBreak.ts | 9 +++ packages/layout/src/types/base.ts | 6 ++ .../layout/tests/node/shouldBreak.test.ts | 63 +++++++++++++++ .../tests/steps/resolvePagination.test.ts | 77 +++++++++++++++++++ packages/renderer/index.d.ts | 6 ++ packages/types/node.d.ts | 1 + 7 files changed, 169 insertions(+) create mode 100644 .changeset/fuzzy-pans-happen.md diff --git a/.changeset/fuzzy-pans-happen.md b/.changeset/fuzzy-pans-happen.md new file mode 100644 index 000000000..bfa8a7850 --- /dev/null +++ b/.changeset/fuzzy-pans-happen.md @@ -0,0 +1,7 @@ +--- +"@react-pdf/layout": minor +"@react-pdf/renderer": minor +"@react-pdf/types": minor +--- + +feat: add `breakWhenNeeded` for wrap-able nodes that should move to the next page before their first split diff --git a/packages/layout/src/node/shouldBreak.ts b/packages/layout/src/node/shouldBreak.ts index eaffe48f4..9bbe00033 100644 --- a/packages/layout/src/node/shouldBreak.ts +++ b/packages/layout/src/node/shouldBreak.ts @@ -5,6 +5,9 @@ import isFixed from './isFixed'; const getBreak = (node: SafeNode) => 'break' in node.props ? node.props.break : false; +const getBreakWhenNeeded = (node: SafeNode) => + 'breakWhenNeeded' in node.props ? node.props.breakWhenNeeded : false; + const getMinPresenceAhead = (node: SafeNode) => 'minPresenceAhead' in node.props ? node.props.minPresenceAhead : 0; @@ -53,10 +56,16 @@ const shouldBreak = ( // (as long as react-pdf does not support breaking into differently sized containers) const breakingImprovesPresence = previousElements.filter((node: SafeNode) => !isFixed(node)).length > 0; + const shouldBreakWhenNeeded = + shouldSplit && + canWrap && + getBreakWhenNeeded(child) && + breakingImprovesPresence; return ( getBreak(child) || (shouldSplit && !canWrap) || + shouldBreakWhenNeeded || (!shouldSplit && endOfPresence > height && breakingImprovesPresence) ); }; diff --git a/packages/layout/src/types/base.ts b/packages/layout/src/types/base.ts index 200be278b..7104bf4e5 100644 --- a/packages/layout/src/types/base.ts +++ b/packages/layout/src/types/base.ts @@ -74,6 +74,12 @@ export type NodeProps = { * @see https://react-pdf.org/advanced#page-breaks */ break?: boolean; + /** + * Move the element to the next page when it would otherwise start splitting + * in the remaining space, while still allowing it to continue across later + * pages. + */ + breakWhenNeeded?: boolean; /** * Hint that no page wrapping should occur between all sibling elements following the element within n points * @see https://react-pdf.org/advanced#orphan-&-widow-protection diff --git a/packages/layout/tests/node/shouldBreak.test.ts b/packages/layout/tests/node/shouldBreak.test.ts index 665881515..877c4ee36 100644 --- a/packages/layout/tests/node/shouldBreak.test.ts +++ b/packages/layout/tests/node/shouldBreak.test.ts @@ -110,6 +110,69 @@ describe('node shouldBreak', () => { expect(result).toEqual(true); }); + test('should break when breakWhenNeeded is enabled and moving improves presence', () => { + const result = shouldBreak( + { + type: 'VIEW', + props: { wrap: true, breakWhenNeeded: true }, + style: {}, + children: [], + box: { + top: 700, + right: 0, + bottom: 0, + left: 0, + height: 400, + width: 200, + }, + }, + [], + 1000, + [ + { + type: 'VIEW', + props: {}, + style: {}, + children: [], + box: { + top: 0, + right: 0, + bottom: 0, + left: 0, + height: 700, + width: 200, + }, + }, + ], + ); + + expect(result).toEqual(true); + }); + + test('should not break when breakWhenNeeded is enabled but the node is already first on the page', () => { + const result = shouldBreak( + { + type: 'VIEW', + props: { wrap: true, breakWhenNeeded: true }, + style: {}, + children: [], + box: { + top: 700, + right: 0, + bottom: 0, + left: 0, + height: 400, + width: 200, + }, + }, + [], + 1000, + [], + ); + + expect(result).toEqual(false); + }); + test('should break when minPresenceAhead is large enough and there are overflowing siblings after the child', () => { const result = shouldBreak( { diff --git a/packages/layout/tests/steps/resolvePagination.test.ts b/packages/layout/tests/steps/resolvePagination.test.ts index 2466aaf4b..830dc8456 100644 --- a/packages/layout/tests/steps/resolvePagination.test.ts +++ b/packages/layout/tests/steps/resolvePagination.test.ts @@ -238,6 +238,83 @@ describe('pagination step', () => { expect(page2.children![0].box!.height).toBe(40); }); + test('should move breakWhenNeeded containers to the next page before splitting them', async () => { + const yoga = await loadYoga(); + + const layout = calcLayout({ + type: 'DOCUMENT', + yoga, + props: {}, + children: [ + { + type: 'PAGE', + props: {}, + style: { + width: 5, + height: 60, + }, + children: [ + { + type: 'VIEW', + style: { + width: 5, + height: 20, + }, + props: {}, + children: [], + }, + { + type: 'VIEW', + style: { + width: 5, + }, + props: { + breakWhenNeeded: true, + }, + children: [ + { + type: 'VIEW', + style: { + height: 30, + }, + props: {}, + children: [], + }, + { + type: 'VIEW', + style: { + height: 30, + }, + props: {}, + children: [], + }, + { + type: 'VIEW', + style: { + height: 30, + }, + props: {}, + children: [], + }, + ], + }, + ], + }, + ], + }); + + const page1 = layout.children[0]; + const page2 = layout.children[1]; + const page3 = layout.children[2]; + + expect(layout.children).toHaveLength(3); + expect(page1.children).toHaveLength(1); + expect(page2.children).toHaveLength(1); + expect(page3.children).toHaveLength(1); + expect(page2.children![0].children).toHaveLength(2); + expect(page3.children![0].children).toHaveLength(1); + }); + test('should not infinitely loop when splitting pages', async () => { const yoga = await loadYoga(); diff --git a/packages/renderer/index.d.ts b/packages/renderer/index.d.ts index 1aa2dc804..f4acc8a87 100644 --- a/packages/renderer/index.d.ts +++ b/packages/renderer/index.d.ts @@ -86,6 +86,12 @@ declare namespace ReactPDF { * @see https://react-pdf.org/advanced#page-breaks */ break?: boolean; + /** + * Move the element to the next page when it would otherwise start + * splitting in the remaining space, while still allowing it to continue + * across later pages. + */ + breakWhenNeeded?: boolean; /** * Hint that no page wrapping should occur between all sibling elements following the element within n points * @see https://react-pdf.org/advanced#orphan-&-widow-protection diff --git a/packages/types/node.d.ts b/packages/types/node.d.ts index 96ecbf866..6b09e0f9a 100644 --- a/packages/types/node.d.ts +++ b/packages/types/node.d.ts @@ -8,6 +8,7 @@ interface BaseProps { id?: string; fixed?: boolean; break?: boolean; + breakWhenNeeded?: boolean; debug?: boolean; bookmark?: Bookmark; minPresenceAhead?: number; From 9512a243268254c9e39578f84bd5d2dbfe761f32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Harun=20=C4=86ati=C4=87?= Date: Tue, 14 Apr 2026 12:16:13 +0200 Subject: [PATCH 05/10] Bringing back old --- packages/image/tests/resolve.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/image/tests/resolve.test.ts b/packages/image/tests/resolve.test.ts index 5ddee009b..d3d92eab8 100644 --- a/packages/image/tests/resolve.test.ts +++ b/packages/image/tests/resolve.test.ts @@ -133,7 +133,7 @@ describe('image resolveImage', () => { test('Should render a local image with special characters in filename', async () => { const image = await resolveImage({ - uri: './packages/image/tests/assets/special_filename_breaks_on_windows.jpg', //HC_UPDATE bring back to the weird one + uri: './packages/image/tests/assets/special_ _%20_@&é"\'(§è!çà)-^$ù`,;:=?.+%£¨*<>.jpg', }); expect(image?.data).toBeTruthy(); From 6b33ca1ce6d4ccf6d562990c319aacd822b4b211 Mon Sep 17 00:00:00 2001 From: Harun <66576442+caticHarun@users.noreply.github.com> Date: Tue, 14 Apr 2026 12:17:08 +0200 Subject: [PATCH 06/10] =?UTF-8?q?Rename=20special=5Ffilename=5Fbreaks=5Fon?= =?UTF-8?q?=5Fwindows.jpg=20to=20special=5F=20=5F%20=5F@&=C3=A9"'(=C2=A7?= =?UTF-8?q?=C3=A8!=C3=A7=C3=A0)-^$=C3=B9`,;:=3D=3F.+%=C2=A3=C2=A8*<>.jpg?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...240)-^$\303\271`,;:=?.+%\302\243\302\250*<>.jpg" | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename packages/image/tests/assets/special_filename_breaks_on_windows.jpg => "packages/image/tests/assets/special_ _%20_@&\303\251\"'(\302\247\303\250!\303\247\303\240)-^$\303\271`,;:=?.+%\302\243\302\250*<>.jpg" (100%) diff --git a/packages/image/tests/assets/special_filename_breaks_on_windows.jpg "b/packages/image/tests/assets/special_ _%20_@&\303\251\"'(\302\247\303\250!\303\247\303\240)-^$\303\271`,;:=?.+%\302\243\302\250*<>.jpg" similarity index 100% rename from packages/image/tests/assets/special_filename_breaks_on_windows.jpg rename to "packages/image/tests/assets/special_ _%20_@&\303\251\"'(\302\247\303\250!\303\247\303\240)-^$\303\271`,;:=?.+%\302\243\302\250*<>.jpg" From 523c9060411ee28ba2427b27f7f72a909714c3c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Harun=20=C4=86ati=C4=87?= Date: Thu, 17 Sep 2026 11:31:15 +0200 Subject: [PATCH 07/10] Rename test asset to a Windows-compatible filename The image fixture contained " : ? * < > which Win32 forbids in file names, so `git clone` aborted the checkout and left the working tree empty on Windows. Dropped those six characters; the other special characters the test exercises (spaces, %20, accents, &, $, ^, backtick) are kept. Co-Authored-By: Claude Opus 5 (1M context) --- ...\303\240)-^$\303\271`,;=.+%\302\243\302\250.jpg" | Bin packages/image/tests/resolve.test.ts | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename "packages/image/tests/assets/special_ _%20_@&\303\251\"'(\302\247\303\250!\303\247\303\240)-^$\303\271`,;:=?.+%\302\243\302\250*<>.jpg" => "packages/image/tests/assets/special_ _%20_@&\303\251'(\302\247\303\250!\303\247\303\240)-^$\303\271`,;=.+%\302\243\302\250.jpg" (100%) diff --git "a/packages/image/tests/assets/special_ _%20_@&\303\251\"'(\302\247\303\250!\303\247\303\240)-^$\303\271`,;:=?.+%\302\243\302\250*<>.jpg" "b/packages/image/tests/assets/special_ _%20_@&\303\251'(\302\247\303\250!\303\247\303\240)-^$\303\271`,;=.+%\302\243\302\250.jpg" similarity index 100% rename from "packages/image/tests/assets/special_ _%20_@&\303\251\"'(\302\247\303\250!\303\247\303\240)-^$\303\271`,;:=?.+%\302\243\302\250*<>.jpg" rename to "packages/image/tests/assets/special_ _%20_@&\303\251'(\302\247\303\250!\303\247\303\240)-^$\303\271`,;=.+%\302\243\302\250.jpg" diff --git a/packages/image/tests/resolve.test.ts b/packages/image/tests/resolve.test.ts index d3d92eab8..2cdcabf98 100644 --- a/packages/image/tests/resolve.test.ts +++ b/packages/image/tests/resolve.test.ts @@ -133,7 +133,7 @@ describe('image resolveImage', () => { test('Should render a local image with special characters in filename', async () => { const image = await resolveImage({ - uri: './packages/image/tests/assets/special_ _%20_@&é"\'(§è!çà)-^$ù`,;:=?.+%£¨*<>.jpg', + uri: "./packages/image/tests/assets/special_ _%20_@&é'(§è!çà)-^$ù`,;=.+%£¨.jpg", }); expect(image?.data).toBeTruthy(); From bddc70c263b8e25198929d57a98132fff8b3c574 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Harun=20=C4=86ati=C4=87?= Date: Thu, 17 Sep 2026 12:01:20 +0200 Subject: [PATCH 08/10] save --- packages/image/src/resolve.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/image/src/resolve.ts b/packages/image/src/resolve.ts index e79126f71..cc11d135e 100644 --- a/packages/image/src/resolve.ts +++ b/packages/image/src/resolve.ts @@ -31,11 +31,17 @@ const isDataImageSrc = (src: ImageSrc): src is DataImageSrc => { const isDataUri = (imageSrc: ImageSrc): imageSrc is Base64ImageSrc => 'uri' in imageSrc && imageSrc.uri.startsWith('data:'); +// Windows drive-letter paths (C:\foo, c:/foo) would otherwise be parsed by +// url.parse as having the protocol "c:" and rejected as non-local. +const isWindowsAbsolutePath = (src: string) => /^[a-zA-Z]:[\\/]/.test(src); + const getAbsoluteLocalPath = (src: string) => { if (BROWSER) { throw new Error('Cannot check local paths in client-side environment'); } + if (isWindowsAbsolutePath(src)) return path.resolve(src); + const { protocol, auth, From 62188d2030eb8ba1f7dcc2ec9f5acc663043b838 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Harun=20=C4=86ati=C4=87?= Date: Thu, 17 Sep 2026 14:01:50 +0200 Subject: [PATCH 09/10] save --- .../components/text-lab/line-break-lab.tsx | 4 +- package.json | 4 +- packages/image/src/resolve.ts | 10 +- packages/pdfkit/lib/pdfkit.browser.js | 53951 ---------------- packages/pdfkit/lib/pdfkit.js | 40753 ------------ .../pdfkit/src/font/data/Courier-Bold.json | 1 - .../src/font/data/Courier-BoldOblique.json | 1 - .../pdfkit/src/font/data/Courier-Oblique.json | 1 - packages/pdfkit/src/font/data/Courier.json | 1 - .../pdfkit/src/font/data/Helvetica-Bold.json | 1 - .../src/font/data/Helvetica-BoldOblique.json | 1 - .../src/font/data/Helvetica-Oblique.json | 1 - packages/pdfkit/src/font/data/Helvetica.json | 1 - packages/pdfkit/src/font/data/Times-Bold.json | 1 - .../src/font/data/Times-BoldItalic.json | 1 - .../pdfkit/src/font/data/Times-Italic.json | 1 - .../pdfkit/src/font/data/Times-Roman.json | 1 - packages/pdfkit/src/font/data/index.json | 1 - packages/png-js/lib/png-js.browser.js | 12601 ---- packages/png-js/lib/png-js.js | 339 - .../render/src/operations/addBookmarks.ts | 7 +- .../render/src/primitives/renderSvgImage.ts | 15 +- 22 files changed, 24 insertions(+), 107673 deletions(-) delete mode 100644 packages/pdfkit/lib/pdfkit.browser.js delete mode 100644 packages/pdfkit/lib/pdfkit.js delete mode 100644 packages/pdfkit/src/font/data/Courier-Bold.json delete mode 100644 packages/pdfkit/src/font/data/Courier-BoldOblique.json delete mode 100644 packages/pdfkit/src/font/data/Courier-Oblique.json delete mode 100644 packages/pdfkit/src/font/data/Courier.json delete mode 100644 packages/pdfkit/src/font/data/Helvetica-Bold.json delete mode 100644 packages/pdfkit/src/font/data/Helvetica-BoldOblique.json delete mode 100644 packages/pdfkit/src/font/data/Helvetica-Oblique.json delete mode 100644 packages/pdfkit/src/font/data/Helvetica.json delete mode 100644 packages/pdfkit/src/font/data/Times-Bold.json delete mode 100644 packages/pdfkit/src/font/data/Times-BoldItalic.json delete mode 100644 packages/pdfkit/src/font/data/Times-Italic.json delete mode 100644 packages/pdfkit/src/font/data/Times-Roman.json delete mode 100644 packages/pdfkit/src/font/data/index.json delete mode 100644 packages/png-js/lib/png-js.browser.js delete mode 100644 packages/png-js/lib/png-js.js diff --git a/apps/site/components/text-lab/line-break-lab.tsx b/apps/site/components/text-lab/line-break-lab.tsx index 770eab0d0..0452bd769 100644 --- a/apps/site/components/text-lab/line-break-lab.tsx +++ b/apps/site/components/text-lab/line-break-lab.tsx @@ -223,7 +223,7 @@ export function LineBreakLab() { > K&P{' '} {justify - ? knuth?.length ?? 0 + ? (knuth?.length ?? 0) : Math.round(score(knuth, width)).toLocaleString('en-US')} {' '} ·{' '} @@ -234,7 +234,7 @@ export function LineBreakLab() { > greedy{' '} {justify - ? greedy?.length ?? 0 + ? (greedy?.length ?? 0) : Math.round(score(greedy, width)).toLocaleString('en-US')} diff --git a/package.json b/package.json index 32ee0a3d8..8a5823dae 100644 --- a/package.json +++ b/package.json @@ -86,8 +86,8 @@ "vitest-fetch-mock": "^0.2.2" }, "lint-staged": { - "*.{js,jsx,ts,tsx}": [ - "yarn lint", + "packages/**/*.{js,jsx,ts,tsx}": [ + "eslint", "prettier --write" ] }, diff --git a/packages/image/src/resolve.ts b/packages/image/src/resolve.ts index 501d27ab7..6fa28bbe2 100644 --- a/packages/image/src/resolve.ts +++ b/packages/image/src/resolve.ts @@ -31,10 +31,12 @@ const isDataImageSrc = (src: ImageSrc): src is DataImageSrc => { const isDataUri = (imageSrc: ImageSrc): imageSrc is Base64ImageSrc => 'uri' in imageSrc && imageSrc.uri.startsWith('data:'); -// Windows drive-letter paths (C:\foo, c:/foo) parse as a URL whose protocol -// is "c:", so they must be recognised before the URL handling below rejects -// them as non-local. -const isWindowsAbsolutePath = (src: string) => /^[a-zA-Z]:[\\/]/.test(src); +// Windows drive-letter paths (C:\foo, c:/foo) parse as a URL whose protocol is +// "c:", so they must be recognised before the URL handling below rejects them +// as non-local. Gated on the platform: on POSIX "c:/foo" is not an absolute +// path but an ordinary relative filename, and must keep falling through. +const isWindowsAbsolutePath = (src: string) => + path.sep === '\\' && /^[a-zA-Z]:[\\/]/.test(src); const getAbsoluteLocalPath = (src: string) => { if (BROWSER) { diff --git a/packages/pdfkit/lib/pdfkit.browser.js b/packages/pdfkit/lib/pdfkit.browser.js deleted file mode 100644 index 9f2afeb4e..000000000 --- a/packages/pdfkit/lib/pdfkit.browser.js +++ /dev/null @@ -1,53951 +0,0 @@ -import md5 from 'js-md5'; -import { cbc, ecb } from '@noble/ciphers/aes'; -import * as fontkit from 'fontkit'; -import LineBreaker from 'linebreak'; -import _JPEG from 'jay-peg'; -import PNG from '@react-pdf/png-js'; - -var global$1 = (typeof global !== "undefined" ? global : - typeof self !== "undefined" ? self : - typeof window !== "undefined" ? window : {}); - -var lookup = []; -var revLookup = []; -var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array; -var inited = false; -function init () { - inited = true; - var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; - for (var i = 0, len = code.length; i < len; ++i) { - lookup[i] = code[i]; - revLookup[code.charCodeAt(i)] = i; - } - - revLookup['-'.charCodeAt(0)] = 62; - revLookup['_'.charCodeAt(0)] = 63; -} - -function toByteArray (b64) { - if (!inited) { - init(); - } - var i, j, l, tmp, placeHolders, arr; - var len = b64.length; - - if (len % 4 > 0) { - throw new Error('Invalid string. Length must be a multiple of 4') - } - - // the number of equal signs (place holders) - // if there are two placeholders, than the two characters before it - // represent one byte - // if there is only one, then the three characters before it represent 2 bytes - // this is just a cheap hack to not do indexOf twice - placeHolders = b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0; - - // base64 is 4/3 + up to two characters of the original data - arr = new Arr(len * 3 / 4 - placeHolders); - - // if there are placeholders, only get up to the last complete 4 chars - l = placeHolders > 0 ? len - 4 : len; - - var L = 0; - - for (i = 0, j = 0; i < l; i += 4, j += 3) { - tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)]; - arr[L++] = (tmp >> 16) & 0xFF; - arr[L++] = (tmp >> 8) & 0xFF; - arr[L++] = tmp & 0xFF; - } - - if (placeHolders === 2) { - tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4); - arr[L++] = tmp & 0xFF; - } else if (placeHolders === 1) { - tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2); - arr[L++] = (tmp >> 8) & 0xFF; - arr[L++] = tmp & 0xFF; - } - - return arr -} - -function tripletToBase64 (num) { - return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F] -} - -function encodeChunk (uint8, start, end) { - var tmp; - var output = []; - for (var i = start; i < end; i += 3) { - tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]); - output.push(tripletToBase64(tmp)); - } - return output.join('') -} - -function fromByteArray (uint8) { - if (!inited) { - init(); - } - var tmp; - var len = uint8.length; - var extraBytes = len % 3; // if we have 1 byte left, pad 2 bytes - var output = ''; - var parts = []; - var maxChunkLength = 16383; // must be multiple of 3 - - // go through the array every three bytes, we'll deal with trailing stuff later - for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) { - parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength))); - } - - // pad the end with zeros, but make sure to not forget the extra bytes - if (extraBytes === 1) { - tmp = uint8[len - 1]; - output += lookup[tmp >> 2]; - output += lookup[(tmp << 4) & 0x3F]; - output += '=='; - } else if (extraBytes === 2) { - tmp = (uint8[len - 2] << 8) + (uint8[len - 1]); - output += lookup[tmp >> 10]; - output += lookup[(tmp >> 4) & 0x3F]; - output += lookup[(tmp << 2) & 0x3F]; - output += '='; - } - - parts.push(output); - - return parts.join('') -} - -function read (buffer, offset, isLE, mLen, nBytes) { - var e, m; - var eLen = nBytes * 8 - mLen - 1; - var eMax = (1 << eLen) - 1; - var eBias = eMax >> 1; - var nBits = -7; - var i = isLE ? (nBytes - 1) : 0; - var d = isLE ? -1 : 1; - var s = buffer[offset + i]; - - i += d; - - e = s & ((1 << (-nBits)) - 1); - s >>= (-nBits); - nBits += eLen; - for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {} - - m = e & ((1 << (-nBits)) - 1); - e >>= (-nBits); - nBits += mLen; - for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {} - - if (e === 0) { - e = 1 - eBias; - } else if (e === eMax) { - return m ? NaN : ((s ? -1 : 1) * Infinity) - } else { - m = m + Math.pow(2, mLen); - e = e - eBias; - } - return (s ? -1 : 1) * m * Math.pow(2, e - mLen) -} - -function write (buffer, value, offset, isLE, mLen, nBytes) { - var e, m, c; - var eLen = nBytes * 8 - mLen - 1; - var eMax = (1 << eLen) - 1; - var eBias = eMax >> 1; - var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0); - var i = isLE ? 0 : (nBytes - 1); - var d = isLE ? 1 : -1; - var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0; - - value = Math.abs(value); - - if (isNaN(value) || value === Infinity) { - m = isNaN(value) ? 1 : 0; - e = eMax; - } else { - e = Math.floor(Math.log(value) / Math.LN2); - if (value * (c = Math.pow(2, -e)) < 1) { - e--; - c *= 2; - } - if (e + eBias >= 1) { - value += rt / c; - } else { - value += rt * Math.pow(2, 1 - eBias); - } - if (value * c >= 2) { - e++; - c /= 2; - } - - if (e + eBias >= eMax) { - m = 0; - e = eMax; - } else if (e + eBias >= 1) { - m = (value * c - 1) * Math.pow(2, mLen); - e = e + eBias; - } else { - m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen); - e = 0; - } - } - - for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} - - e = (e << mLen) | m; - eLen += mLen; - for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} - - buffer[offset + i - d] |= s * 128; -} - -var toString = {}.toString; - -var isArray$1 = Array.isArray || function (arr) { - return toString.call(arr) == '[object Array]'; -}; - -/*! - * The buffer module from node.js, for the browser. - * - * @author Feross Aboukhadijeh - * @license MIT - */ -/* eslint-disable no-proto */ - - -var INSPECT_MAX_BYTES = 50; - -/** - * If `Buffer.TYPED_ARRAY_SUPPORT`: - * === true Use Uint8Array implementation (fastest) - * === false Use Object implementation (most compatible, even IE6) - * - * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+, - * Opera 11.6+, iOS 4.2+. - * - * Due to various browser bugs, sometimes the Object implementation will be used even - * when the browser supports typed arrays. - * - * Note: - * - * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances, - * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438. - * - * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function. - * - * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of - * incorrect length in some situations. - - * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they - * get the Object implementation, which is slower but behaves correctly. - */ -Buffer$2.TYPED_ARRAY_SUPPORT = global$1.TYPED_ARRAY_SUPPORT !== undefined - ? global$1.TYPED_ARRAY_SUPPORT - : true; - -/* - * Export kMaxLength after typed array support is determined. - */ -var _kMaxLength = kMaxLength(); - -function kMaxLength () { - return Buffer$2.TYPED_ARRAY_SUPPORT - ? 0x7fffffff - : 0x3fffffff -} - -function createBuffer (that, length) { - if (kMaxLength() < length) { - throw new RangeError('Invalid typed array length') - } - if (Buffer$2.TYPED_ARRAY_SUPPORT) { - // Return an augmented `Uint8Array` instance, for best performance - that = new Uint8Array(length); - that.__proto__ = Buffer$2.prototype; - } else { - // Fallback: Return an object instance of the Buffer class - if (that === null) { - that = new Buffer$2(length); - } - that.length = length; - } - - return that -} - -/** - * The Buffer constructor returns instances of `Uint8Array` that have their - * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of - * `Uint8Array`, so the returned instances will have all the node `Buffer` methods - * and the `Uint8Array` methods. Square bracket notation works as expected -- it - * returns a single octet. - * - * The `Uint8Array` prototype remains unmodified. - */ - -function Buffer$2 (arg, encodingOrOffset, length) { - if (!Buffer$2.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer$2)) { - return new Buffer$2(arg, encodingOrOffset, length) - } - - // Common case. - if (typeof arg === 'number') { - if (typeof encodingOrOffset === 'string') { - throw new Error( - 'If encoding is specified then the first argument must be a string' - ) - } - return allocUnsafe(this, arg) - } - return from$1(this, arg, encodingOrOffset, length) -} - -Buffer$2.poolSize = 8192; // not used by this implementation - -// TODO: Legacy, not needed anymore. Remove in next major version. -Buffer$2._augment = function (arr) { - arr.__proto__ = Buffer$2.prototype; - return arr -}; - -function from$1 (that, value, encodingOrOffset, length) { - if (typeof value === 'number') { - throw new TypeError('"value" argument must not be a number') - } - - if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) { - return fromArrayBuffer(that, value, encodingOrOffset, length) - } - - if (typeof value === 'string') { - return fromString(that, value, encodingOrOffset) - } - - return fromObject(that, value) -} - -/** - * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError - * if value is a number. - * Buffer.from(str[, encoding]) - * Buffer.from(array) - * Buffer.from(buffer) - * Buffer.from(arrayBuffer[, byteOffset[, length]]) - **/ -Buffer$2.from = function (value, encodingOrOffset, length) { - return from$1(null, value, encodingOrOffset, length) -}; - -if (Buffer$2.TYPED_ARRAY_SUPPORT) { - Buffer$2.prototype.__proto__ = Uint8Array.prototype; - Buffer$2.__proto__ = Uint8Array; - if (typeof Symbol !== 'undefined' && Symbol.species && - Buffer$2[Symbol.species] === Buffer$2) ; -} - -function assertSize (size) { - if (typeof size !== 'number') { - throw new TypeError('"size" argument must be a number') - } else if (size < 0) { - throw new RangeError('"size" argument must not be negative') - } -} - -function alloc (that, size, fill, encoding) { - assertSize(size); - if (size <= 0) { - return createBuffer(that, size) - } - if (fill !== undefined) { - // Only pay attention to encoding if it's a string. This - // prevents accidentally sending in a number that would - // be interpretted as a start offset. - return typeof encoding === 'string' - ? createBuffer(that, size).fill(fill, encoding) - : createBuffer(that, size).fill(fill) - } - return createBuffer(that, size) -} - -/** - * Creates a new filled Buffer instance. - * alloc(size[, fill[, encoding]]) - **/ -Buffer$2.alloc = function (size, fill, encoding) { - return alloc(null, size, fill, encoding) -}; - -function allocUnsafe (that, size) { - assertSize(size); - that = createBuffer(that, size < 0 ? 0 : checked(size) | 0); - if (!Buffer$2.TYPED_ARRAY_SUPPORT) { - for (var i = 0; i < size; ++i) { - that[i] = 0; - } - } - return that -} - -/** - * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance. - * */ -Buffer$2.allocUnsafe = function (size) { - return allocUnsafe(null, size) -}; -/** - * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance. - */ -Buffer$2.allocUnsafeSlow = function (size) { - return allocUnsafe(null, size) -}; - -function fromString (that, string, encoding) { - if (typeof encoding !== 'string' || encoding === '') { - encoding = 'utf8'; - } - - if (!Buffer$2.isEncoding(encoding)) { - throw new TypeError('"encoding" must be a valid string encoding') - } - - var length = byteLength(string, encoding) | 0; - that = createBuffer(that, length); - - var actual = that.write(string, encoding); - - if (actual !== length) { - // Writing a hex string, for example, that contains invalid characters will - // cause everything after the first invalid character to be ignored. (e.g. - // 'abxxcd' will be treated as 'ab') - that = that.slice(0, actual); - } - - return that -} - -function fromArrayLike (that, array) { - var length = array.length < 0 ? 0 : checked(array.length) | 0; - that = createBuffer(that, length); - for (var i = 0; i < length; i += 1) { - that[i] = array[i] & 255; - } - return that -} - -function fromArrayBuffer (that, array, byteOffset, length) { - array.byteLength; // this throws if `array` is not a valid ArrayBuffer - - if (byteOffset < 0 || array.byteLength < byteOffset) { - throw new RangeError('\'offset\' is out of bounds') - } - - if (array.byteLength < byteOffset + (length || 0)) { - throw new RangeError('\'length\' is out of bounds') - } - - if (byteOffset === undefined && length === undefined) { - array = new Uint8Array(array); - } else if (length === undefined) { - array = new Uint8Array(array, byteOffset); - } else { - array = new Uint8Array(array, byteOffset, length); - } - - if (Buffer$2.TYPED_ARRAY_SUPPORT) { - // Return an augmented `Uint8Array` instance, for best performance - that = array; - that.__proto__ = Buffer$2.prototype; - } else { - // Fallback: Return an object instance of the Buffer class - that = fromArrayLike(that, array); - } - return that -} - -function fromObject (that, obj) { - if (internalIsBuffer(obj)) { - var len = checked(obj.length) | 0; - that = createBuffer(that, len); - - if (that.length === 0) { - return that - } - - obj.copy(that, 0, 0, len); - return that - } - - if (obj) { - if ((typeof ArrayBuffer !== 'undefined' && - obj.buffer instanceof ArrayBuffer) || 'length' in obj) { - if (typeof obj.length !== 'number' || isnan(obj.length)) { - return createBuffer(that, 0) - } - return fromArrayLike(that, obj) - } - - if (obj.type === 'Buffer' && isArray$1(obj.data)) { - return fromArrayLike(that, obj.data) - } - } - - throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.') -} - -function checked (length) { - // Note: cannot use `length < kMaxLength()` here because that fails when - // length is NaN (which is otherwise coerced to zero.) - if (length >= kMaxLength()) { - throw new RangeError('Attempt to allocate Buffer larger than maximum ' + - 'size: 0x' + kMaxLength().toString(16) + ' bytes') - } - return length | 0 -} - -function SlowBuffer (length) { - if (+length != length) { // eslint-disable-line eqeqeq - length = 0; - } - return Buffer$2.alloc(+length) -} -Buffer$2.isBuffer = isBuffer$1; -function internalIsBuffer (b) { - return !!(b != null && b._isBuffer) -} - -Buffer$2.compare = function compare (a, b) { - if (!internalIsBuffer(a) || !internalIsBuffer(b)) { - throw new TypeError('Arguments must be Buffers') - } - - if (a === b) return 0 - - var x = a.length; - var y = b.length; - - for (var i = 0, len = Math.min(x, y); i < len; ++i) { - if (a[i] !== b[i]) { - x = a[i]; - y = b[i]; - break - } - } - - if (x < y) return -1 - if (y < x) return 1 - return 0 -}; - -Buffer$2.isEncoding = function isEncoding (encoding) { - switch (String(encoding).toLowerCase()) { - case 'hex': - case 'utf8': - case 'utf-8': - case 'ascii': - case 'latin1': - case 'binary': - case 'base64': - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return true - default: - return false - } -}; - -Buffer$2.concat = function concat (list, length) { - if (!isArray$1(list)) { - throw new TypeError('"list" argument must be an Array of Buffers') - } - - if (list.length === 0) { - return Buffer$2.alloc(0) - } - - var i; - if (length === undefined) { - length = 0; - for (i = 0; i < list.length; ++i) { - length += list[i].length; - } - } - - var buffer = Buffer$2.allocUnsafe(length); - var pos = 0; - for (i = 0; i < list.length; ++i) { - var buf = list[i]; - if (!internalIsBuffer(buf)) { - throw new TypeError('"list" argument must be an Array of Buffers') - } - buf.copy(buffer, pos); - pos += buf.length; - } - return buffer -}; - -function byteLength (string, encoding) { - if (internalIsBuffer(string)) { - return string.length - } - if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' && - (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) { - return string.byteLength - } - if (typeof string !== 'string') { - string = '' + string; - } - - var len = string.length; - if (len === 0) return 0 - - // Use a for loop to avoid recursion - var loweredCase = false; - for (;;) { - switch (encoding) { - case 'ascii': - case 'latin1': - case 'binary': - return len - case 'utf8': - case 'utf-8': - case undefined: - return utf8ToBytes$1(string).length - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return len * 2 - case 'hex': - return len >>> 1 - case 'base64': - return base64ToBytes(string).length - default: - if (loweredCase) return utf8ToBytes$1(string).length // assume utf8 - encoding = ('' + encoding).toLowerCase(); - loweredCase = true; - } - } -} -Buffer$2.byteLength = byteLength; - -function slowToString (encoding, start, end) { - var loweredCase = false; - - // No need to verify that "this.length <= MAX_UINT32" since it's a read-only - // property of a typed array. - - // This behaves neither like String nor Uint8Array in that we set start/end - // to their upper/lower bounds if the value passed is out of range. - // undefined is handled specially as per ECMA-262 6th Edition, - // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization. - if (start === undefined || start < 0) { - start = 0; - } - // Return early if start > this.length. Done here to prevent potential uint32 - // coercion fail below. - if (start > this.length) { - return '' - } - - if (end === undefined || end > this.length) { - end = this.length; - } - - if (end <= 0) { - return '' - } - - // Force coersion to uint32. This will also coerce falsey/NaN values to 0. - end >>>= 0; - start >>>= 0; - - if (end <= start) { - return '' - } - - if (!encoding) encoding = 'utf8'; - - while (true) { - switch (encoding) { - case 'hex': - return hexSlice(this, start, end) - - case 'utf8': - case 'utf-8': - return utf8Slice(this, start, end) - - case 'ascii': - return asciiSlice(this, start, end) - - case 'latin1': - case 'binary': - return latin1Slice(this, start, end) - - case 'base64': - return base64Slice(this, start, end) - - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return utf16leSlice(this, start, end) - - default: - if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) - encoding = (encoding + '').toLowerCase(); - loweredCase = true; - } - } -} - -// The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect -// Buffer instances. -Buffer$2.prototype._isBuffer = true; - -function swap (b, n, m) { - var i = b[n]; - b[n] = b[m]; - b[m] = i; -} - -Buffer$2.prototype.swap16 = function swap16 () { - var len = this.length; - if (len % 2 !== 0) { - throw new RangeError('Buffer size must be a multiple of 16-bits') - } - for (var i = 0; i < len; i += 2) { - swap(this, i, i + 1); - } - return this -}; - -Buffer$2.prototype.swap32 = function swap32 () { - var len = this.length; - if (len % 4 !== 0) { - throw new RangeError('Buffer size must be a multiple of 32-bits') - } - for (var i = 0; i < len; i += 4) { - swap(this, i, i + 3); - swap(this, i + 1, i + 2); - } - return this -}; - -Buffer$2.prototype.swap64 = function swap64 () { - var len = this.length; - if (len % 8 !== 0) { - throw new RangeError('Buffer size must be a multiple of 64-bits') - } - for (var i = 0; i < len; i += 8) { - swap(this, i, i + 7); - swap(this, i + 1, i + 6); - swap(this, i + 2, i + 5); - swap(this, i + 3, i + 4); - } - return this -}; - -Buffer$2.prototype.toString = function toString () { - var length = this.length | 0; - if (length === 0) return '' - if (arguments.length === 0) return utf8Slice(this, 0, length) - return slowToString.apply(this, arguments) -}; - -Buffer$2.prototype.equals = function equals (b) { - if (!internalIsBuffer(b)) throw new TypeError('Argument must be a Buffer') - if (this === b) return true - return Buffer$2.compare(this, b) === 0 -}; - -Buffer$2.prototype.inspect = function inspect () { - var str = ''; - var max = INSPECT_MAX_BYTES; - if (this.length > 0) { - str = this.toString('hex', 0, max).match(/.{2}/g).join(' '); - if (this.length > max) str += ' ... '; - } - return '' -}; - -Buffer$2.prototype.compare = function compare (target, start, end, thisStart, thisEnd) { - if (!internalIsBuffer(target)) { - throw new TypeError('Argument must be a Buffer') - } - - if (start === undefined) { - start = 0; - } - if (end === undefined) { - end = target ? target.length : 0; - } - if (thisStart === undefined) { - thisStart = 0; - } - if (thisEnd === undefined) { - thisEnd = this.length; - } - - if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) { - throw new RangeError('out of range index') - } - - if (thisStart >= thisEnd && start >= end) { - return 0 - } - if (thisStart >= thisEnd) { - return -1 - } - if (start >= end) { - return 1 - } - - start >>>= 0; - end >>>= 0; - thisStart >>>= 0; - thisEnd >>>= 0; - - if (this === target) return 0 - - var x = thisEnd - thisStart; - var y = end - start; - var len = Math.min(x, y); - - var thisCopy = this.slice(thisStart, thisEnd); - var targetCopy = target.slice(start, end); - - for (var i = 0; i < len; ++i) { - if (thisCopy[i] !== targetCopy[i]) { - x = thisCopy[i]; - y = targetCopy[i]; - break - } - } - - if (x < y) return -1 - if (y < x) return 1 - return 0 -}; - -// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`, -// OR the last index of `val` in `buffer` at offset <= `byteOffset`. -// -// Arguments: -// - buffer - a Buffer to search -// - val - a string, Buffer, or number -// - byteOffset - an index into `buffer`; will be clamped to an int32 -// - encoding - an optional encoding, relevant is val is a string -// - dir - true for indexOf, false for lastIndexOf -function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) { - // Empty buffer means no match - if (buffer.length === 0) return -1 - - // Normalize byteOffset - if (typeof byteOffset === 'string') { - encoding = byteOffset; - byteOffset = 0; - } else if (byteOffset > 0x7fffffff) { - byteOffset = 0x7fffffff; - } else if (byteOffset < -2147483648) { - byteOffset = -2147483648; - } - byteOffset = +byteOffset; // Coerce to Number. - if (isNaN(byteOffset)) { - // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer - byteOffset = dir ? 0 : (buffer.length - 1); - } - - // Normalize byteOffset: negative offsets start from the end of the buffer - if (byteOffset < 0) byteOffset = buffer.length + byteOffset; - if (byteOffset >= buffer.length) { - if (dir) return -1 - else byteOffset = buffer.length - 1; - } else if (byteOffset < 0) { - if (dir) byteOffset = 0; - else return -1 - } - - // Normalize val - if (typeof val === 'string') { - val = Buffer$2.from(val, encoding); - } - - // Finally, search either indexOf (if dir is true) or lastIndexOf - if (internalIsBuffer(val)) { - // Special case: looking for empty string/buffer always fails - if (val.length === 0) { - return -1 - } - return arrayIndexOf(buffer, val, byteOffset, encoding, dir) - } else if (typeof val === 'number') { - val = val & 0xFF; // Search for a byte value [0-255] - if (Buffer$2.TYPED_ARRAY_SUPPORT && - typeof Uint8Array.prototype.indexOf === 'function') { - if (dir) { - return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset) - } else { - return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset) - } - } - return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir) - } - - throw new TypeError('val must be string, number or Buffer') -} - -function arrayIndexOf (arr, val, byteOffset, encoding, dir) { - var indexSize = 1; - var arrLength = arr.length; - var valLength = val.length; - - if (encoding !== undefined) { - encoding = String(encoding).toLowerCase(); - if (encoding === 'ucs2' || encoding === 'ucs-2' || - encoding === 'utf16le' || encoding === 'utf-16le') { - if (arr.length < 2 || val.length < 2) { - return -1 - } - indexSize = 2; - arrLength /= 2; - valLength /= 2; - byteOffset /= 2; - } - } - - function read (buf, i) { - if (indexSize === 1) { - return buf[i] - } else { - return buf.readUInt16BE(i * indexSize) - } - } - - var i; - if (dir) { - var foundIndex = -1; - for (i = byteOffset; i < arrLength; i++) { - if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) { - if (foundIndex === -1) foundIndex = i; - if (i - foundIndex + 1 === valLength) return foundIndex * indexSize - } else { - if (foundIndex !== -1) i -= i - foundIndex; - foundIndex = -1; - } - } - } else { - if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength; - for (i = byteOffset; i >= 0; i--) { - var found = true; - for (var j = 0; j < valLength; j++) { - if (read(arr, i + j) !== read(val, j)) { - found = false; - break - } - } - if (found) return i - } - } - - return -1 -} - -Buffer$2.prototype.includes = function includes (val, byteOffset, encoding) { - return this.indexOf(val, byteOffset, encoding) !== -1 -}; - -Buffer$2.prototype.indexOf = function indexOf (val, byteOffset, encoding) { - return bidirectionalIndexOf(this, val, byteOffset, encoding, true) -}; - -Buffer$2.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) { - return bidirectionalIndexOf(this, val, byteOffset, encoding, false) -}; - -function hexWrite (buf, string, offset, length) { - offset = Number(offset) || 0; - var remaining = buf.length - offset; - if (!length) { - length = remaining; - } else { - length = Number(length); - if (length > remaining) { - length = remaining; - } - } - - // must be an even number of digits - var strLen = string.length; - if (strLen % 2 !== 0) throw new TypeError('Invalid hex string') - - if (length > strLen / 2) { - length = strLen / 2; - } - for (var i = 0; i < length; ++i) { - var parsed = parseInt(string.substr(i * 2, 2), 16); - if (isNaN(parsed)) return i - buf[offset + i] = parsed; - } - return i -} - -function utf8Write (buf, string, offset, length) { - return blitBuffer(utf8ToBytes$1(string, buf.length - offset), buf, offset, length) -} - -function asciiWrite (buf, string, offset, length) { - return blitBuffer(asciiToBytes(string), buf, offset, length) -} - -function latin1Write (buf, string, offset, length) { - return asciiWrite(buf, string, offset, length) -} - -function base64Write (buf, string, offset, length) { - return blitBuffer(base64ToBytes(string), buf, offset, length) -} - -function ucs2Write (buf, string, offset, length) { - return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length) -} - -Buffer$2.prototype.write = function write (string, offset, length, encoding) { - // Buffer#write(string) - if (offset === undefined) { - encoding = 'utf8'; - length = this.length; - offset = 0; - // Buffer#write(string, encoding) - } else if (length === undefined && typeof offset === 'string') { - encoding = offset; - length = this.length; - offset = 0; - // Buffer#write(string, offset[, length][, encoding]) - } else if (isFinite(offset)) { - offset = offset | 0; - if (isFinite(length)) { - length = length | 0; - if (encoding === undefined) encoding = 'utf8'; - } else { - encoding = length; - length = undefined; - } - // legacy write(string, encoding, offset, length) - remove in v0.13 - } else { - throw new Error( - 'Buffer.write(string, encoding, offset[, length]) is no longer supported' - ) - } - - var remaining = this.length - offset; - if (length === undefined || length > remaining) length = remaining; - - if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) { - throw new RangeError('Attempt to write outside buffer bounds') - } - - if (!encoding) encoding = 'utf8'; - - var loweredCase = false; - for (;;) { - switch (encoding) { - case 'hex': - return hexWrite(this, string, offset, length) - - case 'utf8': - case 'utf-8': - return utf8Write(this, string, offset, length) - - case 'ascii': - return asciiWrite(this, string, offset, length) - - case 'latin1': - case 'binary': - return latin1Write(this, string, offset, length) - - case 'base64': - // Warning: maxLength not taken into account in base64Write - return base64Write(this, string, offset, length) - - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return ucs2Write(this, string, offset, length) - - default: - if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) - encoding = ('' + encoding).toLowerCase(); - loweredCase = true; - } - } -}; - -Buffer$2.prototype.toJSON = function toJSON () { - return { - type: 'Buffer', - data: Array.prototype.slice.call(this._arr || this, 0) - } -}; - -function base64Slice (buf, start, end) { - if (start === 0 && end === buf.length) { - return fromByteArray(buf) - } else { - return fromByteArray(buf.slice(start, end)) - } -} - -function utf8Slice (buf, start, end) { - end = Math.min(buf.length, end); - var res = []; - - var i = start; - while (i < end) { - var firstByte = buf[i]; - var codePoint = null; - var bytesPerSequence = (firstByte > 0xEF) ? 4 - : (firstByte > 0xDF) ? 3 - : (firstByte > 0xBF) ? 2 - : 1; - - if (i + bytesPerSequence <= end) { - var secondByte, thirdByte, fourthByte, tempCodePoint; - - switch (bytesPerSequence) { - case 1: - if (firstByte < 0x80) { - codePoint = firstByte; - } - break - case 2: - secondByte = buf[i + 1]; - if ((secondByte & 0xC0) === 0x80) { - tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F); - if (tempCodePoint > 0x7F) { - codePoint = tempCodePoint; - } - } - break - case 3: - secondByte = buf[i + 1]; - thirdByte = buf[i + 2]; - if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) { - tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F); - if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) { - codePoint = tempCodePoint; - } - } - break - case 4: - secondByte = buf[i + 1]; - thirdByte = buf[i + 2]; - fourthByte = buf[i + 3]; - if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) { - tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F); - if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) { - codePoint = tempCodePoint; - } - } - } - } - - if (codePoint === null) { - // we did not generate a valid codePoint so insert a - // replacement char (U+FFFD) and advance only 1 byte - codePoint = 0xFFFD; - bytesPerSequence = 1; - } else if (codePoint > 0xFFFF) { - // encode to utf16 (surrogate pair dance) - codePoint -= 0x10000; - res.push(codePoint >>> 10 & 0x3FF | 0xD800); - codePoint = 0xDC00 | codePoint & 0x3FF; - } - - res.push(codePoint); - i += bytesPerSequence; - } - - return decodeCodePointsArray(res) -} - -// Based on http://stackoverflow.com/a/22747272/680742, the browser with -// the lowest limit is Chrome, with 0x10000 args. -// We go 1 magnitude less, for safety -var MAX_ARGUMENTS_LENGTH = 0x1000; - -function decodeCodePointsArray (codePoints) { - var len = codePoints.length; - if (len <= MAX_ARGUMENTS_LENGTH) { - return String.fromCharCode.apply(String, codePoints) // avoid extra slice() - } - - // Decode in chunks to avoid "call stack size exceeded". - var res = ''; - var i = 0; - while (i < len) { - res += String.fromCharCode.apply( - String, - codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH) - ); - } - return res -} - -function asciiSlice (buf, start, end) { - var ret = ''; - end = Math.min(buf.length, end); - - for (var i = start; i < end; ++i) { - ret += String.fromCharCode(buf[i] & 0x7F); - } - return ret -} - -function latin1Slice (buf, start, end) { - var ret = ''; - end = Math.min(buf.length, end); - - for (var i = start; i < end; ++i) { - ret += String.fromCharCode(buf[i]); - } - return ret -} - -function hexSlice (buf, start, end) { - var len = buf.length; - - if (!start || start < 0) start = 0; - if (!end || end < 0 || end > len) end = len; - - var out = ''; - for (var i = start; i < end; ++i) { - out += toHex$1(buf[i]); - } - return out -} - -function utf16leSlice (buf, start, end) { - var bytes = buf.slice(start, end); - var res = ''; - for (var i = 0; i < bytes.length; i += 2) { - res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256); - } - return res -} - -Buffer$2.prototype.slice = function slice (start, end) { - var len = this.length; - start = ~~start; - end = end === undefined ? len : ~~end; - - if (start < 0) { - start += len; - if (start < 0) start = 0; - } else if (start > len) { - start = len; - } - - if (end < 0) { - end += len; - if (end < 0) end = 0; - } else if (end > len) { - end = len; - } - - if (end < start) end = start; - - var newBuf; - if (Buffer$2.TYPED_ARRAY_SUPPORT) { - newBuf = this.subarray(start, end); - newBuf.__proto__ = Buffer$2.prototype; - } else { - var sliceLen = end - start; - newBuf = new Buffer$2(sliceLen, undefined); - for (var i = 0; i < sliceLen; ++i) { - newBuf[i] = this[i + start]; - } - } - - return newBuf -}; - -/* - * Need to make sure that buffer isn't trying to write out of bounds. - */ -function checkOffset (offset, ext, length) { - if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint') - if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length') -} - -Buffer$2.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) { - offset = offset | 0; - byteLength = byteLength | 0; - if (!noAssert) checkOffset(offset, byteLength, this.length); - - var val = this[offset]; - var mul = 1; - var i = 0; - while (++i < byteLength && (mul *= 0x100)) { - val += this[offset + i] * mul; - } - - return val -}; - -Buffer$2.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) { - offset = offset | 0; - byteLength = byteLength | 0; - if (!noAssert) { - checkOffset(offset, byteLength, this.length); - } - - var val = this[offset + --byteLength]; - var mul = 1; - while (byteLength > 0 && (mul *= 0x100)) { - val += this[offset + --byteLength] * mul; - } - - return val -}; - -Buffer$2.prototype.readUInt8 = function readUInt8 (offset, noAssert) { - if (!noAssert) checkOffset(offset, 1, this.length); - return this[offset] -}; - -Buffer$2.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 2, this.length); - return this[offset] | (this[offset + 1] << 8) -}; - -Buffer$2.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 2, this.length); - return (this[offset] << 8) | this[offset + 1] -}; - -Buffer$2.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length); - - return ((this[offset]) | - (this[offset + 1] << 8) | - (this[offset + 2] << 16)) + - (this[offset + 3] * 0x1000000) -}; - -Buffer$2.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length); - - return (this[offset] * 0x1000000) + - ((this[offset + 1] << 16) | - (this[offset + 2] << 8) | - this[offset + 3]) -}; - -Buffer$2.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) { - offset = offset | 0; - byteLength = byteLength | 0; - if (!noAssert) checkOffset(offset, byteLength, this.length); - - var val = this[offset]; - var mul = 1; - var i = 0; - while (++i < byteLength && (mul *= 0x100)) { - val += this[offset + i] * mul; - } - mul *= 0x80; - - if (val >= mul) val -= Math.pow(2, 8 * byteLength); - - return val -}; - -Buffer$2.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) { - offset = offset | 0; - byteLength = byteLength | 0; - if (!noAssert) checkOffset(offset, byteLength, this.length); - - var i = byteLength; - var mul = 1; - var val = this[offset + --i]; - while (i > 0 && (mul *= 0x100)) { - val += this[offset + --i] * mul; - } - mul *= 0x80; - - if (val >= mul) val -= Math.pow(2, 8 * byteLength); - - return val -}; - -Buffer$2.prototype.readInt8 = function readInt8 (offset, noAssert) { - if (!noAssert) checkOffset(offset, 1, this.length); - if (!(this[offset] & 0x80)) return (this[offset]) - return ((0xff - this[offset] + 1) * -1) -}; - -Buffer$2.prototype.readInt16LE = function readInt16LE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 2, this.length); - var val = this[offset] | (this[offset + 1] << 8); - return (val & 0x8000) ? val | 0xFFFF0000 : val -}; - -Buffer$2.prototype.readInt16BE = function readInt16BE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 2, this.length); - var val = this[offset + 1] | (this[offset] << 8); - return (val & 0x8000) ? val | 0xFFFF0000 : val -}; - -Buffer$2.prototype.readInt32LE = function readInt32LE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length); - - return (this[offset]) | - (this[offset + 1] << 8) | - (this[offset + 2] << 16) | - (this[offset + 3] << 24) -}; - -Buffer$2.prototype.readInt32BE = function readInt32BE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length); - - return (this[offset] << 24) | - (this[offset + 1] << 16) | - (this[offset + 2] << 8) | - (this[offset + 3]) -}; - -Buffer$2.prototype.readFloatLE = function readFloatLE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length); - return read(this, offset, true, 23, 4) -}; - -Buffer$2.prototype.readFloatBE = function readFloatBE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length); - return read(this, offset, false, 23, 4) -}; - -Buffer$2.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 8, this.length); - return read(this, offset, true, 52, 8) -}; - -Buffer$2.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 8, this.length); - return read(this, offset, false, 52, 8) -}; - -function checkInt (buf, value, offset, ext, max, min) { - if (!internalIsBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance') - if (value > max || value < min) throw new RangeError('"value" argument is out of bounds') - if (offset + ext > buf.length) throw new RangeError('Index out of range') -} - -Buffer$2.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) { - value = +value; - offset = offset | 0; - byteLength = byteLength | 0; - if (!noAssert) { - var maxBytes = Math.pow(2, 8 * byteLength) - 1; - checkInt(this, value, offset, byteLength, maxBytes, 0); - } - - var mul = 1; - var i = 0; - this[offset] = value & 0xFF; - while (++i < byteLength && (mul *= 0x100)) { - this[offset + i] = (value / mul) & 0xFF; - } - - return offset + byteLength -}; - -Buffer$2.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) { - value = +value; - offset = offset | 0; - byteLength = byteLength | 0; - if (!noAssert) { - var maxBytes = Math.pow(2, 8 * byteLength) - 1; - checkInt(this, value, offset, byteLength, maxBytes, 0); - } - - var i = byteLength - 1; - var mul = 1; - this[offset + i] = value & 0xFF; - while (--i >= 0 && (mul *= 0x100)) { - this[offset + i] = (value / mul) & 0xFF; - } - - return offset + byteLength -}; - -Buffer$2.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0); - if (!Buffer$2.TYPED_ARRAY_SUPPORT) value = Math.floor(value); - this[offset] = (value & 0xff); - return offset + 1 -}; - -function objectWriteUInt16 (buf, value, offset, littleEndian) { - if (value < 0) value = 0xffff + value + 1; - for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) { - buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>> - (littleEndian ? i : 1 - i) * 8; - } -} - -Buffer$2.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0); - if (Buffer$2.TYPED_ARRAY_SUPPORT) { - this[offset] = (value & 0xff); - this[offset + 1] = (value >>> 8); - } else { - objectWriteUInt16(this, value, offset, true); - } - return offset + 2 -}; - -Buffer$2.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0); - if (Buffer$2.TYPED_ARRAY_SUPPORT) { - this[offset] = (value >>> 8); - this[offset + 1] = (value & 0xff); - } else { - objectWriteUInt16(this, value, offset, false); - } - return offset + 2 -}; - -function objectWriteUInt32 (buf, value, offset, littleEndian) { - if (value < 0) value = 0xffffffff + value + 1; - for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) { - buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff; - } -} - -Buffer$2.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0); - if (Buffer$2.TYPED_ARRAY_SUPPORT) { - this[offset + 3] = (value >>> 24); - this[offset + 2] = (value >>> 16); - this[offset + 1] = (value >>> 8); - this[offset] = (value & 0xff); - } else { - objectWriteUInt32(this, value, offset, true); - } - return offset + 4 -}; - -Buffer$2.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0); - if (Buffer$2.TYPED_ARRAY_SUPPORT) { - this[offset] = (value >>> 24); - this[offset + 1] = (value >>> 16); - this[offset + 2] = (value >>> 8); - this[offset + 3] = (value & 0xff); - } else { - objectWriteUInt32(this, value, offset, false); - } - return offset + 4 -}; - -Buffer$2.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) { - var limit = Math.pow(2, 8 * byteLength - 1); - - checkInt(this, value, offset, byteLength, limit - 1, -limit); - } - - var i = 0; - var mul = 1; - var sub = 0; - this[offset] = value & 0xFF; - while (++i < byteLength && (mul *= 0x100)) { - if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) { - sub = 1; - } - this[offset + i] = ((value / mul) >> 0) - sub & 0xFF; - } - - return offset + byteLength -}; - -Buffer$2.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) { - var limit = Math.pow(2, 8 * byteLength - 1); - - checkInt(this, value, offset, byteLength, limit - 1, -limit); - } - - var i = byteLength - 1; - var mul = 1; - var sub = 0; - this[offset + i] = value & 0xFF; - while (--i >= 0 && (mul *= 0x100)) { - if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) { - sub = 1; - } - this[offset + i] = ((value / mul) >> 0) - sub & 0xFF; - } - - return offset + byteLength -}; - -Buffer$2.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -128); - if (!Buffer$2.TYPED_ARRAY_SUPPORT) value = Math.floor(value); - if (value < 0) value = 0xff + value + 1; - this[offset] = (value & 0xff); - return offset + 1 -}; - -Buffer$2.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -32768); - if (Buffer$2.TYPED_ARRAY_SUPPORT) { - this[offset] = (value & 0xff); - this[offset + 1] = (value >>> 8); - } else { - objectWriteUInt16(this, value, offset, true); - } - return offset + 2 -}; - -Buffer$2.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -32768); - if (Buffer$2.TYPED_ARRAY_SUPPORT) { - this[offset] = (value >>> 8); - this[offset + 1] = (value & 0xff); - } else { - objectWriteUInt16(this, value, offset, false); - } - return offset + 2 -}; - -Buffer$2.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -2147483648); - if (Buffer$2.TYPED_ARRAY_SUPPORT) { - this[offset] = (value & 0xff); - this[offset + 1] = (value >>> 8); - this[offset + 2] = (value >>> 16); - this[offset + 3] = (value >>> 24); - } else { - objectWriteUInt32(this, value, offset, true); - } - return offset + 4 -}; - -Buffer$2.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -2147483648); - if (value < 0) value = 0xffffffff + value + 1; - if (Buffer$2.TYPED_ARRAY_SUPPORT) { - this[offset] = (value >>> 24); - this[offset + 1] = (value >>> 16); - this[offset + 2] = (value >>> 8); - this[offset + 3] = (value & 0xff); - } else { - objectWriteUInt32(this, value, offset, false); - } - return offset + 4 -}; - -function checkIEEE754 (buf, value, offset, ext, max, min) { - if (offset + ext > buf.length) throw new RangeError('Index out of range') - if (offset < 0) throw new RangeError('Index out of range') -} - -function writeFloat (buf, value, offset, littleEndian, noAssert) { - if (!noAssert) { - checkIEEE754(buf, value, offset, 4); - } - write(buf, value, offset, littleEndian, 23, 4); - return offset + 4 -} - -Buffer$2.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) { - return writeFloat(this, value, offset, true, noAssert) -}; - -Buffer$2.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) { - return writeFloat(this, value, offset, false, noAssert) -}; - -function writeDouble (buf, value, offset, littleEndian, noAssert) { - if (!noAssert) { - checkIEEE754(buf, value, offset, 8); - } - write(buf, value, offset, littleEndian, 52, 8); - return offset + 8 -} - -Buffer$2.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) { - return writeDouble(this, value, offset, true, noAssert) -}; - -Buffer$2.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) { - return writeDouble(this, value, offset, false, noAssert) -}; - -// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length) -Buffer$2.prototype.copy = function copy (target, targetStart, start, end) { - if (!start) start = 0; - if (!end && end !== 0) end = this.length; - if (targetStart >= target.length) targetStart = target.length; - if (!targetStart) targetStart = 0; - if (end > 0 && end < start) end = start; - - // Copy 0 bytes; we're done - if (end === start) return 0 - if (target.length === 0 || this.length === 0) return 0 - - // Fatal error conditions - if (targetStart < 0) { - throw new RangeError('targetStart out of bounds') - } - if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds') - if (end < 0) throw new RangeError('sourceEnd out of bounds') - - // Are we oob? - if (end > this.length) end = this.length; - if (target.length - targetStart < end - start) { - end = target.length - targetStart + start; - } - - var len = end - start; - var i; - - if (this === target && start < targetStart && targetStart < end) { - // descending copy from end - for (i = len - 1; i >= 0; --i) { - target[i + targetStart] = this[i + start]; - } - } else if (len < 1000 || !Buffer$2.TYPED_ARRAY_SUPPORT) { - // ascending copy from start - for (i = 0; i < len; ++i) { - target[i + targetStart] = this[i + start]; - } - } else { - Uint8Array.prototype.set.call( - target, - this.subarray(start, start + len), - targetStart - ); - } - - return len -}; - -// Usage: -// buffer.fill(number[, offset[, end]]) -// buffer.fill(buffer[, offset[, end]]) -// buffer.fill(string[, offset[, end]][, encoding]) -Buffer$2.prototype.fill = function fill (val, start, end, encoding) { - // Handle string cases: - if (typeof val === 'string') { - if (typeof start === 'string') { - encoding = start; - start = 0; - end = this.length; - } else if (typeof end === 'string') { - encoding = end; - end = this.length; - } - if (val.length === 1) { - var code = val.charCodeAt(0); - if (code < 256) { - val = code; - } - } - if (encoding !== undefined && typeof encoding !== 'string') { - throw new TypeError('encoding must be a string') - } - if (typeof encoding === 'string' && !Buffer$2.isEncoding(encoding)) { - throw new TypeError('Unknown encoding: ' + encoding) - } - } else if (typeof val === 'number') { - val = val & 255; - } - - // Invalid ranges are not set to a default, so can range check early. - if (start < 0 || this.length < start || this.length < end) { - throw new RangeError('Out of range index') - } - - if (end <= start) { - return this - } - - start = start >>> 0; - end = end === undefined ? this.length : end >>> 0; - - if (!val) val = 0; - - var i; - if (typeof val === 'number') { - for (i = start; i < end; ++i) { - this[i] = val; - } - } else { - var bytes = internalIsBuffer(val) - ? val - : utf8ToBytes$1(new Buffer$2(val, encoding).toString()); - var len = bytes.length; - for (i = 0; i < end - start; ++i) { - this[i + start] = bytes[i % len]; - } - } - - return this -}; - -// HELPER FUNCTIONS -// ================ - -var INVALID_BASE64_RE = /[^+\/0-9A-Za-z-_]/g; - -function base64clean (str) { - // Node strips out invalid characters like \n and \t from the string, base64-js does not - str = stringtrim(str).replace(INVALID_BASE64_RE, ''); - // Node converts strings with length < 2 to '' - if (str.length < 2) return '' - // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not - while (str.length % 4 !== 0) { - str = str + '='; - } - return str -} - -function stringtrim (str) { - if (str.trim) return str.trim() - return str.replace(/^\s+|\s+$/g, '') -} - -function toHex$1 (n) { - if (n < 16) return '0' + n.toString(16) - return n.toString(16) -} - -function utf8ToBytes$1 (string, units) { - units = units || Infinity; - var codePoint; - var length = string.length; - var leadSurrogate = null; - var bytes = []; - - for (var i = 0; i < length; ++i) { - codePoint = string.charCodeAt(i); - - // is surrogate component - if (codePoint > 0xD7FF && codePoint < 0xE000) { - // last char was a lead - if (!leadSurrogate) { - // no lead yet - if (codePoint > 0xDBFF) { - // unexpected trail - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD); - continue - } else if (i + 1 === length) { - // unpaired lead - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD); - continue - } - - // valid lead - leadSurrogate = codePoint; - - continue - } - - // 2 leads in a row - if (codePoint < 0xDC00) { - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD); - leadSurrogate = codePoint; - continue - } - - // valid surrogate pair - codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000; - } else if (leadSurrogate) { - // valid bmp char, but last char was a lead - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD); - } - - leadSurrogate = null; - - // encode utf8 - if (codePoint < 0x80) { - if ((units -= 1) < 0) break - bytes.push(codePoint); - } else if (codePoint < 0x800) { - if ((units -= 2) < 0) break - bytes.push( - codePoint >> 0x6 | 0xC0, - codePoint & 0x3F | 0x80 - ); - } else if (codePoint < 0x10000) { - if ((units -= 3) < 0) break - bytes.push( - codePoint >> 0xC | 0xE0, - codePoint >> 0x6 & 0x3F | 0x80, - codePoint & 0x3F | 0x80 - ); - } else if (codePoint < 0x110000) { - if ((units -= 4) < 0) break - bytes.push( - codePoint >> 0x12 | 0xF0, - codePoint >> 0xC & 0x3F | 0x80, - codePoint >> 0x6 & 0x3F | 0x80, - codePoint & 0x3F | 0x80 - ); - } else { - throw new Error('Invalid code point') - } - } - - return bytes -} - -function asciiToBytes (str) { - var byteArray = []; - for (var i = 0; i < str.length; ++i) { - // Node's code seems to be doing this and not & 0x7F.. - byteArray.push(str.charCodeAt(i) & 0xFF); - } - return byteArray -} - -function utf16leToBytes (str, units) { - var c, hi, lo; - var byteArray = []; - for (var i = 0; i < str.length; ++i) { - if ((units -= 2) < 0) break - - c = str.charCodeAt(i); - hi = c >> 8; - lo = c % 256; - byteArray.push(lo); - byteArray.push(hi); - } - - return byteArray -} - - -function base64ToBytes (str) { - return toByteArray(base64clean(str)) -} - -function blitBuffer (src, dst, offset, length) { - for (var i = 0; i < length; ++i) { - if ((i + offset >= dst.length) || (i >= src.length)) break - dst[i + offset] = src[i]; - } - return i -} - -function isnan (val) { - return val !== val // eslint-disable-line no-self-compare -} - - -// the following is from is-buffer, also by Feross Aboukhadijeh and with same lisence -// The _isBuffer check is for Safari 5-7 support, because it's missing -// Object.prototype.constructor. Remove this eventually -function isBuffer$1(obj) { - return obj != null && (!!obj._isBuffer || isFastBuffer(obj) || isSlowBuffer(obj)) -} - -function isFastBuffer (obj) { - return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj) -} - -// For Node v0.10 support. Remove this eventually. -function isSlowBuffer (obj) { - return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isFastBuffer(obj.slice(0, 0)) -} - -var _polyfillNode_buffer = /*#__PURE__*/Object.freeze({ - __proto__: null, - Buffer: Buffer$2, - INSPECT_MAX_BYTES: INSPECT_MAX_BYTES, - SlowBuffer: SlowBuffer, - isBuffer: isBuffer$1, - kMaxLength: _kMaxLength -}); - -var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; - -function getDefaultExportFromCjs (x) { - return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x; -} - -function getAugmentedNamespace(n) { - if (n.__esModule) return n; - var f = n.default; - if (typeof f == "function") { - var a = function a () { - if (this instanceof a) { - return Reflect.construct(f, arguments, this.constructor); - } - return f.apply(this, arguments); - }; - a.prototype = f.prototype; - } else a = {}; - Object.defineProperty(a, '__esModule', {value: true}); - Object.keys(n).forEach(function (k) { - var d = Object.getOwnPropertyDescriptor(n, k); - Object.defineProperty(a, k, d.get ? d : { - enumerable: true, - get: function () { - return n[k]; - } - }); - }); - return a; -} - -var readableBrowser = {exports: {}}; - -var _registry = {}; - -// shim for using process in browser -// based off https://github.com/defunctzombie/node-process/blob/master/browser.js - -function defaultSetTimout() { - throw new Error('setTimeout has not been defined'); -} -function defaultClearTimeout () { - throw new Error('clearTimeout has not been defined'); -} -var cachedSetTimeout = defaultSetTimout; -var cachedClearTimeout = defaultClearTimeout; -if (typeof global$1.setTimeout === 'function') { - cachedSetTimeout = setTimeout; -} -if (typeof global$1.clearTimeout === 'function') { - cachedClearTimeout = clearTimeout; -} - -function runTimeout(fun) { - if (cachedSetTimeout === setTimeout) { - //normal enviroments in sane situations - return setTimeout(fun, 0); - } - // if setTimeout wasn't available but was latter defined - if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { - cachedSetTimeout = setTimeout; - return setTimeout(fun, 0); - } - try { - // when when somebody has screwed with setTimeout but no I.E. maddness - return cachedSetTimeout(fun, 0); - } catch(e){ - try { - // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally - return cachedSetTimeout.call(null, fun, 0); - } catch(e){ - // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error - return cachedSetTimeout.call(this, fun, 0); - } - } - - -} -function runClearTimeout(marker) { - if (cachedClearTimeout === clearTimeout) { - //normal enviroments in sane situations - return clearTimeout(marker); - } - // if clearTimeout wasn't available but was latter defined - if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { - cachedClearTimeout = clearTimeout; - return clearTimeout(marker); - } - try { - // when when somebody has screwed with setTimeout but no I.E. maddness - return cachedClearTimeout(marker); - } catch (e){ - try { - // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally - return cachedClearTimeout.call(null, marker); - } catch (e){ - // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. - // Some versions of I.E. have different rules for clearTimeout vs setTimeout - return cachedClearTimeout.call(this, marker); - } - } - - - -} -var queue = []; -var draining = false; -var currentQueue; -var queueIndex = -1; - -function cleanUpNextTick() { - if (!draining || !currentQueue) { - return; - } - draining = false; - if (currentQueue.length) { - queue = currentQueue.concat(queue); - } else { - queueIndex = -1; - } - if (queue.length) { - drainQueue(); - } -} - -function drainQueue() { - if (draining) { - return; - } - var timeout = runTimeout(cleanUpNextTick); - draining = true; - - var len = queue.length; - while(len) { - currentQueue = queue; - queue = []; - while (++queueIndex < len) { - if (currentQueue) { - currentQueue[queueIndex].run(); - } - } - queueIndex = -1; - len = queue.length; - } - currentQueue = null; - draining = false; - runClearTimeout(timeout); -} -function nextTick(fun) { - var args = new Array(arguments.length - 1); - if (arguments.length > 1) { - for (var i = 1; i < arguments.length; i++) { - args[i - 1] = arguments[i]; - } - } - queue.push(new Item(fun, args)); - if (queue.length === 1 && !draining) { - runTimeout(drainQueue); - } -} -// v8 likes predictible objects -function Item(fun, array) { - this.fun = fun; - this.array = array; -} -Item.prototype.run = function () { - this.fun.apply(null, this.array); -}; -var title = 'browser'; -var platform = 'browser'; -var browser$1 = true; -var env = {}; -var argv = []; -var version = ''; // empty string to avoid regexp issues -var versions = {}; -var release = {}; -var config$1 = {}; - -function noop$2() {} - -var on = noop$2; -var addListener = noop$2; -var once$2 = noop$2; -var off = noop$2; -var removeListener = noop$2; -var removeAllListeners = noop$2; -var emit = noop$2; - -function binding$1(name) { - throw new Error('process.binding is not supported'); -} - -function cwd () { return '/' } -function chdir (dir) { - throw new Error('process.chdir is not supported'); -}function umask() { return 0; } - -// from https://github.com/kumavis/browser-process-hrtime/blob/master/index.js -var performance = global$1.performance || {}; -var performanceNow = - performance.now || - performance.mozNow || - performance.msNow || - performance.oNow || - performance.webkitNow || - function(){ return (new Date()).getTime() }; - -// generate timestamp or delta -// see http://nodejs.org/api/process.html#process_process_hrtime -function hrtime(previousTimestamp){ - var clocktime = performanceNow.call(performance)*1e-3; - var seconds = Math.floor(clocktime); - var nanoseconds = Math.floor((clocktime%1)*1e9); - if (previousTimestamp) { - seconds = seconds - previousTimestamp[0]; - nanoseconds = nanoseconds - previousTimestamp[1]; - if (nanoseconds<0) { - seconds--; - nanoseconds += 1e9; - } - } - return [seconds,nanoseconds] -} - -var startTime = new Date(); -function uptime() { - var currentTime = new Date(); - var dif = currentTime - startTime; - return dif / 1000; -} - -var browser$1$1 = { - nextTick: nextTick, - title: title, - browser: browser$1, - env: env, - argv: argv, - version: version, - versions: versions, - on: on, - addListener: addListener, - once: once$2, - off: off, - removeListener: removeListener, - removeAllListeners: removeAllListeners, - emit: emit, - binding: binding$1, - cwd: cwd, - chdir: chdir, - umask: umask, - hrtime: hrtime, - platform: platform, - release: release, - config: config$1, - uptime: uptime -}; - -var domain; - -// This constructor is used to store event handlers. Instantiating this is -// faster than explicitly calling `Object.create(null)` to get a "clean" empty -// object (tested with v8 v4.9). -function EventHandlers() {} -EventHandlers.prototype = Object.create(null); - -function EventEmitter() { - EventEmitter.init.call(this); -} - -// nodejs oddity -// require('events') === require('events').EventEmitter -EventEmitter.EventEmitter = EventEmitter; - -EventEmitter.usingDomains = false; - -EventEmitter.prototype.domain = undefined; -EventEmitter.prototype._events = undefined; -EventEmitter.prototype._maxListeners = undefined; - -// By default EventEmitters will print a warning if more than 10 listeners are -// added to it. This is a useful default which helps finding memory leaks. -EventEmitter.defaultMaxListeners = 10; - -EventEmitter.init = function() { - this.domain = null; - if (EventEmitter.usingDomains) { - // if there is an active domain, then attach to it. - if (domain.active && !(this instanceof domain.Domain)) { - this.domain = domain.active; - } - } - - if (!this._events || this._events === Object.getPrototypeOf(this)._events) { - this._events = new EventHandlers(); - this._eventsCount = 0; - } - - this._maxListeners = this._maxListeners || undefined; -}; - -// Obviously not all Emitters should be limited to 10. This function allows -// that to be increased. Set to zero for unlimited. -EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) { - if (typeof n !== 'number' || n < 0 || isNaN(n)) - throw new TypeError('"n" argument must be a positive number'); - this._maxListeners = n; - return this; -}; - -function $getMaxListeners(that) { - if (that._maxListeners === undefined) - return EventEmitter.defaultMaxListeners; - return that._maxListeners; -} - -EventEmitter.prototype.getMaxListeners = function getMaxListeners() { - return $getMaxListeners(this); -}; - -// These standalone emit* functions are used to optimize calling of event -// handlers for fast cases because emit() itself often has a variable number of -// arguments and can be deoptimized because of that. These functions always have -// the same number of arguments and thus do not get deoptimized, so the code -// inside them can execute faster. -function emitNone(handler, isFn, self) { - if (isFn) - handler.call(self); - else { - var len = handler.length; - var listeners = arrayClone(handler, len); - for (var i = 0; i < len; ++i) - listeners[i].call(self); - } -} -function emitOne(handler, isFn, self, arg1) { - if (isFn) - handler.call(self, arg1); - else { - var len = handler.length; - var listeners = arrayClone(handler, len); - for (var i = 0; i < len; ++i) - listeners[i].call(self, arg1); - } -} -function emitTwo(handler, isFn, self, arg1, arg2) { - if (isFn) - handler.call(self, arg1, arg2); - else { - var len = handler.length; - var listeners = arrayClone(handler, len); - for (var i = 0; i < len; ++i) - listeners[i].call(self, arg1, arg2); - } -} -function emitThree(handler, isFn, self, arg1, arg2, arg3) { - if (isFn) - handler.call(self, arg1, arg2, arg3); - else { - var len = handler.length; - var listeners = arrayClone(handler, len); - for (var i = 0; i < len; ++i) - listeners[i].call(self, arg1, arg2, arg3); - } -} - -function emitMany(handler, isFn, self, args) { - if (isFn) - handler.apply(self, args); - else { - var len = handler.length; - var listeners = arrayClone(handler, len); - for (var i = 0; i < len; ++i) - listeners[i].apply(self, args); - } -} - -EventEmitter.prototype.emit = function emit(type) { - var er, handler, len, args, i, events, domain; - var doError = (type === 'error'); - - events = this._events; - if (events) - doError = (doError && events.error == null); - else if (!doError) - return false; - - domain = this.domain; - - // If there is no 'error' event listener then throw. - if (doError) { - er = arguments[1]; - if (domain) { - if (!er) - er = new Error('Uncaught, unspecified "error" event'); - er.domainEmitter = this; - er.domain = domain; - er.domainThrown = false; - domain.emit('error', er); - } else if (er instanceof Error) { - throw er; // Unhandled 'error' event - } else { - // At least give some kind of context to the user - var err = new Error('Uncaught, unspecified "error" event. (' + er + ')'); - err.context = er; - throw err; - } - return false; - } - - handler = events[type]; - - if (!handler) - return false; - - var isFn = typeof handler === 'function'; - len = arguments.length; - switch (len) { - // fast cases - case 1: - emitNone(handler, isFn, this); - break; - case 2: - emitOne(handler, isFn, this, arguments[1]); - break; - case 3: - emitTwo(handler, isFn, this, arguments[1], arguments[2]); - break; - case 4: - emitThree(handler, isFn, this, arguments[1], arguments[2], arguments[3]); - break; - // slower - default: - args = new Array(len - 1); - for (i = 1; i < len; i++) - args[i - 1] = arguments[i]; - emitMany(handler, isFn, this, args); - } - - return true; -}; - -function _addListener(target, type, listener, prepend) { - var m; - var events; - var existing; - - if (typeof listener !== 'function') - throw new TypeError('"listener" argument must be a function'); - - events = target._events; - if (!events) { - events = target._events = new EventHandlers(); - target._eventsCount = 0; - } else { - // To avoid recursion in the case that type === "newListener"! Before - // adding it to the listeners, first emit "newListener". - if (events.newListener) { - target.emit('newListener', type, - listener.listener ? listener.listener : listener); - - // Re-assign `events` because a newListener handler could have caused the - // this._events to be assigned to a new object - events = target._events; - } - existing = events[type]; - } - - if (!existing) { - // Optimize the case of one listener. Don't need the extra array object. - existing = events[type] = listener; - ++target._eventsCount; - } else { - if (typeof existing === 'function') { - // Adding the second element, need to change to array. - existing = events[type] = prepend ? [listener, existing] : - [existing, listener]; - } else { - // If we've already got an array, just append. - if (prepend) { - existing.unshift(listener); - } else { - existing.push(listener); - } - } - - // Check for listener leak - if (!existing.warned) { - m = $getMaxListeners(target); - if (m && m > 0 && existing.length > m) { - existing.warned = true; - var w = new Error('Possible EventEmitter memory leak detected. ' + - existing.length + ' ' + type + ' listeners added. ' + - 'Use emitter.setMaxListeners() to increase limit'); - w.name = 'MaxListenersExceededWarning'; - w.emitter = target; - w.type = type; - w.count = existing.length; - emitWarning(w); - } - } - } - - return target; -} -function emitWarning(e) { - typeof console.warn === 'function' ? console.warn(e) : console.log(e); -} -EventEmitter.prototype.addListener = function addListener(type, listener) { - return _addListener(this, type, listener, false); -}; - -EventEmitter.prototype.on = EventEmitter.prototype.addListener; - -EventEmitter.prototype.prependListener = - function prependListener(type, listener) { - return _addListener(this, type, listener, true); - }; - -function _onceWrap(target, type, listener) { - var fired = false; - function g() { - target.removeListener(type, g); - if (!fired) { - fired = true; - listener.apply(target, arguments); - } - } - g.listener = listener; - return g; -} - -EventEmitter.prototype.once = function once(type, listener) { - if (typeof listener !== 'function') - throw new TypeError('"listener" argument must be a function'); - this.on(type, _onceWrap(this, type, listener)); - return this; -}; - -EventEmitter.prototype.prependOnceListener = - function prependOnceListener(type, listener) { - if (typeof listener !== 'function') - throw new TypeError('"listener" argument must be a function'); - this.prependListener(type, _onceWrap(this, type, listener)); - return this; - }; - -// emits a 'removeListener' event iff the listener was removed -EventEmitter.prototype.removeListener = - function removeListener(type, listener) { - var list, events, position, i, originalListener; - - if (typeof listener !== 'function') - throw new TypeError('"listener" argument must be a function'); - - events = this._events; - if (!events) - return this; - - list = events[type]; - if (!list) - return this; - - if (list === listener || (list.listener && list.listener === listener)) { - if (--this._eventsCount === 0) - this._events = new EventHandlers(); - else { - delete events[type]; - if (events.removeListener) - this.emit('removeListener', type, list.listener || listener); - } - } else if (typeof list !== 'function') { - position = -1; - - for (i = list.length; i-- > 0;) { - if (list[i] === listener || - (list[i].listener && list[i].listener === listener)) { - originalListener = list[i].listener; - position = i; - break; - } - } - - if (position < 0) - return this; - - if (list.length === 1) { - list[0] = undefined; - if (--this._eventsCount === 0) { - this._events = new EventHandlers(); - return this; - } else { - delete events[type]; - } - } else { - spliceOne(list, position); - } - - if (events.removeListener) - this.emit('removeListener', type, originalListener || listener); - } - - return this; - }; - -// Alias for removeListener added in NodeJS 10.0 -// https://nodejs.org/api/events.html#events_emitter_off_eventname_listener -EventEmitter.prototype.off = function(type, listener){ - return this.removeListener(type, listener); -}; - -EventEmitter.prototype.removeAllListeners = - function removeAllListeners(type) { - var listeners, events; - - events = this._events; - if (!events) - return this; - - // not listening for removeListener, no need to emit - if (!events.removeListener) { - if (arguments.length === 0) { - this._events = new EventHandlers(); - this._eventsCount = 0; - } else if (events[type]) { - if (--this._eventsCount === 0) - this._events = new EventHandlers(); - else - delete events[type]; - } - return this; - } - - // emit removeListener for all listeners on all events - if (arguments.length === 0) { - var keys = Object.keys(events); - for (var i = 0, key; i < keys.length; ++i) { - key = keys[i]; - if (key === 'removeListener') continue; - this.removeAllListeners(key); - } - this.removeAllListeners('removeListener'); - this._events = new EventHandlers(); - this._eventsCount = 0; - return this; - } - - listeners = events[type]; - - if (typeof listeners === 'function') { - this.removeListener(type, listeners); - } else if (listeners) { - // LIFO order - do { - this.removeListener(type, listeners[listeners.length - 1]); - } while (listeners[0]); - } - - return this; - }; - -EventEmitter.prototype.listeners = function listeners(type) { - var evlistener; - var ret; - var events = this._events; - - if (!events) - ret = []; - else { - evlistener = events[type]; - if (!evlistener) - ret = []; - else if (typeof evlistener === 'function') - ret = [evlistener.listener || evlistener]; - else - ret = unwrapListeners(evlistener); - } - - return ret; -}; - -EventEmitter.listenerCount = function(emitter, type) { - if (typeof emitter.listenerCount === 'function') { - return emitter.listenerCount(type); - } else { - return listenerCount.call(emitter, type); - } -}; - -EventEmitter.prototype.listenerCount = listenerCount; -function listenerCount(type) { - var events = this._events; - - if (events) { - var evlistener = events[type]; - - if (typeof evlistener === 'function') { - return 1; - } else if (evlistener) { - return evlistener.length; - } - } - - return 0; -} - -EventEmitter.prototype.eventNames = function eventNames() { - return this._eventsCount > 0 ? Reflect.ownKeys(this._events) : []; -}; - -// About 1.5x faster than the two-arg version of Array#splice(). -function spliceOne(list, index) { - for (var i = index, k = i + 1, n = list.length; k < n; i += 1, k += 1) - list[i] = list[k]; - list.pop(); -} - -function arrayClone(arr, i) { - var copy = new Array(i); - while (i--) - copy[i] = arr[i]; - return copy; -} - -function unwrapListeners(arr) { - var ret = new Array(arr.length); - for (var i = 0; i < ret.length; ++i) { - ret[i] = arr[i].listener || arr[i]; - } - return ret; -} - -var _polyfillNode_events = /*#__PURE__*/Object.freeze({ - __proto__: null, - EventEmitter: EventEmitter, - default: EventEmitter -}); - -var require$$1$1 = /*@__PURE__*/getAugmentedNamespace(_polyfillNode_events); - -var streamBrowser = require$$1$1.EventEmitter; - -var require$$0 = /*@__PURE__*/getAugmentedNamespace(_polyfillNode_buffer); - -var inherits$2; -if (typeof Object.create === 'function'){ - inherits$2 = function inherits(ctor, superCtor) { - // implementation from standard node.js 'util' module - ctor.super_ = superCtor; - ctor.prototype = Object.create(superCtor.prototype, { - constructor: { - value: ctor, - enumerable: false, - writable: true, - configurable: true - } - }); - }; -} else { - inherits$2 = function inherits(ctor, superCtor) { - ctor.super_ = superCtor; - var TempCtor = function () {}; - TempCtor.prototype = superCtor.prototype; - ctor.prototype = new TempCtor(); - ctor.prototype.constructor = ctor; - }; -} - -var getOwnPropertyDescriptors = Object.getOwnPropertyDescriptors || - function getOwnPropertyDescriptors(obj) { - var keys = Object.keys(obj); - var descriptors = {}; - for (var i = 0; i < keys.length; i++) { - descriptors[keys[i]] = Object.getOwnPropertyDescriptor(obj, keys[i]); - } - return descriptors; - }; - -var formatRegExp = /%[sdj%]/g; -function format(f) { - if (!isString(f)) { - var objects = []; - for (var i = 0; i < arguments.length; i++) { - objects.push(inspect$1(arguments[i])); - } - return objects.join(' '); - } - - var i = 1; - var args = arguments; - var len = args.length; - var str = String(f).replace(formatRegExp, function(x) { - if (x === '%%') return '%'; - if (i >= len) return x; - switch (x) { - case '%s': return String(args[i++]); - case '%d': return Number(args[i++]); - case '%j': - try { - return JSON.stringify(args[i++]); - } catch (_) { - return '[Circular]'; - } - default: - return x; - } - }); - for (var x = args[i]; i < len; x = args[++i]) { - if (isNull(x) || !isObject(x)) { - str += ' ' + x; - } else { - str += ' ' + inspect$1(x); - } - } - return str; -} - -// Mark that a method should not be used. -// Returns a modified function which warns once by default. -// If --no-deprecation is set, then it is a no-op. -function deprecate$1(fn, msg) { - // Allow for deprecating things in the process of starting up. - if (isUndefined(global$1.process)) { - return function() { - return deprecate$1(fn, msg).apply(this, arguments); - }; - } - - if (browser$1$1.noDeprecation === true) { - return fn; - } - - var warned = false; - function deprecated() { - if (!warned) { - if (browser$1$1.throwDeprecation) { - throw new Error(msg); - } else if (browser$1$1.traceDeprecation) { - console.trace(msg); - } else { - console.error(msg); - } - warned = true; - } - return fn.apply(this, arguments); - } - - return deprecated; -} - -var debugs = {}; -var debugEnviron; -function debuglog(set) { - if (isUndefined(debugEnviron)) - debugEnviron = browser$1$1.env.NODE_DEBUG || ''; - set = set.toUpperCase(); - if (!debugs[set]) { - if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) { - var pid = 0; - debugs[set] = function() { - var msg = format.apply(null, arguments); - console.error('%s %d: %s', set, pid, msg); - }; - } else { - debugs[set] = function() {}; - } - } - return debugs[set]; -} - -/** - * Echos the value of a value. Trys to print the value out - * in the best way possible given the different types. - * - * @param {Object} obj The object to print out. - * @param {Object} opts Optional options object that alters the output. - */ -/* legacy: obj, showHidden, depth, colors*/ -function inspect$1(obj, opts) { - // default options - var ctx = { - seen: [], - stylize: stylizeNoColor - }; - // legacy... - if (arguments.length >= 3) ctx.depth = arguments[2]; - if (arguments.length >= 4) ctx.colors = arguments[3]; - if (isBoolean(opts)) { - // legacy... - ctx.showHidden = opts; - } else if (opts) { - // got an "options" object - _extend(ctx, opts); - } - // set default options - if (isUndefined(ctx.showHidden)) ctx.showHidden = false; - if (isUndefined(ctx.depth)) ctx.depth = 2; - if (isUndefined(ctx.colors)) ctx.colors = false; - if (isUndefined(ctx.customInspect)) ctx.customInspect = true; - if (ctx.colors) ctx.stylize = stylizeWithColor; - return formatValue(ctx, obj, ctx.depth); -} - -// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics -inspect$1.colors = { - 'bold' : [1, 22], - 'italic' : [3, 23], - 'underline' : [4, 24], - 'inverse' : [7, 27], - 'white' : [37, 39], - 'grey' : [90, 39], - 'black' : [30, 39], - 'blue' : [34, 39], - 'cyan' : [36, 39], - 'green' : [32, 39], - 'magenta' : [35, 39], - 'red' : [31, 39], - 'yellow' : [33, 39] -}; - -// Don't use 'blue' not visible on cmd.exe -inspect$1.styles = { - 'special': 'cyan', - 'number': 'yellow', - 'boolean': 'yellow', - 'undefined': 'grey', - 'null': 'bold', - 'string': 'green', - 'date': 'magenta', - // "name": intentionally not styling - 'regexp': 'red' -}; - - -function stylizeWithColor(str, styleType) { - var style = inspect$1.styles[styleType]; - - if (style) { - return '\u001b[' + inspect$1.colors[style][0] + 'm' + str + - '\u001b[' + inspect$1.colors[style][1] + 'm'; - } else { - return str; - } -} - - -function stylizeNoColor(str, styleType) { - return str; -} - - -function arrayToHash(array) { - var hash = {}; - - array.forEach(function(val, idx) { - hash[val] = true; - }); - - return hash; -} - - -function formatValue(ctx, value, recurseTimes) { - // Provide a hook for user-specified inspect functions. - // Check that value is an object with an inspect function on it - if (ctx.customInspect && - value && - isFunction(value.inspect) && - // Filter out the util module, it's inspect function is special - value.inspect !== inspect$1 && - // Also filter out any prototype objects using the circular check. - !(value.constructor && value.constructor.prototype === value)) { - var ret = value.inspect(recurseTimes, ctx); - if (!isString(ret)) { - ret = formatValue(ctx, ret, recurseTimes); - } - return ret; - } - - // Primitive types cannot have properties - var primitive = formatPrimitive(ctx, value); - if (primitive) { - return primitive; - } - - // Look up the keys of the object. - var keys = Object.keys(value); - var visibleKeys = arrayToHash(keys); - - if (ctx.showHidden) { - keys = Object.getOwnPropertyNames(value); - } - - // IE doesn't make error fields non-enumerable - // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx - if (isError(value) - && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) { - return formatError(value); - } - - // Some type of object without properties can be shortcutted. - if (keys.length === 0) { - if (isFunction(value)) { - var name = value.name ? ': ' + value.name : ''; - return ctx.stylize('[Function' + name + ']', 'special'); - } - if (isRegExp(value)) { - return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); - } - if (isDate(value)) { - return ctx.stylize(Date.prototype.toString.call(value), 'date'); - } - if (isError(value)) { - return formatError(value); - } - } - - var base = '', array = false, braces = ['{', '}']; - - // Make Array say that they are Array - if (isArray(value)) { - array = true; - braces = ['[', ']']; - } - - // Make functions say that they are functions - if (isFunction(value)) { - var n = value.name ? ': ' + value.name : ''; - base = ' [Function' + n + ']'; - } - - // Make RegExps say that they are RegExps - if (isRegExp(value)) { - base = ' ' + RegExp.prototype.toString.call(value); - } - - // Make dates with properties first say the date - if (isDate(value)) { - base = ' ' + Date.prototype.toUTCString.call(value); - } - - // Make error with message first say the error - if (isError(value)) { - base = ' ' + formatError(value); - } - - if (keys.length === 0 && (!array || value.length == 0)) { - return braces[0] + base + braces[1]; - } - - if (recurseTimes < 0) { - if (isRegExp(value)) { - return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); - } else { - return ctx.stylize('[Object]', 'special'); - } - } - - ctx.seen.push(value); - - var output; - if (array) { - output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); - } else { - output = keys.map(function(key) { - return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); - }); - } - - ctx.seen.pop(); - - return reduceToSingleString(output, base, braces); -} - - -function formatPrimitive(ctx, value) { - if (isUndefined(value)) - return ctx.stylize('undefined', 'undefined'); - if (isString(value)) { - var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') - .replace(/'/g, "\\'") - .replace(/\\"/g, '"') + '\''; - return ctx.stylize(simple, 'string'); - } - if (isNumber(value)) - return ctx.stylize('' + value, 'number'); - if (isBoolean(value)) - return ctx.stylize('' + value, 'boolean'); - // For some reason typeof null is "object", so special case here. - if (isNull(value)) - return ctx.stylize('null', 'null'); -} - - -function formatError(value) { - return '[' + Error.prototype.toString.call(value) + ']'; -} - - -function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { - var output = []; - for (var i = 0, l = value.length; i < l; ++i) { - if (hasOwnProperty(value, String(i))) { - output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, - String(i), true)); - } else { - output.push(''); - } - } - keys.forEach(function(key) { - if (!key.match(/^\d+$/)) { - output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, - key, true)); - } - }); - return output; -} - - -function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { - var name, str, desc; - desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] }; - if (desc.get) { - if (desc.set) { - str = ctx.stylize('[Getter/Setter]', 'special'); - } else { - str = ctx.stylize('[Getter]', 'special'); - } - } else { - if (desc.set) { - str = ctx.stylize('[Setter]', 'special'); - } - } - if (!hasOwnProperty(visibleKeys, key)) { - name = '[' + key + ']'; - } - if (!str) { - if (ctx.seen.indexOf(desc.value) < 0) { - if (isNull(recurseTimes)) { - str = formatValue(ctx, desc.value, null); - } else { - str = formatValue(ctx, desc.value, recurseTimes - 1); - } - if (str.indexOf('\n') > -1) { - if (array) { - str = str.split('\n').map(function(line) { - return ' ' + line; - }).join('\n').substr(2); - } else { - str = '\n' + str.split('\n').map(function(line) { - return ' ' + line; - }).join('\n'); - } - } - } else { - str = ctx.stylize('[Circular]', 'special'); - } - } - if (isUndefined(name)) { - if (array && key.match(/^\d+$/)) { - return str; - } - name = JSON.stringify('' + key); - if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { - name = name.substr(1, name.length - 2); - name = ctx.stylize(name, 'name'); - } else { - name = name.replace(/'/g, "\\'") - .replace(/\\"/g, '"') - .replace(/(^"|"$)/g, "'"); - name = ctx.stylize(name, 'string'); - } - } - - return name + ': ' + str; -} - - -function reduceToSingleString(output, base, braces) { - var length = output.reduce(function(prev, cur) { - if (cur.indexOf('\n') >= 0) ; - return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1; - }, 0); - - if (length > 60) { - return braces[0] + - (base === '' ? '' : base + '\n ') + - ' ' + - output.join(',\n ') + - ' ' + - braces[1]; - } - - return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; -} - - -// NOTE: These type checking functions intentionally don't use `instanceof` -// because it is fragile and can be easily faked with `Object.create()`. -function isArray(ar) { - return Array.isArray(ar); -} - -function isBoolean(arg) { - return typeof arg === 'boolean'; -} - -function isNull(arg) { - return arg === null; -} - -function isNullOrUndefined(arg) { - return arg == null; -} - -function isNumber(arg) { - return typeof arg === 'number'; -} - -function isString(arg) { - return typeof arg === 'string'; -} - -function isSymbol(arg) { - return typeof arg === 'symbol'; -} - -function isUndefined(arg) { - return arg === void 0; -} - -function isRegExp(re) { - return isObject(re) && objectToString(re) === '[object RegExp]'; -} - -function isObject(arg) { - return typeof arg === 'object' && arg !== null; -} - -function isDate(d) { - return isObject(d) && objectToString(d) === '[object Date]'; -} - -function isError(e) { - return isObject(e) && - (objectToString(e) === '[object Error]' || e instanceof Error); -} - -function isFunction(arg) { - return typeof arg === 'function'; -} - -function isPrimitive(arg) { - return arg === null || - typeof arg === 'boolean' || - typeof arg === 'number' || - typeof arg === 'string' || - typeof arg === 'symbol' || // ES6 symbol - typeof arg === 'undefined'; -} - -function isBuffer(maybeBuf) { - return Buffer$2.isBuffer(maybeBuf); -} - -function objectToString(o) { - return Object.prototype.toString.call(o); -} - - -function pad$1(n) { - return n < 10 ? '0' + n.toString(10) : n.toString(10); -} - - -var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', - 'Oct', 'Nov', 'Dec']; - -// 26 Feb 16:19:34 -function timestamp() { - var d = new Date(); - var time = [pad$1(d.getHours()), - pad$1(d.getMinutes()), - pad$1(d.getSeconds())].join(':'); - return [d.getDate(), months[d.getMonth()], time].join(' '); -} - - -// log is just a thin wrapper to console.log that prepends a timestamp -function log() { - console.log('%s - %s', timestamp(), format.apply(null, arguments)); -} - -function _extend(origin, add) { - // Don't do anything if add isn't an object - if (!add || !isObject(add)) return origin; - - var keys = Object.keys(add); - var i = keys.length; - while (i--) { - origin[keys[i]] = add[keys[i]]; - } - return origin; -} -function hasOwnProperty(obj, prop) { - return Object.prototype.hasOwnProperty.call(obj, prop); -} - -var kCustomPromisifiedSymbol = typeof Symbol !== 'undefined' ? Symbol('util.promisify.custom') : undefined; - -function promisify(original) { - if (typeof original !== 'function') - throw new TypeError('The "original" argument must be of type Function'); - - if (kCustomPromisifiedSymbol && original[kCustomPromisifiedSymbol]) { - var fn = original[kCustomPromisifiedSymbol]; - if (typeof fn !== 'function') { - throw new TypeError('The "util.promisify.custom" argument must be of type Function'); - } - Object.defineProperty(fn, kCustomPromisifiedSymbol, { - value: fn, enumerable: false, writable: false, configurable: true - }); - return fn; - } - - function fn() { - var promiseResolve, promiseReject; - var promise = new Promise(function (resolve, reject) { - promiseResolve = resolve; - promiseReject = reject; - }); - - var args = []; - for (var i = 0; i < arguments.length; i++) { - args.push(arguments[i]); - } - args.push(function (err, value) { - if (err) { - promiseReject(err); - } else { - promiseResolve(value); - } - }); - - try { - original.apply(this, args); - } catch (err) { - promiseReject(err); - } - - return promise; - } - - Object.setPrototypeOf(fn, Object.getPrototypeOf(original)); - - if (kCustomPromisifiedSymbol) Object.defineProperty(fn, kCustomPromisifiedSymbol, { - value: fn, enumerable: false, writable: false, configurable: true - }); - return Object.defineProperties( - fn, - getOwnPropertyDescriptors(original) - ); -} - -promisify.custom = kCustomPromisifiedSymbol; - -function callbackifyOnRejected(reason, cb) { - // `!reason` guard inspired by bluebird (Ref: https://goo.gl/t5IS6M). - // Because `null` is a special error value in callbacks which means "no error - // occurred", we error-wrap so the callback consumer can distinguish between - // "the promise rejected with null" or "the promise fulfilled with undefined". - if (!reason) { - var newReason = new Error('Promise was rejected with a falsy value'); - newReason.reason = reason; - reason = newReason; - } - return cb(reason); -} - -function callbackify(original) { - if (typeof original !== 'function') { - throw new TypeError('The "original" argument must be of type Function'); - } - - // We DO NOT return the promise as it gives the user a false sense that - // the promise is actually somehow related to the callback's execution - // and that the callback throwing will reject the promise. - function callbackified() { - var args = []; - for (var i = 0; i < arguments.length; i++) { - args.push(arguments[i]); - } - - var maybeCb = args.pop(); - if (typeof maybeCb !== 'function') { - throw new TypeError('The last argument must be of type Function'); - } - var self = this; - var cb = function() { - return maybeCb.apply(self, arguments); - }; - // In true node style we process the callback on `nextTick` with all the - // implications (stack, `uncaughtException`, `async_hooks`) - original.apply(this, args) - .then(function(ret) { browser$1$1.nextTick(cb.bind(null, null, ret)); }, - function(rej) { browser$1$1.nextTick(callbackifyOnRejected.bind(null, rej, cb)); }); - } - - Object.setPrototypeOf(callbackified, Object.getPrototypeOf(original)); - Object.defineProperties(callbackified, getOwnPropertyDescriptors(original)); - return callbackified; -} - -var _polyfillNode_util = { - inherits: inherits$2, - _extend: _extend, - log: log, - isBuffer: isBuffer, - isPrimitive: isPrimitive, - isFunction: isFunction, - isError: isError, - isDate: isDate, - isObject: isObject, - isRegExp: isRegExp, - isUndefined: isUndefined, - isSymbol: isSymbol, - isString: isString, - isNumber: isNumber, - isNullOrUndefined: isNullOrUndefined, - isNull: isNull, - isBoolean: isBoolean, - isArray: isArray, - inspect: inspect$1, - deprecate: deprecate$1, - format: format, - debuglog: debuglog, - promisify: promisify, - callbackify: callbackify, -}; - -var _polyfillNode_util$1 = /*#__PURE__*/Object.freeze({ - __proto__: null, - _extend: _extend, - callbackify: callbackify, - debuglog: debuglog, - default: _polyfillNode_util, - deprecate: deprecate$1, - format: format, - inherits: inherits$2, - inspect: inspect$1, - isArray: isArray, - isBoolean: isBoolean, - isBuffer: isBuffer, - isDate: isDate, - isError: isError, - isFunction: isFunction, - isNull: isNull, - isNullOrUndefined: isNullOrUndefined, - isNumber: isNumber, - isObject: isObject, - isPrimitive: isPrimitive, - isRegExp: isRegExp, - isString: isString, - isSymbol: isSymbol, - isUndefined: isUndefined, - log: log, - promisify: promisify -}); - -var require$$3 = /*@__PURE__*/getAugmentedNamespace(_polyfillNode_util$1); - -var buffer_list; -var hasRequiredBuffer_list; -function requireBuffer_list() { - if (hasRequiredBuffer_list) return buffer_list; - hasRequiredBuffer_list = 1; - function ownKeys(object, enumerableOnly) { - var keys = Object.keys(object); - if (Object.getOwnPropertySymbols) { - var symbols = Object.getOwnPropertySymbols(object); - if (enumerableOnly) symbols = symbols.filter(function (sym) { - return Object.getOwnPropertyDescriptor(object, sym).enumerable; - }); - keys.push.apply(keys, symbols); - } - return keys; - } - function _objectSpread(target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i] != null ? arguments[i] : {}; - if (i % 2) { - ownKeys(Object(source), true).forEach(function (key) { - _defineProperty(target, key, source[key]); - }); - } else if (Object.getOwnPropertyDescriptors) { - Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); - } else { - ownKeys(Object(source)).forEach(function (key) { - Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); - }); - } - } - return target; - } - function _defineProperty(obj, key, value) { - if (key in obj) { - Object.defineProperty(obj, key, { - value: value, - enumerable: true, - configurable: true, - writable: true - }); - } else { - obj[key] = value; - } - return obj; - } - function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } - } - function _defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } - } - function _createClass(Constructor, protoProps, staticProps) { - if (protoProps) _defineProperties(Constructor.prototype, protoProps); - return Constructor; - } - var _require = require$$0, - Buffer = _require.Buffer; - var _require2 = require$$3, - inspect = _require2.inspect; - var custom = inspect && inspect.custom || 'inspect'; - function copyBuffer(src, target, offset) { - Buffer.prototype.copy.call(src, target, offset); - } - buffer_list = /*#__PURE__*/ - function () { - function BufferList() { - _classCallCheck(this, BufferList); - this.head = null; - this.tail = null; - this.length = 0; - } - _createClass(BufferList, [{ - key: "push", - value: function push(v) { - var entry = { - data: v, - next: null - }; - if (this.length > 0) this.tail.next = entry;else this.head = entry; - this.tail = entry; - ++this.length; - } - }, { - key: "unshift", - value: function unshift(v) { - var entry = { - data: v, - next: this.head - }; - if (this.length === 0) this.tail = entry; - this.head = entry; - ++this.length; - } - }, { - key: "shift", - value: function shift() { - if (this.length === 0) return; - var ret = this.head.data; - if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next; - --this.length; - return ret; - } - }, { - key: "clear", - value: function clear() { - this.head = this.tail = null; - this.length = 0; - } - }, { - key: "join", - value: function join(s) { - if (this.length === 0) return ''; - var p = this.head; - var ret = '' + p.data; - while (p = p.next) { - ret += s + p.data; - } - return ret; - } - }, { - key: "concat", - value: function concat(n) { - if (this.length === 0) return Buffer.alloc(0); - var ret = Buffer.allocUnsafe(n >>> 0); - var p = this.head; - var i = 0; - while (p) { - copyBuffer(p.data, ret, i); - i += p.data.length; - p = p.next; - } - return ret; - } // Consumes a specified amount of bytes or characters from the buffered data. - }, { - key: "consume", - value: function consume(n, hasStrings) { - var ret; - if (n < this.head.data.length) { - // `slice` is the same for buffers and strings. - ret = this.head.data.slice(0, n); - this.head.data = this.head.data.slice(n); - } else if (n === this.head.data.length) { - // First chunk is a perfect match. - ret = this.shift(); - } else { - // Result spans more than one buffer. - ret = hasStrings ? this._getString(n) : this._getBuffer(n); - } - return ret; - } - }, { - key: "first", - value: function first() { - return this.head.data; - } // Consumes a specified amount of characters from the buffered data. - }, { - key: "_getString", - value: function _getString(n) { - var p = this.head; - var c = 1; - var ret = p.data; - n -= ret.length; - while (p = p.next) { - var str = p.data; - var nb = n > str.length ? str.length : n; - if (nb === str.length) ret += str;else ret += str.slice(0, n); - n -= nb; - if (n === 0) { - if (nb === str.length) { - ++c; - if (p.next) this.head = p.next;else this.head = this.tail = null; - } else { - this.head = p; - p.data = str.slice(nb); - } - break; - } - ++c; - } - this.length -= c; - return ret; - } // Consumes a specified amount of bytes from the buffered data. - }, { - key: "_getBuffer", - value: function _getBuffer(n) { - var ret = Buffer.allocUnsafe(n); - var p = this.head; - var c = 1; - p.data.copy(ret); - n -= p.data.length; - while (p = p.next) { - var buf = p.data; - var nb = n > buf.length ? buf.length : n; - buf.copy(ret, ret.length - n, 0, nb); - n -= nb; - if (n === 0) { - if (nb === buf.length) { - ++c; - if (p.next) this.head = p.next;else this.head = this.tail = null; - } else { - this.head = p; - p.data = buf.slice(nb); - } - break; - } - ++c; - } - this.length -= c; - return ret; - } // Make sure the linked list only shows the minimal necessary information. - }, { - key: custom, - value: function value(_, options) { - return inspect(this, _objectSpread({}, options, { - // Only inspect one level. - depth: 0, - // It should not recurse. - customInspect: false - })); - } - }]); - return BufferList; - }(); - return buffer_list; -} - -function destroy(err, cb) { - var _this = this; - var readableDestroyed = this._readableState && this._readableState.destroyed; - var writableDestroyed = this._writableState && this._writableState.destroyed; - if (readableDestroyed || writableDestroyed) { - if (cb) { - cb(err); - } else if (err) { - if (!this._writableState) { - browser$1$1.nextTick(emitErrorNT, this, err); - } else if (!this._writableState.errorEmitted) { - this._writableState.errorEmitted = true; - browser$1$1.nextTick(emitErrorNT, this, err); - } - } - return this; - } // we set destroyed to true before firing error callbacks in order - // to make it re-entrance safe in case destroy() is called within callbacks - - if (this._readableState) { - this._readableState.destroyed = true; - } // if this is a duplex stream mark the writable part as destroyed as well - - if (this._writableState) { - this._writableState.destroyed = true; - } - this._destroy(err || null, function (err) { - if (!cb && err) { - if (!_this._writableState) { - browser$1$1.nextTick(emitErrorAndCloseNT, _this, err); - } else if (!_this._writableState.errorEmitted) { - _this._writableState.errorEmitted = true; - browser$1$1.nextTick(emitErrorAndCloseNT, _this, err); - } else { - browser$1$1.nextTick(emitCloseNT, _this); - } - } else if (cb) { - browser$1$1.nextTick(emitCloseNT, _this); - cb(err); - } else { - browser$1$1.nextTick(emitCloseNT, _this); - } - }); - return this; -} -function emitErrorAndCloseNT(self, err) { - emitErrorNT(self, err); - emitCloseNT(self); -} -function emitCloseNT(self) { - if (self._writableState && !self._writableState.emitClose) return; - if (self._readableState && !self._readableState.emitClose) return; - self.emit('close'); -} -function undestroy() { - if (this._readableState) { - this._readableState.destroyed = false; - this._readableState.reading = false; - this._readableState.ended = false; - this._readableState.endEmitted = false; - } - if (this._writableState) { - this._writableState.destroyed = false; - this._writableState.ended = false; - this._writableState.ending = false; - this._writableState.finalCalled = false; - this._writableState.prefinished = false; - this._writableState.finished = false; - this._writableState.errorEmitted = false; - } -} -function emitErrorNT(self, err) { - self.emit('error', err); -} -function errorOrDestroy$2(stream, err) { - // We have tests that rely on errors being emitted - // in the same tick, so changing this is semver major. - // For now when you opt-in to autoDestroy we allow - // the error to be emitted nextTick. In a future - // semver major update we should change the default to this. - var rState = stream._readableState; - var wState = stream._writableState; - if (rState && rState.autoDestroy || wState && wState.autoDestroy) stream.destroy(err);else stream.emit('error', err); -} -var destroy_1 = { - destroy: destroy, - undestroy: undestroy, - errorOrDestroy: errorOrDestroy$2 -}; - -var errorsBrowser = {}; - -function _inheritsLoose(subClass, superClass) { - subClass.prototype = Object.create(superClass.prototype); - subClass.prototype.constructor = subClass; - subClass.__proto__ = superClass; -} -var codes = {}; -function createErrorType(code, message, Base) { - if (!Base) { - Base = Error; - } - function getMessage(arg1, arg2, arg3) { - if (typeof message === 'string') { - return message; - } else { - return message(arg1, arg2, arg3); - } - } - var NodeError = /*#__PURE__*/ - function (_Base) { - _inheritsLoose(NodeError, _Base); - function NodeError(arg1, arg2, arg3) { - return _Base.call(this, getMessage(arg1, arg2, arg3)) || this; - } - return NodeError; - }(Base); - NodeError.prototype.name = Base.name; - NodeError.prototype.code = code; - codes[code] = NodeError; -} // https://github.com/nodejs/node/blob/v10.8.0/lib/internal/errors.js - -function oneOf(expected, thing) { - if (Array.isArray(expected)) { - var len = expected.length; - expected = expected.map(function (i) { - return String(i); - }); - if (len > 2) { - return "one of ".concat(thing, " ").concat(expected.slice(0, len - 1).join(', '), ", or ") + expected[len - 1]; - } else if (len === 2) { - return "one of ".concat(thing, " ").concat(expected[0], " or ").concat(expected[1]); - } else { - return "of ".concat(thing, " ").concat(expected[0]); - } - } else { - return "of ".concat(thing, " ").concat(String(expected)); - } -} // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith - -function startsWith(str, search, pos) { - return str.substr(0 , search.length) === search; -} // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith - -function endsWith(str, search, this_len) { - if (this_len === undefined || this_len > str.length) { - this_len = str.length; - } - return str.substring(this_len - search.length, this_len) === search; -} // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes - -function includes(str, search, start) { - if (typeof start !== 'number') { - start = 0; - } - if (start + search.length > str.length) { - return false; - } else { - return str.indexOf(search, start) !== -1; - } -} -createErrorType('ERR_INVALID_OPT_VALUE', function (name, value) { - return 'The value "' + value + '" is invalid for option "' + name + '"'; -}, TypeError); -createErrorType('ERR_INVALID_ARG_TYPE', function (name, expected, actual) { - // determiner: 'must be' or 'must not be' - var determiner; - if (typeof expected === 'string' && startsWith(expected, 'not ')) { - determiner = 'must not be'; - expected = expected.replace(/^not /, ''); - } else { - determiner = 'must be'; - } - var msg; - if (endsWith(name, ' argument')) { - // For cases like 'first argument' - msg = "The ".concat(name, " ").concat(determiner, " ").concat(oneOf(expected, 'type')); - } else { - var type = includes(name, '.') ? 'property' : 'argument'; - msg = "The \"".concat(name, "\" ").concat(type, " ").concat(determiner, " ").concat(oneOf(expected, 'type')); - } - msg += ". Received type ".concat(typeof actual); - return msg; -}, TypeError); -createErrorType('ERR_STREAM_PUSH_AFTER_EOF', 'stream.push() after EOF'); -createErrorType('ERR_METHOD_NOT_IMPLEMENTED', function (name) { - return 'The ' + name + ' method is not implemented'; -}); -createErrorType('ERR_STREAM_PREMATURE_CLOSE', 'Premature close'); -createErrorType('ERR_STREAM_DESTROYED', function (name) { - return 'Cannot call ' + name + ' after a stream was destroyed'; -}); -createErrorType('ERR_MULTIPLE_CALLBACK', 'Callback called multiple times'); -createErrorType('ERR_STREAM_CANNOT_PIPE', 'Cannot pipe, not readable'); -createErrorType('ERR_STREAM_WRITE_AFTER_END', 'write after end'); -createErrorType('ERR_STREAM_NULL_VALUES', 'May not write null values to stream', TypeError); -createErrorType('ERR_UNKNOWN_ENCODING', function (arg) { - return 'Unknown encoding: ' + arg; -}, TypeError); -createErrorType('ERR_STREAM_UNSHIFT_AFTER_END_EVENT', 'stream.unshift() after end event'); -errorsBrowser.codes = codes; - -var ERR_INVALID_OPT_VALUE = errorsBrowser.codes.ERR_INVALID_OPT_VALUE; -function highWaterMarkFrom(options, isDuplex, duplexKey) { - return options.highWaterMark != null ? options.highWaterMark : isDuplex ? options[duplexKey] : null; -} -function getHighWaterMark$2(state, options, duplexKey, isDuplex) { - var hwm = highWaterMarkFrom(options, isDuplex, duplexKey); - if (hwm != null) { - if (!(isFinite(hwm) && Math.floor(hwm) === hwm) || hwm < 0) { - var name = isDuplex ? duplexKey : 'highWaterMark'; - throw new ERR_INVALID_OPT_VALUE(name, hwm); - } - return Math.floor(hwm); - } // Default value - - return state.objectMode ? 16 : 16 * 1024; -} -var state = { - getHighWaterMark: getHighWaterMark$2 -}; - -var inherits; -if (typeof Object.create === 'function'){ - inherits = function inherits(ctor, superCtor) { - // implementation from standard node.js 'util' module - ctor.super_ = superCtor; - ctor.prototype = Object.create(superCtor.prototype, { - constructor: { - value: ctor, - enumerable: false, - writable: true, - configurable: true - } - }); - }; -} else { - inherits = function inherits(ctor, superCtor) { - ctor.super_ = superCtor; - var TempCtor = function () {}; - TempCtor.prototype = superCtor.prototype; - ctor.prototype = new TempCtor(); - ctor.prototype.constructor = ctor; - }; -} -var inherits$1 = inherits; - -var _polyfillNode_inherits = /*#__PURE__*/Object.freeze({ - __proto__: null, - default: inherits$1 -}); - -var require$$1 = /*@__PURE__*/getAugmentedNamespace(_polyfillNode_inherits); - -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -var isBufferEncoding = Buffer$2.isEncoding - || function(encoding) { - switch (encoding && encoding.toLowerCase()) { - case 'hex': case 'utf8': case 'utf-8': case 'ascii': case 'binary': case 'base64': case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': case 'raw': return true; - default: return false; - } - }; - - -function assertEncoding(encoding) { - if (encoding && !isBufferEncoding(encoding)) { - throw new Error('Unknown encoding: ' + encoding); - } -} - -// StringDecoder provides an interface for efficiently splitting a series of -// buffers into a series of JS strings without breaking apart multi-byte -// characters. CESU-8 is handled as part of the UTF-8 encoding. -// -// @TODO Handling all encodings inside a single object makes it very difficult -// to reason about this code, so it should be split up in the future. -// @TODO There should be a utf8-strict encoding that rejects invalid UTF-8 code -// points as used by CESU-8. -function StringDecoder$1(encoding) { - this.encoding = (encoding || 'utf8').toLowerCase().replace(/[-_]/, ''); - assertEncoding(encoding); - switch (this.encoding) { - case 'utf8': - // CESU-8 represents each of Surrogate Pair by 3-bytes - this.surrogateSize = 3; - break; - case 'ucs2': - case 'utf16le': - // UTF-16 represents each of Surrogate Pair by 2-bytes - this.surrogateSize = 2; - this.detectIncompleteChar = utf16DetectIncompleteChar; - break; - case 'base64': - // Base-64 stores 3 bytes in 4 chars, and pads the remainder. - this.surrogateSize = 3; - this.detectIncompleteChar = base64DetectIncompleteChar; - break; - default: - this.write = passThroughWrite; - return; - } - - // Enough space to store all bytes of a single character. UTF-8 needs 4 - // bytes, but CESU-8 may require up to 6 (3 bytes per surrogate). - this.charBuffer = new Buffer$2(6); - // Number of bytes received for the current incomplete multi-byte character. - this.charReceived = 0; - // Number of bytes expected for the current incomplete multi-byte character. - this.charLength = 0; -} - -// write decodes the given buffer and returns it as JS string that is -// guaranteed to not contain any partial multi-byte characters. Any partial -// character found at the end of the buffer is buffered up, and will be -// returned when calling write again with the remaining bytes. -// -// Note: Converting a Buffer containing an orphan surrogate to a String -// currently works, but converting a String to a Buffer (via `new Buffer`, or -// Buffer#write) will replace incomplete surrogates with the unicode -// replacement character. See https://codereview.chromium.org/121173009/ . -StringDecoder$1.prototype.write = function(buffer) { - var charStr = ''; - // if our last write ended with an incomplete multibyte character - while (this.charLength) { - // determine how many remaining bytes this buffer has to offer for this char - var available = (buffer.length >= this.charLength - this.charReceived) ? - this.charLength - this.charReceived : - buffer.length; - - // add the new bytes to the char buffer - buffer.copy(this.charBuffer, this.charReceived, 0, available); - this.charReceived += available; - - if (this.charReceived < this.charLength) { - // still not enough chars in this buffer? wait for more ... - return ''; - } - - // remove bytes belonging to the current character from the buffer - buffer = buffer.slice(available, buffer.length); - - // get the character that was split - charStr = this.charBuffer.slice(0, this.charLength).toString(this.encoding); - - // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character - var charCode = charStr.charCodeAt(charStr.length - 1); - if (charCode >= 0xD800 && charCode <= 0xDBFF) { - this.charLength += this.surrogateSize; - charStr = ''; - continue; - } - this.charReceived = this.charLength = 0; - - // if there are no more bytes in this buffer, just emit our char - if (buffer.length === 0) { - return charStr; - } - break; - } - - // determine and set charLength / charReceived - this.detectIncompleteChar(buffer); - - var end = buffer.length; - if (this.charLength) { - // buffer the incomplete character bytes we got - buffer.copy(this.charBuffer, 0, buffer.length - this.charReceived, end); - end -= this.charReceived; - } - - charStr += buffer.toString(this.encoding, 0, end); - - var end = charStr.length - 1; - var charCode = charStr.charCodeAt(end); - // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character - if (charCode >= 0xD800 && charCode <= 0xDBFF) { - var size = this.surrogateSize; - this.charLength += size; - this.charReceived += size; - this.charBuffer.copy(this.charBuffer, size, 0, size); - buffer.copy(this.charBuffer, 0, 0, size); - return charStr.substring(0, end); - } - - // or just emit the charStr - return charStr; -}; - -// detectIncompleteChar determines if there is an incomplete UTF-8 character at -// the end of the given buffer. If so, it sets this.charLength to the byte -// length that character, and sets this.charReceived to the number of bytes -// that are available for this character. -StringDecoder$1.prototype.detectIncompleteChar = function(buffer) { - // determine how many bytes we have to check at the end of this buffer - var i = (buffer.length >= 3) ? 3 : buffer.length; - - // Figure out if one of the last i bytes of our buffer announces an - // incomplete char. - for (; i > 0; i--) { - var c = buffer[buffer.length - i]; - - // See http://en.wikipedia.org/wiki/UTF-8#Description - - // 110XXXXX - if (i == 1 && c >> 5 == 0x06) { - this.charLength = 2; - break; - } - - // 1110XXXX - if (i <= 2 && c >> 4 == 0x0E) { - this.charLength = 3; - break; - } - - // 11110XXX - if (i <= 3 && c >> 3 == 0x1E) { - this.charLength = 4; - break; - } - } - this.charReceived = i; -}; - -StringDecoder$1.prototype.end = function(buffer) { - var res = ''; - if (buffer && buffer.length) - res = this.write(buffer); - - if (this.charReceived) { - var cr = this.charReceived; - var buf = this.charBuffer; - var enc = this.encoding; - res += buf.slice(0, cr).toString(enc); - } - - return res; -}; - -function passThroughWrite(buffer) { - return buffer.toString(this.encoding); -} - -function utf16DetectIncompleteChar(buffer) { - this.charReceived = buffer.length % 2; - this.charLength = this.charReceived ? 2 : 0; -} - -function base64DetectIncompleteChar(buffer) { - this.charReceived = buffer.length % 3; - this.charLength = this.charReceived ? 3 : 0; -} - -var _polyfillNode_string_decoder = /*#__PURE__*/Object.freeze({ - __proto__: null, - StringDecoder: StringDecoder$1 -}); - -var require$$10 = /*@__PURE__*/getAugmentedNamespace(_polyfillNode_string_decoder); - -var ERR_STREAM_PREMATURE_CLOSE = errorsBrowser.codes.ERR_STREAM_PREMATURE_CLOSE; -function once$1(callback) { - var called = false; - return function () { - if (called) return; - called = true; - for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - callback.apply(this, args); - }; -} -function noop$1() {} -function isRequest$1(stream) { - return stream.setHeader && typeof stream.abort === 'function'; -} -function eos$1(stream, opts, callback) { - if (typeof opts === 'function') return eos$1(stream, null, opts); - if (!opts) opts = {}; - callback = once$1(callback || noop$1); - var readable = opts.readable || opts.readable !== false && stream.readable; - var writable = opts.writable || opts.writable !== false && stream.writable; - var onlegacyfinish = function onlegacyfinish() { - if (!stream.writable) onfinish(); - }; - var writableEnded = stream._writableState && stream._writableState.finished; - var onfinish = function onfinish() { - writable = false; - writableEnded = true; - if (!readable) callback.call(stream); - }; - var readableEnded = stream._readableState && stream._readableState.endEmitted; - var onend = function onend() { - readable = false; - readableEnded = true; - if (!writable) callback.call(stream); - }; - var onerror = function onerror(err) { - callback.call(stream, err); - }; - var onclose = function onclose() { - var err; - if (readable && !readableEnded) { - if (!stream._readableState || !stream._readableState.ended) err = new ERR_STREAM_PREMATURE_CLOSE(); - return callback.call(stream, err); - } - if (writable && !writableEnded) { - if (!stream._writableState || !stream._writableState.ended) err = new ERR_STREAM_PREMATURE_CLOSE(); - return callback.call(stream, err); - } - }; - var onrequest = function onrequest() { - stream.req.on('finish', onfinish); - }; - if (isRequest$1(stream)) { - stream.on('complete', onfinish); - stream.on('abort', onclose); - if (stream.req) onrequest();else stream.on('request', onrequest); - } else if (writable && !stream._writableState) { - // legacy streams - stream.on('end', onlegacyfinish); - stream.on('close', onlegacyfinish); - } - stream.on('end', onend); - stream.on('finish', onfinish); - if (opts.error !== false) stream.on('error', onerror); - stream.on('close', onclose); - return function () { - stream.removeListener('complete', onfinish); - stream.removeListener('abort', onclose); - stream.removeListener('request', onrequest); - if (stream.req) stream.req.removeListener('finish', onfinish); - stream.removeListener('end', onlegacyfinish); - stream.removeListener('close', onlegacyfinish); - stream.removeListener('finish', onfinish); - stream.removeListener('end', onend); - stream.removeListener('error', onerror); - stream.removeListener('close', onclose); - }; -} -var endOfStream = eos$1; - -var async_iterator; -var hasRequiredAsync_iterator; -function requireAsync_iterator() { - if (hasRequiredAsync_iterator) return async_iterator; - hasRequiredAsync_iterator = 1; - var _Object$setPrototypeO; - function _defineProperty(obj, key, value) { - if (key in obj) { - Object.defineProperty(obj, key, { - value: value, - enumerable: true, - configurable: true, - writable: true - }); - } else { - obj[key] = value; - } - return obj; - } - var finished = endOfStream; - var kLastResolve = Symbol('lastResolve'); - var kLastReject = Symbol('lastReject'); - var kError = Symbol('error'); - var kEnded = Symbol('ended'); - var kLastPromise = Symbol('lastPromise'); - var kHandlePromise = Symbol('handlePromise'); - var kStream = Symbol('stream'); - function createIterResult(value, done) { - return { - value: value, - done: done - }; - } - function readAndResolve(iter) { - var resolve = iter[kLastResolve]; - if (resolve !== null) { - var data = iter[kStream].read(); // we defer if data is null - // we can be expecting either 'end' or - // 'error' - - if (data !== null) { - iter[kLastPromise] = null; - iter[kLastResolve] = null; - iter[kLastReject] = null; - resolve(createIterResult(data, false)); - } - } - } - function onReadable(iter) { - // we wait for the next tick, because it might - // emit an error with process.nextTick - browser$1$1.nextTick(readAndResolve, iter); - } - function wrapForNext(lastPromise, iter) { - return function (resolve, reject) { - lastPromise.then(function () { - if (iter[kEnded]) { - resolve(createIterResult(undefined, true)); - return; - } - iter[kHandlePromise](resolve, reject); - }, reject); - }; - } - var AsyncIteratorPrototype = Object.getPrototypeOf(function () {}); - var ReadableStreamAsyncIteratorPrototype = Object.setPrototypeOf((_Object$setPrototypeO = { - get stream() { - return this[kStream]; - }, - next: function next() { - var _this = this; - - // if we have detected an error in the meanwhile - // reject straight away - var error = this[kError]; - if (error !== null) { - return Promise.reject(error); - } - if (this[kEnded]) { - return Promise.resolve(createIterResult(undefined, true)); - } - if (this[kStream].destroyed) { - // We need to defer via nextTick because if .destroy(err) is - // called, the error will be emitted via nextTick, and - // we cannot guarantee that there is no error lingering around - // waiting to be emitted. - return new Promise(function (resolve, reject) { - browser$1$1.nextTick(function () { - if (_this[kError]) { - reject(_this[kError]); - } else { - resolve(createIterResult(undefined, true)); - } - }); - }); - } // if we have multiple next() calls - // we will wait for the previous Promise to finish - // this logic is optimized to support for await loops, - // where next() is only called once at a time - - var lastPromise = this[kLastPromise]; - var promise; - if (lastPromise) { - promise = new Promise(wrapForNext(lastPromise, this)); - } else { - // fast path needed to support multiple this.push() - // without triggering the next() queue - var data = this[kStream].read(); - if (data !== null) { - return Promise.resolve(createIterResult(data, false)); - } - promise = new Promise(this[kHandlePromise]); - } - this[kLastPromise] = promise; - return promise; - } - }, _defineProperty(_Object$setPrototypeO, Symbol.asyncIterator, function () { - return this; - }), _defineProperty(_Object$setPrototypeO, "return", function _return() { - var _this2 = this; - - // destroy(err, cb) is a private API - // we can guarantee we have that here, because we control the - // Readable class this is attached to - return new Promise(function (resolve, reject) { - _this2[kStream].destroy(null, function (err) { - if (err) { - reject(err); - return; - } - resolve(createIterResult(undefined, true)); - }); - }); - }), _Object$setPrototypeO), AsyncIteratorPrototype); - var createReadableStreamAsyncIterator = function createReadableStreamAsyncIterator(stream) { - var _Object$create; - var iterator = Object.create(ReadableStreamAsyncIteratorPrototype, (_Object$create = {}, _defineProperty(_Object$create, kStream, { - value: stream, - writable: true - }), _defineProperty(_Object$create, kLastResolve, { - value: null, - writable: true - }), _defineProperty(_Object$create, kLastReject, { - value: null, - writable: true - }), _defineProperty(_Object$create, kError, { - value: null, - writable: true - }), _defineProperty(_Object$create, kEnded, { - value: stream._readableState.endEmitted, - writable: true - }), _defineProperty(_Object$create, kHandlePromise, { - value: function value(resolve, reject) { - var data = iterator[kStream].read(); - if (data) { - iterator[kLastPromise] = null; - iterator[kLastResolve] = null; - iterator[kLastReject] = null; - resolve(createIterResult(data, false)); - } else { - iterator[kLastResolve] = resolve; - iterator[kLastReject] = reject; - } - }, - writable: true - }), _Object$create)); - iterator[kLastPromise] = null; - finished(stream, function (err) { - if (err && err.code !== 'ERR_STREAM_PREMATURE_CLOSE') { - var reject = iterator[kLastReject]; // reject if we are waiting for data in the Promise - // returned by next() and store the error - - if (reject !== null) { - iterator[kLastPromise] = null; - iterator[kLastResolve] = null; - iterator[kLastReject] = null; - reject(err); - } - iterator[kError] = err; - return; - } - var resolve = iterator[kLastResolve]; - if (resolve !== null) { - iterator[kLastPromise] = null; - iterator[kLastResolve] = null; - iterator[kLastReject] = null; - resolve(createIterResult(undefined, true)); - } - iterator[kEnded] = true; - }); - stream.on('readable', onReadable.bind(null, iterator)); - return iterator; - }; - async_iterator = createReadableStreamAsyncIterator; - return async_iterator; -} - -var fromBrowser; -var hasRequiredFromBrowser; -function requireFromBrowser() { - if (hasRequiredFromBrowser) return fromBrowser; - hasRequiredFromBrowser = 1; - fromBrowser = function () { - throw new Error('Readable.from is not available in the browser'); - }; - return fromBrowser; -} - -const Registry$4 = _registry; -Registry$4.Readable = Readable; -Readable.ReadableState = ReadableState; -/**/ - -require$$1$1.EventEmitter; -var EElistenerCount = function EElistenerCount(emitter, type) { - return emitter.listeners(type).length; -}; -/**/ - -/**/ - -var Stream$1 = streamBrowser; -/**/ - -var Buffer$1 = require$$0.Buffer; -var OurUint8Array$1 = commonjsGlobal.Uint8Array || function () {}; -function _uint8ArrayToBuffer$1(chunk) { - return Buffer$1.from(chunk); -} -function _isUint8Array$1(obj) { - return Buffer$1.isBuffer(obj) || obj instanceof OurUint8Array$1; -} -/**/ - -var debugUtil = require$$3; -var debug; -if (debugUtil && debugUtil.debuglog) { - debug = debugUtil.debuglog('stream'); -} else { - debug = function debug() {}; -} -/**/ - -var BufferList = requireBuffer_list(); -var destroyImpl$1 = destroy_1; -var _require$1 = state, - getHighWaterMark$1 = _require$1.getHighWaterMark; -var _require$codes$3 = errorsBrowser.codes, - ERR_INVALID_ARG_TYPE$1 = _require$codes$3.ERR_INVALID_ARG_TYPE, - ERR_STREAM_PUSH_AFTER_EOF = _require$codes$3.ERR_STREAM_PUSH_AFTER_EOF, - ERR_METHOD_NOT_IMPLEMENTED$2 = _require$codes$3.ERR_METHOD_NOT_IMPLEMENTED, - ERR_STREAM_UNSHIFT_AFTER_END_EVENT = _require$codes$3.ERR_STREAM_UNSHIFT_AFTER_END_EVENT; // Lazy loaded to improve the startup performance. - -var StringDecoder; -var createReadableStreamAsyncIterator; -var from; -require$$1(Readable, Stream$1); -var errorOrDestroy$1 = destroyImpl$1.errorOrDestroy; -var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume']; -function prependListener(emitter, event, fn) { - // Sadly this is not cacheable as some libraries bundle their own - // event emitter implementation with them. - if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn); // This is a hack to make sure that our error handler is attached before any - // userland ones. NEVER DO THIS. This is here only because this code needs - // to continue to work with older versions of Node.js that do not include - // the prependListener() method. The goal is to eventually remove this hack. - - if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (Array.isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]]; -} -function ReadableState(options, stream, isDuplex) { - options = options || {}; // Duplex streams are both readable and writable, but share - // the same options object. - // However, some cases require setting options to different - // values for the readable and the writable sides of the duplex stream. - // These options can be provided separately as readableXXX and writableXXX. - - if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof Registry$4.Duplex; // object stream flag. Used to make read(n) ignore n and to - // make all the buffer merging and length checks go away - - this.objectMode = !!options.objectMode; - if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode; // the point at which it stops calling _read() to fill the buffer - // Note: 0 is a valid value, means "don't call _read preemptively ever" - - this.highWaterMark = getHighWaterMark$1(this, options, 'readableHighWaterMark', isDuplex); // A linked list is used to store data chunks instead of an array because the - // linked list can remove elements from the beginning faster than - // array.shift() - - this.buffer = new BufferList(); - this.length = 0; - this.pipes = null; - this.pipesCount = 0; - this.flowing = null; - this.ended = false; - this.endEmitted = false; - this.reading = false; // a flag to be able to tell if the event 'readable'/'data' is emitted - // immediately, or on a later tick. We set this to true at first, because - // any actions that shouldn't happen until "later" should generally also - // not happen before the first read call. - - this.sync = true; // whenever we return null, then we set a flag to say - // that we're awaiting a 'readable' event emission. - - this.needReadable = false; - this.emittedReadable = false; - this.readableListening = false; - this.resumeScheduled = false; - this.paused = true; // Should close be emitted on destroy. Defaults to true. - - this.emitClose = options.emitClose !== false; // Should .destroy() be called after 'end' (and potentially 'finish') - - this.autoDestroy = !!options.autoDestroy; // has it been destroyed - - this.destroyed = false; // Crypto is kind of old and crusty. Historically, its default string - // encoding is 'binary' so we have to make this configurable. - // Everything else in the universe uses 'utf8', though. - - this.defaultEncoding = options.defaultEncoding || 'utf8'; // the number of writers that are awaiting a drain event in .pipe()s - - this.awaitDrain = 0; // if true, a maybeReadMore has been scheduled - - this.readingMore = false; - this.decoder = null; - this.encoding = null; - if (options.encoding) { - if (!StringDecoder) StringDecoder = require$$10.StringDecoder; - this.decoder = new StringDecoder(options.encoding); - this.encoding = options.encoding; - } -} -function Readable(options) { - if (!(this instanceof Readable)) return new Readable(options); // Checking for a Stream.Duplex instance is faster here instead of inside - // the ReadableState constructor, at least with V8 6.5 - - var isDuplex = this instanceof Registry$4.Duplex; - this._readableState = new ReadableState(options, this, isDuplex); // legacy - - this.readable = true; - if (options) { - if (typeof options.read === 'function') this._read = options.read; - if (typeof options.destroy === 'function') this._destroy = options.destroy; - } - Stream$1.call(this); -} -Object.defineProperty(Readable.prototype, 'destroyed', { - // making it explicit this property is not enumerable - // because otherwise some prototype manipulation in - // userland will fail - enumerable: false, - get: function get() { - if (this._readableState === undefined) { - return false; - } - return this._readableState.destroyed; - }, - set: function set(value) { - // we ignore the value if the stream - // has not been initialized yet - if (!this._readableState) { - return; - } // backward compatibility, the user is explicitly - // managing destroyed - - this._readableState.destroyed = value; - } -}); -Readable.prototype.destroy = destroyImpl$1.destroy; -Readable.prototype._undestroy = destroyImpl$1.undestroy; -Readable.prototype._destroy = function (err, cb) { - cb(err); -}; // Manually shove something into the read() buffer. -// This returns true if the highWaterMark has not been hit yet, -// similar to how Writable.write() returns true if you should -// write() some more. - -Readable.prototype.push = function (chunk, encoding) { - var state = this._readableState; - var skipChunkCheck; - if (!state.objectMode) { - if (typeof chunk === 'string') { - encoding = encoding || state.defaultEncoding; - if (encoding !== state.encoding) { - chunk = Buffer$1.from(chunk, encoding); - encoding = ''; - } - skipChunkCheck = true; - } - } else { - skipChunkCheck = true; - } - return readableAddChunk(this, chunk, encoding, false, skipChunkCheck); -}; // Unshift should *always* be something directly out of read() - -Readable.prototype.unshift = function (chunk) { - return readableAddChunk(this, chunk, null, true, false); -}; -function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) { - debug('readableAddChunk', chunk); - var state = stream._readableState; - if (chunk === null) { - state.reading = false; - onEofChunk(stream, state); - } else { - var er; - if (!skipChunkCheck) er = chunkInvalid(state, chunk); - if (er) { - errorOrDestroy$1(stream, er); - } else if (state.objectMode || chunk && chunk.length > 0) { - if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer$1.prototype) { - chunk = _uint8ArrayToBuffer$1(chunk); - } - if (addToFront) { - if (state.endEmitted) errorOrDestroy$1(stream, new ERR_STREAM_UNSHIFT_AFTER_END_EVENT());else addChunk(stream, state, chunk, true); - } else if (state.ended) { - errorOrDestroy$1(stream, new ERR_STREAM_PUSH_AFTER_EOF()); - } else if (state.destroyed) { - return false; - } else { - state.reading = false; - if (state.decoder && !encoding) { - chunk = state.decoder.write(chunk); - if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state); - } else { - addChunk(stream, state, chunk, false); - } - } - } else if (!addToFront) { - state.reading = false; - maybeReadMore(stream, state); - } - } // We can push more data if we are below the highWaterMark. - // Also, if we have no data yet, we can stand some more bytes. - // This is to work around cases where hwm=0, such as the repl. - - return !state.ended && (state.length < state.highWaterMark || state.length === 0); -} -function addChunk(stream, state, chunk, addToFront) { - if (state.flowing && state.length === 0 && !state.sync) { - state.awaitDrain = 0; - stream.emit('data', chunk); - } else { - // update the buffer info. - state.length += state.objectMode ? 1 : chunk.length; - if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk); - if (state.needReadable) emitReadable(stream); - } - maybeReadMore(stream, state); -} -function chunkInvalid(state, chunk) { - var er; - if (!_isUint8Array$1(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { - er = new ERR_INVALID_ARG_TYPE$1('chunk', ['string', 'Buffer', 'Uint8Array'], chunk); - } - return er; -} -Readable.prototype.isPaused = function () { - return this._readableState.flowing === false; -}; // backwards compatibility. - -Readable.prototype.setEncoding = function (enc) { - if (!StringDecoder) StringDecoder = require$$10.StringDecoder; - var decoder = new StringDecoder(enc); - this._readableState.decoder = decoder; // If setEncoding(null), decoder.encoding equals utf8 - - this._readableState.encoding = this._readableState.decoder.encoding; // Iterate over current buffer to convert already stored Buffers: - - var p = this._readableState.buffer.head; - var content = ''; - while (p !== null) { - content += decoder.write(p.data); - p = p.next; - } - this._readableState.buffer.clear(); - if (content !== '') this._readableState.buffer.push(content); - this._readableState.length = content.length; - return this; -}; // Don't raise the hwm > 1GB - -var MAX_HWM = 0x40000000; -function computeNewHighWaterMark(n) { - if (n >= MAX_HWM) { - // TODO(ronag): Throw ERR_VALUE_OUT_OF_RANGE. - n = MAX_HWM; - } else { - // Get the next highest power of 2 to prevent increasing hwm excessively in - // tiny amounts - n--; - n |= n >>> 1; - n |= n >>> 2; - n |= n >>> 4; - n |= n >>> 8; - n |= n >>> 16; - n++; - } - return n; -} // This function is designed to be inlinable, so please take care when making -// changes to the function body. - -function howMuchToRead(n, state) { - if (n <= 0 || state.length === 0 && state.ended) return 0; - if (state.objectMode) return 1; - if (n !== n) { - // Only flow one buffer at a time - if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length; - } // If we're asking for more than the current hwm, then raise the hwm. - - if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); - if (n <= state.length) return n; // Don't have enough - - if (!state.ended) { - state.needReadable = true; - return 0; - } - return state.length; -} // you can override either this method, or the async _read(n) below. - -Readable.prototype.read = function (n) { - debug('read', n); - n = parseInt(n, 10); - var state = this._readableState; - var nOrig = n; - if (n !== 0) state.emittedReadable = false; // if we're doing read(0) to trigger a readable event, but we - // already have a bunch of data in the buffer, then just trigger - // the 'readable' event and move on. - - if (n === 0 && state.needReadable && ((state.highWaterMark !== 0 ? state.length >= state.highWaterMark : state.length > 0) || state.ended)) { - debug('read: emitReadable', state.length, state.ended); - if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this); - return null; - } - n = howMuchToRead(n, state); // if we've ended, and we're now clear, then finish it up. - - if (n === 0 && state.ended) { - if (state.length === 0) endReadable(this); - return null; - } // All the actual chunk generation logic needs to be - // *below* the call to _read. The reason is that in certain - // synthetic stream cases, such as passthrough streams, _read - // may be a completely synchronous operation which may change - // the state of the read buffer, providing enough data when - // before there was *not* enough. - // - // So, the steps are: - // 1. Figure out what the state of things will be after we do - // a read from the buffer. - // - // 2. If that resulting state will trigger a _read, then call _read. - // Note that this may be asynchronous, or synchronous. Yes, it is - // deeply ugly to write APIs this way, but that still doesn't mean - // that the Readable class should behave improperly, as streams are - // designed to be sync/async agnostic. - // Take note if the _read call is sync or async (ie, if the read call - // has returned yet), so that we know whether or not it's safe to emit - // 'readable' etc. - // - // 3. Actually pull the requested chunks out of the buffer and return. - // if we need a readable event, then we need to do some reading. - - var doRead = state.needReadable; - debug('need readable', doRead); // if we currently have less than the highWaterMark, then also read some - - if (state.length === 0 || state.length - n < state.highWaterMark) { - doRead = true; - debug('length less than watermark', doRead); - } // however, if we've ended, then there's no point, and if we're already - // reading, then it's unnecessary. - - if (state.ended || state.reading) { - doRead = false; - debug('reading or ended', doRead); - } else if (doRead) { - debug('do read'); - state.reading = true; - state.sync = true; // if the length is currently zero, then we *need* a readable event. - - if (state.length === 0) state.needReadable = true; // call internal read method - - this._read(state.highWaterMark); - state.sync = false; // If _read pushed data synchronously, then `reading` will be false, - // and we need to re-evaluate how much data we can return to the user. - - if (!state.reading) n = howMuchToRead(nOrig, state); - } - var ret; - if (n > 0) ret = fromList(n, state);else ret = null; - if (ret === null) { - state.needReadable = state.length <= state.highWaterMark; - n = 0; - } else { - state.length -= n; - state.awaitDrain = 0; - } - if (state.length === 0) { - // If we have nothing in the buffer, then we want to know - // as soon as we *do* get something into the buffer. - if (!state.ended) state.needReadable = true; // If we tried to read() past the EOF, then emit end on the next tick. - - if (nOrig !== n && state.ended) endReadable(this); - } - if (ret !== null) this.emit('data', ret); - return ret; -}; -function onEofChunk(stream, state) { - debug('onEofChunk'); - if (state.ended) return; - if (state.decoder) { - var chunk = state.decoder.end(); - if (chunk && chunk.length) { - state.buffer.push(chunk); - state.length += state.objectMode ? 1 : chunk.length; - } - } - state.ended = true; - if (state.sync) { - // if we are sync, wait until next tick to emit the data. - // Otherwise we risk emitting data in the flow() - // the readable code triggers during a read() call - emitReadable(stream); - } else { - // emit 'readable' now to make sure it gets picked up. - state.needReadable = false; - if (!state.emittedReadable) { - state.emittedReadable = true; - emitReadable_(stream); - } - } -} // Don't emit readable right away in sync mode, because this can trigger -// another read() call => stack overflow. This way, it might trigger -// a nextTick recursion warning, but that's not so bad. - -function emitReadable(stream) { - var state = stream._readableState; - debug('emitReadable', state.needReadable, state.emittedReadable); - state.needReadable = false; - if (!state.emittedReadable) { - debug('emitReadable', state.flowing); - state.emittedReadable = true; - browser$1$1.nextTick(emitReadable_, stream); - } -} -function emitReadable_(stream) { - var state = stream._readableState; - debug('emitReadable_', state.destroyed, state.length, state.ended); - if (!state.destroyed && (state.length || state.ended)) { - stream.emit('readable'); - state.emittedReadable = false; - } // The stream needs another readable event if - // 1. It is not flowing, as the flow mechanism will take - // care of it. - // 2. It is not ended. - // 3. It is below the highWaterMark, so we can schedule - // another readable later. - - state.needReadable = !state.flowing && !state.ended && state.length <= state.highWaterMark; - flow(stream); -} // at this point, the user has presumably seen the 'readable' event, -// and called read() to consume some data. that may have triggered -// in turn another _read(n) call, in which case reading = true if -// it's in progress. -// However, if we're not ended, or reading, and the length < hwm, -// then go ahead and try to read some more preemptively. - -function maybeReadMore(stream, state) { - if (!state.readingMore) { - state.readingMore = true; - browser$1$1.nextTick(maybeReadMore_, stream, state); - } -} -function maybeReadMore_(stream, state) { - // Attempt to read more data if we should. - // - // The conditions for reading more data are (one of): - // - Not enough data buffered (state.length < state.highWaterMark). The loop - // is responsible for filling the buffer with enough data if such data - // is available. If highWaterMark is 0 and we are not in the flowing mode - // we should _not_ attempt to buffer any extra data. We'll get more data - // when the stream consumer calls read() instead. - // - No data in the buffer, and the stream is in flowing mode. In this mode - // the loop below is responsible for ensuring read() is called. Failing to - // call read here would abort the flow and there's no other mechanism for - // continuing the flow if the stream consumer has just subscribed to the - // 'data' event. - // - // In addition to the above conditions to keep reading data, the following - // conditions prevent the data from being read: - // - The stream has ended (state.ended). - // - There is already a pending 'read' operation (state.reading). This is a - // case where the the stream has called the implementation defined _read() - // method, but they are processing the call asynchronously and have _not_ - // called push() with new data. In this case we skip performing more - // read()s. The execution ends in this method again after the _read() ends - // up calling push() with more data. - while (!state.reading && !state.ended && (state.length < state.highWaterMark || state.flowing && state.length === 0)) { - var len = state.length; - debug('maybeReadMore read 0'); - stream.read(0); - if (len === state.length) - // didn't get any data, stop spinning. - break; - } - state.readingMore = false; -} // abstract method. to be overridden in specific implementation classes. -// call cb(er, data) where data is <= n in length. -// for virtual (non-string, non-buffer) streams, "length" is somewhat -// arbitrary, and perhaps not very meaningful. - -Readable.prototype._read = function (n) { - errorOrDestroy$1(this, new ERR_METHOD_NOT_IMPLEMENTED$2('_read()')); -}; -Readable.prototype.pipe = function (dest, pipeOpts) { - var src = this; - var state = this._readableState; - switch (state.pipesCount) { - case 0: - state.pipes = dest; - break; - case 1: - state.pipes = [state.pipes, dest]; - break; - default: - state.pipes.push(dest); - break; - } - state.pipesCount += 1; - debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); - var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== browser$1$1.stdout && dest !== browser$1$1.stderr; - var endFn = doEnd ? onend : unpipe; - if (state.endEmitted) browser$1$1.nextTick(endFn);else src.once('end', endFn); - dest.on('unpipe', onunpipe); - function onunpipe(readable, unpipeInfo) { - debug('onunpipe'); - if (readable === src) { - if (unpipeInfo && unpipeInfo.hasUnpiped === false) { - unpipeInfo.hasUnpiped = true; - cleanup(); - } - } - } - function onend() { - debug('onend'); - dest.end(); - } // when the dest drains, it reduces the awaitDrain counter - // on the source. This would be more elegant with a .once() - // handler in flow(), but adding and removing repeatedly is - // too slow. - - var ondrain = pipeOnDrain(src); - dest.on('drain', ondrain); - var cleanedUp = false; - function cleanup() { - debug('cleanup'); // cleanup event handlers once the pipe is broken - - dest.removeListener('close', onclose); - dest.removeListener('finish', onfinish); - dest.removeListener('drain', ondrain); - dest.removeListener('error', onerror); - dest.removeListener('unpipe', onunpipe); - src.removeListener('end', onend); - src.removeListener('end', unpipe); - src.removeListener('data', ondata); - cleanedUp = true; // if the reader is waiting for a drain event from this - // specific writer, then it would cause it to never start - // flowing again. - // So, if this is awaiting a drain, then we just call it now. - // If we don't know, then assume that we are waiting for one. - - if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); - } - src.on('data', ondata); - function ondata(chunk) { - debug('ondata'); - var ret = dest.write(chunk); - debug('dest.write', ret); - if (ret === false) { - // If the user unpiped during `dest.write()`, it is possible - // to get stuck in a permanently paused state if that write - // also returned false. - // => Check whether `dest` is still a piping destination. - if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) { - debug('false write response, pause', state.awaitDrain); - state.awaitDrain++; - } - src.pause(); - } - } // if the dest has an error, then stop piping into it. - // however, don't suppress the throwing behavior for this. - - function onerror(er) { - debug('onerror', er); - unpipe(); - dest.removeListener('error', onerror); - if (EElistenerCount(dest, 'error') === 0) errorOrDestroy$1(dest, er); - } // Make sure our error handler is attached before userland ones. - - prependListener(dest, 'error', onerror); // Both close and finish should trigger unpipe, but only once. - - function onclose() { - dest.removeListener('finish', onfinish); - unpipe(); - } - dest.once('close', onclose); - function onfinish() { - debug('onfinish'); - dest.removeListener('close', onclose); - unpipe(); - } - dest.once('finish', onfinish); - function unpipe() { - debug('unpipe'); - src.unpipe(dest); - } // tell the dest that it's being piped to - - dest.emit('pipe', src); // start the flow if it hasn't been started already. - - if (!state.flowing) { - debug('pipe resume'); - src.resume(); - } - return dest; -}; -function pipeOnDrain(src) { - return function pipeOnDrainFunctionResult() { - var state = src._readableState; - debug('pipeOnDrain', state.awaitDrain); - if (state.awaitDrain) state.awaitDrain--; - if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) { - state.flowing = true; - flow(src); - } - }; -} -Readable.prototype.unpipe = function (dest) { - var state = this._readableState; - var unpipeInfo = { - hasUnpiped: false - }; // if we're not piping anywhere, then do nothing. - - if (state.pipesCount === 0) return this; // just one destination. most common case. - - if (state.pipesCount === 1) { - // passed in one, but it's not the right one. - if (dest && dest !== state.pipes) return this; - if (!dest) dest = state.pipes; // got a match. - - state.pipes = null; - state.pipesCount = 0; - state.flowing = false; - if (dest) dest.emit('unpipe', this, unpipeInfo); - return this; - } // slow case. multiple pipe destinations. - - if (!dest) { - // remove all. - var dests = state.pipes; - var len = state.pipesCount; - state.pipes = null; - state.pipesCount = 0; - state.flowing = false; - for (var i = 0; i < len; i++) { - dests[i].emit('unpipe', this, { - hasUnpiped: false - }); - } - return this; - } // try to find the right one. - - var index = indexOf(state.pipes, dest); - if (index === -1) return this; - state.pipes.splice(index, 1); - state.pipesCount -= 1; - if (state.pipesCount === 1) state.pipes = state.pipes[0]; - dest.emit('unpipe', this, unpipeInfo); - return this; -}; // set up data events if they are asked for -// Ensure readable listeners eventually get something - -Readable.prototype.on = function (ev, fn) { - var res = Stream$1.prototype.on.call(this, ev, fn); - var state = this._readableState; - if (ev === 'data') { - // update readableListening so that resume() may be a no-op - // a few lines down. This is needed to support once('readable'). - state.readableListening = this.listenerCount('readable') > 0; // Try start flowing on next tick if stream isn't explicitly paused - - if (state.flowing !== false) this.resume(); - } else if (ev === 'readable') { - if (!state.endEmitted && !state.readableListening) { - state.readableListening = state.needReadable = true; - state.flowing = false; - state.emittedReadable = false; - debug('on readable', state.length, state.reading); - if (state.length) { - emitReadable(this); - } else if (!state.reading) { - browser$1$1.nextTick(nReadingNextTick, this); - } - } - } - return res; -}; -Readable.prototype.addListener = Readable.prototype.on; -Readable.prototype.removeListener = function (ev, fn) { - var res = Stream$1.prototype.removeListener.call(this, ev, fn); - if (ev === 'readable') { - // We need to check if there is someone still listening to - // readable and reset the state. However this needs to happen - // after readable has been emitted but before I/O (nextTick) to - // support once('readable', fn) cycles. This means that calling - // resume within the same tick will have no - // effect. - browser$1$1.nextTick(updateReadableListening, this); - } - return res; -}; -Readable.prototype.removeAllListeners = function (ev) { - var res = Stream$1.prototype.removeAllListeners.apply(this, arguments); - if (ev === 'readable' || ev === undefined) { - // We need to check if there is someone still listening to - // readable and reset the state. However this needs to happen - // after readable has been emitted but before I/O (nextTick) to - // support once('readable', fn) cycles. This means that calling - // resume within the same tick will have no - // effect. - browser$1$1.nextTick(updateReadableListening, this); - } - return res; -}; -function updateReadableListening(self) { - var state = self._readableState; - state.readableListening = self.listenerCount('readable') > 0; - if (state.resumeScheduled && !state.paused) { - // flowing needs to be set to true now, otherwise - // the upcoming resume will not flow. - state.flowing = true; // crude way to check if we should resume - } else if (self.listenerCount('data') > 0) { - self.resume(); - } -} -function nReadingNextTick(self) { - debug('readable nexttick read 0'); - self.read(0); -} // pause() and resume() are remnants of the legacy readable stream API -// If the user uses them, then switch into old mode. - -Readable.prototype.resume = function () { - var state = this._readableState; - if (!state.flowing) { - debug('resume'); // we flow only if there is no one listening - // for readable, but we still have to call - // resume() - - state.flowing = !state.readableListening; - resume(this, state); - } - state.paused = false; - return this; -}; -function resume(stream, state) { - if (!state.resumeScheduled) { - state.resumeScheduled = true; - browser$1$1.nextTick(resume_, stream, state); - } -} -function resume_(stream, state) { - debug('resume', state.reading); - if (!state.reading) { - stream.read(0); - } - state.resumeScheduled = false; - stream.emit('resume'); - flow(stream); - if (state.flowing && !state.reading) stream.read(0); -} -Readable.prototype.pause = function () { - debug('call pause flowing=%j', this._readableState.flowing); - if (this._readableState.flowing !== false) { - debug('pause'); - this._readableState.flowing = false; - this.emit('pause'); - } - this._readableState.paused = true; - return this; -}; -function flow(stream) { - var state = stream._readableState; - debug('flow', state.flowing); - while (state.flowing && stream.read() !== null) { - } -} // wrap an old-style stream as the async data source. -// This is *not* part of the readable stream interface. -// It is an ugly unfortunate mess of history. - -Readable.prototype.wrap = function (stream) { - var _this = this; - var state = this._readableState; - var paused = false; - stream.on('end', function () { - debug('wrapped end'); - if (state.decoder && !state.ended) { - var chunk = state.decoder.end(); - if (chunk && chunk.length) _this.push(chunk); - } - _this.push(null); - }); - stream.on('data', function (chunk) { - debug('wrapped data'); - if (state.decoder) chunk = state.decoder.write(chunk); // don't skip over falsy values in objectMode - - if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return; - var ret = _this.push(chunk); - if (!ret) { - paused = true; - stream.pause(); - } - }); // proxy all the other methods. - // important when wrapping filters and duplexes. - - for (var i in stream) { - if (this[i] === undefined && typeof stream[i] === 'function') { - this[i] = function methodWrap(method) { - return function methodWrapReturnFunction() { - return stream[method].apply(stream, arguments); - }; - }(i); - } - } // proxy certain important events. - - for (var n = 0; n < kProxyEvents.length; n++) { - stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n])); - } // when we try to consume some more bytes, simply unpause the - // underlying stream. - - this._read = function (n) { - debug('wrapped _read', n); - if (paused) { - paused = false; - stream.resume(); - } - }; - return this; -}; -if (typeof Symbol === 'function') { - Readable.prototype[Symbol.asyncIterator] = function () { - if (createReadableStreamAsyncIterator === undefined) { - createReadableStreamAsyncIterator = requireAsync_iterator(); - } - return createReadableStreamAsyncIterator(this); - }; -} -Object.defineProperty(Readable.prototype, 'readableHighWaterMark', { - // making it explicit this property is not enumerable - // because otherwise some prototype manipulation in - // userland will fail - enumerable: false, - get: function get() { - return this._readableState.highWaterMark; - } -}); -Object.defineProperty(Readable.prototype, 'readableBuffer', { - // making it explicit this property is not enumerable - // because otherwise some prototype manipulation in - // userland will fail - enumerable: false, - get: function get() { - return this._readableState && this._readableState.buffer; - } -}); -Object.defineProperty(Readable.prototype, 'readableFlowing', { - // making it explicit this property is not enumerable - // because otherwise some prototype manipulation in - // userland will fail - enumerable: false, - get: function get() { - return this._readableState.flowing; - }, - set: function set(state) { - if (this._readableState) { - this._readableState.flowing = state; - } - } -}); // exposed for testing purposes only. - -Readable._fromList = fromList; -Object.defineProperty(Readable.prototype, 'readableLength', { - // making it explicit this property is not enumerable - // because otherwise some prototype manipulation in - // userland will fail - enumerable: false, - get: function get() { - return this._readableState.length; - } -}); // Pluck off n bytes from an array of buffers. -// Length is the combined lengths of all the buffers in the list. -// This function is designed to be inlinable, so please take care when making -// changes to the function body. - -function fromList(n, state) { - // nothing buffered - if (state.length === 0) return null; - var ret; - if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) { - // read it all, truncate the list - if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.first();else ret = state.buffer.concat(state.length); - state.buffer.clear(); - } else { - // read part of list - ret = state.buffer.consume(n, state.decoder); - } - return ret; -} -function endReadable(stream) { - var state = stream._readableState; - debug('endReadable', state.endEmitted); - if (!state.endEmitted) { - state.ended = true; - browser$1$1.nextTick(endReadableNT, state, stream); - } -} -function endReadableNT(state, stream) { - debug('endReadableNT', state.endEmitted, state.length); // Check that we didn't get one last unshift. - - if (!state.endEmitted && state.length === 0) { - state.endEmitted = true; - stream.readable = false; - stream.emit('end'); - if (state.autoDestroy) { - // In case of duplex streams we need a way to detect - // if the writable side is ready for autoDestroy as well - var wState = stream._writableState; - if (!wState || wState.autoDestroy && wState.finished) { - stream.destroy(); - } - } - } -} -if (typeof Symbol === 'function') { - Readable.from = function (iterable, opts) { - if (from === undefined) { - from = requireFromBrowser(); - } - return from(Readable, iterable, opts); - }; -} -function indexOf(xs, x) { - for (var i = 0, l = xs.length; i < l; i++) { - if (xs[i] === x) return i; - } - return -1; -} - -/** - * Module exports. - */ - -var browser = deprecate; - -/** - * Mark that a method should not be used. - * Returns a modified function which warns once by default. - * - * If `localStorage.noDeprecation = true` is set, then it is a no-op. - * - * If `localStorage.throwDeprecation = true` is set, then deprecated functions - * will throw an Error when invoked. - * - * If `localStorage.traceDeprecation = true` is set, then deprecated functions - * will invoke `console.trace()` instead of `console.error()`. - * - * @param {Function} fn - the function to deprecate - * @param {String} msg - the string to print to the console when `fn` is invoked - * @returns {Function} a new "deprecated" version of `fn` - * @api public - */ - -function deprecate(fn, msg) { - if (config('noDeprecation')) { - return fn; - } - var warned = false; - function deprecated() { - if (!warned) { - if (config('throwDeprecation')) { - throw new Error(msg); - } else if (config('traceDeprecation')) { - console.trace(msg); - } else { - console.warn(msg); - } - warned = true; - } - return fn.apply(this, arguments); - } - return deprecated; -} - -/** - * Checks `localStorage` for boolean values for the given `name`. - * - * @param {String} name - * @returns {Boolean} - * @api private - */ - -function config(name) { - // accessing global.localStorage can trigger a DOMException in sandboxed iframes - try { - if (!commonjsGlobal.localStorage) return false; - } catch (_) { - return false; - } - var val = commonjsGlobal.localStorage[name]; - if (null == val) return false; - return String(val).toLowerCase() === 'true'; -} - -const Registry$3 = _registry; -Registry$3.Writable = Writable; -// there will be only 2 of these for each stream - -function CorkedRequest(state) { - var _this = this; - this.next = null; - this.entry = null; - this.finish = function () { - onCorkedFinish(_this, state); - }; -} -/* */ - -/**/ - -/**/ - -Writable.WritableState = WritableState; -/**/ - -var internalUtil = { - deprecate: browser -}; -/**/ - -/**/ - -var Stream = streamBrowser; -/**/ - -var Buffer = require$$0.Buffer; -var OurUint8Array = commonjsGlobal.Uint8Array || function () {}; -function _uint8ArrayToBuffer(chunk) { - return Buffer.from(chunk); -} -function _isUint8Array(obj) { - return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; -} -var destroyImpl = destroy_1; -var _require = state, - getHighWaterMark = _require.getHighWaterMark; -var _require$codes$2 = errorsBrowser.codes, - ERR_INVALID_ARG_TYPE = _require$codes$2.ERR_INVALID_ARG_TYPE, - ERR_METHOD_NOT_IMPLEMENTED$1 = _require$codes$2.ERR_METHOD_NOT_IMPLEMENTED, - ERR_MULTIPLE_CALLBACK$1 = _require$codes$2.ERR_MULTIPLE_CALLBACK, - ERR_STREAM_CANNOT_PIPE = _require$codes$2.ERR_STREAM_CANNOT_PIPE, - ERR_STREAM_DESTROYED$1 = _require$codes$2.ERR_STREAM_DESTROYED, - ERR_STREAM_NULL_VALUES = _require$codes$2.ERR_STREAM_NULL_VALUES, - ERR_STREAM_WRITE_AFTER_END = _require$codes$2.ERR_STREAM_WRITE_AFTER_END, - ERR_UNKNOWN_ENCODING = _require$codes$2.ERR_UNKNOWN_ENCODING; -var errorOrDestroy = destroyImpl.errorOrDestroy; -require$$1(Writable, Stream); -function nop() {} -function WritableState(options, stream, isDuplex) { - options = options || {}; // Duplex streams are both readable and writable, but share - // the same options object. - // However, some cases require setting options to different - // values for the readable and the writable sides of the duplex stream, - // e.g. options.readableObjectMode vs. options.writableObjectMode, etc. - - if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof Registry$3.Duplex; // object stream flag to indicate whether or not this stream - // contains buffers or objects. - - this.objectMode = !!options.objectMode; - if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode; // the point at which write() starts returning false - // Note: 0 is a valid value, means that we always return false if - // the entire buffer is not flushed immediately on write() - - this.highWaterMark = getHighWaterMark(this, options, 'writableHighWaterMark', isDuplex); // if _final has been called - - this.finalCalled = false; // drain event flag. - - this.needDrain = false; // at the start of calling end() - - this.ending = false; // when end() has been called, and returned - - this.ended = false; // when 'finish' is emitted - - this.finished = false; // has it been destroyed - - this.destroyed = false; // should we decode strings into buffers before passing to _write? - // this is here so that some node-core streams can optimize string - // handling at a lower level. - - var noDecode = options.decodeStrings === false; - this.decodeStrings = !noDecode; // Crypto is kind of old and crusty. Historically, its default string - // encoding is 'binary' so we have to make this configurable. - // Everything else in the universe uses 'utf8', though. - - this.defaultEncoding = options.defaultEncoding || 'utf8'; // not an actual buffer we keep track of, but a measurement - // of how much we're waiting to get pushed to some underlying - // socket or file. - - this.length = 0; // a flag to see when we're in the middle of a write. - - this.writing = false; // when true all writes will be buffered until .uncork() call - - this.corked = 0; // a flag to be able to tell if the onwrite cb is called immediately, - // or on a later tick. We set this to true at first, because any - // actions that shouldn't happen until "later" should generally also - // not happen before the first write call. - - this.sync = true; // a flag to know if we're processing previously buffered items, which - // may call the _write() callback in the same tick, so that we don't - // end up in an overlapped onwrite situation. - - this.bufferProcessing = false; // the callback that's passed to _write(chunk,cb) - - this.onwrite = function (er) { - onwrite(stream, er); - }; // the callback that the user supplies to write(chunk,encoding,cb) - - this.writecb = null; // the amount that is being written when _write is called. - - this.writelen = 0; - this.bufferedRequest = null; - this.lastBufferedRequest = null; // number of pending user-supplied write callbacks - // this must be 0 before 'finish' can be emitted - - this.pendingcb = 0; // emit prefinish if the only thing we're waiting for is _write cbs - // This is relevant for synchronous Transform streams - - this.prefinished = false; // True if the error was already emitted and should not be thrown again - - this.errorEmitted = false; // Should close be emitted on destroy. Defaults to true. - - this.emitClose = options.emitClose !== false; // Should .destroy() be called after 'finish' (and potentially 'end') - - this.autoDestroy = !!options.autoDestroy; // count buffered requests - - this.bufferedRequestCount = 0; // allocate the first CorkedRequest, there is always - // one allocated and free to use, and we maintain at most two - - this.corkedRequestsFree = new CorkedRequest(this); -} -WritableState.prototype.getBuffer = function getBuffer() { - var current = this.bufferedRequest; - var out = []; - while (current) { - out.push(current); - current = current.next; - } - return out; -}; -(function () { - try { - Object.defineProperty(WritableState.prototype, 'buffer', { - get: internalUtil.deprecate(function writableStateBufferGetter() { - return this.getBuffer(); - }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003') - }); - } catch (_) {} -})(); // Test _writableState for inheritance to account for Duplex streams, -// whose prototype chain only points to Readable. - -var realHasInstance; -if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') { - realHasInstance = Function.prototype[Symbol.hasInstance]; - Object.defineProperty(Writable, Symbol.hasInstance, { - value: function value(object) { - if (realHasInstance.call(this, object)) return true; - if (this !== Writable) return false; - return object && object._writableState instanceof WritableState; - } - }); -} else { - realHasInstance = function realHasInstance(object) { - return object instanceof this; - }; -} -function Writable(options) { - // Writable ctor is applied to Duplexes, too. - // `realHasInstance` is necessary because using plain `instanceof` - // would return false, as no `_writableState` property is attached. - // Trying to use the custom `instanceof` for Writable here will also break the - // Node.js LazyTransform implementation, which has a non-trivial getter for - // `_writableState` that would lead to infinite recursion. - // Checking for a Stream.Duplex instance is faster here instead of inside - // the WritableState constructor, at least with V8 6.5 - - var isDuplex = this instanceof Registry$3.Duplex; - if (!isDuplex && !realHasInstance.call(Writable, this)) return new Writable(options); - this._writableState = new WritableState(options, this, isDuplex); // legacy. - - this.writable = true; - if (options) { - if (typeof options.write === 'function') this._write = options.write; - if (typeof options.writev === 'function') this._writev = options.writev; - if (typeof options.destroy === 'function') this._destroy = options.destroy; - if (typeof options.final === 'function') this._final = options.final; - } - Stream.call(this); -} // Otherwise people can pipe Writable streams, which is just wrong. - -Writable.prototype.pipe = function () { - errorOrDestroy(this, new ERR_STREAM_CANNOT_PIPE()); -}; -function writeAfterEnd(stream, cb) { - var er = new ERR_STREAM_WRITE_AFTER_END(); // TODO: defer error events consistently everywhere, not just the cb - - errorOrDestroy(stream, er); - browser$1$1.nextTick(cb, er); -} // Checks that a user-supplied chunk is valid, especially for the particular -// mode the stream is in. Currently this means that `null` is never accepted -// and undefined/non-string values are only allowed in object mode. - -function validChunk(stream, state, chunk, cb) { - var er; - if (chunk === null) { - er = new ERR_STREAM_NULL_VALUES(); - } else if (typeof chunk !== 'string' && !state.objectMode) { - er = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer'], chunk); - } - if (er) { - errorOrDestroy(stream, er); - browser$1$1.nextTick(cb, er); - return false; - } - return true; -} -Writable.prototype.write = function (chunk, encoding, cb) { - var state = this._writableState; - var ret = false; - var isBuf = !state.objectMode && _isUint8Array(chunk); - if (isBuf && !Buffer.isBuffer(chunk)) { - chunk = _uint8ArrayToBuffer(chunk); - } - if (typeof encoding === 'function') { - cb = encoding; - encoding = null; - } - if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding; - if (typeof cb !== 'function') cb = nop; - if (state.ending) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) { - state.pendingcb++; - ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb); - } - return ret; -}; -Writable.prototype.cork = function () { - this._writableState.corked++; -}; -Writable.prototype.uncork = function () { - var state = this._writableState; - if (state.corked) { - state.corked--; - if (!state.writing && !state.corked && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state); - } -}; -Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { - // node::ParseEncoding() requires lower case. - if (typeof encoding === 'string') encoding = encoding.toLowerCase(); - if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new ERR_UNKNOWN_ENCODING(encoding); - this._writableState.defaultEncoding = encoding; - return this; -}; -Object.defineProperty(Writable.prototype, 'writableBuffer', { - // making it explicit this property is not enumerable - // because otherwise some prototype manipulation in - // userland will fail - enumerable: false, - get: function get() { - return this._writableState && this._writableState.getBuffer(); - } -}); -function decodeChunk(state, chunk, encoding) { - if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { - chunk = Buffer.from(chunk, encoding); - } - return chunk; -} -Object.defineProperty(Writable.prototype, 'writableHighWaterMark', { - // making it explicit this property is not enumerable - // because otherwise some prototype manipulation in - // userland will fail - enumerable: false, - get: function get() { - return this._writableState.highWaterMark; - } -}); // if we're already writing something, then just put this -// in the queue, and wait our turn. Otherwise, call _write -// If we return false, then we need a drain event, so set that flag. - -function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) { - if (!isBuf) { - var newChunk = decodeChunk(state, chunk, encoding); - if (chunk !== newChunk) { - isBuf = true; - encoding = 'buffer'; - chunk = newChunk; - } - } - var len = state.objectMode ? 1 : chunk.length; - state.length += len; - var ret = state.length < state.highWaterMark; // we must ensure that previous needDrain will not be reset to false. - - if (!ret) state.needDrain = true; - if (state.writing || state.corked) { - var last = state.lastBufferedRequest; - state.lastBufferedRequest = { - chunk: chunk, - encoding: encoding, - isBuf: isBuf, - callback: cb, - next: null - }; - if (last) { - last.next = state.lastBufferedRequest; - } else { - state.bufferedRequest = state.lastBufferedRequest; - } - state.bufferedRequestCount += 1; - } else { - doWrite(stream, state, false, len, chunk, encoding, cb); - } - return ret; -} -function doWrite(stream, state, writev, len, chunk, encoding, cb) { - state.writelen = len; - state.writecb = cb; - state.writing = true; - state.sync = true; - if (state.destroyed) state.onwrite(new ERR_STREAM_DESTROYED$1('write'));else if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite); - state.sync = false; -} -function onwriteError(stream, state, sync, er, cb) { - --state.pendingcb; - if (sync) { - // defer the callback if we are being called synchronously - // to avoid piling up things on the stack - browser$1$1.nextTick(cb, er); // this can emit finish, and it will always happen - // after error - - browser$1$1.nextTick(finishMaybe, stream, state); - stream._writableState.errorEmitted = true; - errorOrDestroy(stream, er); - } else { - // the caller expect this to happen before if - // it is async - cb(er); - stream._writableState.errorEmitted = true; - errorOrDestroy(stream, er); // this can emit finish, but finish must - // always follow error - - finishMaybe(stream, state); - } -} -function onwriteStateUpdate(state) { - state.writing = false; - state.writecb = null; - state.length -= state.writelen; - state.writelen = 0; -} -function onwrite(stream, er) { - var state = stream._writableState; - var sync = state.sync; - var cb = state.writecb; - if (typeof cb !== 'function') throw new ERR_MULTIPLE_CALLBACK$1(); - onwriteStateUpdate(state); - if (er) onwriteError(stream, state, sync, er, cb);else { - // Check if we're actually ready to finish, but don't emit yet - var finished = needFinish(state) || stream.destroyed; - if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) { - clearBuffer(stream, state); - } - if (sync) { - browser$1$1.nextTick(afterWrite, stream, state, finished, cb); - } else { - afterWrite(stream, state, finished, cb); - } - } -} -function afterWrite(stream, state, finished, cb) { - if (!finished) onwriteDrain(stream, state); - state.pendingcb--; - cb(); - finishMaybe(stream, state); -} // Must force callback to be called on nextTick, so that we don't -// emit 'drain' before the write() consumer gets the 'false' return -// value, and has a chance to attach a 'drain' listener. - -function onwriteDrain(stream, state) { - if (state.length === 0 && state.needDrain) { - state.needDrain = false; - stream.emit('drain'); - } -} // if there's something in the buffer waiting, then process it - -function clearBuffer(stream, state) { - state.bufferProcessing = true; - var entry = state.bufferedRequest; - if (stream._writev && entry && entry.next) { - // Fast case, write everything using _writev() - var l = state.bufferedRequestCount; - var buffer = new Array(l); - var holder = state.corkedRequestsFree; - holder.entry = entry; - var count = 0; - var allBuffers = true; - while (entry) { - buffer[count] = entry; - if (!entry.isBuf) allBuffers = false; - entry = entry.next; - count += 1; - } - buffer.allBuffers = allBuffers; - doWrite(stream, state, true, state.length, buffer, '', holder.finish); // doWrite is almost always async, defer these to save a bit of time - // as the hot path ends with doWrite - - state.pendingcb++; - state.lastBufferedRequest = null; - if (holder.next) { - state.corkedRequestsFree = holder.next; - holder.next = null; - } else { - state.corkedRequestsFree = new CorkedRequest(state); - } - state.bufferedRequestCount = 0; - } else { - // Slow case, write chunks one-by-one - while (entry) { - var chunk = entry.chunk; - var encoding = entry.encoding; - var cb = entry.callback; - var len = state.objectMode ? 1 : chunk.length; - doWrite(stream, state, false, len, chunk, encoding, cb); - entry = entry.next; - state.bufferedRequestCount--; // if we didn't call the onwrite immediately, then - // it means that we need to wait until it does. - // also, that means that the chunk and cb are currently - // being processed, so move the buffer counter past them. - - if (state.writing) { - break; - } - } - if (entry === null) state.lastBufferedRequest = null; - } - state.bufferedRequest = entry; - state.bufferProcessing = false; -} -Writable.prototype._write = function (chunk, encoding, cb) { - cb(new ERR_METHOD_NOT_IMPLEMENTED$1('_write()')); -}; -Writable.prototype._writev = null; -Writable.prototype.end = function (chunk, encoding, cb) { - var state = this._writableState; - if (typeof chunk === 'function') { - cb = chunk; - chunk = null; - encoding = null; - } else if (typeof encoding === 'function') { - cb = encoding; - encoding = null; - } - if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); // .end() fully uncorks - - if (state.corked) { - state.corked = 1; - this.uncork(); - } // ignore unnecessary end() calls. - - if (!state.ending) endWritable(this, state, cb); - return this; -}; -Object.defineProperty(Writable.prototype, 'writableLength', { - // making it explicit this property is not enumerable - // because otherwise some prototype manipulation in - // userland will fail - enumerable: false, - get: function get() { - return this._writableState.length; - } -}); -function needFinish(state) { - return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; -} -function callFinal(stream, state) { - stream._final(function (err) { - state.pendingcb--; - if (err) { - errorOrDestroy(stream, err); - } - state.prefinished = true; - stream.emit('prefinish'); - finishMaybe(stream, state); - }); -} -function prefinish$1(stream, state) { - if (!state.prefinished && !state.finalCalled) { - if (typeof stream._final === 'function' && !state.destroyed) { - state.pendingcb++; - state.finalCalled = true; - browser$1$1.nextTick(callFinal, stream, state); - } else { - state.prefinished = true; - stream.emit('prefinish'); - } - } -} -function finishMaybe(stream, state) { - var need = needFinish(state); - if (need) { - prefinish$1(stream, state); - if (state.pendingcb === 0) { - state.finished = true; - stream.emit('finish'); - if (state.autoDestroy) { - // In case of duplex streams we need a way to detect - // if the readable side is ready for autoDestroy as well - var rState = stream._readableState; - if (!rState || rState.autoDestroy && rState.endEmitted) { - stream.destroy(); - } - } - } - } - return need; -} -function endWritable(stream, state, cb) { - state.ending = true; - finishMaybe(stream, state); - if (cb) { - if (state.finished) browser$1$1.nextTick(cb);else stream.once('finish', cb); - } - state.ended = true; - stream.writable = false; -} -function onCorkedFinish(corkReq, state, err) { - var entry = corkReq.entry; - corkReq.entry = null; - while (entry) { - var cb = entry.callback; - state.pendingcb--; - cb(err); - entry = entry.next; - } // reuse the free corkReq. - - state.corkedRequestsFree.next = corkReq; -} -Object.defineProperty(Writable.prototype, 'destroyed', { - // making it explicit this property is not enumerable - // because otherwise some prototype manipulation in - // userland will fail - enumerable: false, - get: function get() { - if (this._writableState === undefined) { - return false; - } - return this._writableState.destroyed; - }, - set: function set(value) { - // we ignore the value if the stream - // has not been initialized yet - if (!this._writableState) { - return; - } // backward compatibility, the user is explicitly - // managing destroyed - - this._writableState.destroyed = value; - } -}); -Writable.prototype.destroy = destroyImpl.destroy; -Writable.prototype._undestroy = destroyImpl.undestroy; -Writable.prototype._destroy = function (err, cb) { - cb(err); -}; - -/**/ - -var objectKeys$1 = Object.keys || function (obj) { - var keys = []; - for (var key in obj) { - keys.push(key); - } - return keys; -}; -/**/ - -const Registry$2 = _registry; -Registry$2.Duplex = Duplex; -require$$1(Duplex, Registry$2.Readable); -{ - // Allow the keys array to be GC'ed. - var keys = objectKeys$1(Registry$2.Writable.prototype); - for (var v = 0; v < keys.length; v++) { - var method = keys[v]; - if (!Duplex.prototype[method]) Duplex.prototype[method] = Registry$2.Writable.prototype[method]; - } -} -function Duplex(options) { - if (!(this instanceof Duplex)) return new Duplex(options); - Registry$2.Readable.call(this, options); - Registry$2.Writable.call(this, options); - this.allowHalfOpen = true; - if (options) { - if (options.readable === false) this.readable = false; - if (options.writable === false) this.writable = false; - if (options.allowHalfOpen === false) { - this.allowHalfOpen = false; - this.once('end', onend); - } - } -} -Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', { - // making it explicit this property is not enumerable - // because otherwise some prototype manipulation in - // userland will fail - enumerable: false, - get: function get() { - return this._writableState.highWaterMark; - } -}); -Object.defineProperty(Duplex.prototype, 'writableBuffer', { - // making it explicit this property is not enumerable - // because otherwise some prototype manipulation in - // userland will fail - enumerable: false, - get: function get() { - return this._writableState && this._writableState.getBuffer(); - } -}); -Object.defineProperty(Duplex.prototype, 'writableLength', { - // making it explicit this property is not enumerable - // because otherwise some prototype manipulation in - // userland will fail - enumerable: false, - get: function get() { - return this._writableState.length; - } -}); // the no-half-open enforcer - -function onend() { - // If the writable side ended, then we're ok. - if (this._writableState.ended) return; // no more data can be written. - // But allow more writes to happen in this tick. - - browser$1$1.nextTick(onEndNT, this); -} -function onEndNT(self) { - self.end(); -} -Object.defineProperty(Duplex.prototype, 'destroyed', { - // making it explicit this property is not enumerable - // because otherwise some prototype manipulation in - // userland will fail - enumerable: false, - get: function get() { - if (this._readableState === undefined || this._writableState === undefined) { - return false; - } - return this._readableState.destroyed && this._writableState.destroyed; - }, - set: function set(value) { - // we ignore the value if the stream - // has not been initialized yet - if (this._readableState === undefined || this._writableState === undefined) { - return; - } // backward compatibility, the user is explicitly - // managing destroyed - - this._readableState.destroyed = value; - this._writableState.destroyed = value; - } -}); - -const Registry$1 = _registry; -Registry$1.Transform = Transform$1; -var _require$codes$1 = errorsBrowser.codes, - ERR_METHOD_NOT_IMPLEMENTED = _require$codes$1.ERR_METHOD_NOT_IMPLEMENTED, - ERR_MULTIPLE_CALLBACK = _require$codes$1.ERR_MULTIPLE_CALLBACK, - ERR_TRANSFORM_ALREADY_TRANSFORMING = _require$codes$1.ERR_TRANSFORM_ALREADY_TRANSFORMING, - ERR_TRANSFORM_WITH_LENGTH_0 = _require$codes$1.ERR_TRANSFORM_WITH_LENGTH_0; -require$$1(Transform$1, Registry$1.Duplex); -function afterTransform(er, data) { - var ts = this._transformState; - ts.transforming = false; - var cb = ts.writecb; - if (cb === null) { - return this.emit('error', new ERR_MULTIPLE_CALLBACK()); - } - ts.writechunk = null; - ts.writecb = null; - if (data != null) - // single equals check for both `null` and `undefined` - this.push(data); - cb(er); - var rs = this._readableState; - rs.reading = false; - if (rs.needReadable || rs.length < rs.highWaterMark) { - this._read(rs.highWaterMark); - } -} -function Transform$1(options) { - if (!(this instanceof Transform$1)) return new Transform$1(options); - Registry$1.Duplex.call(this, options); - this._transformState = { - afterTransform: afterTransform.bind(this), - needTransform: false, - transforming: false, - writecb: null, - writechunk: null, - writeencoding: null - }; // start out asking for a readable event once data is transformed. - - this._readableState.needReadable = true; // we have implemented the _read method, and done the other things - // that Readable wants before the first _read call, so unset the - // sync guard flag. - - this._readableState.sync = false; - if (options) { - if (typeof options.transform === 'function') this._transform = options.transform; - if (typeof options.flush === 'function') this._flush = options.flush; - } // When the writable side finishes, then flush out anything remaining. - - this.on('prefinish', prefinish); -} -function prefinish() { - var _this = this; - if (typeof this._flush === 'function' && !this._readableState.destroyed) { - this._flush(function (er, data) { - done(_this, er, data); - }); - } else { - done(this, null, null); - } -} -Transform$1.prototype.push = function (chunk, encoding) { - this._transformState.needTransform = false; - return Registry$1.Duplex.prototype.push.call(this, chunk, encoding); -}; // This is the part where you do stuff! -// override this function in implementation classes. -// 'chunk' is an input chunk. -// -// Call `push(newChunk)` to pass along transformed output -// to the readable side. You may call 'push' zero or more times. -// -// Call `cb(err)` when you are done with this chunk. If you pass -// an error, then that'll put the hurt on the whole operation. If you -// never call cb(), then you'll never get another chunk. - -Transform$1.prototype._transform = function (chunk, encoding, cb) { - cb(new ERR_METHOD_NOT_IMPLEMENTED('_transform()')); -}; -Transform$1.prototype._write = function (chunk, encoding, cb) { - var ts = this._transformState; - ts.writecb = cb; - ts.writechunk = chunk; - ts.writeencoding = encoding; - if (!ts.transforming) { - var rs = this._readableState; - if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); - } -}; // Doesn't matter what the args are here. -// _transform does all the work. -// That we got here means that the readable side wants more data. - -Transform$1.prototype._read = function (n) { - var ts = this._transformState; - if (ts.writechunk !== null && !ts.transforming) { - ts.transforming = true; - this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); - } else { - // mark that we need a transform, so that any data that comes in - // will get processed, now that we've asked for it. - ts.needTransform = true; - } -}; -Transform$1.prototype._destroy = function (err, cb) { - Registry$1.Duplex.prototype._destroy.call(this, err, function (err2) { - cb(err2); - }); -}; -function done(stream, er, data) { - if (er) return stream.emit('error', er); - if (data != null) - // single equals check for both `null` and `undefined` - stream.push(data); // TODO(BridgeAR): Write a test for these two error cases - // if there's nothing in the write buffer, then that means - // that nothing more will ever be provided - - if (stream._writableState.length) throw new ERR_TRANSFORM_WITH_LENGTH_0(); - if (stream._transformState.transforming) throw new ERR_TRANSFORM_ALREADY_TRANSFORMING(); - return stream.push(null); -} - -const Registry = _registry; -Registry.PassThrough = PassThrough; -require$$1(PassThrough, Registry.Transform); -function PassThrough(options) { - if (!(this instanceof PassThrough)) return new PassThrough(options); - Transform.call(this, options); -} -PassThrough.prototype._transform = function (chunk, encoding, cb) { - cb(null, chunk); -}; - -var eos; -function once(callback) { - var called = false; - return function () { - if (called) return; - called = true; - callback.apply(void 0, arguments); - }; -} -var _require$codes = errorsBrowser.codes, - ERR_MISSING_ARGS = _require$codes.ERR_MISSING_ARGS, - ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED; -function noop(err) { - // Rethrow the error if it exists to avoid swallowing it - if (err) throw err; -} -function isRequest(stream) { - return stream.setHeader && typeof stream.abort === 'function'; -} -function destroyer(stream, reading, writing, callback) { - callback = once(callback); - var closed = false; - stream.on('close', function () { - closed = true; - }); - if (eos === undefined) eos = endOfStream; - eos(stream, { - readable: reading, - writable: writing - }, function (err) { - if (err) return callback(err); - closed = true; - callback(); - }); - var destroyed = false; - return function (err) { - if (closed) return; - if (destroyed) return; - destroyed = true; // request.destroy just do .end - .abort is what we want - - if (isRequest(stream)) return stream.abort(); - if (typeof stream.destroy === 'function') return stream.destroy(); - callback(err || new ERR_STREAM_DESTROYED('pipe')); - }; -} -function call(fn) { - fn(); -} -function pipe(from, to) { - return from.pipe(to); -} -function popCallback(streams) { - if (!streams.length) return noop; - if (typeof streams[streams.length - 1] !== 'function') return noop; - return streams.pop(); -} -function pipeline() { - for (var _len = arguments.length, streams = new Array(_len), _key = 0; _key < _len; _key++) { - streams[_key] = arguments[_key]; - } - var callback = popCallback(streams); - if (Array.isArray(streams[0])) streams = streams[0]; - if (streams.length < 2) { - throw new ERR_MISSING_ARGS('streams'); - } - var error; - var destroys = streams.map(function (stream, i) { - var reading = i < streams.length - 1; - var writing = i > 0; - return destroyer(stream, reading, writing, function (err) { - if (!error) error = err; - if (err) destroys.forEach(call); - if (reading) return; - destroys.forEach(call); - callback(error); - }); - }); - return streams.reduce(pipe); -} -var pipeline_1 = pipeline; - -(function (module, exports) { - const Registry = _registry; - exports = module.exports = Registry.Readable; - exports.Stream = Registry.Readable; - exports.Readable = Registry.Readable; - exports.Writable = Registry.Writable; - exports.Duplex = Registry.Duplex; - exports.Transform = Registry.Transform; - exports.PassThrough = Registry.PassThrough; - exports.finished = endOfStream; - exports.pipeline = pipeline_1; -})(readableBrowser, readableBrowser.exports); -var readableBrowserExports = readableBrowser.exports; -var stream = /*@__PURE__*/getDefaultExportFromCjs(readableBrowserExports); - -var lib = {}; - -var binding = {}; - -function compare(a, b) { - if (a === b) { - return 0; - } - - var x = a.length; - var y = b.length; - - for (var i = 0, len = Math.min(x, y); i < len; ++i) { - if (a[i] !== b[i]) { - x = a[i]; - y = b[i]; - break; - } - } - - if (x < y) { - return -1; - } - if (y < x) { - return 1; - } - return 0; -} -var hasOwn = Object.prototype.hasOwnProperty; - -var objectKeys = Object.keys || function (obj) { - var keys = []; - for (var key in obj) { - if (hasOwn.call(obj, key)) keys.push(key); - } - return keys; -}; -var pSlice = Array.prototype.slice; -var _functionsHaveNames; -function functionsHaveNames() { - if (typeof _functionsHaveNames !== 'undefined') { - return _functionsHaveNames; - } - return _functionsHaveNames = (function () { - return function foo() {}.name === 'foo'; - }()); -} -function pToString (obj) { - return Object.prototype.toString.call(obj); -} -function isView(arrbuf) { - if (isBuffer$1(arrbuf)) { - return false; - } - if (typeof global$1.ArrayBuffer !== 'function') { - return false; - } - if (typeof ArrayBuffer.isView === 'function') { - return ArrayBuffer.isView(arrbuf); - } - if (!arrbuf) { - return false; - } - if (arrbuf instanceof DataView) { - return true; - } - if (arrbuf.buffer && arrbuf.buffer instanceof ArrayBuffer) { - return true; - } - return false; -} -// 1. The assert module provides functions that throw -// AssertionError's when particular conditions are not met. The -// assert module must conform to the following interface. - -function assert(value, message) { - if (!value) fail(value, true, message, '==', ok); -} - -// 2. The AssertionError is defined in assert. -// new assert.AssertionError({ message: message, -// actual: actual, -// expected: expected }) - -var regex = /\s*function\s+([^\(\s]*)\s*/; -// based on https://github.com/ljharb/function.prototype.name/blob/adeeeec8bfcc6068b187d7d9fb3d5bb1d3a30899/implementation.js -function getName(func) { - if (!isFunction(func)) { - return; - } - if (functionsHaveNames()) { - return func.name; - } - var str = func.toString(); - var match = str.match(regex); - return match && match[1]; -} -assert.AssertionError = AssertionError; -function AssertionError(options) { - this.name = 'AssertionError'; - this.actual = options.actual; - this.expected = options.expected; - this.operator = options.operator; - if (options.message) { - this.message = options.message; - this.generatedMessage = false; - } else { - this.message = getMessage(this); - this.generatedMessage = true; - } - var stackStartFunction = options.stackStartFunction || fail; - if (Error.captureStackTrace) { - Error.captureStackTrace(this, stackStartFunction); - } else { - // non v8 browsers so we can have a stacktrace - var err = new Error(); - if (err.stack) { - var out = err.stack; - - // try to strip useless frames - var fn_name = getName(stackStartFunction); - var idx = out.indexOf('\n' + fn_name); - if (idx >= 0) { - // once we have located the function frame - // we need to strip out everything before it (and its line) - var next_line = out.indexOf('\n', idx + 1); - out = out.substring(next_line + 1); - } - - this.stack = out; - } - } -} - -// assert.AssertionError instanceof Error -inherits$2(AssertionError, Error); - -function truncate(s, n) { - if (typeof s === 'string') { - return s.length < n ? s : s.slice(0, n); - } else { - return s; - } -} -function inspect(something) { - if (functionsHaveNames() || !isFunction(something)) { - return inspect$1(something); - } - var rawname = getName(something); - var name = rawname ? ': ' + rawname : ''; - return '[Function' + name + ']'; -} -function getMessage(self) { - return truncate(inspect(self.actual), 128) + ' ' + - self.operator + ' ' + - truncate(inspect(self.expected), 128); -} - -// At present only the three keys mentioned above are used and -// understood by the spec. Implementations or sub modules can pass -// other keys to the AssertionError's constructor - they will be -// ignored. - -// 3. All of the following functions must throw an AssertionError -// when a corresponding condition is not met, with a message that -// may be undefined if not provided. All assertion methods provide -// both the actual and expected values to the assertion error for -// display purposes. - -function fail(actual, expected, message, operator, stackStartFunction) { - throw new AssertionError({ - message: message, - actual: actual, - expected: expected, - operator: operator, - stackStartFunction: stackStartFunction - }); -} - -// EXTENSION! allows for well behaved errors defined elsewhere. -assert.fail = fail; - -// 4. Pure assertion tests whether a value is truthy, as determined -// by !!guard. -// assert.ok(guard, message_opt); -// This statement is equivalent to assert.equal(true, !!guard, -// message_opt);. To test strictly for the value true, use -// assert.strictEqual(true, guard, message_opt);. - -function ok(value, message) { - if (!value) fail(value, true, message, '==', ok); -} -assert.ok = ok; - -// 5. The equality assertion tests shallow, coercive equality with -// ==. -// assert.equal(actual, expected, message_opt); -assert.equal = equal; -function equal(actual, expected, message) { - if (actual != expected) fail(actual, expected, message, '==', equal); -} - -// 6. The non-equality assertion tests for whether two objects are not equal -// with != assert.notEqual(actual, expected, message_opt); -assert.notEqual = notEqual; -function notEqual(actual, expected, message) { - if (actual == expected) { - fail(actual, expected, message, '!=', notEqual); - } -} - -// 7. The equivalence assertion tests a deep equality relation. -// assert.deepEqual(actual, expected, message_opt); -assert.deepEqual = deepEqual; -function deepEqual(actual, expected, message) { - if (!_deepEqual(actual, expected, false)) { - fail(actual, expected, message, 'deepEqual', deepEqual); - } -} -assert.deepStrictEqual = deepStrictEqual; -function deepStrictEqual(actual, expected, message) { - if (!_deepEqual(actual, expected, true)) { - fail(actual, expected, message, 'deepStrictEqual', deepStrictEqual); - } -} - -function _deepEqual(actual, expected, strict, memos) { - // 7.1. All identical values are equivalent, as determined by ===. - if (actual === expected) { - return true; - } else if (isBuffer$1(actual) && isBuffer$1(expected)) { - return compare(actual, expected) === 0; - - // 7.2. If the expected value is a Date object, the actual value is - // equivalent if it is also a Date object that refers to the same time. - } else if (isDate(actual) && isDate(expected)) { - return actual.getTime() === expected.getTime(); - - // 7.3 If the expected value is a RegExp object, the actual value is - // equivalent if it is also a RegExp object with the same source and - // properties (`global`, `multiline`, `lastIndex`, `ignoreCase`). - } else if (isRegExp(actual) && isRegExp(expected)) { - return actual.source === expected.source && - actual.global === expected.global && - actual.multiline === expected.multiline && - actual.lastIndex === expected.lastIndex && - actual.ignoreCase === expected.ignoreCase; - - // 7.4. Other pairs that do not both pass typeof value == 'object', - // equivalence is determined by ==. - } else if ((actual === null || typeof actual !== 'object') && - (expected === null || typeof expected !== 'object')) { - return strict ? actual === expected : actual == expected; - - // If both values are instances of typed arrays, wrap their underlying - // ArrayBuffers in a Buffer each to increase performance - // This optimization requires the arrays to have the same type as checked by - // Object.prototype.toString (aka pToString). Never perform binary - // comparisons for Float*Arrays, though, since e.g. +0 === -0 but their - // bit patterns are not identical. - } else if (isView(actual) && isView(expected) && - pToString(actual) === pToString(expected) && - !(actual instanceof Float32Array || - actual instanceof Float64Array)) { - return compare(new Uint8Array(actual.buffer), - new Uint8Array(expected.buffer)) === 0; - - // 7.5 For all other Object pairs, including Array objects, equivalence is - // determined by having the same number of owned properties (as verified - // with Object.prototype.hasOwnProperty.call), the same set of keys - // (although not necessarily the same order), equivalent values for every - // corresponding key, and an identical 'prototype' property. Note: this - // accounts for both named and indexed properties on Arrays. - } else if (isBuffer$1(actual) !== isBuffer$1(expected)) { - return false; - } else { - memos = memos || {actual: [], expected: []}; - - var actualIndex = memos.actual.indexOf(actual); - if (actualIndex !== -1) { - if (actualIndex === memos.expected.indexOf(expected)) { - return true; - } - } - - memos.actual.push(actual); - memos.expected.push(expected); - - return objEquiv(actual, expected, strict, memos); - } -} - -function isArguments(object) { - return Object.prototype.toString.call(object) == '[object Arguments]'; -} - -function objEquiv(a, b, strict, actualVisitedObjects) { - if (a === null || a === undefined || b === null || b === undefined) - return false; - // if one is a primitive, the other must be same - if (isPrimitive(a) || isPrimitive(b)) - return a === b; - if (strict && Object.getPrototypeOf(a) !== Object.getPrototypeOf(b)) - return false; - var aIsArgs = isArguments(a); - var bIsArgs = isArguments(b); - if ((aIsArgs && !bIsArgs) || (!aIsArgs && bIsArgs)) - return false; - if (aIsArgs) { - a = pSlice.call(a); - b = pSlice.call(b); - return _deepEqual(a, b, strict); - } - var ka = objectKeys(a); - var kb = objectKeys(b); - var key, i; - // having the same number of owned properties (keys incorporates - // hasOwnProperty) - if (ka.length !== kb.length) - return false; - //the same set of keys (although not necessarily the same order), - ka.sort(); - kb.sort(); - //~~~cheap key test - for (i = ka.length - 1; i >= 0; i--) { - if (ka[i] !== kb[i]) - return false; - } - //equivalent values for every corresponding key, and - //~~~possibly expensive deep test - for (i = ka.length - 1; i >= 0; i--) { - key = ka[i]; - if (!_deepEqual(a[key], b[key], strict, actualVisitedObjects)) - return false; - } - return true; -} - -// 8. The non-equivalence assertion tests for any deep inequality. -// assert.notDeepEqual(actual, expected, message_opt); -assert.notDeepEqual = notDeepEqual; -function notDeepEqual(actual, expected, message) { - if (_deepEqual(actual, expected, false)) { - fail(actual, expected, message, 'notDeepEqual', notDeepEqual); - } -} - -assert.notDeepStrictEqual = notDeepStrictEqual; -function notDeepStrictEqual(actual, expected, message) { - if (_deepEqual(actual, expected, true)) { - fail(actual, expected, message, 'notDeepStrictEqual', notDeepStrictEqual); - } -} - - -// 9. The strict equality assertion tests strict equality, as determined by ===. -// assert.strictEqual(actual, expected, message_opt); -assert.strictEqual = strictEqual; -function strictEqual(actual, expected, message) { - if (actual !== expected) { - fail(actual, expected, message, '===', strictEqual); - } -} - -// 10. The strict non-equality assertion tests for strict inequality, as -// determined by !==. assert.notStrictEqual(actual, expected, message_opt); -assert.notStrictEqual = notStrictEqual; -function notStrictEqual(actual, expected, message) { - if (actual === expected) { - fail(actual, expected, message, '!==', notStrictEqual); - } -} - -function expectedException(actual, expected) { - if (!actual || !expected) { - return false; - } - - if (Object.prototype.toString.call(expected) == '[object RegExp]') { - return expected.test(actual); - } - - try { - if (actual instanceof expected) { - return true; - } - } catch (e) { - // Ignore. The instanceof check doesn't work for arrow functions. - } - - if (Error.isPrototypeOf(expected)) { - return false; - } - - return expected.call({}, actual) === true; -} - -function _tryBlock(block) { - var error; - try { - block(); - } catch (e) { - error = e; - } - return error; -} - -function _throws(shouldThrow, block, expected, message) { - var actual; - - if (typeof block !== 'function') { - throw new TypeError('"block" argument must be a function'); - } - - if (typeof expected === 'string') { - message = expected; - expected = null; - } - - actual = _tryBlock(block); - - message = (expected && expected.name ? ' (' + expected.name + ').' : '.') + - (message ? ' ' + message : '.'); - - if (shouldThrow && !actual) { - fail(actual, expected, 'Missing expected exception' + message); - } - - var userProvidedMessage = typeof message === 'string'; - var isUnwantedException = !shouldThrow && isError(actual); - var isUnexpectedException = !shouldThrow && actual && !expected; - - if ((isUnwantedException && - userProvidedMessage && - expectedException(actual, expected)) || - isUnexpectedException) { - fail(actual, expected, 'Got unwanted exception' + message); - } - - if ((shouldThrow && actual && expected && - !expectedException(actual, expected)) || (!shouldThrow && actual)) { - throw actual; - } -} - -// 11. Expected to throw an error: -// assert.throws(block, Error_opt, message_opt); -assert.throws = throws; -function throws(block, /*optional*/error, /*optional*/message) { - _throws(true, block, error, message); -} - -// EXTENSION! This is annoying to write outside this module. -assert.doesNotThrow = doesNotThrow; -function doesNotThrow(block, /*optional*/error, /*optional*/message) { - _throws(false, block, error, message); -} - -assert.ifError = ifError; -function ifError(err) { - if (err) throw err; -} - -var _polyfillNode_assert = /*#__PURE__*/Object.freeze({ - __proto__: null, - AssertionError: AssertionError, - assert: ok, - deepEqual: deepEqual, - deepStrictEqual: deepStrictEqual, - default: assert, - doesNotThrow: doesNotThrow, - equal: equal, - fail: fail, - ifError: ifError, - notDeepEqual: notDeepEqual, - notDeepStrictEqual: notDeepStrictEqual, - notEqual: notEqual, - notStrictEqual: notStrictEqual, - ok: ok, - strictEqual: strictEqual, - throws: throws -}); - -var require$$4 = /*@__PURE__*/getAugmentedNamespace(_polyfillNode_assert); - -// (C) 1995-2013 Jean-loup Gailly and Mark Adler -// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// 3. This notice may not be removed or altered from any source distribution. - -function ZStream() { - /* next input byte */ - this.input = null; // JS specific, because we have no pointers - this.next_in = 0; - /* number of bytes available at input */ - this.avail_in = 0; - /* total number of input bytes read so far */ - this.total_in = 0; - /* next output byte should be put there */ - this.output = null; // JS specific, because we have no pointers - this.next_out = 0; - /* remaining free space at output */ - this.avail_out = 0; - /* total number of bytes output so far */ - this.total_out = 0; - /* last error message, NULL if no error */ - this.msg = '' /*Z_NULL*/; - /* not visible by applications */ - this.state = null; - /* best guess about the data type: binary or text */ - this.data_type = 2 /*Z_UNKNOWN*/; - /* adler32 value of the uncompressed data */ - this.adler = 0; -} -var zstream = ZStream; - -var deflate$1 = {}; - -var common = {}; - -(function (exports) { - - var TYPED_OK = typeof Uint8Array !== 'undefined' && typeof Uint16Array !== 'undefined' && typeof Int32Array !== 'undefined'; - function _has(obj, key) { - return Object.prototype.hasOwnProperty.call(obj, key); - } - exports.assign = function (obj /*from1, from2, from3, ...*/) { - var sources = Array.prototype.slice.call(arguments, 1); - while (sources.length) { - var source = sources.shift(); - if (!source) { - continue; - } - if (typeof source !== 'object') { - throw new TypeError(source + 'must be non-object'); - } - for (var p in source) { - if (_has(source, p)) { - obj[p] = source[p]; - } - } - } - return obj; - }; - - // reduce buffer size, avoiding mem copy - exports.shrinkBuf = function (buf, size) { - if (buf.length === size) { - return buf; - } - if (buf.subarray) { - return buf.subarray(0, size); - } - buf.length = size; - return buf; - }; - var fnTyped = { - arraySet: function (dest, src, src_offs, len, dest_offs) { - if (src.subarray && dest.subarray) { - dest.set(src.subarray(src_offs, src_offs + len), dest_offs); - return; - } - // Fallback to ordinary array - for (var i = 0; i < len; i++) { - dest[dest_offs + i] = src[src_offs + i]; - } - }, - // Join array of chunks to single array. - flattenChunks: function (chunks) { - var i, l, len, pos, chunk, result; - - // calculate data length - len = 0; - for (i = 0, l = chunks.length; i < l; i++) { - len += chunks[i].length; - } - - // join chunks - result = new Uint8Array(len); - pos = 0; - for (i = 0, l = chunks.length; i < l; i++) { - chunk = chunks[i]; - result.set(chunk, pos); - pos += chunk.length; - } - return result; - } - }; - var fnUntyped = { - arraySet: function (dest, src, src_offs, len, dest_offs) { - for (var i = 0; i < len; i++) { - dest[dest_offs + i] = src[src_offs + i]; - } - }, - // Join array of chunks to single array. - flattenChunks: function (chunks) { - return [].concat.apply([], chunks); - } - }; - - // Enable/Disable typed arrays use, for testing - // - exports.setTyped = function (on) { - if (on) { - exports.Buf8 = Uint8Array; - exports.Buf16 = Uint16Array; - exports.Buf32 = Int32Array; - exports.assign(exports, fnTyped); - } else { - exports.Buf8 = Array; - exports.Buf16 = Array; - exports.Buf32 = Array; - exports.assign(exports, fnUntyped); - } - }; - exports.setTyped(TYPED_OK); -})(common); - -var trees$1 = {}; - -// (C) 1995-2013 Jean-loup Gailly and Mark Adler -// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// 3. This notice may not be removed or altered from any source distribution. - -/* eslint-disable space-unary-ops */ - -var utils$3 = common; - -/* Public constants ==========================================================*/ -/* ===========================================================================*/ - -//var Z_FILTERED = 1; -//var Z_HUFFMAN_ONLY = 2; -//var Z_RLE = 3; -var Z_FIXED$1 = 4; -//var Z_DEFAULT_STRATEGY = 0; - -/* Possible values of the data_type field (though see inflate()) */ -var Z_BINARY = 0; -var Z_TEXT = 1; -//var Z_ASCII = 1; // = Z_TEXT -var Z_UNKNOWN$1 = 2; - -/*============================================================================*/ - -function zero$1(buf) { - var len = buf.length; - while (--len >= 0) { - buf[len] = 0; - } -} - -// From zutil.h - -var STORED_BLOCK = 0; -var STATIC_TREES = 1; -var DYN_TREES = 2; -/* The three kinds of block type */ - -var MIN_MATCH$1 = 3; -var MAX_MATCH$1 = 258; -/* The minimum and maximum match lengths */ - -// From deflate.h -/* =========================================================================== - * Internal compression state. - */ - -var LENGTH_CODES$1 = 29; -/* number of length codes, not counting the special END_BLOCK code */ - -var LITERALS$1 = 256; -/* number of literal bytes 0..255 */ - -var L_CODES$1 = LITERALS$1 + 1 + LENGTH_CODES$1; -/* number of Literal or Length codes, including the END_BLOCK code */ - -var D_CODES$1 = 30; -/* number of distance codes */ - -var BL_CODES$1 = 19; -/* number of codes used to transfer the bit lengths */ - -var HEAP_SIZE$1 = 2 * L_CODES$1 + 1; -/* maximum heap size */ - -var MAX_BITS$1 = 15; -/* All codes must not exceed MAX_BITS bits */ - -var Buf_size = 16; -/* size of bit buffer in bi_buf */ - -/* =========================================================================== - * Constants - */ - -var MAX_BL_BITS = 7; -/* Bit length codes must not exceed MAX_BL_BITS bits */ - -var END_BLOCK = 256; -/* end of block literal code */ - -var REP_3_6 = 16; -/* repeat previous bit length 3-6 times (2 bits of repeat count) */ - -var REPZ_3_10 = 17; -/* repeat a zero length 3-10 times (3 bits of repeat count) */ - -var REPZ_11_138 = 18; -/* repeat a zero length 11-138 times (7 bits of repeat count) */ - -/* eslint-disable comma-spacing,array-bracket-spacing */ -var extra_lbits = /* extra bits for each length code */ -[0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0]; -var extra_dbits = /* extra bits for each distance code */ -[0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13]; -var extra_blbits = /* extra bits for each bit length code */ -[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7]; -var bl_order = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]; -/* eslint-enable comma-spacing,array-bracket-spacing */ - -/* The lengths of the bit length codes are sent in order of decreasing - * probability, to avoid transmitting the lengths for unused bit length codes. - */ - -/* =========================================================================== - * Local data. These are initialized only once. - */ - -// We pre-fill arrays with 0 to avoid uninitialized gaps - -var DIST_CODE_LEN = 512; /* see definition of array dist_code below */ - -// !!!! Use flat array instead of structure, Freq = i*2, Len = i*2+1 -var static_ltree = new Array((L_CODES$1 + 2) * 2); -zero$1(static_ltree); -/* The static literal tree. Since the bit lengths are imposed, there is no - * need for the L_CODES extra codes used during heap construction. However - * The codes 286 and 287 are needed to build a canonical tree (see _tr_init - * below). - */ - -var static_dtree = new Array(D_CODES$1 * 2); -zero$1(static_dtree); -/* The static distance tree. (Actually a trivial tree since all codes use - * 5 bits.) - */ - -var _dist_code = new Array(DIST_CODE_LEN); -zero$1(_dist_code); -/* Distance codes. The first 256 values correspond to the distances - * 3 .. 258, the last 256 values correspond to the top 8 bits of - * the 15 bit distances. - */ - -var _length_code = new Array(MAX_MATCH$1 - MIN_MATCH$1 + 1); -zero$1(_length_code); -/* length code for each normalized match length (0 == MIN_MATCH) */ - -var base_length = new Array(LENGTH_CODES$1); -zero$1(base_length); -/* First normalized length for each code (0 = MIN_MATCH) */ - -var base_dist = new Array(D_CODES$1); -zero$1(base_dist); -/* First normalized distance for each code (0 = distance of 1) */ - -function StaticTreeDesc(static_tree, extra_bits, extra_base, elems, max_length) { - this.static_tree = static_tree; /* static tree or NULL */ - this.extra_bits = extra_bits; /* extra bits for each code or NULL */ - this.extra_base = extra_base; /* base index for extra_bits */ - this.elems = elems; /* max number of elements in the tree */ - this.max_length = max_length; /* max bit length for the codes */ - - // show if `static_tree` has data or dummy - needed for monomorphic objects - this.has_stree = static_tree && static_tree.length; -} -var static_l_desc; -var static_d_desc; -var static_bl_desc; -function TreeDesc(dyn_tree, stat_desc) { - this.dyn_tree = dyn_tree; /* the dynamic tree */ - this.max_code = 0; /* largest code with non zero frequency */ - this.stat_desc = stat_desc; /* the corresponding static tree */ -} -function d_code(dist) { - return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)]; -} - -/* =========================================================================== - * Output a short LSB first on the stream. - * IN assertion: there is enough room in pendingBuf. - */ -function put_short(s, w) { - // put_byte(s, (uch)((w) & 0xff)); - // put_byte(s, (uch)((ush)(w) >> 8)); - s.pending_buf[s.pending++] = w & 0xff; - s.pending_buf[s.pending++] = w >>> 8 & 0xff; -} - -/* =========================================================================== - * Send a value on a given number of bits. - * IN assertion: length <= 16 and value fits in length bits. - */ -function send_bits(s, value, length) { - if (s.bi_valid > Buf_size - length) { - s.bi_buf |= value << s.bi_valid & 0xffff; - put_short(s, s.bi_buf); - s.bi_buf = value >> Buf_size - s.bi_valid; - s.bi_valid += length - Buf_size; - } else { - s.bi_buf |= value << s.bi_valid & 0xffff; - s.bi_valid += length; - } -} -function send_code(s, c, tree) { - send_bits(s, tree[c * 2] /*.Code*/, tree[c * 2 + 1] /*.Len*/); -} - -/* =========================================================================== - * Reverse the first len bits of a code, using straightforward code (a faster - * method would use a table) - * IN assertion: 1 <= len <= 15 - */ -function bi_reverse(code, len) { - var res = 0; - do { - res |= code & 1; - code >>>= 1; - res <<= 1; - } while (--len > 0); - return res >>> 1; -} - -/* =========================================================================== - * Flush the bit buffer, keeping at most 7 bits in it. - */ -function bi_flush(s) { - if (s.bi_valid === 16) { - put_short(s, s.bi_buf); - s.bi_buf = 0; - s.bi_valid = 0; - } else if (s.bi_valid >= 8) { - s.pending_buf[s.pending++] = s.bi_buf & 0xff; - s.bi_buf >>= 8; - s.bi_valid -= 8; - } -} - -/* =========================================================================== - * Compute the optimal bit lengths for a tree and update the total bit length - * for the current block. - * IN assertion: the fields freq and dad are set, heap[heap_max] and - * above are the tree nodes sorted by increasing frequency. - * OUT assertions: the field len is set to the optimal bit length, the - * array bl_count contains the frequencies for each bit length. - * The length opt_len is updated; static_len is also updated if stree is - * not null. - */ -function gen_bitlen(s, desc) -// deflate_state *s; -// tree_desc *desc; /* the tree descriptor */ -{ - var tree = desc.dyn_tree; - var max_code = desc.max_code; - var stree = desc.stat_desc.static_tree; - var has_stree = desc.stat_desc.has_stree; - var extra = desc.stat_desc.extra_bits; - var base = desc.stat_desc.extra_base; - var max_length = desc.stat_desc.max_length; - var h; /* heap index */ - var n, m; /* iterate over the tree elements */ - var bits; /* bit length */ - var xbits; /* extra bits */ - var f; /* frequency */ - var overflow = 0; /* number of elements with bit length too large */ - - for (bits = 0; bits <= MAX_BITS$1; bits++) { - s.bl_count[bits] = 0; - } - - /* In a first pass, compute the optimal bit lengths (which may - * overflow in the case of the bit length tree). - */ - tree[s.heap[s.heap_max] * 2 + 1] /*.Len*/ = 0; /* root of the heap */ - - for (h = s.heap_max + 1; h < HEAP_SIZE$1; h++) { - n = s.heap[h]; - bits = tree[tree[n * 2 + 1] /*.Dad*/ * 2 + 1] /*.Len*/ + 1; - if (bits > max_length) { - bits = max_length; - overflow++; - } - tree[n * 2 + 1] /*.Len*/ = bits; - /* We overwrite tree[n].Dad which is no longer needed */ - - if (n > max_code) { - continue; - } /* not a leaf node */ - - s.bl_count[bits]++; - xbits = 0; - if (n >= base) { - xbits = extra[n - base]; - } - f = tree[n * 2] /*.Freq*/; - s.opt_len += f * (bits + xbits); - if (has_stree) { - s.static_len += f * (stree[n * 2 + 1] /*.Len*/ + xbits); - } - } - if (overflow === 0) { - return; - } - - // Trace((stderr,"\nbit length overflow\n")); - /* This happens for example on obj2 and pic of the Calgary corpus */ - - /* Find the first bit length which could increase: */ - do { - bits = max_length - 1; - while (s.bl_count[bits] === 0) { - bits--; - } - s.bl_count[bits]--; /* move one leaf down the tree */ - s.bl_count[bits + 1] += 2; /* move one overflow item as its brother */ - s.bl_count[max_length]--; - /* The brother of the overflow item also moves one step up, - * but this does not affect bl_count[max_length] - */ - overflow -= 2; - } while (overflow > 0); - - /* Now recompute all bit lengths, scanning in increasing frequency. - * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all - * lengths instead of fixing only the wrong ones. This idea is taken - * from 'ar' written by Haruhiko Okumura.) - */ - for (bits = max_length; bits !== 0; bits--) { - n = s.bl_count[bits]; - while (n !== 0) { - m = s.heap[--h]; - if (m > max_code) { - continue; - } - if (tree[m * 2 + 1] /*.Len*/ !== bits) { - // Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); - s.opt_len += (bits - tree[m * 2 + 1] /*.Len*/) * tree[m * 2] /*.Freq*/; - tree[m * 2 + 1] /*.Len*/ = bits; - } - n--; - } - } -} - -/* =========================================================================== - * Generate the codes for a given tree and bit counts (which need not be - * optimal). - * IN assertion: the array bl_count contains the bit length statistics for - * the given tree and the field len is set for all tree elements. - * OUT assertion: the field code is set for all tree elements of non - * zero code length. - */ -function gen_codes(tree, max_code, bl_count) -// ct_data *tree; /* the tree to decorate */ -// int max_code; /* largest code with non zero frequency */ -// ushf *bl_count; /* number of codes at each bit length */ -{ - var next_code = new Array(MAX_BITS$1 + 1); /* next code value for each bit length */ - var code = 0; /* running code value */ - var bits; /* bit index */ - var n; /* code index */ - - /* The distribution counts are first used to generate the code values - * without bit reversal. - */ - for (bits = 1; bits <= MAX_BITS$1; bits++) { - next_code[bits] = code = code + bl_count[bits - 1] << 1; - } - /* Check that the bit counts in bl_count are consistent. The last code - * must be all ones. - */ - //Assert (code + bl_count[MAX_BITS]-1 == (1< length code (0..28) */ - length = 0; - for (code = 0; code < LENGTH_CODES$1 - 1; code++) { - base_length[code] = length; - for (n = 0; n < 1 << extra_lbits[code]; n++) { - _length_code[length++] = code; - } - } - //Assert (length == 256, "tr_static_init: length != 256"); - /* Note that the length 255 (match length 258) can be represented - * in two different ways: code 284 + 5 bits or code 285, so we - * overwrite length_code[255] to use the best encoding: - */ - _length_code[length - 1] = code; - - /* Initialize the mapping dist (0..32K) -> dist code (0..29) */ - dist = 0; - for (code = 0; code < 16; code++) { - base_dist[code] = dist; - for (n = 0; n < 1 << extra_dbits[code]; n++) { - _dist_code[dist++] = code; - } - } - //Assert (dist == 256, "tr_static_init: dist != 256"); - dist >>= 7; /* from now on, all distances are divided by 128 */ - for (; code < D_CODES$1; code++) { - base_dist[code] = dist << 7; - for (n = 0; n < 1 << extra_dbits[code] - 7; n++) { - _dist_code[256 + dist++] = code; - } - } - //Assert (dist == 256, "tr_static_init: 256+dist != 512"); - - /* Construct the codes of the static literal tree */ - for (bits = 0; bits <= MAX_BITS$1; bits++) { - bl_count[bits] = 0; - } - n = 0; - while (n <= 143) { - static_ltree[n * 2 + 1] /*.Len*/ = 8; - n++; - bl_count[8]++; - } - while (n <= 255) { - static_ltree[n * 2 + 1] /*.Len*/ = 9; - n++; - bl_count[9]++; - } - while (n <= 279) { - static_ltree[n * 2 + 1] /*.Len*/ = 7; - n++; - bl_count[7]++; - } - while (n <= 287) { - static_ltree[n * 2 + 1] /*.Len*/ = 8; - n++; - bl_count[8]++; - } - /* Codes 286 and 287 do not exist, but we must include them in the - * tree construction to get a canonical Huffman tree (longest code - * all ones) - */ - gen_codes(static_ltree, L_CODES$1 + 1, bl_count); - - /* The static distance tree is trivial: */ - for (n = 0; n < D_CODES$1; n++) { - static_dtree[n * 2 + 1] /*.Len*/ = 5; - static_dtree[n * 2] /*.Code*/ = bi_reverse(n, 5); - } - - // Now data ready and we can init static trees - static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS$1 + 1, L_CODES$1, MAX_BITS$1); - static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0, D_CODES$1, MAX_BITS$1); - static_bl_desc = new StaticTreeDesc(new Array(0), extra_blbits, 0, BL_CODES$1, MAX_BL_BITS); - - //static_init_done = true; -} - -/* =========================================================================== - * Initialize a new block. - */ -function init_block(s) { - var n; /* iterates over tree elements */ - - /* Initialize the trees. */ - for (n = 0; n < L_CODES$1; n++) { - s.dyn_ltree[n * 2] /*.Freq*/ = 0; - } - for (n = 0; n < D_CODES$1; n++) { - s.dyn_dtree[n * 2] /*.Freq*/ = 0; - } - for (n = 0; n < BL_CODES$1; n++) { - s.bl_tree[n * 2] /*.Freq*/ = 0; - } - s.dyn_ltree[END_BLOCK * 2] /*.Freq*/ = 1; - s.opt_len = s.static_len = 0; - s.last_lit = s.matches = 0; -} - -/* =========================================================================== - * Flush the bit buffer and align the output on a byte boundary - */ -function bi_windup(s) { - if (s.bi_valid > 8) { - put_short(s, s.bi_buf); - } else if (s.bi_valid > 0) { - //put_byte(s, (Byte)s->bi_buf); - s.pending_buf[s.pending++] = s.bi_buf; - } - s.bi_buf = 0; - s.bi_valid = 0; -} - -/* =========================================================================== - * Copy a stored block, storing first the length and its - * one's complement if requested. - */ -function copy_block(s, buf, len, header) -//DeflateState *s; -//charf *buf; /* the input data */ -//unsigned len; /* its length */ -//int header; /* true if block header must be written */ -{ - bi_windup(s); /* align on byte boundary */ - - { - put_short(s, len); - put_short(s, ~len); - } - // while (len--) { - // put_byte(s, *buf++); - // } - utils$3.arraySet(s.pending_buf, s.window, buf, len, s.pending); - s.pending += len; -} - -/* =========================================================================== - * Compares to subtrees, using the tree depth as tie breaker when - * the subtrees have equal frequency. This minimizes the worst case length. - */ -function smaller(tree, n, m, depth) { - var _n2 = n * 2; - var _m2 = m * 2; - return tree[_n2] /*.Freq*/ < tree[_m2] /*.Freq*/ || tree[_n2] /*.Freq*/ === tree[_m2] /*.Freq*/ && depth[n] <= depth[m]; -} - -/* =========================================================================== - * Restore the heap property by moving down the tree starting at node k, - * exchanging a node with the smallest of its two sons if necessary, stopping - * when the heap property is re-established (each father smaller than its - * two sons). - */ -function pqdownheap(s, tree, k) -// deflate_state *s; -// ct_data *tree; /* the tree to restore */ -// int k; /* node to move down */ -{ - var v = s.heap[k]; - var j = k << 1; /* left son of k */ - while (j <= s.heap_len) { - /* Set j to the smallest of the two sons: */ - if (j < s.heap_len && smaller(tree, s.heap[j + 1], s.heap[j], s.depth)) { - j++; - } - /* Exit if v is smaller than both sons */ - if (smaller(tree, v, s.heap[j], s.depth)) { - break; - } - - /* Exchange v with the smallest son */ - s.heap[k] = s.heap[j]; - k = j; - - /* And continue down the tree, setting j to the left son of k */ - j <<= 1; - } - s.heap[k] = v; -} - -// inlined manually -// var SMALLEST = 1; - -/* =========================================================================== - * Send the block data compressed using the given Huffman trees - */ -function compress_block(s, ltree, dtree) -// deflate_state *s; -// const ct_data *ltree; /* literal tree */ -// const ct_data *dtree; /* distance tree */ -{ - var dist; /* distance of matched string */ - var lc; /* match length or unmatched char (if dist == 0) */ - var lx = 0; /* running index in l_buf */ - var code; /* the code to send */ - var extra; /* number of extra bits to send */ - - if (s.last_lit !== 0) { - do { - dist = s.pending_buf[s.d_buf + lx * 2] << 8 | s.pending_buf[s.d_buf + lx * 2 + 1]; - lc = s.pending_buf[s.l_buf + lx]; - lx++; - if (dist === 0) { - send_code(s, lc, ltree); /* send a literal byte */ - //Tracecv(isgraph(lc), (stderr," '%c' ", lc)); - } else { - /* Here, lc is the match length - MIN_MATCH */ - code = _length_code[lc]; - send_code(s, code + LITERALS$1 + 1, ltree); /* send the length code */ - extra = extra_lbits[code]; - if (extra !== 0) { - lc -= base_length[code]; - send_bits(s, lc, extra); /* send the extra length bits */ - } - dist--; /* dist is now the match distance - 1 */ - code = d_code(dist); - //Assert (code < D_CODES, "bad d_code"); - - send_code(s, code, dtree); /* send the distance code */ - extra = extra_dbits[code]; - if (extra !== 0) { - dist -= base_dist[code]; - send_bits(s, dist, extra); /* send the extra distance bits */ - } - } /* literal or match pair ? */ - - /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ - //Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx, - // "pendingBuf overflow"); - } while (lx < s.last_lit); - } - send_code(s, END_BLOCK, ltree); -} - -/* =========================================================================== - * Construct one Huffman tree and assigns the code bit strings and lengths. - * Update the total bit length for the current block. - * IN assertion: the field freq is set for all tree elements. - * OUT assertions: the fields len and code are set to the optimal bit length - * and corresponding code. The length opt_len is updated; static_len is - * also updated if stree is not null. The field max_code is set. - */ -function build_tree(s, desc) -// deflate_state *s; -// tree_desc *desc; /* the tree descriptor */ -{ - var tree = desc.dyn_tree; - var stree = desc.stat_desc.static_tree; - var has_stree = desc.stat_desc.has_stree; - var elems = desc.stat_desc.elems; - var n, m; /* iterate over heap elements */ - var max_code = -1; /* largest code with non zero frequency */ - var node; /* new node being created */ - - /* Construct the initial heap, with least frequent element in - * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. - * heap[0] is not used. - */ - s.heap_len = 0; - s.heap_max = HEAP_SIZE$1; - for (n = 0; n < elems; n++) { - if (tree[n * 2] /*.Freq*/ !== 0) { - s.heap[++s.heap_len] = max_code = n; - s.depth[n] = 0; - } else { - tree[n * 2 + 1] /*.Len*/ = 0; - } - } - - /* The pkzip format requires that at least one distance code exists, - * and that at least one bit should be sent even if there is only one - * possible code. So to avoid special checks later on we force at least - * two codes of non zero frequency. - */ - while (s.heap_len < 2) { - node = s.heap[++s.heap_len] = max_code < 2 ? ++max_code : 0; - tree[node * 2] /*.Freq*/ = 1; - s.depth[node] = 0; - s.opt_len--; - if (has_stree) { - s.static_len -= stree[node * 2 + 1] /*.Len*/; - } - /* node is 0 or 1 so it does not have extra bits */ - } - desc.max_code = max_code; - - /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, - * establish sub-heaps of increasing lengths: - */ - for (n = s.heap_len >> 1 /*int /2*/; n >= 1; n--) { - pqdownheap(s, tree, n); - } - - /* Construct the Huffman tree by repeatedly combining the least two - * frequent nodes. - */ - node = elems; /* next internal node of the tree */ - do { - //pqremove(s, tree, n); /* n = node of least frequency */ - /*** pqremove ***/ - n = s.heap[1 /*SMALLEST*/]; - s.heap[1 /*SMALLEST*/] = s.heap[s.heap_len--]; - pqdownheap(s, tree, 1 /*SMALLEST*/); - /***/ - - m = s.heap[1 /*SMALLEST*/]; /* m = node of next least frequency */ - - s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */ - s.heap[--s.heap_max] = m; - - /* Create a new node father of n and m */ - tree[node * 2] /*.Freq*/ = tree[n * 2] /*.Freq*/ + tree[m * 2] /*.Freq*/; - s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1; - tree[n * 2 + 1] /*.Dad*/ = tree[m * 2 + 1] /*.Dad*/ = node; - - /* and insert the new node in the heap */ - s.heap[1 /*SMALLEST*/] = node++; - pqdownheap(s, tree, 1 /*SMALLEST*/); - } while (s.heap_len >= 2); - s.heap[--s.heap_max] = s.heap[1 /*SMALLEST*/]; - - /* At this point, the fields freq and dad are set. We can now - * generate the bit lengths. - */ - gen_bitlen(s, desc); - - /* The field len is now set, we can generate the bit codes */ - gen_codes(tree, max_code, s.bl_count); -} - -/* =========================================================================== - * Scan a literal or distance tree to determine the frequencies of the codes - * in the bit length tree. - */ -function scan_tree(s, tree, max_code) -// deflate_state *s; -// ct_data *tree; /* the tree to be scanned */ -// int max_code; /* and its largest code of non zero frequency */ -{ - var n; /* iterates over all tree elements */ - var prevlen = -1; /* last emitted length */ - var curlen; /* length of current code */ - - var nextlen = tree[0 * 2 + 1] /*.Len*/; /* length of next code */ - - var count = 0; /* repeat count of the current code */ - var max_count = 7; /* max repeat count */ - var min_count = 4; /* min repeat count */ - - if (nextlen === 0) { - max_count = 138; - min_count = 3; - } - tree[(max_code + 1) * 2 + 1] /*.Len*/ = 0xffff; /* guard */ - - for (n = 0; n <= max_code; n++) { - curlen = nextlen; - nextlen = tree[(n + 1) * 2 + 1] /*.Len*/; - if (++count < max_count && curlen === nextlen) { - continue; - } else if (count < min_count) { - s.bl_tree[curlen * 2] /*.Freq*/ += count; - } else if (curlen !== 0) { - if (curlen !== prevlen) { - s.bl_tree[curlen * 2] /*.Freq*/++; - } - s.bl_tree[REP_3_6 * 2] /*.Freq*/++; - } else if (count <= 10) { - s.bl_tree[REPZ_3_10 * 2] /*.Freq*/++; - } else { - s.bl_tree[REPZ_11_138 * 2] /*.Freq*/++; - } - count = 0; - prevlen = curlen; - if (nextlen === 0) { - max_count = 138; - min_count = 3; - } else if (curlen === nextlen) { - max_count = 6; - min_count = 3; - } else { - max_count = 7; - min_count = 4; - } - } -} - -/* =========================================================================== - * Send a literal or distance tree in compressed form, using the codes in - * bl_tree. - */ -function send_tree(s, tree, max_code) -// deflate_state *s; -// ct_data *tree; /* the tree to be scanned */ -// int max_code; /* and its largest code of non zero frequency */ -{ - var n; /* iterates over all tree elements */ - var prevlen = -1; /* last emitted length */ - var curlen; /* length of current code */ - - var nextlen = tree[0 * 2 + 1] /*.Len*/; /* length of next code */ - - var count = 0; /* repeat count of the current code */ - var max_count = 7; /* max repeat count */ - var min_count = 4; /* min repeat count */ - - /* tree[max_code+1].Len = -1; */ /* guard already set */ - if (nextlen === 0) { - max_count = 138; - min_count = 3; - } - for (n = 0; n <= max_code; n++) { - curlen = nextlen; - nextlen = tree[(n + 1) * 2 + 1] /*.Len*/; - if (++count < max_count && curlen === nextlen) { - continue; - } else if (count < min_count) { - do { - send_code(s, curlen, s.bl_tree); - } while (--count !== 0); - } else if (curlen !== 0) { - if (curlen !== prevlen) { - send_code(s, curlen, s.bl_tree); - count--; - } - //Assert(count >= 3 && count <= 6, " 3_6?"); - send_code(s, REP_3_6, s.bl_tree); - send_bits(s, count - 3, 2); - } else if (count <= 10) { - send_code(s, REPZ_3_10, s.bl_tree); - send_bits(s, count - 3, 3); - } else { - send_code(s, REPZ_11_138, s.bl_tree); - send_bits(s, count - 11, 7); - } - count = 0; - prevlen = curlen; - if (nextlen === 0) { - max_count = 138; - min_count = 3; - } else if (curlen === nextlen) { - max_count = 6; - min_count = 3; - } else { - max_count = 7; - min_count = 4; - } - } -} - -/* =========================================================================== - * Construct the Huffman tree for the bit lengths and return the index in - * bl_order of the last bit length code to send. - */ -function build_bl_tree(s) { - var max_blindex; /* index of last bit length code of non zero freq */ - - /* Determine the bit length frequencies for literal and distance trees */ - scan_tree(s, s.dyn_ltree, s.l_desc.max_code); - scan_tree(s, s.dyn_dtree, s.d_desc.max_code); - - /* Build the bit length tree: */ - build_tree(s, s.bl_desc); - /* opt_len now includes the length of the tree representations, except - * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. - */ - - /* Determine the number of bit length codes to send. The pkzip format - * requires that at least 4 bit length codes be sent. (appnote.txt says - * 3 but the actual value used is 4.) - */ - for (max_blindex = BL_CODES$1 - 1; max_blindex >= 3; max_blindex--) { - if (s.bl_tree[bl_order[max_blindex] * 2 + 1] /*.Len*/ !== 0) { - break; - } - } - /* Update opt_len to include the bit length tree and counts */ - s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4; - //Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", - // s->opt_len, s->static_len)); - - return max_blindex; -} - -/* =========================================================================== - * Send the header for a block using dynamic Huffman trees: the counts, the - * lengths of the bit length codes, the literal tree and the distance tree. - * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. - */ -function send_all_trees(s, lcodes, dcodes, blcodes) -// deflate_state *s; -// int lcodes, dcodes, blcodes; /* number of codes for each tree */ -{ - var rank; /* index in bl_order */ - - //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); - //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, - // "too many codes"); - //Tracev((stderr, "\nbl counts: ")); - send_bits(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */ - send_bits(s, dcodes - 1, 5); - send_bits(s, blcodes - 4, 4); /* not -3 as stated in appnote.txt */ - for (rank = 0; rank < blcodes; rank++) { - //Tracev((stderr, "\nbl code %2d ", bl_order[rank])); - send_bits(s, s.bl_tree[bl_order[rank] * 2 + 1] /*.Len*/, 3); - } - //Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); - - send_tree(s, s.dyn_ltree, lcodes - 1); /* literal tree */ - //Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); - - send_tree(s, s.dyn_dtree, dcodes - 1); /* distance tree */ - //Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); -} - -/* =========================================================================== - * Check if the data type is TEXT or BINARY, using the following algorithm: - * - TEXT if the two conditions below are satisfied: - * a) There are no non-portable control characters belonging to the - * "black list" (0..6, 14..25, 28..31). - * b) There is at least one printable character belonging to the - * "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). - * - BINARY otherwise. - * - The following partially-portable control characters form a - * "gray list" that is ignored in this detection algorithm: - * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}). - * IN assertion: the fields Freq of dyn_ltree are set. - */ -function detect_data_type(s) { - /* black_mask is the bit mask of black-listed bytes - * set bits 0..6, 14..25, and 28..31 - * 0xf3ffc07f = binary 11110011111111111100000001111111 - */ - var black_mask = 0xf3ffc07f; - var n; - - /* Check for non-textual ("black-listed") bytes. */ - for (n = 0; n <= 31; n++, black_mask >>>= 1) { - if (black_mask & 1 && s.dyn_ltree[n * 2] /*.Freq*/ !== 0) { - return Z_BINARY; - } - } - - /* Check for textual ("white-listed") bytes. */ - if (s.dyn_ltree[9 * 2] /*.Freq*/ !== 0 || s.dyn_ltree[10 * 2] /*.Freq*/ !== 0 || s.dyn_ltree[13 * 2] /*.Freq*/ !== 0) { - return Z_TEXT; - } - for (n = 32; n < LITERALS$1; n++) { - if (s.dyn_ltree[n * 2] /*.Freq*/ !== 0) { - return Z_TEXT; - } - } - - /* There are no "black-listed" or "white-listed" bytes: - * this stream either is empty or has tolerated ("gray-listed") bytes only. - */ - return Z_BINARY; -} -var static_init_done = false; - -/* =========================================================================== - * Initialize the tree data structures for a new zlib stream. - */ -function _tr_init(s) { - if (!static_init_done) { - tr_static_init(); - static_init_done = true; - } - s.l_desc = new TreeDesc(s.dyn_ltree, static_l_desc); - s.d_desc = new TreeDesc(s.dyn_dtree, static_d_desc); - s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc); - s.bi_buf = 0; - s.bi_valid = 0; - - /* Initialize the first block of the first file: */ - init_block(s); -} - -/* =========================================================================== - * Send a stored block - */ -function _tr_stored_block(s, buf, stored_len, last) -//DeflateState *s; -//charf *buf; /* input block */ -//ulg stored_len; /* length of input block */ -//int last; /* one if this is the last block for a file */ -{ - send_bits(s, (STORED_BLOCK << 1) + (last ? 1 : 0), 3); /* send block type */ - copy_block(s, buf, stored_len); /* with header */ -} - -/* =========================================================================== - * Send one empty static block to give enough lookahead for inflate. - * This takes 10 bits, of which 7 may remain in the bit buffer. - */ -function _tr_align(s) { - send_bits(s, STATIC_TREES << 1, 3); - send_code(s, END_BLOCK, static_ltree); - bi_flush(s); -} - -/* =========================================================================== - * Determine the best encoding for the current block: dynamic trees, static - * trees or store, and output the encoded block to the zip file. - */ -function _tr_flush_block(s, buf, stored_len, last) -//DeflateState *s; -//charf *buf; /* input block, or NULL if too old */ -//ulg stored_len; /* length of input block */ -//int last; /* one if this is the last block for a file */ -{ - var opt_lenb, static_lenb; /* opt_len and static_len in bytes */ - var max_blindex = 0; /* index of last bit length code of non zero freq */ - - /* Build the Huffman trees unless a stored block is forced */ - if (s.level > 0) { - /* Check if the file is binary or text */ - if (s.strm.data_type === Z_UNKNOWN$1) { - s.strm.data_type = detect_data_type(s); - } - - /* Construct the literal and distance trees */ - build_tree(s, s.l_desc); - // Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, - // s->static_len)); - - build_tree(s, s.d_desc); - // Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, - // s->static_len)); - /* At this point, opt_len and static_len are the total bit lengths of - * the compressed block data, excluding the tree representations. - */ - - /* Build the bit length tree for the above two trees, and get the index - * in bl_order of the last bit length code to send. - */ - max_blindex = build_bl_tree(s); - - /* Determine the best encoding. Compute the block lengths in bytes. */ - opt_lenb = s.opt_len + 3 + 7 >>> 3; - static_lenb = s.static_len + 3 + 7 >>> 3; - - // Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", - // opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, - // s->last_lit)); - - if (static_lenb <= opt_lenb) { - opt_lenb = static_lenb; - } - } else { - // Assert(buf != (char*)0, "lost buf"); - opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ - } - if (stored_len + 4 <= opt_lenb && buf !== -1) { - /* 4: two words for the lengths */ - - /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. - * Otherwise we can't have processed more than WSIZE input bytes since - * the last block flush, because compression would have been - * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to - * transform a block into a stored block. - */ - _tr_stored_block(s, buf, stored_len, last); - } else if (s.strategy === Z_FIXED$1 || static_lenb === opt_lenb) { - send_bits(s, (STATIC_TREES << 1) + (last ? 1 : 0), 3); - compress_block(s, static_ltree, static_dtree); - } else { - send_bits(s, (DYN_TREES << 1) + (last ? 1 : 0), 3); - send_all_trees(s, s.l_desc.max_code + 1, s.d_desc.max_code + 1, max_blindex + 1); - compress_block(s, s.dyn_ltree, s.dyn_dtree); - } - // Assert (s->compressed_len == s->bits_sent, "bad compressed size"); - /* The above check is made mod 2^32, for files larger than 512 MB - * and uLong implemented on 32 bits. - */ - init_block(s); - if (last) { - bi_windup(s); - } - // Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, - // s->compressed_len-7*last)); -} - -/* =========================================================================== - * Save the match info and tally the frequency counts. Return true if - * the current block must be flushed. - */ -function _tr_tally(s, dist, lc) -// deflate_state *s; -// unsigned dist; /* distance of matched string */ -// unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ -{ - //var out_length, in_length, dcode; - - s.pending_buf[s.d_buf + s.last_lit * 2] = dist >>> 8 & 0xff; - s.pending_buf[s.d_buf + s.last_lit * 2 + 1] = dist & 0xff; - s.pending_buf[s.l_buf + s.last_lit] = lc & 0xff; - s.last_lit++; - if (dist === 0) { - /* lc is the unmatched char */ - s.dyn_ltree[lc * 2] /*.Freq*/++; - } else { - s.matches++; - /* Here, lc is the match length - MIN_MATCH */ - dist--; /* dist = match distance - 1 */ - //Assert((ush)dist < (ush)MAX_DIST(s) && - // (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && - // (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); - - s.dyn_ltree[(_length_code[lc] + LITERALS$1 + 1) * 2] /*.Freq*/++; - s.dyn_dtree[d_code(dist) * 2] /*.Freq*/++; - } - - // (!) This block is disabled in zlib defaults, - // don't enable it for binary compatibility - - //#ifdef TRUNCATE_BLOCK - // /* Try to guess if it is profitable to stop the current block here */ - // if ((s.last_lit & 0x1fff) === 0 && s.level > 2) { - // /* Compute an upper bound for the compressed length */ - // out_length = s.last_lit*8; - // in_length = s.strstart - s.block_start; - // - // for (dcode = 0; dcode < D_CODES; dcode++) { - // out_length += s.dyn_dtree[dcode*2]/*.Freq*/ * (5 + extra_dbits[dcode]); - // } - // out_length >>>= 3; - // //Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", - // // s->last_lit, in_length, out_length, - // // 100L - out_length*100L/in_length)); - // if (s.matches < (s.last_lit>>1)/*int /2*/ && out_length < (in_length>>1)/*int /2*/) { - // return true; - // } - // } - //#endif - - return s.last_lit === s.lit_bufsize - 1; - /* We avoid equality with lit_bufsize because of wraparound at 64K - * on 16 bit machines and because stored blocks are restricted to - * 64K-1 bytes. - */ -} -trees$1._tr_init = _tr_init; -trees$1._tr_stored_block = _tr_stored_block; -trees$1._tr_flush_block = _tr_flush_block; -trees$1._tr_tally = _tr_tally; -trees$1._tr_align = _tr_align; - -// Note: adler32 takes 12% for level 0 and 2% for level 6. -// It isn't worth it to make additional optimizations as in original. -// Small size is preferable. - -// (C) 1995-2013 Jean-loup Gailly and Mark Adler -// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// 3. This notice may not be removed or altered from any source distribution. - -function adler32$2(adler, buf, len, pos) { - var s1 = adler & 0xffff | 0, - s2 = adler >>> 16 & 0xffff | 0, - n = 0; - while (len !== 0) { - // Set limit ~ twice less than 5552, to keep - // s2 in 31-bits, because we force signed ints. - // in other case %= will fail. - n = len > 2000 ? 2000 : len; - len -= n; - do { - s1 = s1 + buf[pos++] | 0; - s2 = s2 + s1 | 0; - } while (--n); - s1 %= 65521; - s2 %= 65521; - } - return s1 | s2 << 16 | 0; -} -var adler32_1 = adler32$2; - -// Note: we can't get significant speed boost here. -// So write code to minimize size - no pregenerated tables -// and array tools dependencies. - -// (C) 1995-2013 Jean-loup Gailly and Mark Adler -// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// 3. This notice may not be removed or altered from any source distribution. - -// Use ordinary array, since untyped makes no boost here -function makeTable() { - var c, - table = []; - for (var n = 0; n < 256; n++) { - c = n; - for (var k = 0; k < 8; k++) { - c = c & 1 ? 0xEDB88320 ^ c >>> 1 : c >>> 1; - } - table[n] = c; - } - return table; -} - -// Create table on load. Just 255 signed longs. Not a problem. -var crcTable = makeTable(); -function crc32$2(crc, buf, len, pos) { - var t = crcTable, - end = pos + len; - crc ^= -1; - for (var i = pos; i < end; i++) { - crc = crc >>> 8 ^ t[(crc ^ buf[i]) & 0xFF]; - } - return crc ^ -1; // >>> 0; -} -var crc32_1 = crc32$2; - -// (C) 1995-2013 Jean-loup Gailly and Mark Adler -// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// 3. This notice may not be removed or altered from any source distribution. - -var messages = { - 2: 'need dictionary', - /* Z_NEED_DICT 2 */ - 1: 'stream end', - /* Z_STREAM_END 1 */ - 0: '', - /* Z_OK 0 */ - '-1': 'file error', - /* Z_ERRNO (-1) */ - '-2': 'stream error', - /* Z_STREAM_ERROR (-2) */ - '-3': 'data error', - /* Z_DATA_ERROR (-3) */ - '-4': 'insufficient memory', - /* Z_MEM_ERROR (-4) */ - '-5': 'buffer error', - /* Z_BUF_ERROR (-5) */ - '-6': 'incompatible version' /* Z_VERSION_ERROR (-6) */ -}; - -// (C) 1995-2013 Jean-loup Gailly and Mark Adler -// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// 3. This notice may not be removed or altered from any source distribution. - -var utils$2 = common; -var trees = trees$1; -var adler32$1 = adler32_1; -var crc32$1 = crc32_1; -var msg = messages; - -/* Public constants ==========================================================*/ -/* ===========================================================================*/ - -/* Allowed flush values; see deflate() and inflate() below for details */ -var Z_NO_FLUSH = 0; -var Z_PARTIAL_FLUSH = 1; -//var Z_SYNC_FLUSH = 2; -var Z_FULL_FLUSH = 3; -var Z_FINISH$1 = 4; -var Z_BLOCK$1 = 5; -//var Z_TREES = 6; - -/* Return codes for the compression/decompression functions. Negative values - * are errors, positive values are used for special but normal events. - */ -var Z_OK$1 = 0; -var Z_STREAM_END$1 = 1; -//var Z_NEED_DICT = 2; -//var Z_ERRNO = -1; -var Z_STREAM_ERROR$1 = -2; -var Z_DATA_ERROR$1 = -3; -//var Z_MEM_ERROR = -4; -var Z_BUF_ERROR$1 = -5; -//var Z_VERSION_ERROR = -6; - -/* compression levels */ -//var Z_NO_COMPRESSION = 0; -//var Z_BEST_SPEED = 1; -//var Z_BEST_COMPRESSION = 9; -var Z_DEFAULT_COMPRESSION = -1; -var Z_FILTERED = 1; -var Z_HUFFMAN_ONLY = 2; -var Z_RLE = 3; -var Z_FIXED = 4; -var Z_DEFAULT_STRATEGY = 0; - -/* Possible values of the data_type field (though see inflate()) */ -//var Z_BINARY = 0; -//var Z_TEXT = 1; -//var Z_ASCII = 1; // = Z_TEXT -var Z_UNKNOWN = 2; - -/* The deflate compression method */ -var Z_DEFLATED$1 = 8; - -/*============================================================================*/ - -var MAX_MEM_LEVEL = 9; -/* Maximum value for memLevel in deflateInit2 */ -var MAX_WBITS$1 = 15; -/* 32K LZ77 window */ -var DEF_MEM_LEVEL = 8; -var LENGTH_CODES = 29; -/* number of length codes, not counting the special END_BLOCK code */ -var LITERALS = 256; -/* number of literal bytes 0..255 */ -var L_CODES = LITERALS + 1 + LENGTH_CODES; -/* number of Literal or Length codes, including the END_BLOCK code */ -var D_CODES = 30; -/* number of distance codes */ -var BL_CODES = 19; -/* number of codes used to transfer the bit lengths */ -var HEAP_SIZE = 2 * L_CODES + 1; -/* maximum heap size */ -var MAX_BITS = 15; -/* All codes must not exceed MAX_BITS bits */ - -var MIN_MATCH = 3; -var MAX_MATCH = 258; -var MIN_LOOKAHEAD = MAX_MATCH + MIN_MATCH + 1; -var PRESET_DICT = 0x20; -var INIT_STATE = 42; -var EXTRA_STATE = 69; -var NAME_STATE = 73; -var COMMENT_STATE = 91; -var HCRC_STATE = 103; -var BUSY_STATE = 113; -var FINISH_STATE = 666; -var BS_NEED_MORE = 1; /* block not completed, need more input or more output */ -var BS_BLOCK_DONE = 2; /* block flush performed */ -var BS_FINISH_STARTED = 3; /* finish started, need only more output at next deflate */ -var BS_FINISH_DONE = 4; /* finish done, accept no more input or output */ - -var OS_CODE = 0x03; // Unix :) . Don't detect, use this default. - -function err(strm, errorCode) { - strm.msg = msg[errorCode]; - return errorCode; -} -function rank(f) { - return (f << 1) - (f > 4 ? 9 : 0); -} -function zero(buf) { - var len = buf.length; - while (--len >= 0) { - buf[len] = 0; - } -} - -/* ========================================================================= - * Flush as much pending output as possible. All deflate() output goes - * through this function so some applications may wish to modify it - * to avoid allocating a large strm->output buffer and copying into it. - * (See also read_buf()). - */ -function flush_pending(strm) { - var s = strm.state; - - //_tr_flush_bits(s); - var len = s.pending; - if (len > strm.avail_out) { - len = strm.avail_out; - } - if (len === 0) { - return; - } - utils$2.arraySet(strm.output, s.pending_buf, s.pending_out, len, strm.next_out); - strm.next_out += len; - s.pending_out += len; - strm.total_out += len; - strm.avail_out -= len; - s.pending -= len; - if (s.pending === 0) { - s.pending_out = 0; - } -} -function flush_block_only(s, last) { - trees._tr_flush_block(s, s.block_start >= 0 ? s.block_start : -1, s.strstart - s.block_start, last); - s.block_start = s.strstart; - flush_pending(s.strm); -} -function put_byte(s, b) { - s.pending_buf[s.pending++] = b; -} - -/* ========================================================================= - * Put a short in the pending buffer. The 16-bit value is put in MSB order. - * IN assertion: the stream state is correct and there is enough room in - * pending_buf. - */ -function putShortMSB(s, b) { - // put_byte(s, (Byte)(b >> 8)); - // put_byte(s, (Byte)(b & 0xff)); - s.pending_buf[s.pending++] = b >>> 8 & 0xff; - s.pending_buf[s.pending++] = b & 0xff; -} - -/* =========================================================================== - * Read a new buffer from the current input stream, update the adler32 - * and total number of bytes read. All deflate() input goes through - * this function so some applications may wish to modify it to avoid - * allocating a large strm->input buffer and copying from it. - * (See also flush_pending()). - */ -function read_buf(strm, buf, start, size) { - var len = strm.avail_in; - if (len > size) { - len = size; - } - if (len === 0) { - return 0; - } - strm.avail_in -= len; - - // zmemcpy(buf, strm->next_in, len); - utils$2.arraySet(buf, strm.input, strm.next_in, len, start); - if (strm.state.wrap === 1) { - strm.adler = adler32$1(strm.adler, buf, len, start); - } else if (strm.state.wrap === 2) { - strm.adler = crc32$1(strm.adler, buf, len, start); - } - strm.next_in += len; - strm.total_in += len; - return len; -} - -/* =========================================================================== - * Set match_start to the longest match starting at the given string and - * return its length. Matches shorter or equal to prev_length are discarded, - * in which case the result is equal to prev_length and match_start is - * garbage. - * IN assertions: cur_match is the head of the hash chain for the current - * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 - * OUT assertion: the match length is not greater than s->lookahead. - */ -function longest_match(s, cur_match) { - var chain_length = s.max_chain_length; /* max hash chain length */ - var scan = s.strstart; /* current string */ - var match; /* matched string */ - var len; /* length of current match */ - var best_len = s.prev_length; /* best match length so far */ - var nice_match = s.nice_match; /* stop if match long enough */ - var limit = s.strstart > s.w_size - MIN_LOOKAHEAD ? s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0 /*NIL*/; - var _win = s.window; // shortcut - - var wmask = s.w_mask; - var prev = s.prev; - - /* Stop when cur_match becomes <= limit. To simplify the code, - * we prevent matches with the string of window index 0. - */ - - var strend = s.strstart + MAX_MATCH; - var scan_end1 = _win[scan + best_len - 1]; - var scan_end = _win[scan + best_len]; - - /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. - * It is easy to get rid of this optimization if necessary. - */ - // Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); - - /* Do not waste too much time if we already have a good match: */ - if (s.prev_length >= s.good_match) { - chain_length >>= 2; - } - /* Do not look for matches beyond the end of the input. This is necessary - * to make deflate deterministic. - */ - if (nice_match > s.lookahead) { - nice_match = s.lookahead; - } - - // Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); - - do { - // Assert(cur_match < s->strstart, "no future"); - match = cur_match; - - /* Skip to next match if the match length cannot increase - * or if the match length is less than 2. Note that the checks below - * for insufficient lookahead only occur occasionally for performance - * reasons. Therefore uninitialized memory will be accessed, and - * conditional jumps will be made that depend on those values. - * However the length of the match is limited to the lookahead, so - * the output of deflate is not affected by the uninitialized values. - */ - - if (_win[match + best_len] !== scan_end || _win[match + best_len - 1] !== scan_end1 || _win[match] !== _win[scan] || _win[++match] !== _win[scan + 1]) { - continue; - } - - /* The check at best_len-1 can be removed because it will be made - * again later. (This heuristic is not always a win.) - * It is not necessary to compare scan[2] and match[2] since they - * are always equal when the other bytes match, given that - * the hash keys are equal and that HASH_BITS >= 8. - */ - scan += 2; - match++; - // Assert(*scan == *match, "match[2]?"); - - /* We check for insufficient lookahead only every 8th comparison; - * the 256th check will be made at strstart+258. - */ - do { - /*jshint noempty:false*/ - } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && scan < strend); - - // Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); - - len = MAX_MATCH - (strend - scan); - scan = strend - MAX_MATCH; - if (len > best_len) { - s.match_start = cur_match; - best_len = len; - if (len >= nice_match) { - break; - } - scan_end1 = _win[scan + best_len - 1]; - scan_end = _win[scan + best_len]; - } - } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0); - if (best_len <= s.lookahead) { - return best_len; - } - return s.lookahead; -} - -/* =========================================================================== - * Fill the window when the lookahead becomes insufficient. - * Updates strstart and lookahead. - * - * IN assertion: lookahead < MIN_LOOKAHEAD - * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD - * At least one byte has been read, or avail_in == 0; reads are - * performed for at least two bytes (required for the zip translate_eol - * option -- not supported here). - */ -function fill_window(s) { - var _w_size = s.w_size; - var p, n, m, more, str; - - //Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead"); - - do { - more = s.window_size - s.lookahead - s.strstart; - - // JS ints have 32 bit, block below not needed - /* Deal with !@#$% 64K limit: */ - //if (sizeof(int) <= 2) { - // if (more == 0 && s->strstart == 0 && s->lookahead == 0) { - // more = wsize; - // - // } else if (more == (unsigned)(-1)) { - // /* Very unlikely, but possible on 16 bit machine if - // * strstart == 0 && lookahead == 1 (input done a byte at time) - // */ - // more--; - // } - //} - - /* If the window is almost full and there is insufficient lookahead, - * move the upper half to the lower one to make room in the upper half. - */ - if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) { - utils$2.arraySet(s.window, s.window, _w_size, _w_size, 0); - s.match_start -= _w_size; - s.strstart -= _w_size; - /* we now have strstart >= MAX_DIST */ - s.block_start -= _w_size; - - /* Slide the hash table (could be avoided with 32 bit values - at the expense of memory usage). We slide even when level == 0 - to keep the hash table consistent if we switch back to level > 0 - later. (Using level 0 permanently is not an optimal usage of - zlib, so we don't care about this pathological case.) - */ - - n = s.hash_size; - p = n; - do { - m = s.head[--p]; - s.head[p] = m >= _w_size ? m - _w_size : 0; - } while (--n); - n = _w_size; - p = n; - do { - m = s.prev[--p]; - s.prev[p] = m >= _w_size ? m - _w_size : 0; - /* If n is not on any hash chain, prev[n] is garbage but - * its value will never be used. - */ - } while (--n); - more += _w_size; - } - if (s.strm.avail_in === 0) { - break; - } - - /* If there was no sliding: - * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && - * more == window_size - lookahead - strstart - * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) - * => more >= window_size - 2*WSIZE + 2 - * In the BIG_MEM or MMAP case (not yet supported), - * window_size == input_size + MIN_LOOKAHEAD && - * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. - * Otherwise, window_size == 2*WSIZE so more >= 2. - * If there was sliding, more >= WSIZE. So in all cases, more >= 2. - */ - //Assert(more >= 2, "more < 2"); - n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more); - s.lookahead += n; - - /* Initialize the hash value now that we have some input: */ - if (s.lookahead + s.insert >= MIN_MATCH) { - str = s.strstart - s.insert; - s.ins_h = s.window[str]; - - /* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */ - s.ins_h = (s.ins_h << s.hash_shift ^ s.window[str + 1]) & s.hash_mask; - //#if MIN_MATCH != 3 - // Call update_hash() MIN_MATCH-3 more times - //#endif - while (s.insert) { - /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */ - s.ins_h = (s.ins_h << s.hash_shift ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask; - s.prev[str & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = str; - str++; - s.insert--; - if (s.lookahead + s.insert < MIN_MATCH) { - break; - } - } - } - /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, - * but this is not important since only literal bytes will be emitted. - */ - } while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0); - - /* If the WIN_INIT bytes after the end of the current data have never been - * written, then zero those bytes in order to avoid memory check reports of - * the use of uninitialized (or uninitialised as Julian writes) bytes by - * the longest match routines. Update the high water mark for the next - * time through here. WIN_INIT is set to MAX_MATCH since the longest match - * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead. - */ - // if (s.high_water < s.window_size) { - // var curr = s.strstart + s.lookahead; - // var init = 0; - // - // if (s.high_water < curr) { - // /* Previous high water mark below current data -- zero WIN_INIT - // * bytes or up to end of window, whichever is less. - // */ - // init = s.window_size - curr; - // if (init > WIN_INIT) - // init = WIN_INIT; - // zmemzero(s->window + curr, (unsigned)init); - // s->high_water = curr + init; - // } - // else if (s->high_water < (ulg)curr + WIN_INIT) { - // /* High water mark at or above current data, but below current data - // * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up - // * to end of window, whichever is less. - // */ - // init = (ulg)curr + WIN_INIT - s->high_water; - // if (init > s->window_size - s->high_water) - // init = s->window_size - s->high_water; - // zmemzero(s->window + s->high_water, (unsigned)init); - // s->high_water += init; - // } - // } - // - // Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, - // "not enough room for search"); -} - -/* =========================================================================== - * Copy without compression as much as possible from the input stream, return - * the current block state. - * This function does not insert new strings in the dictionary since - * uncompressible data is probably not useful. This function is used - * only for the level=0 compression option. - * NOTE: this function should be optimized to avoid extra copying from - * window to pending_buf. - */ -function deflate_stored(s, flush) { - /* Stored blocks are limited to 0xffff bytes, pending_buf is limited - * to pending_buf_size, and each stored block has a 5 byte header: - */ - var max_block_size = 0xffff; - if (max_block_size > s.pending_buf_size - 5) { - max_block_size = s.pending_buf_size - 5; - } - - /* Copy as much as possible from input to output: */ - for (;;) { - /* Fill the window as much as possible: */ - if (s.lookahead <= 1) { - //Assert(s->strstart < s->w_size+MAX_DIST(s) || - // s->block_start >= (long)s->w_size, "slide too late"); - // if (!(s.strstart < s.w_size + (s.w_size - MIN_LOOKAHEAD) || - // s.block_start >= s.w_size)) { - // throw new Error("slide too late"); - // } - - fill_window(s); - if (s.lookahead === 0 && flush === Z_NO_FLUSH) { - return BS_NEED_MORE; - } - if (s.lookahead === 0) { - break; - } - /* flush the current block */ - } - //Assert(s->block_start >= 0L, "block gone"); - // if (s.block_start < 0) throw new Error("block gone"); - - s.strstart += s.lookahead; - s.lookahead = 0; - - /* Emit a stored block if pending_buf will be full: */ - var max_start = s.block_start + max_block_size; - if (s.strstart === 0 || s.strstart >= max_start) { - /* strstart == 0 is possible when wraparound on 16-bit machine */ - s.lookahead = s.strstart - max_start; - s.strstart = max_start; - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - /* Flush if we may have to slide, otherwise block_start may become - * negative and the data will be gone: - */ - if (s.strstart - s.block_start >= s.w_size - MIN_LOOKAHEAD) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - } - s.insert = 0; - if (flush === Z_FINISH$1) { - /*** FLUSH_BLOCK(s, 1); ***/ - flush_block_only(s, true); - if (s.strm.avail_out === 0) { - return BS_FINISH_STARTED; - } - /***/ - return BS_FINISH_DONE; - } - if (s.strstart > s.block_start) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - return BS_NEED_MORE; -} - -/* =========================================================================== - * Compress as much as possible from the input stream, return the current - * block state. - * This function does not perform lazy evaluation of matches and inserts - * new strings in the dictionary only for unmatched strings or for short - * matches. It is used only for the fast compression options. - */ -function deflate_fast(s, flush) { - var hash_head; /* head of the hash chain */ - var bflush; /* set if current block must be flushed */ - - for (;;) { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the next match, plus MIN_MATCH bytes to insert the - * string following the next match. - */ - if (s.lookahead < MIN_LOOKAHEAD) { - fill_window(s); - if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) { - return BS_NEED_MORE; - } - if (s.lookahead === 0) { - break; /* flush the current block */ - } - } - - /* Insert the string window[strstart .. strstart+2] in the - * dictionary, and set hash_head to the head of the hash chain: - */ - hash_head = 0 /*NIL*/; - if (s.lookahead >= MIN_MATCH) { - /*** INSERT_STRING(s, s.strstart, hash_head); ***/ - s.ins_h = (s.ins_h << s.hash_shift ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask; - hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = s.strstart; - /***/ - } - - /* Find the longest match, discarding those <= prev_length. - * At this point we have always match_length < MIN_MATCH - */ - if (hash_head !== 0 /*NIL*/ && s.strstart - hash_head <= s.w_size - MIN_LOOKAHEAD) { - /* To simplify the code, we prevent matches with the string - * of window index 0 (in particular we have to avoid a match - * of the string with itself at the start of the input file). - */ - s.match_length = longest_match(s, hash_head); - /* longest_match() sets match_start */ - } - if (s.match_length >= MIN_MATCH) { - // check_match(s, s.strstart, s.match_start, s.match_length); // for debug only - - /*** _tr_tally_dist(s, s.strstart - s.match_start, - s.match_length - MIN_MATCH, bflush); ***/ - bflush = trees._tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH); - s.lookahead -= s.match_length; - - /* Insert new strings in the hash table only if the match length - * is not too large. This saves time but degrades compression. - */ - if (s.match_length <= s.max_lazy_match /*max_insert_length*/ && s.lookahead >= MIN_MATCH) { - s.match_length--; /* string at strstart already in table */ - do { - s.strstart++; - /*** INSERT_STRING(s, s.strstart, hash_head); ***/ - s.ins_h = (s.ins_h << s.hash_shift ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask; - hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = s.strstart; - /***/ - /* strstart never exceeds WSIZE-MAX_MATCH, so there are - * always MIN_MATCH bytes ahead. - */ - } while (--s.match_length !== 0); - s.strstart++; - } else { - s.strstart += s.match_length; - s.match_length = 0; - s.ins_h = s.window[s.strstart]; - /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */ - s.ins_h = (s.ins_h << s.hash_shift ^ s.window[s.strstart + 1]) & s.hash_mask; - - //#if MIN_MATCH != 3 - // Call UPDATE_HASH() MIN_MATCH-3 more times - //#endif - /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not - * matter since it will be recomputed at next deflate call. - */ - } - } else { - /* No match, output a literal byte */ - //Tracevv((stderr,"%c", s.window[s.strstart])); - /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ - bflush = trees._tr_tally(s, 0, s.window[s.strstart]); - s.lookahead--; - s.strstart++; - } - if (bflush) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - } - s.insert = s.strstart < MIN_MATCH - 1 ? s.strstart : MIN_MATCH - 1; - if (flush === Z_FINISH$1) { - /*** FLUSH_BLOCK(s, 1); ***/ - flush_block_only(s, true); - if (s.strm.avail_out === 0) { - return BS_FINISH_STARTED; - } - /***/ - return BS_FINISH_DONE; - } - if (s.last_lit) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - return BS_BLOCK_DONE; -} - -/* =========================================================================== - * Same as above, but achieves better compression. We use a lazy - * evaluation for matches: a match is finally adopted only if there is - * no better match at the next window position. - */ -function deflate_slow(s, flush) { - var hash_head; /* head of hash chain */ - var bflush; /* set if current block must be flushed */ - - var max_insert; - - /* Process the input block. */ - for (;;) { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the next match, plus MIN_MATCH bytes to insert the - * string following the next match. - */ - if (s.lookahead < MIN_LOOKAHEAD) { - fill_window(s); - if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) { - return BS_NEED_MORE; - } - if (s.lookahead === 0) { - break; - } /* flush the current block */ - } - - /* Insert the string window[strstart .. strstart+2] in the - * dictionary, and set hash_head to the head of the hash chain: - */ - hash_head = 0 /*NIL*/; - if (s.lookahead >= MIN_MATCH) { - /*** INSERT_STRING(s, s.strstart, hash_head); ***/ - s.ins_h = (s.ins_h << s.hash_shift ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask; - hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = s.strstart; - /***/ - } - - /* Find the longest match, discarding those <= prev_length. - */ - s.prev_length = s.match_length; - s.prev_match = s.match_start; - s.match_length = MIN_MATCH - 1; - if (hash_head !== 0 /*NIL*/ && s.prev_length < s.max_lazy_match && s.strstart - hash_head <= s.w_size - MIN_LOOKAHEAD /*MAX_DIST(s)*/) { - /* To simplify the code, we prevent matches with the string - * of window index 0 (in particular we have to avoid a match - * of the string with itself at the start of the input file). - */ - s.match_length = longest_match(s, hash_head); - /* longest_match() sets match_start */ - - if (s.match_length <= 5 && (s.strategy === Z_FILTERED || s.match_length === MIN_MATCH && s.strstart - s.match_start > 4096 /*TOO_FAR*/)) { - /* If prev_match is also MIN_MATCH, match_start is garbage - * but we will ignore the current match anyway. - */ - s.match_length = MIN_MATCH - 1; - } - } - /* If there was a match at the previous step and the current - * match is not better, output the previous match: - */ - if (s.prev_length >= MIN_MATCH && s.match_length <= s.prev_length) { - max_insert = s.strstart + s.lookahead - MIN_MATCH; - /* Do not insert strings in hash table beyond this. */ - - //check_match(s, s.strstart-1, s.prev_match, s.prev_length); - - /***_tr_tally_dist(s, s.strstart - 1 - s.prev_match, - s.prev_length - MIN_MATCH, bflush);***/ - bflush = trees._tr_tally(s, s.strstart - 1 - s.prev_match, s.prev_length - MIN_MATCH); - /* Insert in hash table all strings up to the end of the match. - * strstart-1 and strstart are already inserted. If there is not - * enough lookahead, the last two strings are not inserted in - * the hash table. - */ - s.lookahead -= s.prev_length - 1; - s.prev_length -= 2; - do { - if (++s.strstart <= max_insert) { - /*** INSERT_STRING(s, s.strstart, hash_head); ***/ - s.ins_h = (s.ins_h << s.hash_shift ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask; - hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = s.strstart; - /***/ - } - } while (--s.prev_length !== 0); - s.match_available = 0; - s.match_length = MIN_MATCH - 1; - s.strstart++; - if (bflush) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - } else if (s.match_available) { - /* If there was no match at the previous position, output a - * single literal. If there was a match but the current match - * is longer, truncate the previous match to a single literal. - */ - //Tracevv((stderr,"%c", s->window[s->strstart-1])); - /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/ - bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]); - if (bflush) { - /*** FLUSH_BLOCK_ONLY(s, 0) ***/ - flush_block_only(s, false); - /***/ - } - s.strstart++; - s.lookahead--; - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - } else { - /* There is no previous match to compare with, wait for - * the next step to decide. - */ - s.match_available = 1; - s.strstart++; - s.lookahead--; - } - } - //Assert (flush != Z_NO_FLUSH, "no flush?"); - if (s.match_available) { - //Tracevv((stderr,"%c", s->window[s->strstart-1])); - /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/ - bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]); - s.match_available = 0; - } - s.insert = s.strstart < MIN_MATCH - 1 ? s.strstart : MIN_MATCH - 1; - if (flush === Z_FINISH$1) { - /*** FLUSH_BLOCK(s, 1); ***/ - flush_block_only(s, true); - if (s.strm.avail_out === 0) { - return BS_FINISH_STARTED; - } - /***/ - return BS_FINISH_DONE; - } - if (s.last_lit) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - return BS_BLOCK_DONE; -} - -/* =========================================================================== - * For Z_RLE, simply look for runs of bytes, generate matches only of distance - * one. Do not maintain a hash table. (It will be regenerated if this run of - * deflate switches away from Z_RLE.) - */ -function deflate_rle(s, flush) { - var bflush; /* set if current block must be flushed */ - var prev; /* byte at distance one to match */ - var scan, strend; /* scan goes up to strend for length of run */ - - var _win = s.window; - for (;;) { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the longest run, plus one for the unrolled loop. - */ - if (s.lookahead <= MAX_MATCH) { - fill_window(s); - if (s.lookahead <= MAX_MATCH && flush === Z_NO_FLUSH) { - return BS_NEED_MORE; - } - if (s.lookahead === 0) { - break; - } /* flush the current block */ - } - - /* See how many times the previous byte repeats */ - s.match_length = 0; - if (s.lookahead >= MIN_MATCH && s.strstart > 0) { - scan = s.strstart - 1; - prev = _win[scan]; - if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) { - strend = s.strstart + MAX_MATCH; - do { - /*jshint noempty:false*/ - } while (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan] && scan < strend); - s.match_length = MAX_MATCH - (strend - scan); - if (s.match_length > s.lookahead) { - s.match_length = s.lookahead; - } - } - //Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan"); - } - - /* Emit match if have run of MIN_MATCH or longer, else emit literal */ - if (s.match_length >= MIN_MATCH) { - //check_match(s, s.strstart, s.strstart - 1, s.match_length); - - /*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/ - bflush = trees._tr_tally(s, 1, s.match_length - MIN_MATCH); - s.lookahead -= s.match_length; - s.strstart += s.match_length; - s.match_length = 0; - } else { - /* No match, output a literal byte */ - //Tracevv((stderr,"%c", s->window[s->strstart])); - /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ - bflush = trees._tr_tally(s, 0, s.window[s.strstart]); - s.lookahead--; - s.strstart++; - } - if (bflush) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - } - s.insert = 0; - if (flush === Z_FINISH$1) { - /*** FLUSH_BLOCK(s, 1); ***/ - flush_block_only(s, true); - if (s.strm.avail_out === 0) { - return BS_FINISH_STARTED; - } - /***/ - return BS_FINISH_DONE; - } - if (s.last_lit) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - return BS_BLOCK_DONE; -} - -/* =========================================================================== - * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table. - * (It will be regenerated if this run of deflate switches away from Huffman.) - */ -function deflate_huff(s, flush) { - var bflush; /* set if current block must be flushed */ - - for (;;) { - /* Make sure that we have a literal to write. */ - if (s.lookahead === 0) { - fill_window(s); - if (s.lookahead === 0) { - if (flush === Z_NO_FLUSH) { - return BS_NEED_MORE; - } - break; /* flush the current block */ - } - } - - /* Output a literal byte */ - s.match_length = 0; - //Tracevv((stderr,"%c", s->window[s->strstart])); - /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ - bflush = trees._tr_tally(s, 0, s.window[s.strstart]); - s.lookahead--; - s.strstart++; - if (bflush) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - } - s.insert = 0; - if (flush === Z_FINISH$1) { - /*** FLUSH_BLOCK(s, 1); ***/ - flush_block_only(s, true); - if (s.strm.avail_out === 0) { - return BS_FINISH_STARTED; - } - /***/ - return BS_FINISH_DONE; - } - if (s.last_lit) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - return BS_BLOCK_DONE; -} - -/* Values for max_lazy_match, good_match and max_chain_length, depending on - * the desired pack level (0..9). The values given below have been tuned to - * exclude worst case performance for pathological files. Better values may be - * found for specific files. - */ -function Config(good_length, max_lazy, nice_length, max_chain, func) { - this.good_length = good_length; - this.max_lazy = max_lazy; - this.nice_length = nice_length; - this.max_chain = max_chain; - this.func = func; -} -var configuration_table; -configuration_table = [/* good lazy nice chain */ -new Config(0, 0, 0, 0, deflate_stored), /* 0 store only */ -new Config(4, 4, 8, 4, deflate_fast), /* 1 max speed, no lazy matches */ -new Config(4, 5, 16, 8, deflate_fast), /* 2 */ -new Config(4, 6, 32, 32, deflate_fast), /* 3 */ - -new Config(4, 4, 16, 16, deflate_slow), /* 4 lazy matches */ -new Config(8, 16, 32, 32, deflate_slow), /* 5 */ -new Config(8, 16, 128, 128, deflate_slow), /* 6 */ -new Config(8, 32, 128, 256, deflate_slow), /* 7 */ -new Config(32, 128, 258, 1024, deflate_slow), /* 8 */ -new Config(32, 258, 258, 4096, deflate_slow) /* 9 max compression */]; - -/* =========================================================================== - * Initialize the "longest match" routines for a new zlib stream - */ -function lm_init(s) { - s.window_size = 2 * s.w_size; - - /*** CLEAR_HASH(s); ***/ - zero(s.head); // Fill with NIL (= 0); - - /* Set the default configuration parameters: - */ - s.max_lazy_match = configuration_table[s.level].max_lazy; - s.good_match = configuration_table[s.level].good_length; - s.nice_match = configuration_table[s.level].nice_length; - s.max_chain_length = configuration_table[s.level].max_chain; - s.strstart = 0; - s.block_start = 0; - s.lookahead = 0; - s.insert = 0; - s.match_length = s.prev_length = MIN_MATCH - 1; - s.match_available = 0; - s.ins_h = 0; -} -function DeflateState() { - this.strm = null; /* pointer back to this zlib stream */ - this.status = 0; /* as the name implies */ - this.pending_buf = null; /* output still pending */ - this.pending_buf_size = 0; /* size of pending_buf */ - this.pending_out = 0; /* next pending byte to output to the stream */ - this.pending = 0; /* nb of bytes in the pending buffer */ - this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */ - this.gzhead = null; /* gzip header information to write */ - this.gzindex = 0; /* where in extra, name, or comment */ - this.method = Z_DEFLATED$1; /* can only be DEFLATED */ - this.last_flush = -1; /* value of flush param for previous deflate call */ - - this.w_size = 0; /* LZ77 window size (32K by default) */ - this.w_bits = 0; /* log2(w_size) (8..16) */ - this.w_mask = 0; /* w_size - 1 */ - - this.window = null; - /* Sliding window. Input bytes are read into the second half of the window, - * and move to the first half later to keep a dictionary of at least wSize - * bytes. With this organization, matches are limited to a distance of - * wSize-MAX_MATCH bytes, but this ensures that IO is always - * performed with a length multiple of the block size. - */ - - this.window_size = 0; - /* Actual size of window: 2*wSize, except when the user input buffer - * is directly used as sliding window. - */ - - this.prev = null; - /* Link to older string with same hash index. To limit the size of this - * array to 64K, this link is maintained only for the last 32K strings. - * An index in this array is thus a window index modulo 32K. - */ - - this.head = null; /* Heads of the hash chains or NIL. */ - - this.ins_h = 0; /* hash index of string to be inserted */ - this.hash_size = 0; /* number of elements in hash table */ - this.hash_bits = 0; /* log2(hash_size) */ - this.hash_mask = 0; /* hash_size-1 */ - - this.hash_shift = 0; - /* Number of bits by which ins_h must be shifted at each input - * step. It must be such that after MIN_MATCH steps, the oldest - * byte no longer takes part in the hash key, that is: - * hash_shift * MIN_MATCH >= hash_bits - */ - - this.block_start = 0; - /* Window position at the beginning of the current output block. Gets - * negative when the window is moved backwards. - */ - - this.match_length = 0; /* length of best match */ - this.prev_match = 0; /* previous match */ - this.match_available = 0; /* set if previous match exists */ - this.strstart = 0; /* start of string to insert */ - this.match_start = 0; /* start of matching string */ - this.lookahead = 0; /* number of valid bytes ahead in window */ - - this.prev_length = 0; - /* Length of the best match at previous step. Matches not greater than this - * are discarded. This is used in the lazy match evaluation. - */ - - this.max_chain_length = 0; - /* To speed up deflation, hash chains are never searched beyond this - * length. A higher limit improves compression ratio but degrades the - * speed. - */ - - this.max_lazy_match = 0; - /* Attempt to find a better match only when the current match is strictly - * smaller than this value. This mechanism is used only for compression - * levels >= 4. - */ - // That's alias to max_lazy_match, don't use directly - //this.max_insert_length = 0; - /* Insert new strings in the hash table only if the match length is not - * greater than this length. This saves time but degrades compression. - * max_insert_length is used only for compression levels <= 3. - */ - - this.level = 0; /* compression level (1..9) */ - this.strategy = 0; /* favor or force Huffman coding*/ - - this.good_match = 0; - /* Use a faster search when the previous match is longer than this */ - - this.nice_match = 0; /* Stop searching when current match exceeds this */ - - /* used by trees.c: */ - - /* Didn't use ct_data typedef below to suppress compiler warning */ - - // struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ - // struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ - // struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ - - // Use flat array of DOUBLE size, with interleaved fata, - // because JS does not support effective - this.dyn_ltree = new utils$2.Buf16(HEAP_SIZE * 2); - this.dyn_dtree = new utils$2.Buf16((2 * D_CODES + 1) * 2); - this.bl_tree = new utils$2.Buf16((2 * BL_CODES + 1) * 2); - zero(this.dyn_ltree); - zero(this.dyn_dtree); - zero(this.bl_tree); - this.l_desc = null; /* desc. for literal tree */ - this.d_desc = null; /* desc. for distance tree */ - this.bl_desc = null; /* desc. for bit length tree */ - - //ush bl_count[MAX_BITS+1]; - this.bl_count = new utils$2.Buf16(MAX_BITS + 1); - /* number of codes at each bit length for an optimal tree */ - - //int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ - this.heap = new utils$2.Buf16(2 * L_CODES + 1); /* heap used to build the Huffman trees */ - zero(this.heap); - this.heap_len = 0; /* number of elements in the heap */ - this.heap_max = 0; /* element of largest frequency */ - /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. - * The same heap array is used to build all trees. - */ - - this.depth = new utils$2.Buf16(2 * L_CODES + 1); //uch depth[2*L_CODES+1]; - zero(this.depth); - /* Depth of each subtree used as tie breaker for trees of equal frequency - */ - - this.l_buf = 0; /* buffer index for literals or lengths */ - - this.lit_bufsize = 0; - /* Size of match buffer for literals/lengths. There are 4 reasons for - * limiting lit_bufsize to 64K: - * - frequencies can be kept in 16 bit counters - * - if compression is not successful for the first block, all input - * data is still in the window so we can still emit a stored block even - * when input comes from standard input. (This can also be done for - * all blocks if lit_bufsize is not greater than 32K.) - * - if compression is not successful for a file smaller than 64K, we can - * even emit a stored file instead of a stored block (saving 5 bytes). - * This is applicable only for zip (not gzip or zlib). - * - creating new Huffman trees less frequently may not provide fast - * adaptation to changes in the input data statistics. (Take for - * example a binary file with poorly compressible code followed by - * a highly compressible string table.) Smaller buffer sizes give - * fast adaptation but have of course the overhead of transmitting - * trees more frequently. - * - I can't count above 4 - */ - - this.last_lit = 0; /* running index in l_buf */ - - this.d_buf = 0; - /* Buffer index for distances. To simplify the code, d_buf and l_buf have - * the same number of elements. To use different lengths, an extra flag - * array would be necessary. - */ - - this.opt_len = 0; /* bit length of current block with optimal trees */ - this.static_len = 0; /* bit length of current block with static trees */ - this.matches = 0; /* number of string matches in current block */ - this.insert = 0; /* bytes at end of window left to insert */ - - this.bi_buf = 0; - /* Output buffer. bits are inserted starting at the bottom (least - * significant bits). - */ - this.bi_valid = 0; - /* Number of valid bits in bi_buf. All bits above the last valid bit - * are always zero. - */ - - // Used for window memory init. We safely ignore it for JS. That makes - // sense only for pointers and memory check tools. - //this.high_water = 0; - /* High water mark offset in window for initialized bytes -- bytes above - * this are set to zero in order to avoid memory check warnings when - * longest match routines access bytes past the input. This is then - * updated to the new high water mark. - */ -} -function deflateResetKeep(strm) { - var s; - if (!strm || !strm.state) { - return err(strm, Z_STREAM_ERROR$1); - } - strm.total_in = strm.total_out = 0; - strm.data_type = Z_UNKNOWN; - s = strm.state; - s.pending = 0; - s.pending_out = 0; - if (s.wrap < 0) { - s.wrap = -s.wrap; - /* was made negative by deflate(..., Z_FINISH); */ - } - s.status = s.wrap ? INIT_STATE : BUSY_STATE; - strm.adler = s.wrap === 2 ? 0 // crc32(0, Z_NULL, 0) - : 1; // adler32(0, Z_NULL, 0) - s.last_flush = Z_NO_FLUSH; - trees._tr_init(s); - return Z_OK$1; -} -function deflateReset(strm) { - var ret = deflateResetKeep(strm); - if (ret === Z_OK$1) { - lm_init(strm.state); - } - return ret; -} -function deflateSetHeader(strm, head) { - if (!strm || !strm.state) { - return Z_STREAM_ERROR$1; - } - if (strm.state.wrap !== 2) { - return Z_STREAM_ERROR$1; - } - strm.state.gzhead = head; - return Z_OK$1; -} -function deflateInit2(strm, level, method, windowBits, memLevel, strategy) { - if (!strm) { - // === Z_NULL - return Z_STREAM_ERROR$1; - } - var wrap = 1; - if (level === Z_DEFAULT_COMPRESSION) { - level = 6; - } - if (windowBits < 0) { - /* suppress zlib wrapper */ - wrap = 0; - windowBits = -windowBits; - } else if (windowBits > 15) { - wrap = 2; /* write gzip wrapper instead */ - windowBits -= 16; - } - if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED$1 || windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) { - return err(strm, Z_STREAM_ERROR$1); - } - if (windowBits === 8) { - windowBits = 9; - } - /* until 256-byte window bug fixed */ - - var s = new DeflateState(); - strm.state = s; - s.strm = strm; - s.wrap = wrap; - s.gzhead = null; - s.w_bits = windowBits; - s.w_size = 1 << s.w_bits; - s.w_mask = s.w_size - 1; - s.hash_bits = memLevel + 7; - s.hash_size = 1 << s.hash_bits; - s.hash_mask = s.hash_size - 1; - s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH); - s.window = new utils$2.Buf8(s.w_size * 2); - s.head = new utils$2.Buf16(s.hash_size); - s.prev = new utils$2.Buf16(s.w_size); - - // Don't need mem init magic for JS. - //s.high_water = 0; /* nothing written to s->window yet */ - - s.lit_bufsize = 1 << memLevel + 6; /* 16K elements by default */ - - s.pending_buf_size = s.lit_bufsize * 4; - - //overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); - //s->pending_buf = (uchf *) overlay; - s.pending_buf = new utils$2.Buf8(s.pending_buf_size); - - // It is offset from `s.pending_buf` (size is `s.lit_bufsize * 2`) - //s->d_buf = overlay + s->lit_bufsize/sizeof(ush); - s.d_buf = 1 * s.lit_bufsize; - - //s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; - s.l_buf = (1 + 2) * s.lit_bufsize; - s.level = level; - s.strategy = strategy; - s.method = method; - return deflateReset(strm); -} -function deflateInit(strm, level) { - return deflateInit2(strm, level, Z_DEFLATED$1, MAX_WBITS$1, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY); -} -function deflate(strm, flush) { - var old_flush, s; - var beg, val; // for gzip header write only - - if (!strm || !strm.state || flush > Z_BLOCK$1 || flush < 0) { - return strm ? err(strm, Z_STREAM_ERROR$1) : Z_STREAM_ERROR$1; - } - s = strm.state; - if (!strm.output || !strm.input && strm.avail_in !== 0 || s.status === FINISH_STATE && flush !== Z_FINISH$1) { - return err(strm, strm.avail_out === 0 ? Z_BUF_ERROR$1 : Z_STREAM_ERROR$1); - } - s.strm = strm; /* just in case */ - old_flush = s.last_flush; - s.last_flush = flush; - - /* Write the header */ - if (s.status === INIT_STATE) { - if (s.wrap === 2) { - // GZIP header - strm.adler = 0; //crc32(0L, Z_NULL, 0); - put_byte(s, 31); - put_byte(s, 139); - put_byte(s, 8); - if (!s.gzhead) { - // s->gzhead == Z_NULL - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, s.level === 9 ? 2 : s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ? 4 : 0); - put_byte(s, OS_CODE); - s.status = BUSY_STATE; - } else { - put_byte(s, (s.gzhead.text ? 1 : 0) + (s.gzhead.hcrc ? 2 : 0) + (!s.gzhead.extra ? 0 : 4) + (!s.gzhead.name ? 0 : 8) + (!s.gzhead.comment ? 0 : 16)); - put_byte(s, s.gzhead.time & 0xff); - put_byte(s, s.gzhead.time >> 8 & 0xff); - put_byte(s, s.gzhead.time >> 16 & 0xff); - put_byte(s, s.gzhead.time >> 24 & 0xff); - put_byte(s, s.level === 9 ? 2 : s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ? 4 : 0); - put_byte(s, s.gzhead.os & 0xff); - if (s.gzhead.extra && s.gzhead.extra.length) { - put_byte(s, s.gzhead.extra.length & 0xff); - put_byte(s, s.gzhead.extra.length >> 8 & 0xff); - } - if (s.gzhead.hcrc) { - strm.adler = crc32$1(strm.adler, s.pending_buf, s.pending, 0); - } - s.gzindex = 0; - s.status = EXTRA_STATE; - } - } else - // DEFLATE header - { - var header = Z_DEFLATED$1 + (s.w_bits - 8 << 4) << 8; - var level_flags = -1; - if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) { - level_flags = 0; - } else if (s.level < 6) { - level_flags = 1; - } else if (s.level === 6) { - level_flags = 2; - } else { - level_flags = 3; - } - header |= level_flags << 6; - if (s.strstart !== 0) { - header |= PRESET_DICT; - } - header += 31 - header % 31; - s.status = BUSY_STATE; - putShortMSB(s, header); - - /* Save the adler32 of the preset dictionary: */ - if (s.strstart !== 0) { - putShortMSB(s, strm.adler >>> 16); - putShortMSB(s, strm.adler & 0xffff); - } - strm.adler = 1; // adler32(0L, Z_NULL, 0); - } - } - - //#ifdef GZIP - if (s.status === EXTRA_STATE) { - if (s.gzhead.extra /* != Z_NULL*/) { - beg = s.pending; /* start of bytes to update crc */ - - while (s.gzindex < (s.gzhead.extra.length & 0xffff)) { - if (s.pending === s.pending_buf_size) { - if (s.gzhead.hcrc && s.pending > beg) { - strm.adler = crc32$1(strm.adler, s.pending_buf, s.pending - beg, beg); - } - flush_pending(strm); - beg = s.pending; - if (s.pending === s.pending_buf_size) { - break; - } - } - put_byte(s, s.gzhead.extra[s.gzindex] & 0xff); - s.gzindex++; - } - if (s.gzhead.hcrc && s.pending > beg) { - strm.adler = crc32$1(strm.adler, s.pending_buf, s.pending - beg, beg); - } - if (s.gzindex === s.gzhead.extra.length) { - s.gzindex = 0; - s.status = NAME_STATE; - } - } else { - s.status = NAME_STATE; - } - } - if (s.status === NAME_STATE) { - if (s.gzhead.name /* != Z_NULL*/) { - beg = s.pending; /* start of bytes to update crc */ - //int val; - - do { - if (s.pending === s.pending_buf_size) { - if (s.gzhead.hcrc && s.pending > beg) { - strm.adler = crc32$1(strm.adler, s.pending_buf, s.pending - beg, beg); - } - flush_pending(strm); - beg = s.pending; - if (s.pending === s.pending_buf_size) { - val = 1; - break; - } - } - // JS specific: little magic to add zero terminator to end of string - if (s.gzindex < s.gzhead.name.length) { - val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff; - } else { - val = 0; - } - put_byte(s, val); - } while (val !== 0); - if (s.gzhead.hcrc && s.pending > beg) { - strm.adler = crc32$1(strm.adler, s.pending_buf, s.pending - beg, beg); - } - if (val === 0) { - s.gzindex = 0; - s.status = COMMENT_STATE; - } - } else { - s.status = COMMENT_STATE; - } - } - if (s.status === COMMENT_STATE) { - if (s.gzhead.comment /* != Z_NULL*/) { - beg = s.pending; /* start of bytes to update crc */ - //int val; - - do { - if (s.pending === s.pending_buf_size) { - if (s.gzhead.hcrc && s.pending > beg) { - strm.adler = crc32$1(strm.adler, s.pending_buf, s.pending - beg, beg); - } - flush_pending(strm); - beg = s.pending; - if (s.pending === s.pending_buf_size) { - val = 1; - break; - } - } - // JS specific: little magic to add zero terminator to end of string - if (s.gzindex < s.gzhead.comment.length) { - val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff; - } else { - val = 0; - } - put_byte(s, val); - } while (val !== 0); - if (s.gzhead.hcrc && s.pending > beg) { - strm.adler = crc32$1(strm.adler, s.pending_buf, s.pending - beg, beg); - } - if (val === 0) { - s.status = HCRC_STATE; - } - } else { - s.status = HCRC_STATE; - } - } - if (s.status === HCRC_STATE) { - if (s.gzhead.hcrc) { - if (s.pending + 2 > s.pending_buf_size) { - flush_pending(strm); - } - if (s.pending + 2 <= s.pending_buf_size) { - put_byte(s, strm.adler & 0xff); - put_byte(s, strm.adler >> 8 & 0xff); - strm.adler = 0; //crc32(0L, Z_NULL, 0); - s.status = BUSY_STATE; - } - } else { - s.status = BUSY_STATE; - } - } - //#endif - - /* Flush as much pending output as possible */ - if (s.pending !== 0) { - flush_pending(strm); - if (strm.avail_out === 0) { - /* Since avail_out is 0, deflate will be called again with - * more output space, but possibly with both pending and - * avail_in equal to zero. There won't be anything to do, - * but this is not an error situation so make sure we - * return OK instead of BUF_ERROR at next call of deflate: - */ - s.last_flush = -1; - return Z_OK$1; - } - - /* Make sure there is something to do and avoid duplicate consecutive - * flushes. For repeated and useless calls with Z_FINISH, we keep - * returning Z_STREAM_END instead of Z_BUF_ERROR. - */ - } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) && flush !== Z_FINISH$1) { - return err(strm, Z_BUF_ERROR$1); - } - - /* User must not provide more input after the first FINISH: */ - if (s.status === FINISH_STATE && strm.avail_in !== 0) { - return err(strm, Z_BUF_ERROR$1); - } - - /* Start a new block or continue the current one. - */ - if (strm.avail_in !== 0 || s.lookahead !== 0 || flush !== Z_NO_FLUSH && s.status !== FINISH_STATE) { - var bstate = s.strategy === Z_HUFFMAN_ONLY ? deflate_huff(s, flush) : s.strategy === Z_RLE ? deflate_rle(s, flush) : configuration_table[s.level].func(s, flush); - if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) { - s.status = FINISH_STATE; - } - if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) { - if (strm.avail_out === 0) { - s.last_flush = -1; - /* avoid BUF_ERROR next call, see above */ - } - return Z_OK$1; - /* If flush != Z_NO_FLUSH && avail_out == 0, the next call - * of deflate should use the same flush parameter to make sure - * that the flush is complete. So we don't have to output an - * empty block here, this will be done at next call. This also - * ensures that for a very small output buffer, we emit at most - * one empty block. - */ - } - if (bstate === BS_BLOCK_DONE) { - if (flush === Z_PARTIAL_FLUSH) { - trees._tr_align(s); - } else if (flush !== Z_BLOCK$1) { - /* FULL_FLUSH or SYNC_FLUSH */ - - trees._tr_stored_block(s, 0, 0, false); - /* For a full flush, this empty block will be recognized - * as a special marker by inflate_sync(). - */ - if (flush === Z_FULL_FLUSH) { - /*** CLEAR_HASH(s); ***/ /* forget history */ - zero(s.head); // Fill with NIL (= 0); - - if (s.lookahead === 0) { - s.strstart = 0; - s.block_start = 0; - s.insert = 0; - } - } - } - flush_pending(strm); - if (strm.avail_out === 0) { - s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */ - return Z_OK$1; - } - } - } - //Assert(strm->avail_out > 0, "bug2"); - //if (strm.avail_out <= 0) { throw new Error("bug2");} - - if (flush !== Z_FINISH$1) { - return Z_OK$1; - } - if (s.wrap <= 0) { - return Z_STREAM_END$1; - } - - /* Write the trailer */ - if (s.wrap === 2) { - put_byte(s, strm.adler & 0xff); - put_byte(s, strm.adler >> 8 & 0xff); - put_byte(s, strm.adler >> 16 & 0xff); - put_byte(s, strm.adler >> 24 & 0xff); - put_byte(s, strm.total_in & 0xff); - put_byte(s, strm.total_in >> 8 & 0xff); - put_byte(s, strm.total_in >> 16 & 0xff); - put_byte(s, strm.total_in >> 24 & 0xff); - } else { - putShortMSB(s, strm.adler >>> 16); - putShortMSB(s, strm.adler & 0xffff); - } - flush_pending(strm); - /* If avail_out is zero, the application will call deflate again - * to flush the rest. - */ - if (s.wrap > 0) { - s.wrap = -s.wrap; - } - /* write the trailer only once! */ - return s.pending !== 0 ? Z_OK$1 : Z_STREAM_END$1; -} -function deflateEnd(strm) { - var status; - if (!strm /*== Z_NULL*/ || !strm.state /*== Z_NULL*/) { - return Z_STREAM_ERROR$1; - } - status = strm.state.status; - if (status !== INIT_STATE && status !== EXTRA_STATE && status !== NAME_STATE && status !== COMMENT_STATE && status !== HCRC_STATE && status !== BUSY_STATE && status !== FINISH_STATE) { - return err(strm, Z_STREAM_ERROR$1); - } - strm.state = null; - return status === BUSY_STATE ? err(strm, Z_DATA_ERROR$1) : Z_OK$1; -} - -/* ========================================================================= - * Initializes the compression dictionary from the given byte - * sequence without producing any compressed output. - */ -function deflateSetDictionary(strm, dictionary) { - var dictLength = dictionary.length; - var s; - var str, n; - var wrap; - var avail; - var next; - var input; - var tmpDict; - if (!strm /*== Z_NULL*/ || !strm.state /*== Z_NULL*/) { - return Z_STREAM_ERROR$1; - } - s = strm.state; - wrap = s.wrap; - if (wrap === 2 || wrap === 1 && s.status !== INIT_STATE || s.lookahead) { - return Z_STREAM_ERROR$1; - } - - /* when using zlib wrappers, compute Adler-32 for provided dictionary */ - if (wrap === 1) { - /* adler32(strm->adler, dictionary, dictLength); */ - strm.adler = adler32$1(strm.adler, dictionary, dictLength, 0); - } - s.wrap = 0; /* avoid computing Adler-32 in read_buf */ - - /* if dictionary would fill window, just replace the history */ - if (dictLength >= s.w_size) { - if (wrap === 0) { - /* already empty otherwise */ - /*** CLEAR_HASH(s); ***/ - zero(s.head); // Fill with NIL (= 0); - s.strstart = 0; - s.block_start = 0; - s.insert = 0; - } - /* use the tail */ - // dictionary = dictionary.slice(dictLength - s.w_size); - tmpDict = new utils$2.Buf8(s.w_size); - utils$2.arraySet(tmpDict, dictionary, dictLength - s.w_size, s.w_size, 0); - dictionary = tmpDict; - dictLength = s.w_size; - } - /* insert dictionary into window and hash */ - avail = strm.avail_in; - next = strm.next_in; - input = strm.input; - strm.avail_in = dictLength; - strm.next_in = 0; - strm.input = dictionary; - fill_window(s); - while (s.lookahead >= MIN_MATCH) { - str = s.strstart; - n = s.lookahead - (MIN_MATCH - 1); - do { - /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */ - s.ins_h = (s.ins_h << s.hash_shift ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask; - s.prev[str & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = str; - str++; - } while (--n); - s.strstart = str; - s.lookahead = MIN_MATCH - 1; - fill_window(s); - } - s.strstart += s.lookahead; - s.block_start = s.strstart; - s.insert = s.lookahead; - s.lookahead = 0; - s.match_length = s.prev_length = MIN_MATCH - 1; - s.match_available = 0; - strm.next_in = next; - strm.input = input; - strm.avail_in = avail; - s.wrap = wrap; - return Z_OK$1; -} -deflate$1.deflateInit = deflateInit; -deflate$1.deflateInit2 = deflateInit2; -deflate$1.deflateReset = deflateReset; -deflate$1.deflateResetKeep = deflateResetKeep; -deflate$1.deflateSetHeader = deflateSetHeader; -deflate$1.deflate = deflate; -deflate$1.deflateEnd = deflateEnd; -deflate$1.deflateSetDictionary = deflateSetDictionary; -deflate$1.deflateInfo = 'pako deflate (from Nodeca project)'; - -var inflate$1 = {}; - -// (C) 1995-2013 Jean-loup Gailly and Mark Adler -// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// 3. This notice may not be removed or altered from any source distribution. - -// See state defs from inflate.js -var BAD$1 = 30; /* got a data error -- remain here until reset */ -var TYPE$1 = 12; /* i: waiting for type bits, including last-flag bit */ - -/* - Decode literal, length, and distance codes and write out the resulting - literal and match bytes until either not enough input or output is - available, an end-of-block is encountered, or a data error is encountered. - When large enough input and output buffers are supplied to inflate(), for - example, a 16K input buffer and a 64K output buffer, more than 95% of the - inflate execution time is spent in this routine. - - Entry assumptions: - - state.mode === LEN - strm.avail_in >= 6 - strm.avail_out >= 258 - start >= strm.avail_out - state.bits < 8 - - On return, state.mode is one of: - - LEN -- ran out of enough output space or enough available input - TYPE -- reached end of block code, inflate() to interpret next block - BAD -- error in block data - - Notes: - - - The maximum input bits used by a length/distance pair is 15 bits for the - length code, 5 bits for the length extra, 15 bits for the distance code, - and 13 bits for the distance extra. This totals 48 bits, or six bytes. - Therefore if strm.avail_in >= 6, then there is enough input to avoid - checking for available input while decoding. - - - The maximum bytes that a single length/distance pair can output is 258 - bytes, which is the maximum length that can be coded. inflate_fast() - requires strm.avail_out >= 258 for each loop to avoid checking for - output space. - */ -var inffast = function inflate_fast(strm, start) { - var state; - var _in; /* local strm.input */ - var last; /* have enough input while in < last */ - var _out; /* local strm.output */ - var beg; /* inflate()'s initial strm.output */ - var end; /* while out < end, enough space available */ - //#ifdef INFLATE_STRICT - var dmax; /* maximum distance from zlib header */ - //#endif - var wsize; /* window size or zero if not using window */ - var whave; /* valid bytes in the window */ - var wnext; /* window write index */ - // Use `s_window` instead `window`, avoid conflict with instrumentation tools - var s_window; /* allocated sliding window, if wsize != 0 */ - var hold; /* local strm.hold */ - var bits; /* local strm.bits */ - var lcode; /* local strm.lencode */ - var dcode; /* local strm.distcode */ - var lmask; /* mask for first level of length codes */ - var dmask; /* mask for first level of distance codes */ - var here; /* retrieved table entry */ - var op; /* code bits, operation, extra bits, or */ - /* window position, window bytes to copy */ - var len; /* match length, unused bytes */ - var dist; /* match distance */ - var from; /* where to copy match from */ - var from_source; - var input, output; // JS specific, because we have no pointers - - /* copy state to local variables */ - state = strm.state; - //here = state.here; - _in = strm.next_in; - input = strm.input; - last = _in + (strm.avail_in - 5); - _out = strm.next_out; - output = strm.output; - beg = _out - (start - strm.avail_out); - end = _out + (strm.avail_out - 257); - //#ifdef INFLATE_STRICT - dmax = state.dmax; - //#endif - wsize = state.wsize; - whave = state.whave; - wnext = state.wnext; - s_window = state.window; - hold = state.hold; - bits = state.bits; - lcode = state.lencode; - dcode = state.distcode; - lmask = (1 << state.lenbits) - 1; - dmask = (1 << state.distbits) - 1; - - /* decode literals and length/distances until end-of-block or not enough - input data or output space */ - - top: do { - if (bits < 15) { - hold += input[_in++] << bits; - bits += 8; - hold += input[_in++] << bits; - bits += 8; - } - here = lcode[hold & lmask]; - dolen: for (;;) { - // Goto emulation - op = here >>> 24 /*here.bits*/; - hold >>>= op; - bits -= op; - op = here >>> 16 & 0xff /*here.op*/; - if (op === 0) { - /* literal */ - //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? - // "inflate: literal '%c'\n" : - // "inflate: literal 0x%02x\n", here.val)); - output[_out++] = here & 0xffff /*here.val*/; - } else if (op & 16) { - /* length base */ - len = here & 0xffff /*here.val*/; - op &= 15; /* number of extra bits */ - if (op) { - if (bits < op) { - hold += input[_in++] << bits; - bits += 8; - } - len += hold & (1 << op) - 1; - hold >>>= op; - bits -= op; - } - //Tracevv((stderr, "inflate: length %u\n", len)); - if (bits < 15) { - hold += input[_in++] << bits; - bits += 8; - hold += input[_in++] << bits; - bits += 8; - } - here = dcode[hold & dmask]; - dodist: for (;;) { - // goto emulation - op = here >>> 24 /*here.bits*/; - hold >>>= op; - bits -= op; - op = here >>> 16 & 0xff /*here.op*/; - if (op & 16) { - /* distance base */ - dist = here & 0xffff /*here.val*/; - op &= 15; /* number of extra bits */ - if (bits < op) { - hold += input[_in++] << bits; - bits += 8; - if (bits < op) { - hold += input[_in++] << bits; - bits += 8; - } - } - dist += hold & (1 << op) - 1; - //#ifdef INFLATE_STRICT - if (dist > dmax) { - strm.msg = 'invalid distance too far back'; - state.mode = BAD$1; - break top; - } - //#endif - hold >>>= op; - bits -= op; - //Tracevv((stderr, "inflate: distance %u\n", dist)); - op = _out - beg; /* max distance in output */ - if (dist > op) { - /* see if copy from window */ - op = dist - op; /* distance back in window */ - if (op > whave) { - if (state.sane) { - strm.msg = 'invalid distance too far back'; - state.mode = BAD$1; - break top; - } - - // (!) This block is disabled in zlib defaults, - // don't enable it for binary compatibility - //#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR - // if (len <= op - whave) { - // do { - // output[_out++] = 0; - // } while (--len); - // continue top; - // } - // len -= op - whave; - // do { - // output[_out++] = 0; - // } while (--op > whave); - // if (op === 0) { - // from = _out - dist; - // do { - // output[_out++] = output[from++]; - // } while (--len); - // continue top; - // } - //#endif - } - from = 0; // window index - from_source = s_window; - if (wnext === 0) { - /* very common case */ - from += wsize - op; - if (op < len) { - /* some from window */ - len -= op; - do { - output[_out++] = s_window[from++]; - } while (--op); - from = _out - dist; /* rest from output */ - from_source = output; - } - } else if (wnext < op) { - /* wrap around window */ - from += wsize + wnext - op; - op -= wnext; - if (op < len) { - /* some from end of window */ - len -= op; - do { - output[_out++] = s_window[from++]; - } while (--op); - from = 0; - if (wnext < len) { - /* some from start of window */ - op = wnext; - len -= op; - do { - output[_out++] = s_window[from++]; - } while (--op); - from = _out - dist; /* rest from output */ - from_source = output; - } - } - } else { - /* contiguous in window */ - from += wnext - op; - if (op < len) { - /* some from window */ - len -= op; - do { - output[_out++] = s_window[from++]; - } while (--op); - from = _out - dist; /* rest from output */ - from_source = output; - } - } - while (len > 2) { - output[_out++] = from_source[from++]; - output[_out++] = from_source[from++]; - output[_out++] = from_source[from++]; - len -= 3; - } - if (len) { - output[_out++] = from_source[from++]; - if (len > 1) { - output[_out++] = from_source[from++]; - } - } - } else { - from = _out - dist; /* copy direct from output */ - do { - /* minimum length is three */ - output[_out++] = output[from++]; - output[_out++] = output[from++]; - output[_out++] = output[from++]; - len -= 3; - } while (len > 2); - if (len) { - output[_out++] = output[from++]; - if (len > 1) { - output[_out++] = output[from++]; - } - } - } - } else if ((op & 64) === 0) { - /* 2nd level distance code */ - here = dcode[(here & 0xffff /*here.val*/) + (hold & (1 << op) - 1)]; - continue dodist; - } else { - strm.msg = 'invalid distance code'; - state.mode = BAD$1; - break top; - } - break; // need to emulate goto via "continue" - } - } else if ((op & 64) === 0) { - /* 2nd level length code */ - here = lcode[(here & 0xffff /*here.val*/) + (hold & (1 << op) - 1)]; - continue dolen; - } else if (op & 32) { - /* end-of-block */ - //Tracevv((stderr, "inflate: end of block\n")); - state.mode = TYPE$1; - break top; - } else { - strm.msg = 'invalid literal/length code'; - state.mode = BAD$1; - break top; - } - break; // need to emulate goto via "continue" - } - } while (_in < last && _out < end); - - /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ - len = bits >> 3; - _in -= len; - bits -= len << 3; - hold &= (1 << bits) - 1; - - /* update state and return */ - strm.next_in = _in; - strm.next_out = _out; - strm.avail_in = _in < last ? 5 + (last - _in) : 5 - (_in - last); - strm.avail_out = _out < end ? 257 + (end - _out) : 257 - (_out - end); - state.hold = hold; - state.bits = bits; - return; -}; - -// (C) 1995-2013 Jean-loup Gailly and Mark Adler -// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// 3. This notice may not be removed or altered from any source distribution. - -var utils$1 = common; -var MAXBITS = 15; -var ENOUGH_LENS$1 = 852; -var ENOUGH_DISTS$1 = 592; -//var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS); - -var CODES$1 = 0; -var LENS$1 = 1; -var DISTS$1 = 2; -var lbase = [/* Length codes 257..285 base */ -3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0]; -var lext = [/* Length codes 257..285 extra */ -16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78]; -var dbase = [/* Distance codes 0..29 base */ -1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577, 0, 0]; -var dext = [/* Distance codes 0..29 extra */ -16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 64, 64]; -var inftrees = function inflate_table(type, lens, lens_index, codes, table, table_index, work, opts) { - var bits = opts.bits; - //here = opts.here; /* table entry for duplication */ - - var len = 0; /* a code's length in bits */ - var sym = 0; /* index of code symbols */ - var min = 0, - max = 0; /* minimum and maximum code lengths */ - var root = 0; /* number of index bits for root table */ - var curr = 0; /* number of index bits for current table */ - var drop = 0; /* code bits to drop for sub-table */ - var left = 0; /* number of prefix codes available */ - var used = 0; /* code entries in table used */ - var huff = 0; /* Huffman code */ - var incr; /* for incrementing code, index */ - var fill; /* index for replicating entries */ - var low; /* low bits for current root entry */ - var mask; /* mask for low root bits */ - var next; /* next available space in table */ - var base = null; /* base value table to use */ - var base_index = 0; - // var shoextra; /* extra bits table to use */ - var end; /* use base and extra for symbol > end */ - var count = new utils$1.Buf16(MAXBITS + 1); //[MAXBITS+1]; /* number of codes of each length */ - var offs = new utils$1.Buf16(MAXBITS + 1); //[MAXBITS+1]; /* offsets in table for each length */ - var extra = null; - var extra_index = 0; - var here_bits, here_op, here_val; - - /* - Process a set of code lengths to create a canonical Huffman code. The - code lengths are lens[0..codes-1]. Each length corresponds to the - symbols 0..codes-1. The Huffman code is generated by first sorting the - symbols by length from short to long, and retaining the symbol order - for codes with equal lengths. Then the code starts with all zero bits - for the first code of the shortest length, and the codes are integer - increments for the same length, and zeros are appended as the length - increases. For the deflate format, these bits are stored backwards - from their more natural integer increment ordering, and so when the - decoding tables are built in the large loop below, the integer codes - are incremented backwards. - This routine assumes, but does not check, that all of the entries in - lens[] are in the range 0..MAXBITS. The caller must assure this. - 1..MAXBITS is interpreted as that code length. zero means that that - symbol does not occur in this code. - The codes are sorted by computing a count of codes for each length, - creating from that a table of starting indices for each length in the - sorted table, and then entering the symbols in order in the sorted - table. The sorted table is work[], with that space being provided by - the caller. - The length counts are used for other purposes as well, i.e. finding - the minimum and maximum length codes, determining if there are any - codes at all, checking for a valid set of lengths, and looking ahead - at length counts to determine sub-table sizes when building the - decoding tables. - */ - - /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ - for (len = 0; len <= MAXBITS; len++) { - count[len] = 0; - } - for (sym = 0; sym < codes; sym++) { - count[lens[lens_index + sym]]++; - } - - /* bound code lengths, force root to be within code lengths */ - root = bits; - for (max = MAXBITS; max >= 1; max--) { - if (count[max] !== 0) { - break; - } - } - if (root > max) { - root = max; - } - if (max === 0) { - /* no symbols to code at all */ - //table.op[opts.table_index] = 64; //here.op = (var char)64; /* invalid code marker */ - //table.bits[opts.table_index] = 1; //here.bits = (var char)1; - //table.val[opts.table_index++] = 0; //here.val = (var short)0; - table[table_index++] = 1 << 24 | 64 << 16 | 0; - - //table.op[opts.table_index] = 64; - //table.bits[opts.table_index] = 1; - //table.val[opts.table_index++] = 0; - table[table_index++] = 1 << 24 | 64 << 16 | 0; - opts.bits = 1; - return 0; /* no symbols, but wait for decoding to report error */ - } - for (min = 1; min < max; min++) { - if (count[min] !== 0) { - break; - } - } - if (root < min) { - root = min; - } - - /* check for an over-subscribed or incomplete set of lengths */ - left = 1; - for (len = 1; len <= MAXBITS; len++) { - left <<= 1; - left -= count[len]; - if (left < 0) { - return -1; - } /* over-subscribed */ - } - if (left > 0 && (type === CODES$1 || max !== 1)) { - return -1; /* incomplete set */ - } - - /* generate offsets into symbol table for each length for sorting */ - offs[1] = 0; - for (len = 1; len < MAXBITS; len++) { - offs[len + 1] = offs[len] + count[len]; - } - - /* sort symbols by length, by symbol order within each length */ - for (sym = 0; sym < codes; sym++) { - if (lens[lens_index + sym] !== 0) { - work[offs[lens[lens_index + sym]]++] = sym; - } - } - - /* - Create and fill in decoding tables. In this loop, the table being - filled is at next and has curr index bits. The code being used is huff - with length len. That code is converted to an index by dropping drop - bits off of the bottom. For codes where len is less than drop + curr, - those top drop + curr - len bits are incremented through all values to - fill the table with replicated entries. - root is the number of index bits for the root table. When len exceeds - root, sub-tables are created pointed to by the root entry with an index - of the low root bits of huff. This is saved in low to check for when a - new sub-table should be started. drop is zero when the root table is - being filled, and drop is root when sub-tables are being filled. - When a new sub-table is needed, it is necessary to look ahead in the - code lengths to determine what size sub-table is needed. The length - counts are used for this, and so count[] is decremented as codes are - entered in the tables. - used keeps track of how many table entries have been allocated from the - provided *table space. It is checked for LENS and DIST tables against - the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in - the initial root table size constants. See the comments in inftrees.h - for more information. - sym increments through all symbols, and the loop terminates when - all codes of length max, i.e. all codes, have been processed. This - routine permits incomplete codes, so another loop after this one fills - in the rest of the decoding tables with invalid code markers. - */ - - /* set up for code type */ - // poor man optimization - use if-else instead of switch, - // to avoid deopts in old v8 - if (type === CODES$1) { - base = extra = work; /* dummy value--not used */ - end = 19; - } else if (type === LENS$1) { - base = lbase; - base_index -= 257; - extra = lext; - extra_index -= 257; - end = 256; - } else { - /* DISTS */ - base = dbase; - extra = dext; - end = -1; - } - - /* initialize opts for loop */ - huff = 0; /* starting code */ - sym = 0; /* starting code symbol */ - len = min; /* starting code length */ - next = table_index; /* current table to fill in */ - curr = root; /* current table index bits */ - drop = 0; /* current bits to drop from code for index */ - low = -1; /* trigger new sub-table when len > root */ - used = 1 << root; /* use root table entries */ - mask = used - 1; /* mask for comparing low */ - - /* check available table space */ - if (type === LENS$1 && used > ENOUGH_LENS$1 || type === DISTS$1 && used > ENOUGH_DISTS$1) { - return 1; - } - - /* process all codes and make table entries */ - for (;;) { - /* create table entry */ - here_bits = len - drop; - if (work[sym] < end) { - here_op = 0; - here_val = work[sym]; - } else if (work[sym] > end) { - here_op = extra[extra_index + work[sym]]; - here_val = base[base_index + work[sym]]; - } else { - here_op = 32 + 64; /* end of block */ - here_val = 0; - } - - /* replicate for those indices with low len bits equal to huff */ - incr = 1 << len - drop; - fill = 1 << curr; - min = fill; /* save offset to next table */ - do { - fill -= incr; - table[next + (huff >> drop) + fill] = here_bits << 24 | here_op << 16 | here_val | 0; - } while (fill !== 0); - - /* backwards increment the len-bit code huff */ - incr = 1 << len - 1; - while (huff & incr) { - incr >>= 1; - } - if (incr !== 0) { - huff &= incr - 1; - huff += incr; - } else { - huff = 0; - } - - /* go to next symbol, update count, len */ - sym++; - if (--count[len] === 0) { - if (len === max) { - break; - } - len = lens[lens_index + work[sym]]; - } - - /* create new sub-table if needed */ - if (len > root && (huff & mask) !== low) { - /* if first time, transition to sub-tables */ - if (drop === 0) { - drop = root; - } - - /* increment past last table */ - next += min; /* here min is 1 << curr */ - - /* determine length of next table */ - curr = len - drop; - left = 1 << curr; - while (curr + drop < max) { - left -= count[curr + drop]; - if (left <= 0) { - break; - } - curr++; - left <<= 1; - } - - /* check for enough space */ - used += 1 << curr; - if (type === LENS$1 && used > ENOUGH_LENS$1 || type === DISTS$1 && used > ENOUGH_DISTS$1) { - return 1; - } - - /* point entry in root table to sub-table */ - low = huff & mask; - /*table.op[low] = curr; - table.bits[low] = root; - table.val[low] = next - opts.table_index;*/ - table[low] = root << 24 | curr << 16 | next - table_index | 0; - } - } - - /* fill in remaining table entry if code is incomplete (guaranteed to have - at most one remaining entry, since if the code is incomplete, the - maximum code length that was allowed to get this far is one bit) */ - if (huff !== 0) { - //table.op[next + huff] = 64; /* invalid code marker */ - //table.bits[next + huff] = len - drop; - //table.val[next + huff] = 0; - table[next + huff] = len - drop << 24 | 64 << 16 | 0; - } - - /* set return parameters */ - //opts.table_index += used; - opts.bits = root; - return 0; -}; - -// (C) 1995-2013 Jean-loup Gailly and Mark Adler -// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// 3. This notice may not be removed or altered from any source distribution. - -var utils = common; -var adler32 = adler32_1; -var crc32 = crc32_1; -var inflate_fast = inffast; -var inflate_table = inftrees; -var CODES = 0; -var LENS = 1; -var DISTS = 2; - -/* Public constants ==========================================================*/ -/* ===========================================================================*/ - -/* Allowed flush values; see deflate() and inflate() below for details */ -//var Z_NO_FLUSH = 0; -//var Z_PARTIAL_FLUSH = 1; -//var Z_SYNC_FLUSH = 2; -//var Z_FULL_FLUSH = 3; -var Z_FINISH = 4; -var Z_BLOCK = 5; -var Z_TREES = 6; - -/* Return codes for the compression/decompression functions. Negative values - * are errors, positive values are used for special but normal events. - */ -var Z_OK = 0; -var Z_STREAM_END = 1; -var Z_NEED_DICT = 2; -//var Z_ERRNO = -1; -var Z_STREAM_ERROR = -2; -var Z_DATA_ERROR = -3; -var Z_MEM_ERROR = -4; -var Z_BUF_ERROR = -5; -//var Z_VERSION_ERROR = -6; - -/* The deflate compression method */ -var Z_DEFLATED = 8; - -/* STATES ====================================================================*/ -/* ===========================================================================*/ - -var HEAD = 1; /* i: waiting for magic header */ -var FLAGS = 2; /* i: waiting for method and flags (gzip) */ -var TIME = 3; /* i: waiting for modification time (gzip) */ -var OS = 4; /* i: waiting for extra flags and operating system (gzip) */ -var EXLEN = 5; /* i: waiting for extra length (gzip) */ -var EXTRA = 6; /* i: waiting for extra bytes (gzip) */ -var NAME = 7; /* i: waiting for end of file name (gzip) */ -var COMMENT = 8; /* i: waiting for end of comment (gzip) */ -var HCRC = 9; /* i: waiting for header crc (gzip) */ -var DICTID = 10; /* i: waiting for dictionary check value */ -var DICT = 11; /* waiting for inflateSetDictionary() call */ -var TYPE = 12; /* i: waiting for type bits, including last-flag bit */ -var TYPEDO = 13; /* i: same, but skip check to exit inflate on new block */ -var STORED = 14; /* i: waiting for stored size (length and complement) */ -var COPY_ = 15; /* i/o: same as COPY below, but only first time in */ -var COPY = 16; /* i/o: waiting for input or output to copy stored block */ -var TABLE = 17; /* i: waiting for dynamic block table lengths */ -var LENLENS = 18; /* i: waiting for code length code lengths */ -var CODELENS = 19; /* i: waiting for length/lit and distance code lengths */ -var LEN_ = 20; /* i: same as LEN below, but only first time in */ -var LEN = 21; /* i: waiting for length/lit/eob code */ -var LENEXT = 22; /* i: waiting for length extra bits */ -var DIST = 23; /* i: waiting for distance code */ -var DISTEXT = 24; /* i: waiting for distance extra bits */ -var MATCH = 25; /* o: waiting for output space to copy string */ -var LIT = 26; /* o: waiting for output space to write literal */ -var CHECK = 27; /* i: waiting for 32-bit check value */ -var LENGTH = 28; /* i: waiting for 32-bit length (gzip) */ -var DONE = 29; /* finished check, done -- remain here until reset */ -var BAD = 30; /* got a data error -- remain here until reset */ -var MEM = 31; /* got an inflate() memory error -- remain here until reset */ -var SYNC = 32; /* looking for synchronization bytes to restart inflate() */ - -/* ===========================================================================*/ - -var ENOUGH_LENS = 852; -var ENOUGH_DISTS = 592; -//var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS); - -var MAX_WBITS = 15; -/* 32K LZ77 window */ -var DEF_WBITS = MAX_WBITS; -function zswap32(q) { - return (q >>> 24 & 0xff) + (q >>> 8 & 0xff00) + ((q & 0xff00) << 8) + ((q & 0xff) << 24); -} -function InflateState() { - this.mode = 0; /* current inflate mode */ - this.last = false; /* true if processing last block */ - this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */ - this.havedict = false; /* true if dictionary provided */ - this.flags = 0; /* gzip header method and flags (0 if zlib) */ - this.dmax = 0; /* zlib header max distance (INFLATE_STRICT) */ - this.check = 0; /* protected copy of check value */ - this.total = 0; /* protected copy of output count */ - // TODO: may be {} - this.head = null; /* where to save gzip header information */ - - /* sliding window */ - this.wbits = 0; /* log base 2 of requested window size */ - this.wsize = 0; /* window size or zero if not using window */ - this.whave = 0; /* valid bytes in the window */ - this.wnext = 0; /* window write index */ - this.window = null; /* allocated sliding window, if needed */ - - /* bit accumulator */ - this.hold = 0; /* input bit accumulator */ - this.bits = 0; /* number of bits in "in" */ - - /* for string and stored block copying */ - this.length = 0; /* literal or length of data to copy */ - this.offset = 0; /* distance back to copy string from */ - - /* for table and code decoding */ - this.extra = 0; /* extra bits needed */ - - /* fixed and dynamic code tables */ - this.lencode = null; /* starting table for length/literal codes */ - this.distcode = null; /* starting table for distance codes */ - this.lenbits = 0; /* index bits for lencode */ - this.distbits = 0; /* index bits for distcode */ - - /* dynamic table building */ - this.ncode = 0; /* number of code length code lengths */ - this.nlen = 0; /* number of length code lengths */ - this.ndist = 0; /* number of distance code lengths */ - this.have = 0; /* number of code lengths in lens[] */ - this.next = null; /* next available space in codes[] */ - - this.lens = new utils.Buf16(320); /* temporary storage for code lengths */ - this.work = new utils.Buf16(288); /* work area for code table building */ - - /* - because we don't have pointers in js, we use lencode and distcode directly - as buffers so we don't need codes - */ - //this.codes = new utils.Buf32(ENOUGH); /* space for code tables */ - this.lendyn = null; /* dynamic table for length/literal codes (JS specific) */ - this.distdyn = null; /* dynamic table for distance codes (JS specific) */ - this.sane = 0; /* if false, allow invalid distance too far */ - this.back = 0; /* bits back of last unprocessed length/lit */ - this.was = 0; /* initial length of match */ -} -function inflateResetKeep(strm) { - var state; - if (!strm || !strm.state) { - return Z_STREAM_ERROR; - } - state = strm.state; - strm.total_in = strm.total_out = state.total = 0; - strm.msg = ''; /*Z_NULL*/ - if (state.wrap) { - /* to support ill-conceived Java test suite */ - strm.adler = state.wrap & 1; - } - state.mode = HEAD; - state.last = 0; - state.havedict = 0; - state.dmax = 32768; - state.head = null /*Z_NULL*/; - state.hold = 0; - state.bits = 0; - //state.lencode = state.distcode = state.next = state.codes; - state.lencode = state.lendyn = new utils.Buf32(ENOUGH_LENS); - state.distcode = state.distdyn = new utils.Buf32(ENOUGH_DISTS); - state.sane = 1; - state.back = -1; - //Tracev((stderr, "inflate: reset\n")); - return Z_OK; -} -function inflateReset(strm) { - var state; - if (!strm || !strm.state) { - return Z_STREAM_ERROR; - } - state = strm.state; - state.wsize = 0; - state.whave = 0; - state.wnext = 0; - return inflateResetKeep(strm); -} -function inflateReset2(strm, windowBits) { - var wrap; - var state; - - /* get the state */ - if (!strm || !strm.state) { - return Z_STREAM_ERROR; - } - state = strm.state; - - /* extract wrap request from windowBits parameter */ - if (windowBits < 0) { - wrap = 0; - windowBits = -windowBits; - } else { - wrap = (windowBits >> 4) + 1; - if (windowBits < 48) { - windowBits &= 15; - } - } - - /* set number of window bits, free window if different */ - if (windowBits && (windowBits < 8 || windowBits > 15)) { - return Z_STREAM_ERROR; - } - if (state.window !== null && state.wbits !== windowBits) { - state.window = null; - } - - /* update state and reset the rest of it */ - state.wrap = wrap; - state.wbits = windowBits; - return inflateReset(strm); -} -function inflateInit2(strm, windowBits) { - var ret; - var state; - if (!strm) { - return Z_STREAM_ERROR; - } - //strm.msg = Z_NULL; /* in case we return an error */ - - state = new InflateState(); - - //if (state === Z_NULL) return Z_MEM_ERROR; - //Tracev((stderr, "inflate: allocated\n")); - strm.state = state; - state.window = null /*Z_NULL*/; - ret = inflateReset2(strm, windowBits); - if (ret !== Z_OK) { - strm.state = null /*Z_NULL*/; - } - return ret; -} -function inflateInit(strm) { - return inflateInit2(strm, DEF_WBITS); -} - -/* - Return state with length and distance decoding tables and index sizes set to - fixed code decoding. Normally this returns fixed tables from inffixed.h. - If BUILDFIXED is defined, then instead this routine builds the tables the - first time it's called, and returns those tables the first time and - thereafter. This reduces the size of the code by about 2K bytes, in - exchange for a little execution time. However, BUILDFIXED should not be - used for threaded applications, since the rewriting of the tables and virgin - may not be thread-safe. - */ -var virgin = true; -var lenfix, distfix; // We have no pointers in JS, so keep tables separate - -function fixedtables(state) { - /* build fixed huffman tables if first call (may not be thread safe) */ - if (virgin) { - var sym; - lenfix = new utils.Buf32(512); - distfix = new utils.Buf32(32); - - /* literal/length table */ - sym = 0; - while (sym < 144) { - state.lens[sym++] = 8; - } - while (sym < 256) { - state.lens[sym++] = 9; - } - while (sym < 280) { - state.lens[sym++] = 7; - } - while (sym < 288) { - state.lens[sym++] = 8; - } - inflate_table(LENS, state.lens, 0, 288, lenfix, 0, state.work, { - bits: 9 - }); - - /* distance table */ - sym = 0; - while (sym < 32) { - state.lens[sym++] = 5; - } - inflate_table(DISTS, state.lens, 0, 32, distfix, 0, state.work, { - bits: 5 - }); - - /* do this just once */ - virgin = false; - } - state.lencode = lenfix; - state.lenbits = 9; - state.distcode = distfix; - state.distbits = 5; -} - -/* - Update the window with the last wsize (normally 32K) bytes written before - returning. If window does not exist yet, create it. This is only called - when a window is already in use, or when output has been written during this - inflate call, but the end of the deflate stream has not been reached yet. - It is also called to create a window for dictionary data when a dictionary - is loaded. - - Providing output buffers larger than 32K to inflate() should provide a speed - advantage, since only the last 32K of output is copied to the sliding window - upon return from inflate(), and since all distances after the first 32K of - output will fall in the output data, making match copies simpler and faster. - The advantage may be dependent on the size of the processor's data caches. - */ -function updatewindow(strm, src, end, copy) { - var dist; - var state = strm.state; - - /* if it hasn't been done already, allocate space for the window */ - if (state.window === null) { - state.wsize = 1 << state.wbits; - state.wnext = 0; - state.whave = 0; - state.window = new utils.Buf8(state.wsize); - } - - /* copy state->wsize or less output bytes into the circular window */ - if (copy >= state.wsize) { - utils.arraySet(state.window, src, end - state.wsize, state.wsize, 0); - state.wnext = 0; - state.whave = state.wsize; - } else { - dist = state.wsize - state.wnext; - if (dist > copy) { - dist = copy; - } - //zmemcpy(state->window + state->wnext, end - copy, dist); - utils.arraySet(state.window, src, end - copy, dist, state.wnext); - copy -= dist; - if (copy) { - //zmemcpy(state->window, end - copy, copy); - utils.arraySet(state.window, src, end - copy, copy, 0); - state.wnext = copy; - state.whave = state.wsize; - } else { - state.wnext += dist; - if (state.wnext === state.wsize) { - state.wnext = 0; - } - if (state.whave < state.wsize) { - state.whave += dist; - } - } - } - return 0; -} -function inflate(strm, flush) { - var state; - var input, output; // input/output buffers - var next; /* next input INDEX */ - var put; /* next output INDEX */ - var have, left; /* available input and output */ - var hold; /* bit buffer */ - var bits; /* bits in bit buffer */ - var _in, _out; /* save starting available input and output */ - var copy; /* number of stored or match bytes to copy */ - var from; /* where to copy match bytes from */ - var from_source; - var here = 0; /* current decoding table entry */ - var here_bits, here_op, here_val; // paked "here" denormalized (JS specific) - //var last; /* parent table entry */ - var last_bits, last_op, last_val; // paked "last" denormalized (JS specific) - var len; /* length to copy for repeats, bits to drop */ - var ret; /* return code */ - var hbuf = new utils.Buf8(4); /* buffer for gzip header crc calculation */ - var opts; - var n; // temporary var for NEED_BITS - - var order = /* permutation of code lengths */ - [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]; - if (!strm || !strm.state || !strm.output || !strm.input && strm.avail_in !== 0) { - return Z_STREAM_ERROR; - } - state = strm.state; - if (state.mode === TYPE) { - state.mode = TYPEDO; - } /* skip check */ - - //--- LOAD() --- - put = strm.next_out; - output = strm.output; - left = strm.avail_out; - next = strm.next_in; - input = strm.input; - have = strm.avail_in; - hold = state.hold; - bits = state.bits; - //--- - - _in = have; - _out = left; - ret = Z_OK; - inf_leave: - // goto emulation - for (;;) { - switch (state.mode) { - case HEAD: - if (state.wrap === 0) { - state.mode = TYPEDO; - break; - } - //=== NEEDBITS(16); - while (bits < 16) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if (state.wrap & 2 && hold === 0x8b1f) { - /* gzip header */ - state.check = 0 /*crc32(0L, Z_NULL, 0)*/; - //=== CRC2(state.check, hold); - hbuf[0] = hold & 0xff; - hbuf[1] = hold >>> 8 & 0xff; - state.check = crc32(state.check, hbuf, 2, 0); - //===// - - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = FLAGS; - break; - } - state.flags = 0; /* expect zlib header */ - if (state.head) { - state.head.done = false; - } - if (!(state.wrap & 1) || /* check if zlib header allowed */ - (((hold & 0xff /*BITS(8)*/) << 8) + (hold >> 8)) % 31) { - strm.msg = 'incorrect header check'; - state.mode = BAD; - break; - } - if ((hold & 0x0f /*BITS(4)*/) !== Z_DEFLATED) { - strm.msg = 'unknown compression method'; - state.mode = BAD; - break; - } - //--- DROPBITS(4) ---// - hold >>>= 4; - bits -= 4; - //---// - len = (hold & 0x0f /*BITS(4)*/) + 8; - if (state.wbits === 0) { - state.wbits = len; - } else if (len > state.wbits) { - strm.msg = 'invalid window size'; - state.mode = BAD; - break; - } - state.dmax = 1 << len; - //Tracev((stderr, "inflate: zlib header ok\n")); - strm.adler = state.check = 1 /*adler32(0L, Z_NULL, 0)*/; - state.mode = hold & 0x200 ? DICTID : TYPE; - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - break; - case FLAGS: - //=== NEEDBITS(16); */ - while (bits < 16) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.flags = hold; - if ((state.flags & 0xff) !== Z_DEFLATED) { - strm.msg = 'unknown compression method'; - state.mode = BAD; - break; - } - if (state.flags & 0xe000) { - strm.msg = 'unknown header flags set'; - state.mode = BAD; - break; - } - if (state.head) { - state.head.text = hold >> 8 & 1; - } - if (state.flags & 0x0200) { - //=== CRC2(state.check, hold); - hbuf[0] = hold & 0xff; - hbuf[1] = hold >>> 8 & 0xff; - state.check = crc32(state.check, hbuf, 2, 0); - //===// - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = TIME; - /* falls through */ - case TIME: - //=== NEEDBITS(32); */ - while (bits < 32) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if (state.head) { - state.head.time = hold; - } - if (state.flags & 0x0200) { - //=== CRC4(state.check, hold) - hbuf[0] = hold & 0xff; - hbuf[1] = hold >>> 8 & 0xff; - hbuf[2] = hold >>> 16 & 0xff; - hbuf[3] = hold >>> 24 & 0xff; - state.check = crc32(state.check, hbuf, 4, 0); - //=== - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = OS; - /* falls through */ - case OS: - //=== NEEDBITS(16); */ - while (bits < 16) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if (state.head) { - state.head.xflags = hold & 0xff; - state.head.os = hold >> 8; - } - if (state.flags & 0x0200) { - //=== CRC2(state.check, hold); - hbuf[0] = hold & 0xff; - hbuf[1] = hold >>> 8 & 0xff; - state.check = crc32(state.check, hbuf, 2, 0); - //===// - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = EXLEN; - /* falls through */ - case EXLEN: - if (state.flags & 0x0400) { - //=== NEEDBITS(16); */ - while (bits < 16) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.length = hold; - if (state.head) { - state.head.extra_len = hold; - } - if (state.flags & 0x0200) { - //=== CRC2(state.check, hold); - hbuf[0] = hold & 0xff; - hbuf[1] = hold >>> 8 & 0xff; - state.check = crc32(state.check, hbuf, 2, 0); - //===// - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - } else if (state.head) { - state.head.extra = null /*Z_NULL*/; - } - state.mode = EXTRA; - /* falls through */ - case EXTRA: - if (state.flags & 0x0400) { - copy = state.length; - if (copy > have) { - copy = have; - } - if (copy) { - if (state.head) { - len = state.head.extra_len - state.length; - if (!state.head.extra) { - // Use untyped array for more convenient processing later - state.head.extra = new Array(state.head.extra_len); - } - utils.arraySet(state.head.extra, input, next, - // extra field is limited to 65536 bytes - // - no need for additional size check - copy, /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/ - len); - //zmemcpy(state.head.extra + len, next, - // len + copy > state.head.extra_max ? - // state.head.extra_max - len : copy); - } - if (state.flags & 0x0200) { - state.check = crc32(state.check, input, copy, next); - } - have -= copy; - next += copy; - state.length -= copy; - } - if (state.length) { - break inf_leave; - } - } - state.length = 0; - state.mode = NAME; - /* falls through */ - case NAME: - if (state.flags & 0x0800) { - if (have === 0) { - break inf_leave; - } - copy = 0; - do { - // TODO: 2 or 1 bytes? - len = input[next + copy++]; - /* use constant limit because in js we should not preallocate memory */ - if (state.head && len && state.length < 65536 /*state.head.name_max*/) { - state.head.name += String.fromCharCode(len); - } - } while (len && copy < have); - if (state.flags & 0x0200) { - state.check = crc32(state.check, input, copy, next); - } - have -= copy; - next += copy; - if (len) { - break inf_leave; - } - } else if (state.head) { - state.head.name = null; - } - state.length = 0; - state.mode = COMMENT; - /* falls through */ - case COMMENT: - if (state.flags & 0x1000) { - if (have === 0) { - break inf_leave; - } - copy = 0; - do { - len = input[next + copy++]; - /* use constant limit because in js we should not preallocate memory */ - if (state.head && len && state.length < 65536 /*state.head.comm_max*/) { - state.head.comment += String.fromCharCode(len); - } - } while (len && copy < have); - if (state.flags & 0x0200) { - state.check = crc32(state.check, input, copy, next); - } - have -= copy; - next += copy; - if (len) { - break inf_leave; - } - } else if (state.head) { - state.head.comment = null; - } - state.mode = HCRC; - /* falls through */ - case HCRC: - if (state.flags & 0x0200) { - //=== NEEDBITS(16); */ - while (bits < 16) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if (hold !== (state.check & 0xffff)) { - strm.msg = 'header crc mismatch'; - state.mode = BAD; - break; - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - } - if (state.head) { - state.head.hcrc = state.flags >> 9 & 1; - state.head.done = true; - } - strm.adler = state.check = 0; - state.mode = TYPE; - break; - case DICTID: - //=== NEEDBITS(32); */ - while (bits < 32) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - strm.adler = state.check = zswap32(hold); - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = DICT; - /* falls through */ - case DICT: - if (state.havedict === 0) { - //--- RESTORE() --- - strm.next_out = put; - strm.avail_out = left; - strm.next_in = next; - strm.avail_in = have; - state.hold = hold; - state.bits = bits; - //--- - return Z_NEED_DICT; - } - strm.adler = state.check = 1 /*adler32(0L, Z_NULL, 0)*/; - state.mode = TYPE; - /* falls through */ - case TYPE: - if (flush === Z_BLOCK || flush === Z_TREES) { - break inf_leave; - } - /* falls through */ - case TYPEDO: - if (state.last) { - //--- BYTEBITS() ---// - hold >>>= bits & 7; - bits -= bits & 7; - //---// - state.mode = CHECK; - break; - } - //=== NEEDBITS(3); */ - while (bits < 3) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.last = hold & 0x01 /*BITS(1)*/; - //--- DROPBITS(1) ---// - hold >>>= 1; - bits -= 1; - //---// - - switch (hold & 0x03 /*BITS(2)*/) { - case 0: - /* stored block */ - //Tracev((stderr, "inflate: stored block%s\n", - // state.last ? " (last)" : "")); - state.mode = STORED; - break; - case 1: - /* fixed block */ - fixedtables(state); - //Tracev((stderr, "inflate: fixed codes block%s\n", - // state.last ? " (last)" : "")); - state.mode = LEN_; /* decode codes */ - if (flush === Z_TREES) { - //--- DROPBITS(2) ---// - hold >>>= 2; - bits -= 2; - //---// - break inf_leave; - } - break; - case 2: - /* dynamic block */ - //Tracev((stderr, "inflate: dynamic codes block%s\n", - // state.last ? " (last)" : "")); - state.mode = TABLE; - break; - case 3: - strm.msg = 'invalid block type'; - state.mode = BAD; - } - //--- DROPBITS(2) ---// - hold >>>= 2; - bits -= 2; - //---// - break; - case STORED: - //--- BYTEBITS() ---// /* go to byte boundary */ - hold >>>= bits & 7; - bits -= bits & 7; - //---// - //=== NEEDBITS(32); */ - while (bits < 32) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if ((hold & 0xffff) !== (hold >>> 16 ^ 0xffff)) { - strm.msg = 'invalid stored block lengths'; - state.mode = BAD; - break; - } - state.length = hold & 0xffff; - //Tracev((stderr, "inflate: stored length %u\n", - // state.length)); - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = COPY_; - if (flush === Z_TREES) { - break inf_leave; - } - /* falls through */ - case COPY_: - state.mode = COPY; - /* falls through */ - case COPY: - copy = state.length; - if (copy) { - if (copy > have) { - copy = have; - } - if (copy > left) { - copy = left; - } - if (copy === 0) { - break inf_leave; - } - //--- zmemcpy(put, next, copy); --- - utils.arraySet(output, input, next, copy, put); - //---// - have -= copy; - next += copy; - left -= copy; - put += copy; - state.length -= copy; - break; - } - //Tracev((stderr, "inflate: stored end\n")); - state.mode = TYPE; - break; - case TABLE: - //=== NEEDBITS(14); */ - while (bits < 14) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.nlen = (hold & 0x1f /*BITS(5)*/) + 257; - //--- DROPBITS(5) ---// - hold >>>= 5; - bits -= 5; - //---// - state.ndist = (hold & 0x1f /*BITS(5)*/) + 1; - //--- DROPBITS(5) ---// - hold >>>= 5; - bits -= 5; - //---// - state.ncode = (hold & 0x0f /*BITS(4)*/) + 4; - //--- DROPBITS(4) ---// - hold >>>= 4; - bits -= 4; - //---// - //#ifndef PKZIP_BUG_WORKAROUND - if (state.nlen > 286 || state.ndist > 30) { - strm.msg = 'too many length or distance symbols'; - state.mode = BAD; - break; - } - //#endif - //Tracev((stderr, "inflate: table sizes ok\n")); - state.have = 0; - state.mode = LENLENS; - /* falls through */ - case LENLENS: - while (state.have < state.ncode) { - //=== NEEDBITS(3); - while (bits < 3) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.lens[order[state.have++]] = hold & 0x07; //BITS(3); - //--- DROPBITS(3) ---// - hold >>>= 3; - bits -= 3; - //---// - } - while (state.have < 19) { - state.lens[order[state.have++]] = 0; - } - // We have separate tables & no pointers. 2 commented lines below not needed. - //state.next = state.codes; - //state.lencode = state.next; - // Switch to use dynamic table - state.lencode = state.lendyn; - state.lenbits = 7; - opts = { - bits: state.lenbits - }; - ret = inflate_table(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts); - state.lenbits = opts.bits; - if (ret) { - strm.msg = 'invalid code lengths set'; - state.mode = BAD; - break; - } - //Tracev((stderr, "inflate: code lengths ok\n")); - state.have = 0; - state.mode = CODELENS; - /* falls through */ - case CODELENS: - while (state.have < state.nlen + state.ndist) { - for (;;) { - here = state.lencode[hold & (1 << state.lenbits) - 1]; /*BITS(state.lenbits)*/ - here_bits = here >>> 24; - here_op = here >>> 16 & 0xff; - here_val = here & 0xffff; - if (here_bits <= bits) { - break; - } - //--- PULLBYTE() ---// - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - //---// - } - if (here_val < 16) { - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - state.lens[state.have++] = here_val; - } else { - if (here_val === 16) { - //=== NEEDBITS(here.bits + 2); - n = here_bits + 2; - while (bits < n) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - if (state.have === 0) { - strm.msg = 'invalid bit length repeat'; - state.mode = BAD; - break; - } - len = state.lens[state.have - 1]; - copy = 3 + (hold & 0x03); //BITS(2); - //--- DROPBITS(2) ---// - hold >>>= 2; - bits -= 2; - //---// - } else if (here_val === 17) { - //=== NEEDBITS(here.bits + 3); - n = here_bits + 3; - while (bits < n) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - len = 0; - copy = 3 + (hold & 0x07); //BITS(3); - //--- DROPBITS(3) ---// - hold >>>= 3; - bits -= 3; - //---// - } else { - //=== NEEDBITS(here.bits + 7); - n = here_bits + 7; - while (bits < n) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - len = 0; - copy = 11 + (hold & 0x7f); //BITS(7); - //--- DROPBITS(7) ---// - hold >>>= 7; - bits -= 7; - //---// - } - if (state.have + copy > state.nlen + state.ndist) { - strm.msg = 'invalid bit length repeat'; - state.mode = BAD; - break; - } - while (copy--) { - state.lens[state.have++] = len; - } - } - } - - /* handle error breaks in while */ - if (state.mode === BAD) { - break; - } - - /* check for end-of-block code (better have one) */ - if (state.lens[256] === 0) { - strm.msg = 'invalid code -- missing end-of-block'; - state.mode = BAD; - break; - } - - /* build code tables -- note: do not change the lenbits or distbits - values here (9 and 6) without reading the comments in inftrees.h - concerning the ENOUGH constants, which depend on those values */ - state.lenbits = 9; - opts = { - bits: state.lenbits - }; - ret = inflate_table(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts); - // We have separate tables & no pointers. 2 commented lines below not needed. - // state.next_index = opts.table_index; - state.lenbits = opts.bits; - // state.lencode = state.next; - - if (ret) { - strm.msg = 'invalid literal/lengths set'; - state.mode = BAD; - break; - } - state.distbits = 6; - //state.distcode.copy(state.codes); - // Switch to use dynamic table - state.distcode = state.distdyn; - opts = { - bits: state.distbits - }; - ret = inflate_table(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts); - // We have separate tables & no pointers. 2 commented lines below not needed. - // state.next_index = opts.table_index; - state.distbits = opts.bits; - // state.distcode = state.next; - - if (ret) { - strm.msg = 'invalid distances set'; - state.mode = BAD; - break; - } - //Tracev((stderr, 'inflate: codes ok\n')); - state.mode = LEN_; - if (flush === Z_TREES) { - break inf_leave; - } - /* falls through */ - case LEN_: - state.mode = LEN; - /* falls through */ - case LEN: - if (have >= 6 && left >= 258) { - //--- RESTORE() --- - strm.next_out = put; - strm.avail_out = left; - strm.next_in = next; - strm.avail_in = have; - state.hold = hold; - state.bits = bits; - //--- - inflate_fast(strm, _out); - //--- LOAD() --- - put = strm.next_out; - output = strm.output; - left = strm.avail_out; - next = strm.next_in; - input = strm.input; - have = strm.avail_in; - hold = state.hold; - bits = state.bits; - //--- - - if (state.mode === TYPE) { - state.back = -1; - } - break; - } - state.back = 0; - for (;;) { - here = state.lencode[hold & (1 << state.lenbits) - 1]; /*BITS(state.lenbits)*/ - here_bits = here >>> 24; - here_op = here >>> 16 & 0xff; - here_val = here & 0xffff; - if (here_bits <= bits) { - break; - } - //--- PULLBYTE() ---// - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - //---// - } - if (here_op && (here_op & 0xf0) === 0) { - last_bits = here_bits; - last_op = here_op; - last_val = here_val; - for (;;) { - here = state.lencode[last_val + ((hold & (1 << last_bits + last_op) - 1 /*BITS(last.bits + last.op)*/) >> last_bits)]; - here_bits = here >>> 24; - here_op = here >>> 16 & 0xff; - here_val = here & 0xffff; - if (last_bits + here_bits <= bits) { - break; - } - //--- PULLBYTE() ---// - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - //---// - } - //--- DROPBITS(last.bits) ---// - hold >>>= last_bits; - bits -= last_bits; - //---// - state.back += last_bits; - } - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - state.back += here_bits; - state.length = here_val; - if (here_op === 0) { - //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? - // "inflate: literal '%c'\n" : - // "inflate: literal 0x%02x\n", here.val)); - state.mode = LIT; - break; - } - if (here_op & 32) { - //Tracevv((stderr, "inflate: end of block\n")); - state.back = -1; - state.mode = TYPE; - break; - } - if (here_op & 64) { - strm.msg = 'invalid literal/length code'; - state.mode = BAD; - break; - } - state.extra = here_op & 15; - state.mode = LENEXT; - /* falls through */ - case LENEXT: - if (state.extra) { - //=== NEEDBITS(state.extra); - n = state.extra; - while (bits < n) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.length += hold & (1 << state.extra) - 1 /*BITS(state.extra)*/; - //--- DROPBITS(state.extra) ---// - hold >>>= state.extra; - bits -= state.extra; - //---// - state.back += state.extra; - } - //Tracevv((stderr, "inflate: length %u\n", state.length)); - state.was = state.length; - state.mode = DIST; - /* falls through */ - case DIST: - for (;;) { - here = state.distcode[hold & (1 << state.distbits) - 1]; /*BITS(state.distbits)*/ - here_bits = here >>> 24; - here_op = here >>> 16 & 0xff; - here_val = here & 0xffff; - if (here_bits <= bits) { - break; - } - //--- PULLBYTE() ---// - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - //---// - } - if ((here_op & 0xf0) === 0) { - last_bits = here_bits; - last_op = here_op; - last_val = here_val; - for (;;) { - here = state.distcode[last_val + ((hold & (1 << last_bits + last_op) - 1 /*BITS(last.bits + last.op)*/) >> last_bits)]; - here_bits = here >>> 24; - here_op = here >>> 16 & 0xff; - here_val = here & 0xffff; - if (last_bits + here_bits <= bits) { - break; - } - //--- PULLBYTE() ---// - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - //---// - } - //--- DROPBITS(last.bits) ---// - hold >>>= last_bits; - bits -= last_bits; - //---// - state.back += last_bits; - } - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - state.back += here_bits; - if (here_op & 64) { - strm.msg = 'invalid distance code'; - state.mode = BAD; - break; - } - state.offset = here_val; - state.extra = here_op & 15; - state.mode = DISTEXT; - /* falls through */ - case DISTEXT: - if (state.extra) { - //=== NEEDBITS(state.extra); - n = state.extra; - while (bits < n) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.offset += hold & (1 << state.extra) - 1 /*BITS(state.extra)*/; - //--- DROPBITS(state.extra) ---// - hold >>>= state.extra; - bits -= state.extra; - //---// - state.back += state.extra; - } - //#ifdef INFLATE_STRICT - if (state.offset > state.dmax) { - strm.msg = 'invalid distance too far back'; - state.mode = BAD; - break; - } - //#endif - //Tracevv((stderr, "inflate: distance %u\n", state.offset)); - state.mode = MATCH; - /* falls through */ - case MATCH: - if (left === 0) { - break inf_leave; - } - copy = _out - left; - if (state.offset > copy) { - /* copy from window */ - copy = state.offset - copy; - if (copy > state.whave) { - if (state.sane) { - strm.msg = 'invalid distance too far back'; - state.mode = BAD; - break; - } - // (!) This block is disabled in zlib defaults, - // don't enable it for binary compatibility - //#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR - // Trace((stderr, "inflate.c too far\n")); - // copy -= state.whave; - // if (copy > state.length) { copy = state.length; } - // if (copy > left) { copy = left; } - // left -= copy; - // state.length -= copy; - // do { - // output[put++] = 0; - // } while (--copy); - // if (state.length === 0) { state.mode = LEN; } - // break; - //#endif - } - if (copy > state.wnext) { - copy -= state.wnext; - from = state.wsize - copy; - } else { - from = state.wnext - copy; - } - if (copy > state.length) { - copy = state.length; - } - from_source = state.window; - } else { - /* copy from output */ - from_source = output; - from = put - state.offset; - copy = state.length; - } - if (copy > left) { - copy = left; - } - left -= copy; - state.length -= copy; - do { - output[put++] = from_source[from++]; - } while (--copy); - if (state.length === 0) { - state.mode = LEN; - } - break; - case LIT: - if (left === 0) { - break inf_leave; - } - output[put++] = state.length; - left--; - state.mode = LEN; - break; - case CHECK: - if (state.wrap) { - //=== NEEDBITS(32); - while (bits < 32) { - if (have === 0) { - break inf_leave; - } - have--; - // Use '|' instead of '+' to make sure that result is signed - hold |= input[next++] << bits; - bits += 8; - } - //===// - _out -= left; - strm.total_out += _out; - state.total += _out; - if (_out) { - strm.adler = state.check = /*UPDATE(state.check, put - _out, _out);*/ - state.flags ? crc32(state.check, output, _out, put - _out) : adler32(state.check, output, _out, put - _out); - } - _out = left; - // NB: crc32 stored as signed 32-bit int, zswap32 returns signed too - if ((state.flags ? hold : zswap32(hold)) !== state.check) { - strm.msg = 'incorrect data check'; - state.mode = BAD; - break; - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - //Tracev((stderr, "inflate: check matches trailer\n")); - } - state.mode = LENGTH; - /* falls through */ - case LENGTH: - if (state.wrap && state.flags) { - //=== NEEDBITS(32); - while (bits < 32) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if (hold !== (state.total & 0xffffffff)) { - strm.msg = 'incorrect length check'; - state.mode = BAD; - break; - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - //Tracev((stderr, "inflate: length matches trailer\n")); - } - state.mode = DONE; - /* falls through */ - case DONE: - ret = Z_STREAM_END; - break inf_leave; - case BAD: - ret = Z_DATA_ERROR; - break inf_leave; - case MEM: - return Z_MEM_ERROR; - case SYNC: - /* falls through */ - default: - return Z_STREAM_ERROR; - } - } - - // inf_leave <- here is real place for "goto inf_leave", emulated via "break inf_leave" - - /* - Return from inflate(), updating the total counts and the check value. - If there was no progress during the inflate() call, return a buffer - error. Call updatewindow() to create and/or update the window state. - Note: a memory error from inflate() is non-recoverable. - */ - - //--- RESTORE() --- - strm.next_out = put; - strm.avail_out = left; - strm.next_in = next; - strm.avail_in = have; - state.hold = hold; - state.bits = bits; - //--- - - if (state.wsize || _out !== strm.avail_out && state.mode < BAD && (state.mode < CHECK || flush !== Z_FINISH)) { - if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) ; - } - _in -= strm.avail_in; - _out -= strm.avail_out; - strm.total_in += _in; - strm.total_out += _out; - state.total += _out; - if (state.wrap && _out) { - strm.adler = state.check = /*UPDATE(state.check, strm.next_out - _out, _out);*/ - state.flags ? crc32(state.check, output, _out, strm.next_out - _out) : adler32(state.check, output, _out, strm.next_out - _out); - } - strm.data_type = state.bits + (state.last ? 64 : 0) + (state.mode === TYPE ? 128 : 0) + (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0); - if ((_in === 0 && _out === 0 || flush === Z_FINISH) && ret === Z_OK) { - ret = Z_BUF_ERROR; - } - return ret; -} -function inflateEnd(strm) { - if (!strm || !strm.state /*|| strm->zfree == (free_func)0*/) { - return Z_STREAM_ERROR; - } - var state = strm.state; - if (state.window) { - state.window = null; - } - strm.state = null; - return Z_OK; -} -function inflateGetHeader(strm, head) { - var state; - - /* check state */ - if (!strm || !strm.state) { - return Z_STREAM_ERROR; - } - state = strm.state; - if ((state.wrap & 2) === 0) { - return Z_STREAM_ERROR; - } - - /* save header structure */ - state.head = head; - head.done = false; - return Z_OK; -} -function inflateSetDictionary(strm, dictionary) { - var dictLength = dictionary.length; - var state; - var dictid; - var ret; - - /* check state */ - if (!strm /* == Z_NULL */ || !strm.state /* == Z_NULL */) { - return Z_STREAM_ERROR; - } - state = strm.state; - if (state.wrap !== 0 && state.mode !== DICT) { - return Z_STREAM_ERROR; - } - - /* check for correct dictionary identifier */ - if (state.mode === DICT) { - dictid = 1; /* adler32(0, null, 0)*/ - /* dictid = adler32(dictid, dictionary, dictLength); */ - dictid = adler32(dictid, dictionary, dictLength, 0); - if (dictid !== state.check) { - return Z_DATA_ERROR; - } - } - /* copy dictionary to window using updatewindow(), which will amend the - existing dictionary if appropriate */ - ret = updatewindow(strm, dictionary, dictLength, dictLength); - if (ret) { - state.mode = MEM; - return Z_MEM_ERROR; - } - state.havedict = 1; - // Tracev((stderr, "inflate: dictionary set\n")); - return Z_OK; -} -inflate$1.inflateReset = inflateReset; -inflate$1.inflateReset2 = inflateReset2; -inflate$1.inflateResetKeep = inflateResetKeep; -inflate$1.inflateInit = inflateInit; -inflate$1.inflateInit2 = inflateInit2; -inflate$1.inflate = inflate; -inflate$1.inflateEnd = inflateEnd; -inflate$1.inflateGetHeader = inflateGetHeader; -inflate$1.inflateSetDictionary = inflateSetDictionary; -inflate$1.inflateInfo = 'pako inflate (from Nodeca project)'; - -// (C) 1995-2013 Jean-loup Gailly and Mark Adler -// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// 3. This notice may not be removed or altered from any source distribution. - -var constants = { - /* Allowed flush values; see deflate() and inflate() below for details */ - Z_NO_FLUSH: 0, - Z_PARTIAL_FLUSH: 1, - Z_SYNC_FLUSH: 2, - Z_FULL_FLUSH: 3, - Z_FINISH: 4, - Z_BLOCK: 5, - Z_TREES: 6, - /* Return codes for the compression/decompression functions. Negative values - * are errors, positive values are used for special but normal events. - */ - Z_OK: 0, - Z_STREAM_END: 1, - Z_NEED_DICT: 2, - Z_ERRNO: -1, - Z_STREAM_ERROR: -2, - Z_DATA_ERROR: -3, - //Z_MEM_ERROR: -4, - Z_BUF_ERROR: -5, - //Z_VERSION_ERROR: -6, - - /* compression levels */ - Z_NO_COMPRESSION: 0, - Z_BEST_SPEED: 1, - Z_BEST_COMPRESSION: 9, - Z_DEFAULT_COMPRESSION: -1, - Z_FILTERED: 1, - Z_HUFFMAN_ONLY: 2, - Z_RLE: 3, - Z_FIXED: 4, - Z_DEFAULT_STRATEGY: 0, - /* Possible values of the data_type field (though see inflate()) */ - Z_BINARY: 0, - Z_TEXT: 1, - //Z_ASCII: 1, // = Z_TEXT (deprecated) - Z_UNKNOWN: 2, - /* The deflate compression method */ - Z_DEFLATED: 8 - //Z_NULL: null // Use -1 or null inline, depending on var type -}; - -(function (exports) { - - /* eslint camelcase: "off" */ - var assert = require$$4; - var Zstream = zstream; - var zlib_deflate = deflate$1; - var zlib_inflate = inflate$1; - var constants$1 = constants; - for (var key in constants$1) { - exports[key] = constants$1[key]; - } - - // zlib modes - exports.NONE = 0; - exports.DEFLATE = 1; - exports.INFLATE = 2; - exports.GZIP = 3; - exports.GUNZIP = 4; - exports.DEFLATERAW = 5; - exports.INFLATERAW = 6; - exports.UNZIP = 7; - var GZIP_HEADER_ID1 = 0x1f; - var GZIP_HEADER_ID2 = 0x8b; - - /** - * Emulate Node's zlib C++ layer for use by the JS layer in index.js - */ - function Zlib(mode) { - if (typeof mode !== 'number' || mode < exports.DEFLATE || mode > exports.UNZIP) { - throw new TypeError('Bad argument'); - } - this.dictionary = null; - this.err = 0; - this.flush = 0; - this.init_done = false; - this.level = 0; - this.memLevel = 0; - this.mode = mode; - this.strategy = 0; - this.windowBits = 0; - this.write_in_progress = false; - this.pending_close = false; - this.gzip_id_bytes_read = 0; - } - Zlib.prototype.close = function () { - if (this.write_in_progress) { - this.pending_close = true; - return; - } - this.pending_close = false; - assert(this.init_done, 'close before init'); - assert(this.mode <= exports.UNZIP); - if (this.mode === exports.DEFLATE || this.mode === exports.GZIP || this.mode === exports.DEFLATERAW) { - zlib_deflate.deflateEnd(this.strm); - } else if (this.mode === exports.INFLATE || this.mode === exports.GUNZIP || this.mode === exports.INFLATERAW || this.mode === exports.UNZIP) { - zlib_inflate.inflateEnd(this.strm); - } - this.mode = exports.NONE; - this.dictionary = null; - }; - Zlib.prototype.write = function (flush, input, in_off, in_len, out, out_off, out_len) { - return this._write(true, flush, input, in_off, in_len, out, out_off, out_len); - }; - Zlib.prototype.writeSync = function (flush, input, in_off, in_len, out, out_off, out_len) { - return this._write(false, flush, input, in_off, in_len, out, out_off, out_len); - }; - Zlib.prototype._write = function (async, flush, input, in_off, in_len, out, out_off, out_len) { - assert.equal(arguments.length, 8); - assert(this.init_done, 'write before init'); - assert(this.mode !== exports.NONE, 'already finalized'); - assert.equal(false, this.write_in_progress, 'write already in progress'); - assert.equal(false, this.pending_close, 'close is pending'); - this.write_in_progress = true; - assert.equal(false, flush === undefined, 'must provide flush value'); - this.write_in_progress = true; - if (flush !== exports.Z_NO_FLUSH && flush !== exports.Z_PARTIAL_FLUSH && flush !== exports.Z_SYNC_FLUSH && flush !== exports.Z_FULL_FLUSH && flush !== exports.Z_FINISH && flush !== exports.Z_BLOCK) { - throw new Error('Invalid flush value'); - } - if (input == null) { - input = Buffer$2.alloc(0); - in_len = 0; - in_off = 0; - } - this.strm.avail_in = in_len; - this.strm.input = input; - this.strm.next_in = in_off; - this.strm.avail_out = out_len; - this.strm.output = out; - this.strm.next_out = out_off; - this.flush = flush; - if (!async) { - // sync version - this._process(); - if (this._checkError()) { - return this._afterSync(); - } - return; - } - - // async version - var self = this; - browser$1$1.nextTick(function () { - self._process(); - self._after(); - }); - return this; - }; - Zlib.prototype._afterSync = function () { - var avail_out = this.strm.avail_out; - var avail_in = this.strm.avail_in; - this.write_in_progress = false; - return [avail_in, avail_out]; - }; - Zlib.prototype._process = function () { - var next_expected_header_byte = null; - - // If the avail_out is left at 0, then it means that it ran out - // of room. If there was avail_out left over, then it means - // that all of the input was consumed. - switch (this.mode) { - case exports.DEFLATE: - case exports.GZIP: - case exports.DEFLATERAW: - this.err = zlib_deflate.deflate(this.strm, this.flush); - break; - case exports.UNZIP: - if (this.strm.avail_in > 0) { - next_expected_header_byte = this.strm.next_in; - } - switch (this.gzip_id_bytes_read) { - case 0: - if (next_expected_header_byte === null) { - break; - } - if (this.strm.input[next_expected_header_byte] === GZIP_HEADER_ID1) { - this.gzip_id_bytes_read = 1; - next_expected_header_byte++; - if (this.strm.avail_in === 1) { - // The only available byte was already read. - break; - } - } else { - this.mode = exports.INFLATE; - break; - } - - // fallthrough - case 1: - if (next_expected_header_byte === null) { - break; - } - if (this.strm.input[next_expected_header_byte] === GZIP_HEADER_ID2) { - this.gzip_id_bytes_read = 2; - this.mode = exports.GUNZIP; - } else { - // There is no actual difference between INFLATE and INFLATERAW - // (after initialization). - this.mode = exports.INFLATE; - } - break; - default: - throw new Error('invalid number of gzip magic number bytes read'); - } - - // fallthrough - case exports.INFLATE: - case exports.GUNZIP: - case exports.INFLATERAW: - this.err = zlib_inflate.inflate(this.strm, this.flush - - // If data was encoded with dictionary - ); - if (this.err === exports.Z_NEED_DICT && this.dictionary) { - // Load it - this.err = zlib_inflate.inflateSetDictionary(this.strm, this.dictionary); - if (this.err === exports.Z_OK) { - // And try to decode again - this.err = zlib_inflate.inflate(this.strm, this.flush); - } else if (this.err === exports.Z_DATA_ERROR) { - // Both inflateSetDictionary() and inflate() return Z_DATA_ERROR. - // Make it possible for After() to tell a bad dictionary from bad - // input. - this.err = exports.Z_NEED_DICT; - } - } - while (this.strm.avail_in > 0 && this.mode === exports.GUNZIP && this.err === exports.Z_STREAM_END && this.strm.next_in[0] !== 0x00) { - // Bytes remain in input buffer. Perhaps this is another compressed - // member in the same archive, or just trailing garbage. - // Trailing zero bytes are okay, though, since they are frequently - // used for padding. - - this.reset(); - this.err = zlib_inflate.inflate(this.strm, this.flush); - } - break; - default: - throw new Error('Unknown mode ' + this.mode); - } - }; - Zlib.prototype._checkError = function () { - // Acceptable error states depend on the type of zlib stream. - switch (this.err) { - case exports.Z_OK: - case exports.Z_BUF_ERROR: - if (this.strm.avail_out !== 0 && this.flush === exports.Z_FINISH) { - this._error('unexpected end of file'); - return false; - } - break; - case exports.Z_STREAM_END: - // normal statuses, not fatal - break; - case exports.Z_NEED_DICT: - if (this.dictionary == null) { - this._error('Missing dictionary'); - } else { - this._error('Bad dictionary'); - } - return false; - default: - // something else. - this._error('Zlib error'); - return false; - } - return true; - }; - Zlib.prototype._after = function () { - if (!this._checkError()) { - return; - } - var avail_out = this.strm.avail_out; - var avail_in = this.strm.avail_in; - this.write_in_progress = false; - - // call the write() cb - this.callback(avail_in, avail_out); - if (this.pending_close) { - this.close(); - } - }; - Zlib.prototype._error = function (message) { - if (this.strm.msg) { - message = this.strm.msg; - } - this.onerror(message, this.err - - // no hope of rescue. - ); - this.write_in_progress = false; - if (this.pending_close) { - this.close(); - } - }; - Zlib.prototype.init = function (windowBits, level, memLevel, strategy, dictionary) { - assert(arguments.length === 4 || arguments.length === 5, 'init(windowBits, level, memLevel, strategy, [dictionary])'); - assert(windowBits >= 8 && windowBits <= 15, 'invalid windowBits'); - assert(level >= -1 && level <= 9, 'invalid compression level'); - assert(memLevel >= 1 && memLevel <= 9, 'invalid memlevel'); - assert(strategy === exports.Z_FILTERED || strategy === exports.Z_HUFFMAN_ONLY || strategy === exports.Z_RLE || strategy === exports.Z_FIXED || strategy === exports.Z_DEFAULT_STRATEGY, 'invalid strategy'); - this._init(level, windowBits, memLevel, strategy, dictionary); - this._setDictionary(); - }; - Zlib.prototype.params = function () { - throw new Error('deflateParams Not supported'); - }; - Zlib.prototype.reset = function () { - this._reset(); - this._setDictionary(); - }; - Zlib.prototype._init = function (level, windowBits, memLevel, strategy, dictionary) { - this.level = level; - this.windowBits = windowBits; - this.memLevel = memLevel; - this.strategy = strategy; - this.flush = exports.Z_NO_FLUSH; - this.err = exports.Z_OK; - if (this.mode === exports.GZIP || this.mode === exports.GUNZIP) { - this.windowBits += 16; - } - if (this.mode === exports.UNZIP) { - this.windowBits += 32; - } - if (this.mode === exports.DEFLATERAW || this.mode === exports.INFLATERAW) { - this.windowBits = -1 * this.windowBits; - } - this.strm = new Zstream(); - switch (this.mode) { - case exports.DEFLATE: - case exports.GZIP: - case exports.DEFLATERAW: - this.err = zlib_deflate.deflateInit2(this.strm, this.level, exports.Z_DEFLATED, this.windowBits, this.memLevel, this.strategy); - break; - case exports.INFLATE: - case exports.GUNZIP: - case exports.INFLATERAW: - case exports.UNZIP: - this.err = zlib_inflate.inflateInit2(this.strm, this.windowBits); - break; - default: - throw new Error('Unknown mode ' + this.mode); - } - if (this.err !== exports.Z_OK) { - this._error('Init error'); - } - this.dictionary = dictionary; - this.write_in_progress = false; - this.init_done = true; - }; - Zlib.prototype._setDictionary = function () { - if (this.dictionary == null) { - return; - } - this.err = exports.Z_OK; - switch (this.mode) { - case exports.DEFLATE: - case exports.DEFLATERAW: - this.err = zlib_deflate.deflateSetDictionary(this.strm, this.dictionary); - break; - } - if (this.err !== exports.Z_OK) { - this._error('Failed to set dictionary'); - } - }; - Zlib.prototype._reset = function () { - this.err = exports.Z_OK; - switch (this.mode) { - case exports.DEFLATE: - case exports.DEFLATERAW: - case exports.GZIP: - this.err = zlib_deflate.deflateReset(this.strm); - break; - case exports.INFLATE: - case exports.INFLATERAW: - case exports.GUNZIP: - this.err = zlib_inflate.inflateReset(this.strm); - break; - } - if (this.err !== exports.Z_OK) { - this._error('Failed to reset stream'); - } - }; - exports.Zlib = Zlib; -})(binding); - -(function (exports) { - - var Buffer = require$$0.Buffer; - var Transform = readableBrowserExports.Transform; - var binding$1 = binding; - var util = require$$3; - var assert = require$$4.ok; - var kMaxLength = require$$0.kMaxLength; - var kRangeErrorMessage = 'Cannot create final Buffer. It would be larger ' + 'than 0x' + kMaxLength.toString(16) + ' bytes'; - - // zlib doesn't provide these, so kludge them in following the same - // const naming scheme zlib uses. - binding$1.Z_MIN_WINDOWBITS = 8; - binding$1.Z_MAX_WINDOWBITS = 15; - binding$1.Z_DEFAULT_WINDOWBITS = 15; - - // fewer than 64 bytes per chunk is stupid. - // technically it could work with as few as 8, but even 64 bytes - // is absurdly low. Usually a MB or more is best. - binding$1.Z_MIN_CHUNK = 64; - binding$1.Z_MAX_CHUNK = Infinity; - binding$1.Z_DEFAULT_CHUNK = 16 * 1024; - binding$1.Z_MIN_MEMLEVEL = 1; - binding$1.Z_MAX_MEMLEVEL = 9; - binding$1.Z_DEFAULT_MEMLEVEL = 8; - binding$1.Z_MIN_LEVEL = -1; - binding$1.Z_MAX_LEVEL = 9; - binding$1.Z_DEFAULT_LEVEL = binding$1.Z_DEFAULT_COMPRESSION; - - // expose all the zlib constants - var bkeys = Object.keys(binding$1); - for (var bk = 0; bk < bkeys.length; bk++) { - var bkey = bkeys[bk]; - if (bkey.match(/^Z/)) { - Object.defineProperty(exports, bkey, { - enumerable: true, - value: binding$1[bkey], - writable: false - }); - } - } - - // translation table for return codes. - var codes = { - Z_OK: binding$1.Z_OK, - Z_STREAM_END: binding$1.Z_STREAM_END, - Z_NEED_DICT: binding$1.Z_NEED_DICT, - Z_ERRNO: binding$1.Z_ERRNO, - Z_STREAM_ERROR: binding$1.Z_STREAM_ERROR, - Z_DATA_ERROR: binding$1.Z_DATA_ERROR, - Z_MEM_ERROR: binding$1.Z_MEM_ERROR, - Z_BUF_ERROR: binding$1.Z_BUF_ERROR, - Z_VERSION_ERROR: binding$1.Z_VERSION_ERROR - }; - var ckeys = Object.keys(codes); - for (var ck = 0; ck < ckeys.length; ck++) { - var ckey = ckeys[ck]; - codes[codes[ckey]] = ckey; - } - Object.defineProperty(exports, 'codes', { - enumerable: true, - value: Object.freeze(codes), - writable: false - }); - exports.Deflate = Deflate; - exports.Inflate = Inflate; - exports.Gzip = Gzip; - exports.Gunzip = Gunzip; - exports.DeflateRaw = DeflateRaw; - exports.InflateRaw = InflateRaw; - exports.Unzip = Unzip; - exports.createDeflate = function (o) { - return new Deflate(o); - }; - exports.createInflate = function (o) { - return new Inflate(o); - }; - exports.createDeflateRaw = function (o) { - return new DeflateRaw(o); - }; - exports.createInflateRaw = function (o) { - return new InflateRaw(o); - }; - exports.createGzip = function (o) { - return new Gzip(o); - }; - exports.createGunzip = function (o) { - return new Gunzip(o); - }; - exports.createUnzip = function (o) { - return new Unzip(o); - }; - - // Convenience methods. - // compress/decompress a string or buffer in one step. - exports.deflate = function (buffer, opts, callback) { - if (typeof opts === 'function') { - callback = opts; - opts = {}; - } - return zlibBuffer(new Deflate(opts), buffer, callback); - }; - exports.deflateSync = function (buffer, opts) { - return zlibBufferSync(new Deflate(opts), buffer); - }; - exports.gzip = function (buffer, opts, callback) { - if (typeof opts === 'function') { - callback = opts; - opts = {}; - } - return zlibBuffer(new Gzip(opts), buffer, callback); - }; - exports.gzipSync = function (buffer, opts) { - return zlibBufferSync(new Gzip(opts), buffer); - }; - exports.deflateRaw = function (buffer, opts, callback) { - if (typeof opts === 'function') { - callback = opts; - opts = {}; - } - return zlibBuffer(new DeflateRaw(opts), buffer, callback); - }; - exports.deflateRawSync = function (buffer, opts) { - return zlibBufferSync(new DeflateRaw(opts), buffer); - }; - exports.unzip = function (buffer, opts, callback) { - if (typeof opts === 'function') { - callback = opts; - opts = {}; - } - return zlibBuffer(new Unzip(opts), buffer, callback); - }; - exports.unzipSync = function (buffer, opts) { - return zlibBufferSync(new Unzip(opts), buffer); - }; - exports.inflate = function (buffer, opts, callback) { - if (typeof opts === 'function') { - callback = opts; - opts = {}; - } - return zlibBuffer(new Inflate(opts), buffer, callback); - }; - exports.inflateSync = function (buffer, opts) { - return zlibBufferSync(new Inflate(opts), buffer); - }; - exports.gunzip = function (buffer, opts, callback) { - if (typeof opts === 'function') { - callback = opts; - opts = {}; - } - return zlibBuffer(new Gunzip(opts), buffer, callback); - }; - exports.gunzipSync = function (buffer, opts) { - return zlibBufferSync(new Gunzip(opts), buffer); - }; - exports.inflateRaw = function (buffer, opts, callback) { - if (typeof opts === 'function') { - callback = opts; - opts = {}; - } - return zlibBuffer(new InflateRaw(opts), buffer, callback); - }; - exports.inflateRawSync = function (buffer, opts) { - return zlibBufferSync(new InflateRaw(opts), buffer); - }; - function zlibBuffer(engine, buffer, callback) { - var buffers = []; - var nread = 0; - engine.on('error', onError); - engine.on('end', onEnd); - engine.end(buffer); - flow(); - function flow() { - var chunk; - while (null !== (chunk = engine.read())) { - buffers.push(chunk); - nread += chunk.length; - } - engine.once('readable', flow); - } - function onError(err) { - engine.removeListener('end', onEnd); - engine.removeListener('readable', flow); - callback(err); - } - function onEnd() { - var buf; - var err = null; - if (nread >= kMaxLength) { - err = new RangeError(kRangeErrorMessage); - } else { - buf = Buffer.concat(buffers, nread); - } - buffers = []; - engine.close(); - callback(err, buf); - } - } - function zlibBufferSync(engine, buffer) { - if (typeof buffer === 'string') buffer = Buffer.from(buffer); - if (!Buffer.isBuffer(buffer)) throw new TypeError('Not a string or buffer'); - var flushFlag = engine._finishFlushFlag; - return engine._processChunk(buffer, flushFlag); - } - - // generic zlib - // minimal 2-byte header - function Deflate(opts) { - if (!(this instanceof Deflate)) return new Deflate(opts); - Zlib.call(this, opts, binding$1.DEFLATE); - } - function Inflate(opts) { - if (!(this instanceof Inflate)) return new Inflate(opts); - Zlib.call(this, opts, binding$1.INFLATE); - } - - // gzip - bigger header, same deflate compression - function Gzip(opts) { - if (!(this instanceof Gzip)) return new Gzip(opts); - Zlib.call(this, opts, binding$1.GZIP); - } - function Gunzip(opts) { - if (!(this instanceof Gunzip)) return new Gunzip(opts); - Zlib.call(this, opts, binding$1.GUNZIP); - } - - // raw - no header - function DeflateRaw(opts) { - if (!(this instanceof DeflateRaw)) return new DeflateRaw(opts); - Zlib.call(this, opts, binding$1.DEFLATERAW); - } - function InflateRaw(opts) { - if (!(this instanceof InflateRaw)) return new InflateRaw(opts); - Zlib.call(this, opts, binding$1.INFLATERAW); - } - - // auto-detect header. - function Unzip(opts) { - if (!(this instanceof Unzip)) return new Unzip(opts); - Zlib.call(this, opts, binding$1.UNZIP); - } - function isValidFlushFlag(flag) { - return flag === binding$1.Z_NO_FLUSH || flag === binding$1.Z_PARTIAL_FLUSH || flag === binding$1.Z_SYNC_FLUSH || flag === binding$1.Z_FULL_FLUSH || flag === binding$1.Z_FINISH || flag === binding$1.Z_BLOCK; - } - - // the Zlib class they all inherit from - // This thing manages the queue of requests, and returns - // true or false if there is anything in the queue when - // you call the .write() method. - - function Zlib(opts, mode) { - var _this = this; - this._opts = opts = opts || {}; - this._chunkSize = opts.chunkSize || exports.Z_DEFAULT_CHUNK; - Transform.call(this, opts); - if (opts.flush && !isValidFlushFlag(opts.flush)) { - throw new Error('Invalid flush flag: ' + opts.flush); - } - if (opts.finishFlush && !isValidFlushFlag(opts.finishFlush)) { - throw new Error('Invalid flush flag: ' + opts.finishFlush); - } - this._flushFlag = opts.flush || binding$1.Z_NO_FLUSH; - this._finishFlushFlag = typeof opts.finishFlush !== 'undefined' ? opts.finishFlush : binding$1.Z_FINISH; - if (opts.chunkSize) { - if (opts.chunkSize < exports.Z_MIN_CHUNK || opts.chunkSize > exports.Z_MAX_CHUNK) { - throw new Error('Invalid chunk size: ' + opts.chunkSize); - } - } - if (opts.windowBits) { - if (opts.windowBits < exports.Z_MIN_WINDOWBITS || opts.windowBits > exports.Z_MAX_WINDOWBITS) { - throw new Error('Invalid windowBits: ' + opts.windowBits); - } - } - if (opts.level) { - if (opts.level < exports.Z_MIN_LEVEL || opts.level > exports.Z_MAX_LEVEL) { - throw new Error('Invalid compression level: ' + opts.level); - } - } - if (opts.memLevel) { - if (opts.memLevel < exports.Z_MIN_MEMLEVEL || opts.memLevel > exports.Z_MAX_MEMLEVEL) { - throw new Error('Invalid memLevel: ' + opts.memLevel); - } - } - if (opts.strategy) { - if (opts.strategy != exports.Z_FILTERED && opts.strategy != exports.Z_HUFFMAN_ONLY && opts.strategy != exports.Z_RLE && opts.strategy != exports.Z_FIXED && opts.strategy != exports.Z_DEFAULT_STRATEGY) { - throw new Error('Invalid strategy: ' + opts.strategy); - } - } - if (opts.dictionary) { - if (!Buffer.isBuffer(opts.dictionary)) { - throw new Error('Invalid dictionary: it should be a Buffer instance'); - } - } - this._handle = new binding$1.Zlib(mode); - var self = this; - this._hadError = false; - this._handle.onerror = function (message, errno) { - // there is no way to cleanly recover. - // continuing only obscures problems. - _close(self); - self._hadError = true; - var error = new Error(message); - error.errno = errno; - error.code = exports.codes[errno]; - self.emit('error', error); - }; - var level = exports.Z_DEFAULT_COMPRESSION; - if (typeof opts.level === 'number') level = opts.level; - var strategy = exports.Z_DEFAULT_STRATEGY; - if (typeof opts.strategy === 'number') strategy = opts.strategy; - this._handle.init(opts.windowBits || exports.Z_DEFAULT_WINDOWBITS, level, opts.memLevel || exports.Z_DEFAULT_MEMLEVEL, strategy, opts.dictionary); - this._buffer = Buffer.allocUnsafe(this._chunkSize); - this._offset = 0; - this._level = level; - this._strategy = strategy; - this.once('end', this.close); - Object.defineProperty(this, '_closed', { - get: function () { - return !_this._handle; - }, - configurable: true, - enumerable: true - }); - } - util.inherits(Zlib, Transform); - Zlib.prototype.params = function (level, strategy, callback) { - if (level < exports.Z_MIN_LEVEL || level > exports.Z_MAX_LEVEL) { - throw new RangeError('Invalid compression level: ' + level); - } - if (strategy != exports.Z_FILTERED && strategy != exports.Z_HUFFMAN_ONLY && strategy != exports.Z_RLE && strategy != exports.Z_FIXED && strategy != exports.Z_DEFAULT_STRATEGY) { - throw new TypeError('Invalid strategy: ' + strategy); - } - if (this._level !== level || this._strategy !== strategy) { - var self = this; - this.flush(binding$1.Z_SYNC_FLUSH, function () { - assert(self._handle, 'zlib binding closed'); - self._handle.params(level, strategy); - if (!self._hadError) { - self._level = level; - self._strategy = strategy; - if (callback) callback(); - } - }); - } else { - browser$1$1.nextTick(callback); - } - }; - Zlib.prototype.reset = function () { - assert(this._handle, 'zlib binding closed'); - return this._handle.reset(); - }; - - // This is the _flush function called by the transform class, - // internally, when the last chunk has been written. - Zlib.prototype._flush = function (callback) { - this._transform(Buffer.alloc(0), '', callback); - }; - Zlib.prototype.flush = function (kind, callback) { - var _this2 = this; - var ws = this._writableState; - if (typeof kind === 'function' || kind === undefined && !callback) { - callback = kind; - kind = binding$1.Z_FULL_FLUSH; - } - if (ws.ended) { - if (callback) browser$1$1.nextTick(callback); - } else if (ws.ending) { - if (callback) this.once('end', callback); - } else if (ws.needDrain) { - if (callback) { - this.once('drain', function () { - return _this2.flush(kind, callback); - }); - } - } else { - this._flushFlag = kind; - this.write(Buffer.alloc(0), '', callback); - } - }; - Zlib.prototype.close = function (callback) { - _close(this, callback); - browser$1$1.nextTick(emitCloseNT, this); - }; - function _close(engine, callback) { - if (callback) browser$1$1.nextTick(callback); - - // Caller may invoke .close after a zlib error (which will null _handle). - if (!engine._handle) return; - engine._handle.close(); - engine._handle = null; - } - function emitCloseNT(self) { - self.emit('close'); - } - Zlib.prototype._transform = function (chunk, encoding, cb) { - var flushFlag; - var ws = this._writableState; - var ending = ws.ending || ws.ended; - var last = ending && (!chunk || ws.length === chunk.length); - if (chunk !== null && !Buffer.isBuffer(chunk)) return cb(new Error('invalid input')); - if (!this._handle) return cb(new Error('zlib binding closed')); - - // If it's the last chunk, or a final flush, we use the Z_FINISH flush flag - // (or whatever flag was provided using opts.finishFlush). - // If it's explicitly flushing at some other time, then we use - // Z_FULL_FLUSH. Otherwise, use Z_NO_FLUSH for maximum compression - // goodness. - if (last) flushFlag = this._finishFlushFlag;else { - flushFlag = this._flushFlag; - // once we've flushed the last of the queue, stop flushing and - // go back to the normal behavior. - if (chunk.length >= ws.length) { - this._flushFlag = this._opts.flush || binding$1.Z_NO_FLUSH; - } - } - this._processChunk(chunk, flushFlag, cb); - }; - Zlib.prototype._processChunk = function (chunk, flushFlag, cb) { - var availInBefore = chunk && chunk.length; - var availOutBefore = this._chunkSize - this._offset; - var inOff = 0; - var self = this; - var async = typeof cb === 'function'; - if (!async) { - var buffers = []; - var nread = 0; - var error; - this.on('error', function (er) { - error = er; - }); - assert(this._handle, 'zlib binding closed'); - do { - var res = this._handle.writeSync(flushFlag, chunk, - // in - inOff, - // in_off - availInBefore, - // in_len - this._buffer, - // out - this._offset, - //out_off - availOutBefore); // out_len - } while (!this._hadError && callback(res[0], res[1])); - if (this._hadError) { - throw error; - } - if (nread >= kMaxLength) { - _close(this); - throw new RangeError(kRangeErrorMessage); - } - var buf = Buffer.concat(buffers, nread); - _close(this); - return buf; - } - assert(this._handle, 'zlib binding closed'); - var req = this._handle.write(flushFlag, chunk, - // in - inOff, - // in_off - availInBefore, - // in_len - this._buffer, - // out - this._offset, - //out_off - availOutBefore); // out_len - - req.buffer = chunk; - req.callback = callback; - function callback(availInAfter, availOutAfter) { - // When the callback is used in an async write, the callback's - // context is the `req` object that was created. The req object - // is === this._handle, and that's why it's important to null - // out the values after they are done being used. `this._handle` - // can stay in memory longer than the callback and buffer are needed. - if (this) { - this.buffer = null; - this.callback = null; - } - if (self._hadError) return; - var have = availOutBefore - availOutAfter; - assert(have >= 0, 'have should not go down'); - if (have > 0) { - var out = self._buffer.slice(self._offset, self._offset + have); - self._offset += have; - // serve some output to the consumer. - if (async) { - self.push(out); - } else { - buffers.push(out); - nread += out.length; - } - } - - // exhausted the output buffer, or used all the input create a new one. - if (availOutAfter === 0 || self._offset >= self._chunkSize) { - availOutBefore = self._chunkSize; - self._offset = 0; - self._buffer = Buffer.allocUnsafe(self._chunkSize); - } - if (availOutAfter === 0) { - // Not actually done. Need to reprocess. - // Also, update the availInBefore to the availInAfter value, - // so that if we have to hit it a third (fourth, etc.) time, - // it'll have the correct byte counts. - inOff += availInBefore - availInAfter; - availInBefore = availInAfter; - if (!async) return true; - var newReq = self._handle.write(flushFlag, chunk, inOff, availInBefore, self._buffer, self._offset, self._chunkSize); - newReq.callback = callback; // this same function - newReq.buffer = chunk; - return; - } - if (!async) return false; - - // finished with the chunk. - cb(); - } - }; - util.inherits(Deflate, Zlib); - util.inherits(Inflate, Zlib); - util.inherits(Gzip, Zlib); - util.inherits(Gunzip, Zlib); - util.inherits(DeflateRaw, Zlib); - util.inherits(InflateRaw, Zlib); - util.inherits(Unzip, Zlib); -})(lib); -var zlib = /*@__PURE__*/getDefaultExportFromCjs(lib); - -class PDFReference extends stream.Writable { - constructor(document, id, data) { - super({ - decodeStrings: false - }); - this.finalize = this.finalize.bind(this); - this.document = document; - this.id = id; - if (data == null) { - data = {}; - } - this.data = data; - this.gen = 0; - this.deflate = null; - this.compress = this.document.compress && !this.data.Filter; - this.uncompressedLength = 0; - this.chunks = []; - } - initDeflate() { - this.data.Filter = 'FlateDecode'; - this.deflate = zlib.createDeflate(); - this.deflate.on('data', chunk => { - this.chunks.push(chunk); - return this.data.Length += chunk.length; - }); - return this.deflate.on('end', this.finalize); - } - _write(chunk, encoding, callback) { - if (!(chunk instanceof Uint8Array)) { - chunk = Buffer$2.from(chunk + '\n', 'binary'); - } - this.uncompressedLength += chunk.length; - if (this.data.Length == null) { - this.data.Length = 0; - } - if (this.compress) { - if (!this.deflate) { - this.initDeflate(); - } - this.deflate.write(chunk); - } else { - this.chunks.push(chunk); - this.data.Length += chunk.length; - } - return callback(); - } - end() { - super.end(...arguments); - if (this.deflate) { - return this.deflate.end(); - } - return this.finalize(); - } - finalize() { - this.offset = this.document._offset; - const encryptFn = this.document._security ? this.document._security.getEncryptFn(this.id, this.gen) : null; - if (this.chunks.length) { - let buffer = Buffer$2.concat(this.chunks); - if (encryptFn) { - buffer = encryptFn(buffer); - } - this.data.Length = buffer.length; - this.document._write(`${this.id} ${this.gen} obj`); - this.document._write(PDFObject.convert(this.data, encryptFn)); - this.document._write('stream'); - this.document._write(buffer); - this.chunks.length = 0; - this.document._write('\nendstream'); - } else { - this.document._write(`${this.id} ${this.gen} obj`); - this.document._write(PDFObject.convert(this.data, encryptFn)); - } - this.document._write('endobj'); - return this.document._refEnd(this); - } - toString() { - return `${this.id} ${this.gen} R`; - } -} - -/* -PDFTree - abstract base class for name and number tree objects -*/ - -class PDFTree { - constructor(options) { - if (options === void 0) { - options = {}; - } - this._items = {}; - // disable /Limits output for this tree - this.limits = typeof options.limits === 'boolean' ? options.limits : true; - } - add(key, val) { - return this._items[key] = val; - } - get(key) { - return this._items[key]; - } - toString() { - // Needs to be sorted by key - const sortedKeys = Object.keys(this._items).sort((a, b) => this._compareKeys(a, b)); - const out = ['<<']; - if (this.limits && sortedKeys.length > 1) { - const first = sortedKeys[0], - last = sortedKeys[sortedKeys.length - 1]; - out.push(` /Limits ${PDFObject.convert([this._dataForKey(first), this._dataForKey(last)])}`); - } - out.push(` /${this._keysName()} [`); - for (let key of sortedKeys) { - out.push(` ${PDFObject.convert(this._dataForKey(key))} ${PDFObject.convert(this._items[key])}`); - } - out.push(']'); - out.push('>>'); - return out.join('\n'); - } - _compareKeys( /*a, b*/ - ) { - throw new Error('Must be implemented by subclasses'); - } - _keysName() { - throw new Error('Must be implemented by subclasses'); - } - _dataForKey( /*k*/ - ) { - throw new Error('Must be implemented by subclasses'); - } -} - -/* -PDFNameTree - represents a name tree object -*/ - -class PDFNameTree extends PDFTree { - _compareKeys(a, b) { - return a.localeCompare(b); - } - _keysName() { - return 'Names'; - } - _dataForKey(k) { - return new String(k); - } -} - -const pad = (str, length) => (Array(length + 1).join('0') + str).slice(-length); -const escapableRe = /[\n\r\t\b\f()\\]/g; -const escapable = { - '\n': '\\n', - '\r': '\\r', - '\t': '\\t', - '\b': '\\b', - '\f': '\\f', - '\\': '\\\\', - '(': '\\(', - ')': '\\)' -}; - -// Convert little endian UTF-16 to big endian -const swapBytes = function (buff) { - const l = buff.length; - if (l & 0x01) { - throw new Error('Buffer length must be even'); - } else { - for (let i = 0, end = l - 1; i < end; i += 2) { - const a = buff[i]; - buff[i] = buff[i + 1]; - buff[i + 1] = a; - } - } - return buff; -}; -class PDFObject { - static convert(object, encryptFn) { - if (encryptFn === void 0) { - encryptFn = null; - } - // String literals are converted to the PDF name type - if (typeof object === 'string') { - return `/${object}`; - } - - // String objects are converted to PDF strings (UTF-16) - if (object instanceof String) { - let string = object; - // Detect if this is a unicode string - let isUnicode = false; - for (let i = 0, end = string.length; i < end; i++) { - if (string.charCodeAt(i) > 0x7f) { - isUnicode = true; - break; - } - } - - // If so, encode it as big endian UTF-16 - let stringBuffer; - if (isUnicode) { - stringBuffer = swapBytes(Buffer$2.from(`\ufeff${string}`, 'utf16le')); - } else { - stringBuffer = Buffer$2.from(string.valueOf(), 'ascii'); - } - - // Encrypt the string when necessary - if (encryptFn) { - string = encryptFn(stringBuffer).toString('binary'); - } else { - string = stringBuffer.toString('binary'); - } - - // Escape characters as required by the spec - string = string.replace(escapableRe, c => escapable[c]); - return `(${string})`; - - // Buffers are converted to PDF hex strings - } - if (Buffer$2.isBuffer(object)) { - return `<${object.toString('hex')}>`; - } - if (object instanceof PDFReference || object instanceof PDFNameTree) { - return object.toString(); - } - if (object instanceof Date) { - let string = `D:${pad(object.getUTCFullYear(), 4)}` + pad(object.getUTCMonth() + 1, 2) + pad(object.getUTCDate(), 2) + pad(object.getUTCHours(), 2) + pad(object.getUTCMinutes(), 2) + pad(object.getUTCSeconds(), 2) + 'Z'; - - // Encrypt the string when necessary - if (encryptFn) { - string = encryptFn(Buffer$2.from(string, 'ascii')).toString('binary'); - string = string.replace(escapableRe, c => escapable[c]); - } - return `(${string})`; - } - if (Array.isArray(object)) { - const items = Array.from(object).map(e => PDFObject.convert(e, encryptFn)).join(' '); - return `[${items}]`; - } - if ({}.toString.call(object) === '[object Object]') { - const out = ['<<']; - for (let key in object) { - const val = object[key]; - out.push(`/${key} ${PDFObject.convert(val, encryptFn)}`); - } - out.push('>>'); - return out.join('\n'); - } - if (typeof object === 'number') { - return PDFObject.number(object); - } - return `${object}`; - } - static number(n) { - if (n > -1e21 && n < 1e21) { - return Math.round(n * 1e6) / 1e6; - } - throw new Error(`unsupported number: ${n}`); - } -} - -/* -PDFPage - represents a single page in the PDF document -By Devon Govett -*/ - -/** - * @type {SideDefinition} - */ -const DEFAULT_MARGINS = { - top: 72, - left: 72, - bottom: 72, - right: 72 -}; -const SIZES = { - '4A0': [4767.87, 6740.79], - '2A0': [3370.39, 4767.87], - A0: [2383.94, 3370.39], - A1: [1683.78, 2383.94], - A2: [1190.55, 1683.78], - A3: [841.89, 1190.55], - A4: [595.28, 841.89], - A5: [419.53, 595.28], - A6: [297.64, 419.53], - A7: [209.76, 297.64], - A8: [147.4, 209.76], - A9: [104.88, 147.4], - A10: [73.7, 104.88], - B0: [2834.65, 4008.19], - B1: [2004.09, 2834.65], - B2: [1417.32, 2004.09], - B3: [1000.63, 1417.32], - B4: [708.66, 1000.63], - B5: [498.9, 708.66], - B6: [354.33, 498.9], - B7: [249.45, 354.33], - B8: [175.75, 249.45], - B9: [124.72, 175.75], - B10: [87.87, 124.72], - C0: [2599.37, 3676.54], - C1: [1836.85, 2599.37], - C2: [1298.27, 1836.85], - C3: [918.43, 1298.27], - C4: [649.13, 918.43], - C5: [459.21, 649.13], - C6: [323.15, 459.21], - C7: [229.61, 323.15], - C8: [161.57, 229.61], - C9: [113.39, 161.57], - C10: [79.37, 113.39], - RA0: [2437.8, 3458.27], - RA1: [1729.13, 2437.8], - RA2: [1218.9, 1729.13], - RA3: [864.57, 1218.9], - RA4: [609.45, 864.57], - SRA0: [2551.18, 3628.35], - SRA1: [1814.17, 2551.18], - SRA2: [1275.59, 1814.17], - SRA3: [907.09, 1275.59], - SRA4: [637.8, 907.09], - EXECUTIVE: [521.86, 756.0], - FOLIO: [612.0, 936.0], - LEGAL: [612.0, 1008.0], - LETTER: [612.0, 792.0], - TABLOID: [792.0, 1224.0] -}; -class PDFPage { - constructor(document, options) { - if (options === void 0) { - options = {}; - } - this.document = document; - this._options = options; - this.size = options.size || 'letter'; - this.layout = options.layout || 'portrait'; - this.userUnit = options.userUnit || 1.0; - - // process margins - if (typeof options.margin === 'number') { - this.margins = { - top: options.margin, - left: options.margin, - bottom: options.margin, - right: options.margin - }; - - // default to 1 inch margins - } else { - this.margins = options.margins || DEFAULT_MARGINS; - } - - // calculate page dimensions - const dimensions = Array.isArray(this.size) ? this.size : SIZES[this.size.toUpperCase()]; - this.width = dimensions[this.layout === 'portrait' ? 0 : 1]; - this.height = dimensions[this.layout === 'portrait' ? 1 : 0]; - this.content = this.document.ref(); - if (options.font) document.font(options.font, options.fontFamily); - if (options.fontSize) document.fontSize(options.fontSize); - - // Initialize the Font, XObject, and ExtGState dictionaries - this.resources = this.document.ref({ - ProcSet: ['PDF', 'Text', 'ImageB', 'ImageC', 'ImageI'] - }); - - // The page dictionary - this.dictionary = this.document.ref({ - Type: 'Page', - Parent: this.document._root.data.Pages, - MediaBox: [0, 0, this.width, this.height], - Contents: this.content, - Resources: this.resources, - UserUnit: this.userUnit - }); - this.markings = []; - } - - // Lazily create these objects - get fonts() { - const data = this.resources.data; - return data.Font != null ? data.Font : data.Font = {}; - } - get xobjects() { - const data = this.resources.data; - return data.XObject != null ? data.XObject : data.XObject = {}; - } - get ext_gstates() { - const data = this.resources.data; - return data.ExtGState != null ? data.ExtGState : data.ExtGState = {}; - } - get patterns() { - const data = this.resources.data; - return data.Pattern != null ? data.Pattern : data.Pattern = {}; - } - get colorSpaces() { - const data = this.resources.data; - return data.ColorSpace || (data.ColorSpace = {}); - } - get annotations() { - const data = this.dictionary.data; - return data.Annots != null ? data.Annots : data.Annots = []; - } - get structParentTreeKey() { - const data = this.dictionary.data; - return data.StructParents != null ? data.StructParents : data.StructParents = this.document.createStructParentTreeNextKey(); - } - maxY() { - return this.height - this.margins.bottom; - } - write(chunk) { - return this.content.write(chunk); - } - - // Set tab order if document is tagged for accessibility. - _setTabOrder() { - if (!this.dictionary.Tabs && this.document.hasMarkInfoDictionary()) { - this.dictionary.data.Tabs = 'S'; - } - } - end() { - this._setTabOrder(); - this.dictionary.end(); - this.resources.data.ColorSpace = this.resources.data.ColorSpace || {}; - for (let color of Object.values(this.document.spotColors)) { - this.resources.data.ColorSpace[color.id] = color; - } - this.resources.end(); - return this.content.end(); - } -} - -function md5Hash(data) { - return new Uint8Array(md5.arrayBuffer(data)); -} -function md5Hex(data) { - return md5(data); -} - -/** - * Utilities for hex, bytes, CSPRNG. - * @module - */ -/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */ -// We use WebCrypto aka globalThis.crypto, which exists in browsers and node.js 16+. -// node.js versions earlier than v19 don't declare it in global scope. -// For node.js, package.json#exports field mapping rewrites import -// from `crypto` to `cryptoNode`, which imports native module. -// Makes the utils un-importable in browsers without a bundler. -// Once node.js 18 is deprecated (2025-04-30), we can just drop the import. -/** Checks if something is Uint8Array. Be careful: nodejs Buffer will return true. */ -function isBytes(a) { - return a instanceof Uint8Array || ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array'; -} -/** Asserts something is Uint8Array. */ -function abytes(b) { - if (!isBytes(b)) throw new Error('Uint8Array expected'); - for (var _len = arguments.length, lengths = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - lengths[_key - 1] = arguments[_key]; - } - if (lengths.length > 0 && !lengths.includes(b.length)) throw new Error('Uint8Array expected of length ' + lengths + ', got length=' + b.length); -} -/** Asserts a hash instance has not been destroyed / finished */ -function aexists(instance, checkFinished) { - if (checkFinished === void 0) { - checkFinished = true; - } - if (instance.destroyed) throw new Error('Hash instance has been destroyed'); - if (checkFinished && instance.finished) throw new Error('Hash#digest() has already been called'); -} -/** Asserts output is properly-sized byte array */ -function aoutput(out, instance) { - abytes(out); - const min = instance.outputLen; - if (out.length < min) { - throw new Error('digestInto() expects output buffer of length at least ' + min); - } -} -/** Zeroize a byte array. Warning: JS provides no guarantees. */ -function clean() { - for (var _len2 = arguments.length, arrays = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { - arrays[_key2] = arguments[_key2]; - } - for (let i = 0; i < arrays.length; i++) { - arrays[i].fill(0); - } -} -/** Create DataView of an array for easy byte-level manipulation. */ -function createView(arr) { - return new DataView(arr.buffer, arr.byteOffset, arr.byteLength); -} -/** The rotate right (circular right shift) operation for uint32 */ -function rotr(word, shift) { - return word << 32 - shift | word >>> shift; -} -/** - * Converts string to bytes using UTF8 encoding. - * @example utf8ToBytes('abc') // Uint8Array.from([97, 98, 99]) - */ -function utf8ToBytes(str) { - if (typeof str !== 'string') throw new Error('string expected'); - return new Uint8Array(new TextEncoder().encode(str)); // https://bugzil.la/1681809 -} -/** - * Normalizes (non-hex) string or Uint8Array to Uint8Array. - * Warning: when Uint8Array is passed, it would NOT get copied. - * Keep in mind for future mutable operations. - */ -function toBytes(data) { - if (typeof data === 'string') data = utf8ToBytes(data); - abytes(data); - return data; -} -/** For runtime check if class implements interface */ -class Hash {} -/** Wraps hash function, creating an interface on top of it */ -function createHasher(hashCons) { - const hashC = msg => hashCons().update(toBytes(msg)).digest(); - const tmp = hashCons(); - hashC.outputLen = tmp.outputLen; - hashC.blockLen = tmp.blockLen; - hashC.create = () => hashCons(); - return hashC; -} - -/** - * Internal Merkle-Damgard hash utils. - * @module - */ -/** Polyfill for Safari 14. https://caniuse.com/mdn-javascript_builtins_dataview_setbiguint64 */ -function setBigUint64(view, byteOffset, value, isLE) { - if (typeof view.setBigUint64 === 'function') return view.setBigUint64(byteOffset, value, isLE); - const _32n = BigInt(32); - const _u32_max = BigInt(0xffffffff); - const wh = Number(value >> _32n & _u32_max); - const wl = Number(value & _u32_max); - const h = isLE ? 4 : 0; - const l = isLE ? 0 : 4; - view.setUint32(byteOffset + h, wh, isLE); - view.setUint32(byteOffset + l, wl, isLE); -} -/** Choice: a ? b : c */ -function Chi(a, b, c) { - return a & b ^ ~a & c; -} -/** Majority function, true if any two inputs is true. */ -function Maj(a, b, c) { - return a & b ^ a & c ^ b & c; -} -/** - * Merkle-Damgard hash construction base class. - * Could be used to create MD5, RIPEMD, SHA1, SHA2. - */ -class HashMD extends Hash { - constructor(blockLen, outputLen, padOffset, isLE) { - super(); - this.finished = false; - this.length = 0; - this.pos = 0; - this.destroyed = false; - this.blockLen = blockLen; - this.outputLen = outputLen; - this.padOffset = padOffset; - this.isLE = isLE; - this.buffer = new Uint8Array(blockLen); - this.view = createView(this.buffer); - } - update(data) { - aexists(this); - data = toBytes(data); - abytes(data); - const { - view, - buffer, - blockLen - } = this; - const len = data.length; - for (let pos = 0; pos < len;) { - const take = Math.min(blockLen - this.pos, len - pos); - // Fast path: we have at least one block in input, cast it to view and process - if (take === blockLen) { - const dataView = createView(data); - for (; blockLen <= len - pos; pos += blockLen) this.process(dataView, pos); - continue; - } - buffer.set(data.subarray(pos, pos + take), this.pos); - this.pos += take; - pos += take; - if (this.pos === blockLen) { - this.process(view, 0); - this.pos = 0; - } - } - this.length += data.length; - this.roundClean(); - return this; - } - digestInto(out) { - aexists(this); - aoutput(out, this); - this.finished = true; - // Padding - // We can avoid allocation of buffer for padding completely if it - // was previously not allocated here. But it won't change performance. - const { - buffer, - view, - blockLen, - isLE - } = this; - let { - pos - } = this; - // append the bit '1' to the message - buffer[pos++] = 0b10000000; - clean(this.buffer.subarray(pos)); - // we have less than padOffset left in buffer, so we cannot put length in - // current block, need process it and pad again - if (this.padOffset > blockLen - pos) { - this.process(view, 0); - pos = 0; - } - // Pad until full block byte with zeros - for (let i = pos; i < blockLen; i++) buffer[i] = 0; - // Note: sha512 requires length to be 128bit integer, but length in JS will overflow before that - // You need to write around 2 exabytes (u64_max / 8 / (1024**6)) for this to happen. - // So we just write lowest 64 bits of that value. - setBigUint64(view, blockLen - 8, BigInt(this.length * 8), isLE); - this.process(view, 0); - const oview = createView(out); - const len = this.outputLen; - // NOTE: we do division by 4 later, which should be fused in single op with modulo by JIT - if (len % 4) throw new Error('_sha2: outputLen should be aligned to 32bit'); - const outLen = len / 4; - const state = this.get(); - if (outLen > state.length) throw new Error('_sha2: outputLen bigger than state'); - for (let i = 0; i < outLen; i++) oview.setUint32(4 * i, state[i], isLE); - } - digest() { - const { - buffer, - outputLen - } = this; - this.digestInto(buffer); - const res = buffer.slice(0, outputLen); - this.destroy(); - return res; - } - _cloneInto(to) { - to || (to = new this.constructor()); - to.set(...this.get()); - const { - blockLen, - buffer, - length, - finished, - destroyed, - pos - } = this; - to.destroyed = destroyed; - to.finished = finished; - to.length = length; - to.pos = pos; - if (length % blockLen) to.buffer.set(buffer); - return to; - } - clone() { - return this._cloneInto(); - } -} -/** - * Initial SHA-2 state: fractional parts of square roots of first 16 primes 2..53. - * Check out `test/misc/sha2-gen-iv.js` for recomputation guide. - */ -/** Initial SHA256 state. Bits 0..32 of frac part of sqrt of primes 2..19 */ -const SHA256_IV = /* @__PURE__ */Uint32Array.from([0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19]); - -/** - * SHA2 hash function. A.k.a. sha256, sha384, sha512, sha512_224, sha512_256. - * SHA256 is the fastest hash implementable in JS, even faster than Blake3. - * Check out [RFC 4634](https://datatracker.ietf.org/doc/html/rfc4634) and - * [FIPS 180-4](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf). - * @module - */ -/** - * Round constants: - * First 32 bits of fractional parts of the cube roots of the first 64 primes 2..311) - */ -// prettier-ignore -const SHA256_K = /* @__PURE__ */Uint32Array.from([0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2]); -/** Reusable temporary buffer. "W" comes straight from spec. */ -const SHA256_W = /* @__PURE__ */new Uint32Array(64); -class SHA256 extends HashMD { - constructor(outputLen) { - if (outputLen === void 0) { - outputLen = 32; - } - super(64, outputLen, 8, false); - // We cannot use array here since array allows indexing by variable - // which means optimizer/compiler cannot use registers. - this.A = SHA256_IV[0] | 0; - this.B = SHA256_IV[1] | 0; - this.C = SHA256_IV[2] | 0; - this.D = SHA256_IV[3] | 0; - this.E = SHA256_IV[4] | 0; - this.F = SHA256_IV[5] | 0; - this.G = SHA256_IV[6] | 0; - this.H = SHA256_IV[7] | 0; - } - get() { - const { - A, - B, - C, - D, - E, - F, - G, - H - } = this; - return [A, B, C, D, E, F, G, H]; - } - // prettier-ignore - set(A, B, C, D, E, F, G, H) { - this.A = A | 0; - this.B = B | 0; - this.C = C | 0; - this.D = D | 0; - this.E = E | 0; - this.F = F | 0; - this.G = G | 0; - this.H = H | 0; - } - process(view, offset) { - // Extend the first 16 words into the remaining 48 words w[16..63] of the message schedule array - for (let i = 0; i < 16; i++, offset += 4) SHA256_W[i] = view.getUint32(offset, false); - for (let i = 16; i < 64; i++) { - const W15 = SHA256_W[i - 15]; - const W2 = SHA256_W[i - 2]; - const s0 = rotr(W15, 7) ^ rotr(W15, 18) ^ W15 >>> 3; - const s1 = rotr(W2, 17) ^ rotr(W2, 19) ^ W2 >>> 10; - SHA256_W[i] = s1 + SHA256_W[i - 7] + s0 + SHA256_W[i - 16] | 0; - } - // Compression function main loop, 64 rounds - let { - A, - B, - C, - D, - E, - F, - G, - H - } = this; - for (let i = 0; i < 64; i++) { - const sigma1 = rotr(E, 6) ^ rotr(E, 11) ^ rotr(E, 25); - const T1 = H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i] | 0; - const sigma0 = rotr(A, 2) ^ rotr(A, 13) ^ rotr(A, 22); - const T2 = sigma0 + Maj(A, B, C) | 0; - H = G; - G = F; - F = E; - E = D + T1 | 0; - D = C; - C = B; - B = A; - A = T1 + T2 | 0; - } - // Add the compressed chunk to the current hash value - A = A + this.A | 0; - B = B + this.B | 0; - C = C + this.C | 0; - D = D + this.D | 0; - E = E + this.E | 0; - F = F + this.F | 0; - G = G + this.G | 0; - H = H + this.H | 0; - this.set(A, B, C, D, E, F, G, H); - } - roundClean() { - clean(SHA256_W); - } - destroy() { - this.set(0, 0, 0, 0, 0, 0, 0, 0); - clean(this.buffer); - } -} -/** - * SHA2-256 hash function from RFC 4634. - * - * It is the fastest JS hash, even faster than Blake3. - * To break sha256 using birthday attack, attackers need to try 2^128 hashes. - * BTC network is doing 2^70 hashes/sec (2^95 hashes/year) as per 2025. - */ -const sha256 = /* @__PURE__ */createHasher(() => new SHA256()); - -function sha256Hash(data) { - return sha256(data); -} - -function aesCbcEncrypt(data, key, iv, padding) { - if (padding === void 0) { - padding = true; - } - return cbc(key, iv, { - disablePadding: !padding - }).encrypt(data); -} -function aesEcbEncrypt(data, key) { - return ecb(key, { - disablePadding: true - }).encrypt(data); -} - -// RC4 (for legacy PDF 1.3-1.5) -function rc4(data, key) { - const s = new Uint8Array(256); - for (let i = 0; i < 256; i++) { - s[i] = i; - } - let j = 0; - for (let i = 0; i < 256; i++) { - j = j + s[i] + key[i % key.length] & 0xff; - [s[i], s[j]] = [s[j], s[i]]; - } - const output = new Uint8Array(data.length); - for (let i = 0, j = 0, k = 0; k < data.length; k++) { - i = i + 1 & 0xff; - j = j + s[i] & 0xff; - [s[i], s[j]] = [s[j], s[i]]; - output[k] = data[k] ^ s[s[i] + s[j] & 0xff]; - } - return output; -} - -function randomBytes(length) { - const bytes = new Uint8Array(length); - globalThis.crypto.getRandomValues(bytes); - return bytes; -} - -/** - * Check if value is in a range group. - * @param {number} value - * @param {number[]} rangeGroup - * @returns {boolean} - */ -function inRange(value, rangeGroup) { - if (value < rangeGroup[0]) return false; - let startRange = 0; - let endRange = rangeGroup.length / 2; - while (startRange <= endRange) { - const middleRange = Math.floor((startRange + endRange) / 2); - - // actual array index - const arrayIndex = middleRange * 2; - - // Check if value is in range pointed by actual index - if (value >= rangeGroup[arrayIndex] && value <= rangeGroup[arrayIndex + 1]) { - return true; - } - if (value > rangeGroup[arrayIndex + 1]) { - // Search Right Side Of Array - startRange = middleRange + 1; - } else { - // Search Left Side Of Array - endRange = middleRange - 1; - } - } - return false; -} - -// prettier-ignore-start -/** - * A.1 Unassigned code points in Unicode 3.2 - * @link https://tools.ietf.org/html/rfc3454#appendix-A.1 - */ -const unassigned_code_points = [0x0221, 0x0221, 0x0234, 0x024f, 0x02ae, 0x02af, 0x02ef, 0x02ff, 0x0350, 0x035f, 0x0370, 0x0373, 0x0376, 0x0379, 0x037b, 0x037d, 0x037f, 0x0383, 0x038b, 0x038b, 0x038d, 0x038d, 0x03a2, 0x03a2, 0x03cf, 0x03cf, 0x03f7, 0x03ff, 0x0487, 0x0487, 0x04cf, 0x04cf, 0x04f6, 0x04f7, 0x04fa, 0x04ff, 0x0510, 0x0530, 0x0557, 0x0558, 0x0560, 0x0560, 0x0588, 0x0588, 0x058b, 0x0590, 0x05a2, 0x05a2, 0x05ba, 0x05ba, 0x05c5, 0x05cf, 0x05eb, 0x05ef, 0x05f5, 0x060b, 0x060d, 0x061a, 0x061c, 0x061e, 0x0620, 0x0620, 0x063b, 0x063f, 0x0656, 0x065f, 0x06ee, 0x06ef, 0x06ff, 0x06ff, 0x070e, 0x070e, 0x072d, 0x072f, 0x074b, 0x077f, 0x07b2, 0x0900, 0x0904, 0x0904, 0x093a, 0x093b, 0x094e, 0x094f, 0x0955, 0x0957, 0x0971, 0x0980, 0x0984, 0x0984, 0x098d, 0x098e, 0x0991, 0x0992, 0x09a9, 0x09a9, 0x09b1, 0x09b1, 0x09b3, 0x09b5, 0x09ba, 0x09bb, 0x09bd, 0x09bd, 0x09c5, 0x09c6, 0x09c9, 0x09ca, 0x09ce, 0x09d6, 0x09d8, 0x09db, 0x09de, 0x09de, 0x09e4, 0x09e5, 0x09fb, 0x0a01, 0x0a03, 0x0a04, 0x0a0b, 0x0a0e, 0x0a11, 0x0a12, 0x0a29, 0x0a29, 0x0a31, 0x0a31, 0x0a34, 0x0a34, 0x0a37, 0x0a37, 0x0a3a, 0x0a3b, 0x0a3d, 0x0a3d, 0x0a43, 0x0a46, 0x0a49, 0x0a4a, 0x0a4e, 0x0a58, 0x0a5d, 0x0a5d, 0x0a5f, 0x0a65, 0x0a75, 0x0a80, 0x0a84, 0x0a84, 0x0a8c, 0x0a8c, 0x0a8e, 0x0a8e, 0x0a92, 0x0a92, 0x0aa9, 0x0aa9, 0x0ab1, 0x0ab1, 0x0ab4, 0x0ab4, 0x0aba, 0x0abb, 0x0ac6, 0x0ac6, 0x0aca, 0x0aca, 0x0ace, 0x0acf, 0x0ad1, 0x0adf, 0x0ae1, 0x0ae5, 0x0af0, 0x0b00, 0x0b04, 0x0b04, 0x0b0d, 0x0b0e, 0x0b11, 0x0b12, 0x0b29, 0x0b29, 0x0b31, 0x0b31, 0x0b34, 0x0b35, 0x0b3a, 0x0b3b, 0x0b44, 0x0b46, 0x0b49, 0x0b4a, 0x0b4e, 0x0b55, 0x0b58, 0x0b5b, 0x0b5e, 0x0b5e, 0x0b62, 0x0b65, 0x0b71, 0x0b81, 0x0b84, 0x0b84, 0x0b8b, 0x0b8d, 0x0b91, 0x0b91, 0x0b96, 0x0b98, 0x0b9b, 0x0b9b, 0x0b9d, 0x0b9d, 0x0ba0, 0x0ba2, 0x0ba5, 0x0ba7, 0x0bab, 0x0bad, 0x0bb6, 0x0bb6, 0x0bba, 0x0bbd, 0x0bc3, 0x0bc5, 0x0bc9, 0x0bc9, 0x0bce, 0x0bd6, 0x0bd8, 0x0be6, 0x0bf3, 0x0c00, 0x0c04, 0x0c04, 0x0c0d, 0x0c0d, 0x0c11, 0x0c11, 0x0c29, 0x0c29, 0x0c34, 0x0c34, 0x0c3a, 0x0c3d, 0x0c45, 0x0c45, 0x0c49, 0x0c49, 0x0c4e, 0x0c54, 0x0c57, 0x0c5f, 0x0c62, 0x0c65, 0x0c70, 0x0c81, 0x0c84, 0x0c84, 0x0c8d, 0x0c8d, 0x0c91, 0x0c91, 0x0ca9, 0x0ca9, 0x0cb4, 0x0cb4, 0x0cba, 0x0cbd, 0x0cc5, 0x0cc5, 0x0cc9, 0x0cc9, 0x0cce, 0x0cd4, 0x0cd7, 0x0cdd, 0x0cdf, 0x0cdf, 0x0ce2, 0x0ce5, 0x0cf0, 0x0d01, 0x0d04, 0x0d04, 0x0d0d, 0x0d0d, 0x0d11, 0x0d11, 0x0d29, 0x0d29, 0x0d3a, 0x0d3d, 0x0d44, 0x0d45, 0x0d49, 0x0d49, 0x0d4e, 0x0d56, 0x0d58, 0x0d5f, 0x0d62, 0x0d65, 0x0d70, 0x0d81, 0x0d84, 0x0d84, 0x0d97, 0x0d99, 0x0db2, 0x0db2, 0x0dbc, 0x0dbc, 0x0dbe, 0x0dbf, 0x0dc7, 0x0dc9, 0x0dcb, 0x0dce, 0x0dd5, 0x0dd5, 0x0dd7, 0x0dd7, 0x0de0, 0x0df1, 0x0df5, 0x0e00, 0x0e3b, 0x0e3e, 0x0e5c, 0x0e80, 0x0e83, 0x0e83, 0x0e85, 0x0e86, 0x0e89, 0x0e89, 0x0e8b, 0x0e8c, 0x0e8e, 0x0e93, 0x0e98, 0x0e98, 0x0ea0, 0x0ea0, 0x0ea4, 0x0ea4, 0x0ea6, 0x0ea6, 0x0ea8, 0x0ea9, 0x0eac, 0x0eac, 0x0eba, 0x0eba, 0x0ebe, 0x0ebf, 0x0ec5, 0x0ec5, 0x0ec7, 0x0ec7, 0x0ece, 0x0ecf, 0x0eda, 0x0edb, 0x0ede, 0x0eff, 0x0f48, 0x0f48, 0x0f6b, 0x0f70, 0x0f8c, 0x0f8f, 0x0f98, 0x0f98, 0x0fbd, 0x0fbd, 0x0fcd, 0x0fce, 0x0fd0, 0x0fff, 0x1022, 0x1022, 0x1028, 0x1028, 0x102b, 0x102b, 0x1033, 0x1035, 0x103a, 0x103f, 0x105a, 0x109f, 0x10c6, 0x10cf, 0x10f9, 0x10fa, 0x10fc, 0x10ff, 0x115a, 0x115e, 0x11a3, 0x11a7, 0x11fa, 0x11ff, 0x1207, 0x1207, 0x1247, 0x1247, 0x1249, 0x1249, 0x124e, 0x124f, 0x1257, 0x1257, 0x1259, 0x1259, 0x125e, 0x125f, 0x1287, 0x1287, 0x1289, 0x1289, 0x128e, 0x128f, 0x12af, 0x12af, 0x12b1, 0x12b1, 0x12b6, 0x12b7, 0x12bf, 0x12bf, 0x12c1, 0x12c1, 0x12c6, 0x12c7, 0x12cf, 0x12cf, 0x12d7, 0x12d7, 0x12ef, 0x12ef, 0x130f, 0x130f, 0x1311, 0x1311, 0x1316, 0x1317, 0x131f, 0x131f, 0x1347, 0x1347, 0x135b, 0x1360, 0x137d, 0x139f, 0x13f5, 0x1400, 0x1677, 0x167f, 0x169d, 0x169f, 0x16f1, 0x16ff, 0x170d, 0x170d, 0x1715, 0x171f, 0x1737, 0x173f, 0x1754, 0x175f, 0x176d, 0x176d, 0x1771, 0x1771, 0x1774, 0x177f, 0x17dd, 0x17df, 0x17ea, 0x17ff, 0x180f, 0x180f, 0x181a, 0x181f, 0x1878, 0x187f, 0x18aa, 0x1dff, 0x1e9c, 0x1e9f, 0x1efa, 0x1eff, 0x1f16, 0x1f17, 0x1f1e, 0x1f1f, 0x1f46, 0x1f47, 0x1f4e, 0x1f4f, 0x1f58, 0x1f58, 0x1f5a, 0x1f5a, 0x1f5c, 0x1f5c, 0x1f5e, 0x1f5e, 0x1f7e, 0x1f7f, 0x1fb5, 0x1fb5, 0x1fc5, 0x1fc5, 0x1fd4, 0x1fd5, 0x1fdc, 0x1fdc, 0x1ff0, 0x1ff1, 0x1ff5, 0x1ff5, 0x1fff, 0x1fff, 0x2053, 0x2056, 0x2058, 0x205e, 0x2064, 0x2069, 0x2072, 0x2073, 0x208f, 0x209f, 0x20b2, 0x20cf, 0x20eb, 0x20ff, 0x213b, 0x213c, 0x214c, 0x2152, 0x2184, 0x218f, 0x23cf, 0x23ff, 0x2427, 0x243f, 0x244b, 0x245f, 0x24ff, 0x24ff, 0x2614, 0x2615, 0x2618, 0x2618, 0x267e, 0x267f, 0x268a, 0x2700, 0x2705, 0x2705, 0x270a, 0x270b, 0x2728, 0x2728, 0x274c, 0x274c, 0x274e, 0x274e, 0x2753, 0x2755, 0x2757, 0x2757, 0x275f, 0x2760, 0x2795, 0x2797, 0x27b0, 0x27b0, 0x27bf, 0x27cf, 0x27ec, 0x27ef, 0x2b00, 0x2e7f, 0x2e9a, 0x2e9a, 0x2ef4, 0x2eff, 0x2fd6, 0x2fef, 0x2ffc, 0x2fff, 0x3040, 0x3040, 0x3097, 0x3098, 0x3100, 0x3104, 0x312d, 0x3130, 0x318f, 0x318f, 0x31b8, 0x31ef, 0x321d, 0x321f, 0x3244, 0x3250, 0x327c, 0x327e, 0x32cc, 0x32cf, 0x32ff, 0x32ff, 0x3377, 0x337a, 0x33de, 0x33df, 0x33ff, 0x33ff, 0x4db6, 0x4dff, 0x9fa6, 0x9fff, 0xa48d, 0xa48f, 0xa4c7, 0xabff, 0xd7a4, 0xd7ff, 0xfa2e, 0xfa2f, 0xfa6b, 0xfaff, 0xfb07, 0xfb12, 0xfb18, 0xfb1c, 0xfb37, 0xfb37, 0xfb3d, 0xfb3d, 0xfb3f, 0xfb3f, 0xfb42, 0xfb42, 0xfb45, 0xfb45, 0xfbb2, 0xfbd2, 0xfd40, 0xfd4f, 0xfd90, 0xfd91, 0xfdc8, 0xfdcf, 0xfdfd, 0xfdff, 0xfe10, 0xfe1f, 0xfe24, 0xfe2f, 0xfe47, 0xfe48, 0xfe53, 0xfe53, 0xfe67, 0xfe67, 0xfe6c, 0xfe6f, 0xfe75, 0xfe75, 0xfefd, 0xfefe, 0xff00, 0xff00, 0xffbf, 0xffc1, 0xffc8, 0xffc9, 0xffd0, 0xffd1, 0xffd8, 0xffd9, 0xffdd, 0xffdf, 0xffe7, 0xffe7, 0xffef, 0xfff8, 0x10000, 0x102ff, 0x1031f, 0x1031f, 0x10324, 0x1032f, 0x1034b, 0x103ff, 0x10426, 0x10427, 0x1044e, 0x1cfff, 0x1d0f6, 0x1d0ff, 0x1d127, 0x1d129, 0x1d1de, 0x1d3ff, 0x1d455, 0x1d455, 0x1d49d, 0x1d49d, 0x1d4a0, 0x1d4a1, 0x1d4a3, 0x1d4a4, 0x1d4a7, 0x1d4a8, 0x1d4ad, 0x1d4ad, 0x1d4ba, 0x1d4ba, 0x1d4bc, 0x1d4bc, 0x1d4c1, 0x1d4c1, 0x1d4c4, 0x1d4c4, 0x1d506, 0x1d506, 0x1d50b, 0x1d50c, 0x1d515, 0x1d515, 0x1d51d, 0x1d51d, 0x1d53a, 0x1d53a, 0x1d53f, 0x1d53f, 0x1d545, 0x1d545, 0x1d547, 0x1d549, 0x1d551, 0x1d551, 0x1d6a4, 0x1d6a7, 0x1d7ca, 0x1d7cd, 0x1d800, 0x1fffd, 0x2a6d7, 0x2f7ff, 0x2fa1e, 0x2fffd, 0x30000, 0x3fffd, 0x40000, 0x4fffd, 0x50000, 0x5fffd, 0x60000, 0x6fffd, 0x70000, 0x7fffd, 0x80000, 0x8fffd, 0x90000, 0x9fffd, 0xa0000, 0xafffd, 0xb0000, 0xbfffd, 0xc0000, 0xcfffd, 0xd0000, 0xdfffd, 0xe0000, 0xe0000, 0xe0002, 0xe001f, 0xe0080, 0xefffd]; -// prettier-ignore-end - -const isUnassignedCodePoint = character => inRange(character, unassigned_code_points); - -// prettier-ignore-start -/** - * B.1 Commonly mapped to nothing - * @link https://tools.ietf.org/html/rfc3454#appendix-B.1 - */ -const commonly_mapped_to_nothing = [0x00ad, 0x00ad, 0x034f, 0x034f, 0x1806, 0x1806, 0x180b, 0x180b, 0x180c, 0x180c, 0x180d, 0x180d, 0x200b, 0x200b, 0x200c, 0x200c, 0x200d, 0x200d, 0x2060, 0x2060, 0xfe00, 0xfe00, 0xfe01, 0xfe01, 0xfe02, 0xfe02, 0xfe03, 0xfe03, 0xfe04, 0xfe04, 0xfe05, 0xfe05, 0xfe06, 0xfe06, 0xfe07, 0xfe07, 0xfe08, 0xfe08, 0xfe09, 0xfe09, 0xfe0a, 0xfe0a, 0xfe0b, 0xfe0b, 0xfe0c, 0xfe0c, 0xfe0d, 0xfe0d, 0xfe0e, 0xfe0e, 0xfe0f, 0xfe0f, 0xfeff, 0xfeff]; -// prettier-ignore-end - -const isCommonlyMappedToNothing = character => inRange(character, commonly_mapped_to_nothing); - -// prettier-ignore-start -/** - * C.1.2 Non-ASCII space characters - * @link https://tools.ietf.org/html/rfc3454#appendix-C.1.2 - */ -const non_ASCII_space_characters = [0x00a0, 0x00a0 /* NO-BREAK SPACE */, 0x1680, 0x1680 /* OGHAM SPACE MARK */, 0x2000, 0x2000 /* EN QUAD */, 0x2001, 0x2001 /* EM QUAD */, 0x2002, 0x2002 /* EN SPACE */, 0x2003, 0x2003 /* EM SPACE */, 0x2004, 0x2004 /* THREE-PER-EM SPACE */, 0x2005, 0x2005 /* FOUR-PER-EM SPACE */, 0x2006, 0x2006 /* SIX-PER-EM SPACE */, 0x2007, 0x2007 /* FIGURE SPACE */, 0x2008, 0x2008 /* PUNCTUATION SPACE */, 0x2009, 0x2009 /* THIN SPACE */, 0x200a, 0x200a /* HAIR SPACE */, 0x200b, 0x200b /* ZERO WIDTH SPACE */, 0x202f, 0x202f /* NARROW NO-BREAK SPACE */, 0x205f, 0x205f /* MEDIUM MATHEMATICAL SPACE */, 0x3000, 0x3000 /* IDEOGRAPHIC SPACE */]; -// prettier-ignore-end - -const isNonASCIISpaceCharacter = character => inRange(character, non_ASCII_space_characters); - -// prettier-ignore-start -const non_ASCII_controls_characters = [ -/** - * C.2.2 Non-ASCII control characters - * @link https://tools.ietf.org/html/rfc3454#appendix-C.2.2 - */ -0x0080, 0x009f /* [CONTROL CHARACTERS] */, 0x06dd, 0x06dd /* ARABIC END OF AYAH */, 0x070f, 0x070f /* SYRIAC ABBREVIATION MARK */, 0x180e, 0x180e /* MONGOLIAN VOWEL SEPARATOR */, 0x200c, 0x200c /* ZERO WIDTH NON-JOINER */, 0x200d, 0x200d /* ZERO WIDTH JOINER */, 0x2028, 0x2028 /* LINE SEPARATOR */, 0x2029, 0x2029 /* PARAGRAPH SEPARATOR */, 0x2060, 0x2060 /* WORD JOINER */, 0x2061, 0x2061 /* FUNCTION APPLICATION */, 0x2062, 0x2062 /* INVISIBLE TIMES */, 0x2063, 0x2063 /* INVISIBLE SEPARATOR */, 0x206a, 0x206f /* [CONTROL CHARACTERS] */, 0xfeff, 0xfeff /* ZERO WIDTH NO-BREAK SPACE */, 0xfff9, 0xfffc /* [CONTROL CHARACTERS] */, 0x1d173, 0x1d17a /* [MUSICAL CONTROL CHARACTERS] */]; -const non_character_codepoints = [ -/** - * C.4 Non-character code points - * @link https://tools.ietf.org/html/rfc3454#appendix-C.4 - */ -0xfdd0, 0xfdef /* [NONCHARACTER CODE POINTS] */, 0xfffe, 0xffff /* [NONCHARACTER CODE POINTS] */, 0x1fffe, 0x1ffff /* [NONCHARACTER CODE POINTS] */, 0x2fffe, 0x2ffff /* [NONCHARACTER CODE POINTS] */, 0x3fffe, 0x3ffff /* [NONCHARACTER CODE POINTS] */, 0x4fffe, 0x4ffff /* [NONCHARACTER CODE POINTS] */, 0x5fffe, 0x5ffff /* [NONCHARACTER CODE POINTS] */, 0x6fffe, 0x6ffff /* [NONCHARACTER CODE POINTS] */, 0x7fffe, 0x7ffff /* [NONCHARACTER CODE POINTS] */, 0x8fffe, 0x8ffff /* [NONCHARACTER CODE POINTS] */, 0x9fffe, 0x9ffff /* [NONCHARACTER CODE POINTS] */, 0xafffe, 0xaffff /* [NONCHARACTER CODE POINTS] */, 0xbfffe, 0xbffff /* [NONCHARACTER CODE POINTS] */, 0xcfffe, 0xcffff /* [NONCHARACTER CODE POINTS] */, 0xdfffe, 0xdffff /* [NONCHARACTER CODE POINTS] */, 0xefffe, 0xeffff /* [NONCHARACTER CODE POINTS] */, 0x10fffe, 0x10ffff /* [NONCHARACTER CODE POINTS] */]; - -/** - * 2.3. Prohibited Output - */ -const prohibited_characters = [ -/** - * C.2.1 ASCII control characters - * @link https://tools.ietf.org/html/rfc3454#appendix-C.2.1 - */ -0, 0x001f /* [CONTROL CHARACTERS] */, 0x007f, 0x007f /* DELETE */, -/** - * C.8 Change display properties or are deprecated - * @link https://tools.ietf.org/html/rfc3454#appendix-C.8 - */ -0x0340, 0x0340 /* COMBINING GRAVE TONE MARK */, 0x0341, 0x0341 /* COMBINING ACUTE TONE MARK */, 0x200e, 0x200e /* LEFT-TO-RIGHT MARK */, 0x200f, 0x200f /* RIGHT-TO-LEFT MARK */, 0x202a, 0x202a /* LEFT-TO-RIGHT EMBEDDING */, 0x202b, 0x202b /* RIGHT-TO-LEFT EMBEDDING */, 0x202c, 0x202c /* POP DIRECTIONAL FORMATTING */, 0x202d, 0x202d /* LEFT-TO-RIGHT OVERRIDE */, 0x202e, 0x202e /* RIGHT-TO-LEFT OVERRIDE */, 0x206a, 0x206a /* INHIBIT SYMMETRIC SWAPPING */, 0x206b, 0x206b /* ACTIVATE SYMMETRIC SWAPPING */, 0x206c, 0x206c /* INHIBIT ARABIC FORM SHAPING */, 0x206d, 0x206d /* ACTIVATE ARABIC FORM SHAPING */, 0x206e, 0x206e /* NATIONAL DIGIT SHAPES */, 0x206f, 0x206f /* NOMINAL DIGIT SHAPES */, -/** - * C.7 Inappropriate for canonical representation - * @link https://tools.ietf.org/html/rfc3454#appendix-C.7 - */ -0x2ff0, 0x2ffb /* [IDEOGRAPHIC DESCRIPTION CHARACTERS] */, -/** - * C.5 Surrogate codes - * @link https://tools.ietf.org/html/rfc3454#appendix-C.5 - */ -0xd800, 0xdfff, -/** - * C.3 Private use - * @link https://tools.ietf.org/html/rfc3454#appendix-C.3 - */ -0xe000, 0xf8ff /* [PRIVATE USE, PLANE 0] */, -/** - * C.6 Inappropriate for plain text - * @link https://tools.ietf.org/html/rfc3454#appendix-C.6 - */ -0xfff9, 0xfff9 /* INTERLINEAR ANNOTATION ANCHOR */, 0xfffa, 0xfffa /* INTERLINEAR ANNOTATION SEPARATOR */, 0xfffb, 0xfffb /* INTERLINEAR ANNOTATION TERMINATOR */, 0xfffc, 0xfffc /* OBJECT REPLACEMENT CHARACTER */, 0xfffd, 0xfffd /* REPLACEMENT CHARACTER */, -/** - * C.9 Tagging characters - * @link https://tools.ietf.org/html/rfc3454#appendix-C.9 - */ -0xe0001, 0xe0001 /* LANGUAGE TAG */, 0xe0020, 0xe007f /* [TAGGING CHARACTERS] */, -/** - * C.3 Private use - * @link https://tools.ietf.org/html/rfc3454#appendix-C.3 - */ - -0xf0000, 0xffffd /* [PRIVATE USE, PLANE 15] */, 0x100000, 0x10fffd /* [PRIVATE USE, PLANE 16] */]; -// prettier-ignore-end - -const isProhibitedCharacter = character => inRange(character, non_ASCII_space_characters) || inRange(character, prohibited_characters) || inRange(character, non_ASCII_controls_characters) || inRange(character, non_character_codepoints); - -// prettier-ignore-start -/** - * D.1 Characters with bidirectional property "R" or "AL" - * @link https://tools.ietf.org/html/rfc3454#appendix-D.1 - */ -const bidirectional_r_al = [0x05be, 0x05be, 0x05c0, 0x05c0, 0x05c3, 0x05c3, 0x05d0, 0x05ea, 0x05f0, 0x05f4, 0x061b, 0x061b, 0x061f, 0x061f, 0x0621, 0x063a, 0x0640, 0x064a, 0x066d, 0x066f, 0x0671, 0x06d5, 0x06dd, 0x06dd, 0x06e5, 0x06e6, 0x06fa, 0x06fe, 0x0700, 0x070d, 0x0710, 0x0710, 0x0712, 0x072c, 0x0780, 0x07a5, 0x07b1, 0x07b1, 0x200f, 0x200f, 0xfb1d, 0xfb1d, 0xfb1f, 0xfb28, 0xfb2a, 0xfb36, 0xfb38, 0xfb3c, 0xfb3e, 0xfb3e, 0xfb40, 0xfb41, 0xfb43, 0xfb44, 0xfb46, 0xfbb1, 0xfbd3, 0xfd3d, 0xfd50, 0xfd8f, 0xfd92, 0xfdc7, 0xfdf0, 0xfdfc, 0xfe70, 0xfe74, 0xfe76, 0xfefc]; -// prettier-ignore-end - -const isBidirectionalRAL = character => inRange(character, bidirectional_r_al); - -// prettier-ignore-start -/** - * D.2 Characters with bidirectional property "L" - * @link https://tools.ietf.org/html/rfc3454#appendix-D.2 - */ -const bidirectional_l = [0x0041, 0x005a, 0x0061, 0x007a, 0x00aa, 0x00aa, 0x00b5, 0x00b5, 0x00ba, 0x00ba, 0x00c0, 0x00d6, 0x00d8, 0x00f6, 0x00f8, 0x0220, 0x0222, 0x0233, 0x0250, 0x02ad, 0x02b0, 0x02b8, 0x02bb, 0x02c1, 0x02d0, 0x02d1, 0x02e0, 0x02e4, 0x02ee, 0x02ee, 0x037a, 0x037a, 0x0386, 0x0386, 0x0388, 0x038a, 0x038c, 0x038c, 0x038e, 0x03a1, 0x03a3, 0x03ce, 0x03d0, 0x03f5, 0x0400, 0x0482, 0x048a, 0x04ce, 0x04d0, 0x04f5, 0x04f8, 0x04f9, 0x0500, 0x050f, 0x0531, 0x0556, 0x0559, 0x055f, 0x0561, 0x0587, 0x0589, 0x0589, 0x0903, 0x0903, 0x0905, 0x0939, 0x093d, 0x0940, 0x0949, 0x094c, 0x0950, 0x0950, 0x0958, 0x0961, 0x0964, 0x0970, 0x0982, 0x0983, 0x0985, 0x098c, 0x098f, 0x0990, 0x0993, 0x09a8, 0x09aa, 0x09b0, 0x09b2, 0x09b2, 0x09b6, 0x09b9, 0x09be, 0x09c0, 0x09c7, 0x09c8, 0x09cb, 0x09cc, 0x09d7, 0x09d7, 0x09dc, 0x09dd, 0x09df, 0x09e1, 0x09e6, 0x09f1, 0x09f4, 0x09fa, 0x0a05, 0x0a0a, 0x0a0f, 0x0a10, 0x0a13, 0x0a28, 0x0a2a, 0x0a30, 0x0a32, 0x0a33, 0x0a35, 0x0a36, 0x0a38, 0x0a39, 0x0a3e, 0x0a40, 0x0a59, 0x0a5c, 0x0a5e, 0x0a5e, 0x0a66, 0x0a6f, 0x0a72, 0x0a74, 0x0a83, 0x0a83, 0x0a85, 0x0a8b, 0x0a8d, 0x0a8d, 0x0a8f, 0x0a91, 0x0a93, 0x0aa8, 0x0aaa, 0x0ab0, 0x0ab2, 0x0ab3, 0x0ab5, 0x0ab9, 0x0abd, 0x0ac0, 0x0ac9, 0x0ac9, 0x0acb, 0x0acc, 0x0ad0, 0x0ad0, 0x0ae0, 0x0ae0, 0x0ae6, 0x0aef, 0x0b02, 0x0b03, 0x0b05, 0x0b0c, 0x0b0f, 0x0b10, 0x0b13, 0x0b28, 0x0b2a, 0x0b30, 0x0b32, 0x0b33, 0x0b36, 0x0b39, 0x0b3d, 0x0b3e, 0x0b40, 0x0b40, 0x0b47, 0x0b48, 0x0b4b, 0x0b4c, 0x0b57, 0x0b57, 0x0b5c, 0x0b5d, 0x0b5f, 0x0b61, 0x0b66, 0x0b70, 0x0b83, 0x0b83, 0x0b85, 0x0b8a, 0x0b8e, 0x0b90, 0x0b92, 0x0b95, 0x0b99, 0x0b9a, 0x0b9c, 0x0b9c, 0x0b9e, 0x0b9f, 0x0ba3, 0x0ba4, 0x0ba8, 0x0baa, 0x0bae, 0x0bb5, 0x0bb7, 0x0bb9, 0x0bbe, 0x0bbf, 0x0bc1, 0x0bc2, 0x0bc6, 0x0bc8, 0x0bca, 0x0bcc, 0x0bd7, 0x0bd7, 0x0be7, 0x0bf2, 0x0c01, 0x0c03, 0x0c05, 0x0c0c, 0x0c0e, 0x0c10, 0x0c12, 0x0c28, 0x0c2a, 0x0c33, 0x0c35, 0x0c39, 0x0c41, 0x0c44, 0x0c60, 0x0c61, 0x0c66, 0x0c6f, 0x0c82, 0x0c83, 0x0c85, 0x0c8c, 0x0c8e, 0x0c90, 0x0c92, 0x0ca8, 0x0caa, 0x0cb3, 0x0cb5, 0x0cb9, 0x0cbe, 0x0cbe, 0x0cc0, 0x0cc4, 0x0cc7, 0x0cc8, 0x0cca, 0x0ccb, 0x0cd5, 0x0cd6, 0x0cde, 0x0cde, 0x0ce0, 0x0ce1, 0x0ce6, 0x0cef, 0x0d02, 0x0d03, 0x0d05, 0x0d0c, 0x0d0e, 0x0d10, 0x0d12, 0x0d28, 0x0d2a, 0x0d39, 0x0d3e, 0x0d40, 0x0d46, 0x0d48, 0x0d4a, 0x0d4c, 0x0d57, 0x0d57, 0x0d60, 0x0d61, 0x0d66, 0x0d6f, 0x0d82, 0x0d83, 0x0d85, 0x0d96, 0x0d9a, 0x0db1, 0x0db3, 0x0dbb, 0x0dbd, 0x0dbd, 0x0dc0, 0x0dc6, 0x0dcf, 0x0dd1, 0x0dd8, 0x0ddf, 0x0df2, 0x0df4, 0x0e01, 0x0e30, 0x0e32, 0x0e33, 0x0e40, 0x0e46, 0x0e4f, 0x0e5b, 0x0e81, 0x0e82, 0x0e84, 0x0e84, 0x0e87, 0x0e88, 0x0e8a, 0x0e8a, 0x0e8d, 0x0e8d, 0x0e94, 0x0e97, 0x0e99, 0x0e9f, 0x0ea1, 0x0ea3, 0x0ea5, 0x0ea5, 0x0ea7, 0x0ea7, 0x0eaa, 0x0eab, 0x0ead, 0x0eb0, 0x0eb2, 0x0eb3, 0x0ebd, 0x0ebd, 0x0ec0, 0x0ec4, 0x0ec6, 0x0ec6, 0x0ed0, 0x0ed9, 0x0edc, 0x0edd, 0x0f00, 0x0f17, 0x0f1a, 0x0f34, 0x0f36, 0x0f36, 0x0f38, 0x0f38, 0x0f3e, 0x0f47, 0x0f49, 0x0f6a, 0x0f7f, 0x0f7f, 0x0f85, 0x0f85, 0x0f88, 0x0f8b, 0x0fbe, 0x0fc5, 0x0fc7, 0x0fcc, 0x0fcf, 0x0fcf, 0x1000, 0x1021, 0x1023, 0x1027, 0x1029, 0x102a, 0x102c, 0x102c, 0x1031, 0x1031, 0x1038, 0x1038, 0x1040, 0x1057, 0x10a0, 0x10c5, 0x10d0, 0x10f8, 0x10fb, 0x10fb, 0x1100, 0x1159, 0x115f, 0x11a2, 0x11a8, 0x11f9, 0x1200, 0x1206, 0x1208, 0x1246, 0x1248, 0x1248, 0x124a, 0x124d, 0x1250, 0x1256, 0x1258, 0x1258, 0x125a, 0x125d, 0x1260, 0x1286, 0x1288, 0x1288, 0x128a, 0x128d, 0x1290, 0x12ae, 0x12b0, 0x12b0, 0x12b2, 0x12b5, 0x12b8, 0x12be, 0x12c0, 0x12c0, 0x12c2, 0x12c5, 0x12c8, 0x12ce, 0x12d0, 0x12d6, 0x12d8, 0x12ee, 0x12f0, 0x130e, 0x1310, 0x1310, 0x1312, 0x1315, 0x1318, 0x131e, 0x1320, 0x1346, 0x1348, 0x135a, 0x1361, 0x137c, 0x13a0, 0x13f4, 0x1401, 0x1676, 0x1681, 0x169a, 0x16a0, 0x16f0, 0x1700, 0x170c, 0x170e, 0x1711, 0x1720, 0x1731, 0x1735, 0x1736, 0x1740, 0x1751, 0x1760, 0x176c, 0x176e, 0x1770, 0x1780, 0x17b6, 0x17be, 0x17c5, 0x17c7, 0x17c8, 0x17d4, 0x17da, 0x17dc, 0x17dc, 0x17e0, 0x17e9, 0x1810, 0x1819, 0x1820, 0x1877, 0x1880, 0x18a8, 0x1e00, 0x1e9b, 0x1ea0, 0x1ef9, 0x1f00, 0x1f15, 0x1f18, 0x1f1d, 0x1f20, 0x1f45, 0x1f48, 0x1f4d, 0x1f50, 0x1f57, 0x1f59, 0x1f59, 0x1f5b, 0x1f5b, 0x1f5d, 0x1f5d, 0x1f5f, 0x1f7d, 0x1f80, 0x1fb4, 0x1fb6, 0x1fbc, 0x1fbe, 0x1fbe, 0x1fc2, 0x1fc4, 0x1fc6, 0x1fcc, 0x1fd0, 0x1fd3, 0x1fd6, 0x1fdb, 0x1fe0, 0x1fec, 0x1ff2, 0x1ff4, 0x1ff6, 0x1ffc, 0x200e, 0x200e, 0x2071, 0x2071, 0x207f, 0x207f, 0x2102, 0x2102, 0x2107, 0x2107, 0x210a, 0x2113, 0x2115, 0x2115, 0x2119, 0x211d, 0x2124, 0x2124, 0x2126, 0x2126, 0x2128, 0x2128, 0x212a, 0x212d, 0x212f, 0x2131, 0x2133, 0x2139, 0x213d, 0x213f, 0x2145, 0x2149, 0x2160, 0x2183, 0x2336, 0x237a, 0x2395, 0x2395, 0x249c, 0x24e9, 0x3005, 0x3007, 0x3021, 0x3029, 0x3031, 0x3035, 0x3038, 0x303c, 0x3041, 0x3096, 0x309d, 0x309f, 0x30a1, 0x30fa, 0x30fc, 0x30ff, 0x3105, 0x312c, 0x3131, 0x318e, 0x3190, 0x31b7, 0x31f0, 0x321c, 0x3220, 0x3243, 0x3260, 0x327b, 0x327f, 0x32b0, 0x32c0, 0x32cb, 0x32d0, 0x32fe, 0x3300, 0x3376, 0x337b, 0x33dd, 0x33e0, 0x33fe, 0x3400, 0x4db5, 0x4e00, 0x9fa5, 0xa000, 0xa48c, 0xac00, 0xd7a3, 0xd800, 0xfa2d, 0xfa30, 0xfa6a, 0xfb00, 0xfb06, 0xfb13, 0xfb17, 0xff21, 0xff3a, 0xff41, 0xff5a, 0xff66, 0xffbe, 0xffc2, 0xffc7, 0xffca, 0xffcf, 0xffd2, 0xffd7, 0xffda, 0xffdc, 0x10300, 0x1031e, 0x10320, 0x10323, 0x10330, 0x1034a, 0x10400, 0x10425, 0x10428, 0x1044d, 0x1d000, 0x1d0f5, 0x1d100, 0x1d126, 0x1d12a, 0x1d166, 0x1d16a, 0x1d172, 0x1d183, 0x1d184, 0x1d18c, 0x1d1a9, 0x1d1ae, 0x1d1dd, 0x1d400, 0x1d454, 0x1d456, 0x1d49c, 0x1d49e, 0x1d49f, 0x1d4a2, 0x1d4a2, 0x1d4a5, 0x1d4a6, 0x1d4a9, 0x1d4ac, 0x1d4ae, 0x1d4b9, 0x1d4bb, 0x1d4bb, 0x1d4bd, 0x1d4c0, 0x1d4c2, 0x1d4c3, 0x1d4c5, 0x1d505, 0x1d507, 0x1d50a, 0x1d50d, 0x1d514, 0x1d516, 0x1d51c, 0x1d51e, 0x1d539, 0x1d53b, 0x1d53e, 0x1d540, 0x1d544, 0x1d546, 0x1d546, 0x1d54a, 0x1d550, 0x1d552, 0x1d6a3, 0x1d6a8, 0x1d7c9, 0x20000, 0x2a6d6, 0x2f800, 0x2fa1d, 0xf0000, 0xffffd, 0x100000, 0x10fffd]; -// prettier-ignore-end - -const isBidirectionalL = character => inRange(character, bidirectional_l); - -// 2.1. Mapping - -/** - * non-ASCII space characters [StringPrep, C.1.2] that can be - * mapped to SPACE (U+0020) - */ -const mapping2space = isNonASCIISpaceCharacter; - -/** - * the "commonly mapped to nothing" characters [StringPrep, B.1] - * that can be mapped to nothing. - */ -const mapping2nothing = isCommonlyMappedToNothing; - -// utils -const getCodePoint = character => character.codePointAt(0); -const first = x => x[0]; -const last = x => x[x.length - 1]; - -/** - * Convert provided string into an array of Unicode Code Points. - * Based on https://stackoverflow.com/a/21409165/1556249 - * and https://www.npmjs.com/package/code-point-at. - * @param {string} input - * @returns {number[]} - */ -function toCodePoints(input) { - const codepoints = []; - const size = input.length; - for (let i = 0; i < size; i += 1) { - const before = input.charCodeAt(i); - if (before >= 0xd800 && before <= 0xdbff && size > i + 1) { - const next = input.charCodeAt(i + 1); - if (next >= 0xdc00 && next <= 0xdfff) { - codepoints.push((before - 0xd800) * 0x400 + next - 0xdc00 + 0x10000); - i += 1; - continue; - } - } - codepoints.push(before); - } - return codepoints; -} - -/** - * SASLprep. - * @param {string} input - * @param {Object} opts - * @param {boolean} opts.allowUnassigned - * @returns {string} - */ -function saslprep(input, opts) { - if (opts === void 0) { - opts = {}; - } - if (typeof input !== 'string') { - throw new TypeError('Expected string.'); - } - if (input.length === 0) { - return ''; - } - - // 1. Map - const mapped_input = toCodePoints(input) - // 1.1 mapping to space - .map(character => mapping2space(character) ? 0x20 : character) - // 1.2 mapping to nothing - .filter(character => !mapping2nothing(character)); - - // 2. Normalize - const normalized_input = String.fromCodePoint.apply(null, mapped_input).normalize('NFKC'); - const normalized_map = toCodePoints(normalized_input); - - // 3. Prohibit - const hasProhibited = normalized_map.some(isProhibitedCharacter); - if (hasProhibited) { - throw new Error('Prohibited character, see https://tools.ietf.org/html/rfc4013#section-2.3'); - } - - // Unassigned Code Points - if (opts.allowUnassigned !== true) { - const hasUnassigned = normalized_map.some(isUnassignedCodePoint); - if (hasUnassigned) { - throw new Error('Unassigned code point, see https://tools.ietf.org/html/rfc4013#section-2.5'); - } - } - - // 4. check bidi - - const hasBidiRAL = normalized_map.some(isBidirectionalRAL); - const hasBidiL = normalized_map.some(isBidirectionalL); - - // 4.1 If a string contains any RandALCat character, the string MUST NOT - // contain any LCat character. - if (hasBidiRAL && hasBidiL) { - throw new Error('String must not contain RandALCat and LCat at the same time,' + ' see https://tools.ietf.org/html/rfc3454#section-6'); - } - - /** - * 4.2 If a string contains any RandALCat character, a RandALCat - * character MUST be the first character of the string, and a - * RandALCat character MUST be the last character of the string. - */ - - const isFirstBidiRAL = isBidirectionalRAL(getCodePoint(first(normalized_input))); - const isLastBidiRAL = isBidirectionalRAL(getCodePoint(last(normalized_input))); - if (hasBidiRAL && !(isFirstBidiRAL && isLastBidiRAL)) { - throw new Error('Bidirectional RandALCat character must be the first and the last' + ' character of the string, see https://tools.ietf.org/html/rfc3454#section-6'); - } - return normalized_input; -} - -function concatBytes() { - for (var _len = arguments.length, arrays = new Array(_len), _key = 0; _key < _len; _key++) { - arrays[_key] = arguments[_key]; - } - const length = arrays.reduce((a, b) => a + b.length, 0); - const result = new Uint8Array(length); - let offset = 0; - for (const arr of arrays) { - result.set(arr, offset); - offset += arr.length; - } - return result; -} -class PDFSecurity { - static generateFileID(info) { - if (info === void 0) { - info = {}; - } - let infoStr = `${info.CreationDate.getTime()}\n`; - for (let key in info) { - // eslint-disable-next-line no-prototype-builtins - if (!info.hasOwnProperty(key)) { - continue; - } - infoStr += `${key}: ${info[key].valueOf()}\n`; - } - return Buffer$2.from(md5Hash(infoStr)); - } - static generateRandomWordArray(bytes) { - return randomBytes(bytes); - } - static create(document, options) { - if (options === void 0) { - options = {}; - } - if (!options.ownerPassword && !options.userPassword) { - return null; - } - return new PDFSecurity(document, options); - } - constructor(document, options) { - if (options === void 0) { - options = {}; - } - if (!options.ownerPassword && !options.userPassword) { - throw new Error('None of owner password and user password is defined.'); - } - this.document = document; - this._setupEncryption(options); - } - _setupEncryption(options) { - switch (options.pdfVersion) { - case '1.4': - case '1.5': - this.version = 2; - break; - case '1.6': - case '1.7': - this.version = 4; - break; - case '1.7ext3': - this.version = 5; - break; - default: - this.version = 1; - break; - } - const encDict = { - Filter: 'Standard' - }; - switch (this.version) { - case 1: - case 2: - case 4: - this._setupEncryptionV1V2V4(this.version, encDict, options); - break; - case 5: - this._setupEncryptionV5(encDict, options); - break; - } - this.dictionary = this.document.ref(encDict); - } - _setupEncryptionV1V2V4(v, encDict, options) { - let r, permissions; - switch (v) { - case 1: - r = 2; - this.keyBits = 40; - permissions = getPermissionsR2(options.permissions); - break; - case 2: - r = 3; - this.keyBits = 128; - permissions = getPermissionsR3(options.permissions); - break; - case 4: - r = 4; - this.keyBits = 128; - permissions = getPermissionsR3(options.permissions); - break; - } - const paddedUserPassword = processPasswordR2R3R4(options.userPassword); - const paddedOwnerPassword = options.ownerPassword ? processPasswordR2R3R4(options.ownerPassword) : paddedUserPassword; - const ownerPasswordEntry = getOwnerPasswordR2R3R4(r, this.keyBits, paddedUserPassword, paddedOwnerPassword); - this.encryptionKey = getEncryptionKeyR2R3R4(r, this.keyBits, this.document._id, paddedUserPassword, ownerPasswordEntry, permissions); - let userPasswordEntry; - if (r === 2) { - userPasswordEntry = getUserPasswordR2(this.encryptionKey); - } else { - userPasswordEntry = getUserPasswordR3R4(this.document._id, this.encryptionKey); - } - encDict.V = v; - if (v >= 2) { - encDict.Length = this.keyBits; - } - if (v === 4) { - encDict.CF = { - StdCF: { - AuthEvent: 'DocOpen', - CFM: 'AESV2', - Length: this.keyBits / 8 - } - }; - encDict.StmF = 'StdCF'; - encDict.StrF = 'StdCF'; - } - encDict.R = r; - encDict.O = Buffer$2.from(ownerPasswordEntry); - encDict.U = Buffer$2.from(userPasswordEntry); - encDict.P = permissions; - } - _setupEncryptionV5(encDict, options) { - this.keyBits = 256; - const permissions = getPermissionsR3(options.permissions); - const processedUserPassword = processPasswordR5(options.userPassword); - const processedOwnerPassword = options.ownerPassword ? processPasswordR5(options.ownerPassword) : processedUserPassword; - this.encryptionKey = getEncryptionKeyR5(PDFSecurity.generateRandomWordArray); - const userPasswordEntry = getUserPasswordR5(processedUserPassword, PDFSecurity.generateRandomWordArray); - const userKeySalt = userPasswordEntry.slice(40, 48); - const userEncryptionKeyEntry = getUserEncryptionKeyR5(processedUserPassword, userKeySalt, this.encryptionKey); - const ownerPasswordEntry = getOwnerPasswordR5(processedOwnerPassword, userPasswordEntry, PDFSecurity.generateRandomWordArray); - const ownerKeySalt = ownerPasswordEntry.slice(40, 48); - const ownerEncryptionKeyEntry = getOwnerEncryptionKeyR5(processedOwnerPassword, ownerKeySalt, userPasswordEntry, this.encryptionKey); - const permsEntry = getEncryptedPermissionsR5(permissions, this.encryptionKey, PDFSecurity.generateRandomWordArray); - encDict.V = 5; - encDict.Length = this.keyBits; - encDict.CF = { - StdCF: { - AuthEvent: 'DocOpen', - CFM: 'AESV3', - Length: this.keyBits / 8 - } - }; - encDict.StmF = 'StdCF'; - encDict.StrF = 'StdCF'; - encDict.R = 5; - encDict.O = Buffer$2.from(ownerPasswordEntry); - encDict.OE = Buffer$2.from(ownerEncryptionKeyEntry); - encDict.U = Buffer$2.from(userPasswordEntry); - encDict.UE = Buffer$2.from(userEncryptionKeyEntry); - encDict.P = permissions; - encDict.Perms = Buffer$2.from(permsEntry); - } - getEncryptFn(obj, gen) { - let digest; - if (this.version < 5) { - // Create 5-byte object/generation number suffix - const suffix = new Uint8Array([obj & 0xff, obj >> 8 & 0xff, obj >> 16 & 0xff, gen & 0xff, gen >> 8 & 0xff]); - digest = concatBytes(this.encryptionKey, suffix); - } - if (this.version === 1 || this.version === 2) { - let key = md5Hash(digest); - const keyLen = Math.min(16, this.keyBits / 8 + 5); - key = key.slice(0, keyLen); - return buffer => Buffer$2.from(rc4(new Uint8Array(buffer), key)); - } - let key; - if (this.version === 4) { - // Append "sAlT" marker for AES - const saltMarker = new Uint8Array([0x73, 0x41, 0x6c, 0x54]); - key = md5Hash(concatBytes(digest, saltMarker)); - } else { - key = this.encryptionKey; - } - const iv = PDFSecurity.generateRandomWordArray(16); - return buffer => { - const encrypted = aesCbcEncrypt(new Uint8Array(buffer), key, iv, true); - return Buffer$2.from(concatBytes(iv, encrypted)); - }; - } - end() { - this.dictionary.end(); - } -} -function getPermissionsR2(permissionObject) { - if (permissionObject === void 0) { - permissionObject = {}; - } - let permissions = 0xffffffc0 >> 0; - if (permissionObject.printing) { - permissions |= 0b000000000100; - } - if (permissionObject.modifying) { - permissions |= 0b000000001000; - } - if (permissionObject.copying) { - permissions |= 0b000000010000; - } - if (permissionObject.annotating) { - permissions |= 0b000000100000; - } - return permissions; -} -function getPermissionsR3(permissionObject) { - if (permissionObject === void 0) { - permissionObject = {}; - } - let permissions = 0xfffff0c0 >> 0; - if (permissionObject.printing === 'lowResolution') { - permissions |= 0b000000000100; - } - if (permissionObject.printing === 'highResolution') { - permissions |= 0b100000000100; - } - if (permissionObject.modifying) { - permissions |= 0b000000001000; - } - if (permissionObject.copying) { - permissions |= 0b000000010000; - } - if (permissionObject.annotating) { - permissions |= 0b000000100000; - } - if (permissionObject.fillingForms) { - permissions |= 0b000100000000; - } - if (permissionObject.contentAccessibility) { - permissions |= 0b001000000000; - } - if (permissionObject.documentAssembly) { - permissions |= 0b010000000000; - } - return permissions; -} -function getUserPasswordR2(encryptionKey) { - return rc4(processPasswordR2R3R4(), encryptionKey); -} -function getUserPasswordR3R4(documentId, encryptionKey) { - const key = encryptionKey.slice(); - let cipher = md5Hash(concatBytes(processPasswordR2R3R4(), new Uint8Array(documentId))); - for (let i = 0; i < 20; i++) { - const xorKey = new Uint8Array(key.length); - for (let j = 0; j < key.length; j++) { - xorKey[j] = encryptionKey[j] ^ i; - } - cipher = rc4(cipher, xorKey); - } - // Pad to 32 bytes - const result = new Uint8Array(32); - result.set(cipher); - return result; -} -function getOwnerPasswordR2R3R4(r, keyBits, paddedUserPassword, paddedOwnerPassword) { - let digest = paddedOwnerPassword; - let round = r >= 3 ? 51 : 1; - for (let i = 0; i < round; i++) { - digest = md5Hash(digest); - } - const keyLen = keyBits / 8; - let key = digest.slice(0, keyLen); - let cipher = paddedUserPassword; - round = r >= 3 ? 20 : 1; - for (let i = 0; i < round; i++) { - const xorKey = new Uint8Array(keyLen); - for (let j = 0; j < keyLen; j++) { - xorKey[j] = key[j] ^ i; - } - cipher = rc4(cipher, xorKey); - } - return cipher; -} -function getEncryptionKeyR2R3R4(r, keyBits, documentId, paddedUserPassword, ownerPasswordEntry, permissions) { - // Build input: password + owner entry + permissions (LSB first) + document ID - const permBytes = new Uint8Array([permissions & 0xff, permissions >> 8 & 0xff, permissions >> 16 & 0xff, permissions >> 24 & 0xff]); - let key = concatBytes(paddedUserPassword, ownerPasswordEntry, permBytes, new Uint8Array(documentId)); - const round = r >= 3 ? 51 : 1; - const keyLen = keyBits / 8; - for (let i = 0; i < round; i++) { - key = md5Hash(key); - key = key.slice(0, keyLen); - } - return key; -} -function getUserPasswordR5(processedUserPassword, generateRandomWordArray) { - const validationSalt = generateRandomWordArray(8); - const keySalt = generateRandomWordArray(8); - const hash = sha256Hash(concatBytes(processedUserPassword, validationSalt)); - return concatBytes(hash, validationSalt, keySalt); -} -function getUserEncryptionKeyR5(processedUserPassword, userKeySalt, encryptionKey) { - const key = sha256Hash(concatBytes(processedUserPassword, userKeySalt)); - const iv = new Uint8Array(16); // Zero IV - return aesCbcEncrypt(encryptionKey, key, iv, false); -} -function getOwnerPasswordR5(processedOwnerPassword, userPasswordEntry, generateRandomWordArray) { - const validationSalt = generateRandomWordArray(8); - const keySalt = generateRandomWordArray(8); - const hash = sha256Hash(concatBytes(processedOwnerPassword, validationSalt, userPasswordEntry)); - return concatBytes(hash, validationSalt, keySalt); -} -function getOwnerEncryptionKeyR5(processedOwnerPassword, ownerKeySalt, userPasswordEntry, encryptionKey) { - const key = sha256Hash(concatBytes(processedOwnerPassword, ownerKeySalt, userPasswordEntry)); - const iv = new Uint8Array(16); // Zero IV - return aesCbcEncrypt(encryptionKey, key, iv, false); -} -function getEncryptionKeyR5(generateRandomWordArray) { - return generateRandomWordArray(32); -} -function getEncryptedPermissionsR5(permissions, encryptionKey, generateRandomWordArray) { - // Build 16-byte block: permissions (4 bytes LSB) + 0xFFFFFFFF (4 bytes) + "adbT" (4 bytes) + random (4 bytes) - const data = new Uint8Array(16); - // Permissions (LSB first) - data[0] = permissions & 0xff; - data[1] = permissions >> 8 & 0xff; - data[2] = permissions >> 16 & 0xff; - data[3] = permissions >> 24 & 0xff; - // 0xFFFFFFFF - data[4] = 0xff; - data[5] = 0xff; - data[6] = 0xff; - data[7] = 0xff; - // "adbT" = 0x54616462 (but stored as individual bytes) - data[8] = 0x54; // 'T' - data[9] = 0x61; // 'a' - data[10] = 0x64; // 'd' - data[11] = 0x62; // 'b' - // Random 4 bytes - const randomPart = generateRandomWordArray(4); - data.set(randomPart, 12); - return aesEcbEncrypt(data, encryptionKey); -} -function processPasswordR2R3R4(password) { - if (password === void 0) { - password = ''; - } - const out = new Uint8Array(32); - const length = password.length; - let index = 0; - while (index < length && index < 32) { - const code = password.charCodeAt(index); - if (code > 0xff) { - throw new Error('Password contains one or more invalid characters.'); - } - out[index] = code; - index++; - } - while (index < 32) { - out[index] = PASSWORD_PADDING[index - length]; - index++; - } - return out; -} -function processPasswordR5(password) { - if (password === void 0) { - password = ''; - } - password = unescape(encodeURIComponent(saslprep(password))); - const length = Math.min(127, password.length); - const out = new Uint8Array(length); - for (let i = 0; i < length; i++) { - out[i] = password.charCodeAt(i); - } - return out; -} -const PASSWORD_PADDING = [0x28, 0xbf, 0x4e, 0x5e, 0x4e, 0x75, 0x8a, 0x41, 0x64, 0x00, 0x4e, 0x56, 0xff, 0xfa, 0x01, 0x08, 0x2e, 0x2e, 0x00, 0xb6, 0xd0, 0x68, 0x3e, 0x80, 0x2f, 0x0c, 0xa9, 0xfe, 0x64, 0x53, 0x69, 0x7a]; - -const { - number: number$2 -} = PDFObject; -let PDFGradient$1 = class PDFGradient { - constructor(doc) { - this.doc = doc; - this.stops = []; - this.embedded = false; - this.transform = [1, 0, 0, 1, 0, 0]; - } - stop(pos, color, opacity) { - if (opacity == null) { - opacity = 1; - } - color = this.doc._normalizeColor(color); - if (this.stops.length === 0) { - if (color.length === 3) { - this._colorSpace = 'DeviceRGB'; - } else if (color.length === 4) { - this._colorSpace = 'DeviceCMYK'; - } else if (color.length === 1) { - this._colorSpace = 'DeviceGray'; - } else { - throw new Error('Unknown color space'); - } - } else if (this._colorSpace === 'DeviceRGB' && color.length !== 3 || this._colorSpace === 'DeviceCMYK' && color.length !== 4 || this._colorSpace === 'DeviceGray' && color.length !== 1) { - throw new Error('All gradient stops must use the same color space'); - } - opacity = Math.max(0, Math.min(1, opacity)); - this.stops.push([pos, color, opacity]); - return this; - } - setTransform(m11, m12, m21, m22, dx, dy) { - this.transform = [m11, m12, m21, m22, dx, dy]; - return this; - } - embed(m) { - let fn; - const stopsLength = this.stops.length; - if (stopsLength === 0) { - return; - } - this.embedded = true; - this.matrix = m; - - // if the last stop comes before 100%, add a copy at 100% - const last = this.stops[stopsLength - 1]; - if (last[0] < 1) { - this.stops.push([1, last[1], last[2]]); - } - const bounds = []; - const encode = []; - const stops = []; - for (let i = 0; i < stopsLength - 1; i++) { - encode.push(0, 1); - if (i + 2 !== stopsLength) { - bounds.push(this.stops[i + 1][0]); - } - fn = this.doc.ref({ - FunctionType: 2, - Domain: [0, 1], - C0: this.stops[i + 0][1], - C1: this.stops[i + 1][1], - N: 1 - }); - stops.push(fn); - fn.end(); - } - - // if there are only two stops, we don't need a stitching function - if (stopsLength === 1) { - fn = stops[0]; - } else { - fn = this.doc.ref({ - FunctionType: 3, - // stitching function - Domain: [0, 1], - Functions: stops, - Bounds: bounds, - Encode: encode - }); - fn.end(); - } - this.id = `Sh${++this.doc._gradCount}`; - const shader = this.shader(fn); - shader.end(); - const pattern = this.doc.ref({ - Type: 'Pattern', - PatternType: 2, - Shading: shader, - Matrix: this.matrix.map(number$2) - }); - pattern.end(); - if (this.stops.some(stop => stop[2] < 1)) { - let grad = this.opacityGradient(); - grad._colorSpace = 'DeviceGray'; - for (let stop of this.stops) { - grad.stop(stop[0], [stop[2]]); - } - grad = grad.embed(this.matrix); - const pageBBox = [0, 0, this.doc.page.width, this.doc.page.height]; - const form = this.doc.ref({ - Type: 'XObject', - Subtype: 'Form', - FormType: 1, - BBox: pageBBox, - Group: { - Type: 'Group', - S: 'Transparency', - CS: 'DeviceGray' - }, - Resources: { - ProcSet: ['PDF', 'Text', 'ImageB', 'ImageC', 'ImageI'], - Pattern: { - Sh1: grad - } - } - }); - form.write('/Pattern cs /Sh1 scn'); - form.end(`${pageBBox.join(' ')} re f`); - const gstate = this.doc.ref({ - Type: 'ExtGState', - SMask: { - Type: 'Mask', - S: 'Luminosity', - G: form - } - }); - gstate.end(); - const opacityPattern = this.doc.ref({ - Type: 'Pattern', - PatternType: 1, - PaintType: 1, - TilingType: 2, - BBox: pageBBox, - XStep: pageBBox[2], - YStep: pageBBox[3], - Resources: { - ProcSet: ['PDF', 'Text', 'ImageB', 'ImageC', 'ImageI'], - Pattern: { - Sh1: pattern - }, - ExtGState: { - Gs1: gstate - } - } - }); - opacityPattern.write('/Gs1 gs /Pattern cs /Sh1 scn'); - opacityPattern.end(`${pageBBox.join(' ')} re f`); - this.doc.page.patterns[this.id] = opacityPattern; - } else { - this.doc.page.patterns[this.id] = pattern; - } - return pattern; - } - apply(stroke) { - // apply gradient transform to existing document ctm - const [m0, m1, m2, m3, m4, m5] = this.doc._ctm; - const [m11, m12, m21, m22, dx, dy] = this.transform; - const m = [m0 * m11 + m2 * m12, m1 * m11 + m3 * m12, m0 * m21 + m2 * m22, m1 * m21 + m3 * m22, m0 * dx + m2 * dy + m4, m1 * dx + m3 * dy + m5]; - if (!this.embedded || m.join(' ') !== this.matrix.join(' ')) { - this.embed(m); - } - this.doc._setColorSpace('Pattern', stroke); - const op = stroke ? 'SCN' : 'scn'; - return this.doc.addContent(`/${this.id} ${op}`); - } -}; -let PDFLinearGradient$1 = class PDFLinearGradient extends PDFGradient$1 { - constructor(doc, x1, y1, x2, y2) { - super(doc); - this.x1 = x1; - this.y1 = y1; - this.x2 = x2; - this.y2 = y2; - } - shader(fn) { - return this.doc.ref({ - ShadingType: 2, - ColorSpace: this._colorSpace, - Coords: [this.x1, this.y1, this.x2, this.y2], - Function: fn, - Extend: [true, true] - }); - } - opacityGradient() { - return new PDFLinearGradient(this.doc, this.x1, this.y1, this.x2, this.y2); - } -}; -let PDFRadialGradient$1 = class PDFRadialGradient extends PDFGradient$1 { - constructor(doc, x1, y1, r1, x2, y2, r2) { - super(doc); - this.doc = doc; - this.x1 = x1; - this.y1 = y1; - this.r1 = r1; - this.x2 = x2; - this.y2 = y2; - this.r2 = r2; - } - shader(fn) { - return this.doc.ref({ - ShadingType: 3, - ColorSpace: this._colorSpace, - Coords: [this.x1, this.y1, this.r1, this.x2, this.y2, this.r2], - Function: fn, - Extend: [true, true] - }); - } - opacityGradient() { - return new PDFRadialGradient(this.doc, this.x1, this.y1, this.r1, this.x2, this.y2, this.r2); - } -}; -var Gradient = { - PDFGradient: PDFGradient$1, - PDFLinearGradient: PDFLinearGradient$1, - PDFRadialGradient: PDFRadialGradient$1 -}; - -/* -PDF tiling pattern support. Uncolored only. - */ - -const underlyingColorSpaces = ['DeviceCMYK', 'DeviceRGB']; -let PDFTilingPattern$1 = class PDFTilingPattern { - constructor(doc, bBox, xStep, yStep, stream) { - this.doc = doc; - this.bBox = bBox; - this.xStep = xStep; - this.yStep = yStep; - this.stream = stream; - } - createPattern() { - // no resources needed for our current usage - // required entry - const resources = this.doc.ref(); - resources.end(); - // apply default transform matrix (flipped in the default doc._ctm) - // see document.js & gradient.js - const [m0, m1, m2, m3, m4, m5] = this.doc._ctm; - const [m11, m12, m21, m22, dx, dy] = [1, 0, 0, 1, 0, 0]; - const m = [m0 * m11 + m2 * m12, m1 * m11 + m3 * m12, m0 * m21 + m2 * m22, m1 * m21 + m3 * m22, m0 * dx + m2 * dy + m4, m1 * dx + m3 * dy + m5]; - const pattern = this.doc.ref({ - Type: 'Pattern', - PatternType: 1, - // tiling - PaintType: 2, - // 1-colored, 2-uncolored - TilingType: 2, - // 2-no distortion - BBox: this.bBox, - XStep: this.xStep, - YStep: this.yStep, - Matrix: m.map(v => +v.toFixed(5)), - Resources: resources - }); - pattern.end(this.stream); - return pattern; - } - embedPatternColorSpaces() { - // map each pattern to an underlying color space - // and embed on each page - underlyingColorSpaces.forEach(csName => { - const csId = this.getPatternColorSpaceId(csName); - if (this.doc.page.colorSpaces[csId]) return; - const cs = this.doc.ref(['Pattern', csName]); - cs.end(); - this.doc.page.colorSpaces[csId] = cs; - }); - } - getPatternColorSpaceId(underlyingColorspace) { - return `CsP${underlyingColorspace}`; - } - embed() { - if (!this.id) { - this.doc._patternCount = this.doc._patternCount + 1; - this.id = 'P' + this.doc._patternCount; - this.pattern = this.createPattern(); - } - - // patterns are embedded in each page - if (!this.doc.page.patterns[this.id]) { - this.doc.page.patterns[this.id] = this.pattern; - } - } - apply(stroke, patternColor) { - // do any embedding/creating that might be needed - this.embedPatternColorSpaces(); - this.embed(); - const normalizedColor = this.doc._normalizeColor(patternColor); - if (!normalizedColor) throw Error(`invalid pattern color. (value: ${patternColor})`); - - // select one of the pattern color spaces - const csId = this.getPatternColorSpaceId(this.doc._getColorSpace(normalizedColor)); - this.doc._setColorSpace(csId, stroke); - - // stroke/fill using the pattern and color (in the above underlying color space) - const op = stroke ? 'SCN' : 'scn'; - return this.doc.addContent(`${normalizedColor.join(' ')} /${this.id} ${op}`); - } -}; -var pattern = { - PDFTilingPattern: PDFTilingPattern$1 -}; - -class SpotColor { - constructor(doc, name, C, M, Y, K) { - this.id = 'CS' + Object.keys(doc.spotColors).length; - this.name = name; - this.values = [C, M, Y, K]; - this.ref = doc.ref(['Separation', this.name, 'DeviceCMYK', { - Range: [0, 1, 0, 1, 0, 1, 0, 1], - C0: [0, 0, 0, 0], - C1: this.values.map(value => value / 100), - FunctionType: 2, - Domain: [0, 1], - N: 1 - }]); - this.ref.end(); - } - toString() { - return `${this.ref.id} 0 R`; - } -} - -const { - PDFGradient, - PDFLinearGradient, - PDFRadialGradient -} = Gradient; -const { - PDFTilingPattern -} = pattern; -var ColorMixin = { - initColor() { - this.spotColors = {}; - // The opacity dictionaries - this._opacityRegistry = {}; - this._opacityCount = 0; - this._patternCount = 0; - return this._gradCount = 0; - }, - _normalizeColor(color) { - if (typeof color === 'string') { - if (color.charAt(0) === '#') { - if (color.length === 4) { - color = color.replace(/#([0-9A-F])([0-9A-F])([0-9A-F])/i, '#$1$1$2$2$3$3'); - } - const hex = parseInt(color.slice(1), 16); - color = [hex >> 16, hex >> 8 & 0xff, hex & 0xff]; - } else if (namedColors[color]) { - color = namedColors[color]; - } else if (this.spotColors[color]) { - return this.spotColors[color]; - } - } - if (Array.isArray(color)) { - // RGB - if (color.length === 3) { - color = color.map(part => part / 255); - // CMYK - } else if (color.length === 4) { - color = color.map(part => part / 100); - } - return color; - } - return null; - }, - _setColor(color, stroke) { - if (color instanceof PDFGradient) { - color.apply(stroke); - return true; - // see if tiling pattern, decode & apply it it - } else if (Array.isArray(color) && color[0] instanceof PDFTilingPattern) { - color[0].apply(stroke, color[1]); - return true; - } - // any other case should be a normal color and not a pattern - return this._setColorCore(color, stroke); - }, - _setColorCore(color, stroke) { - color = this._normalizeColor(color); - if (!color) { - return false; - } - const op = stroke ? 'SCN' : 'scn'; - const space = this._getColorSpace(color); - this._setColorSpace(space, stroke); - if (color instanceof SpotColor) { - this.page.colorSpaces[color.id] = color.ref; - this.addContent(`1 ${op}`); - } else { - this.addContent(`${color.join(' ')} ${op}`); - } - return true; - }, - _setColorSpace(space, stroke) { - const op = stroke ? 'CS' : 'cs'; - return this.addContent(`/${space} ${op}`); - }, - _getColorSpace(color) { - if (color instanceof SpotColor) { - return color.id; - } - return color.length === 4 ? 'DeviceCMYK' : 'DeviceRGB'; - }, - fillColor(color, opacity) { - const set = this._setColor(color, false); - if (set) { - this.fillOpacity(opacity); - } - - // save this for text wrapper, which needs to reset - // the fill color on new pages - this._fillColor = [color, opacity]; - return this; - }, - strokeColor(color, opacity) { - const set = this._setColor(color, true); - if (set) { - this.strokeOpacity(opacity); - } - return this; - }, - opacity(opacity) { - this._doOpacity(opacity, opacity); - return this; - }, - fillOpacity(opacity) { - this._doOpacity(opacity, null); - return this; - }, - strokeOpacity(opacity) { - this._doOpacity(null, opacity); - return this; - }, - _doOpacity(fillOpacity, strokeOpacity) { - let dictionary, name; - if (fillOpacity == null && strokeOpacity == null) { - return; - } - if (fillOpacity != null) { - fillOpacity = Math.max(0, Math.min(1, fillOpacity)); - } - if (strokeOpacity != null) { - strokeOpacity = Math.max(0, Math.min(1, strokeOpacity)); - } - const key = `${fillOpacity}_${strokeOpacity}`; - if (this._opacityRegistry[key]) { - [dictionary, name] = this._opacityRegistry[key]; - } else { - dictionary = { - Type: 'ExtGState' - }; - if (fillOpacity != null) { - dictionary.ca = fillOpacity; - } - if (strokeOpacity != null) { - dictionary.CA = strokeOpacity; - } - dictionary = this.ref(dictionary); - dictionary.end(); - const id = ++this._opacityCount; - name = `Gs${id}`; - this._opacityRegistry[key] = [dictionary, name]; - } - this.page.ext_gstates[name] = dictionary; - return this.addContent(`/${name} gs`); - }, - linearGradient(x1, y1, x2, y2) { - return new PDFLinearGradient(this, x1, y1, x2, y2); - }, - radialGradient(x1, y1, r1, x2, y2, r2) { - return new PDFRadialGradient(this, x1, y1, r1, x2, y2, r2); - }, - pattern(bbox, xStep, yStep, stream) { - return new PDFTilingPattern(this, bbox, xStep, yStep, stream); - }, - addSpotColor(name, C, M, Y, K) { - const color = new SpotColor(this, name, C, M, Y, K); - this.spotColors[name] = color; - return this; - } -}; -var namedColors = { - aliceblue: [240, 248, 255], - antiquewhite: [250, 235, 215], - aqua: [0, 255, 255], - aquamarine: [127, 255, 212], - azure: [240, 255, 255], - beige: [245, 245, 220], - bisque: [255, 228, 196], - black: [0, 0, 0], - blanchedalmond: [255, 235, 205], - blue: [0, 0, 255], - blueviolet: [138, 43, 226], - brown: [165, 42, 42], - burlywood: [222, 184, 135], - cadetblue: [95, 158, 160], - chartreuse: [127, 255, 0], - chocolate: [210, 105, 30], - coral: [255, 127, 80], - cornflowerblue: [100, 149, 237], - cornsilk: [255, 248, 220], - crimson: [220, 20, 60], - cyan: [0, 255, 255], - darkblue: [0, 0, 139], - darkcyan: [0, 139, 139], - darkgoldenrod: [184, 134, 11], - darkgray: [169, 169, 169], - darkgreen: [0, 100, 0], - darkgrey: [169, 169, 169], - darkkhaki: [189, 183, 107], - darkmagenta: [139, 0, 139], - darkolivegreen: [85, 107, 47], - darkorange: [255, 140, 0], - darkorchid: [153, 50, 204], - darkred: [139, 0, 0], - darksalmon: [233, 150, 122], - darkseagreen: [143, 188, 143], - darkslateblue: [72, 61, 139], - darkslategray: [47, 79, 79], - darkslategrey: [47, 79, 79], - darkturquoise: [0, 206, 209], - darkviolet: [148, 0, 211], - deeppink: [255, 20, 147], - deepskyblue: [0, 191, 255], - dimgray: [105, 105, 105], - dimgrey: [105, 105, 105], - dodgerblue: [30, 144, 255], - firebrick: [178, 34, 34], - floralwhite: [255, 250, 240], - forestgreen: [34, 139, 34], - fuchsia: [255, 0, 255], - gainsboro: [220, 220, 220], - ghostwhite: [248, 248, 255], - gold: [255, 215, 0], - goldenrod: [218, 165, 32], - gray: [128, 128, 128], - grey: [128, 128, 128], - green: [0, 128, 0], - greenyellow: [173, 255, 47], - honeydew: [240, 255, 240], - hotpink: [255, 105, 180], - indianred: [205, 92, 92], - indigo: [75, 0, 130], - ivory: [255, 255, 240], - khaki: [240, 230, 140], - lavender: [230, 230, 250], - lavenderblush: [255, 240, 245], - lawngreen: [124, 252, 0], - lemonchiffon: [255, 250, 205], - lightblue: [173, 216, 230], - lightcoral: [240, 128, 128], - lightcyan: [224, 255, 255], - lightgoldenrodyellow: [250, 250, 210], - lightgray: [211, 211, 211], - lightgreen: [144, 238, 144], - lightgrey: [211, 211, 211], - lightpink: [255, 182, 193], - lightsalmon: [255, 160, 122], - lightseagreen: [32, 178, 170], - lightskyblue: [135, 206, 250], - lightslategray: [119, 136, 153], - lightslategrey: [119, 136, 153], - lightsteelblue: [176, 196, 222], - lightyellow: [255, 255, 224], - lime: [0, 255, 0], - limegreen: [50, 205, 50], - linen: [250, 240, 230], - magenta: [255, 0, 255], - maroon: [128, 0, 0], - mediumaquamarine: [102, 205, 170], - mediumblue: [0, 0, 205], - mediumorchid: [186, 85, 211], - mediumpurple: [147, 112, 219], - mediumseagreen: [60, 179, 113], - mediumslateblue: [123, 104, 238], - mediumspringgreen: [0, 250, 154], - mediumturquoise: [72, 209, 204], - mediumvioletred: [199, 21, 133], - midnightblue: [25, 25, 112], - mintcream: [245, 255, 250], - mistyrose: [255, 228, 225], - moccasin: [255, 228, 181], - navajowhite: [255, 222, 173], - navy: [0, 0, 128], - oldlace: [253, 245, 230], - olive: [128, 128, 0], - olivedrab: [107, 142, 35], - orange: [255, 165, 0], - orangered: [255, 69, 0], - orchid: [218, 112, 214], - palegoldenrod: [238, 232, 170], - palegreen: [152, 251, 152], - paleturquoise: [175, 238, 238], - palevioletred: [219, 112, 147], - papayawhip: [255, 239, 213], - peachpuff: [255, 218, 185], - peru: [205, 133, 63], - pink: [255, 192, 203], - plum: [221, 160, 221], - powderblue: [176, 224, 230], - purple: [128, 0, 128], - red: [255, 0, 0], - rosybrown: [188, 143, 143], - royalblue: [65, 105, 225], - saddlebrown: [139, 69, 19], - salmon: [250, 128, 114], - sandybrown: [244, 164, 96], - seagreen: [46, 139, 87], - seashell: [255, 245, 238], - sienna: [160, 82, 45], - silver: [192, 192, 192], - skyblue: [135, 206, 235], - slateblue: [106, 90, 205], - slategray: [112, 128, 144], - slategrey: [112, 128, 144], - snow: [255, 250, 250], - springgreen: [0, 255, 127], - steelblue: [70, 130, 180], - tan: [210, 180, 140], - teal: [0, 128, 128], - thistle: [216, 191, 216], - tomato: [255, 99, 71], - turquoise: [64, 224, 208], - violet: [238, 130, 238], - wheat: [245, 222, 179], - white: [255, 255, 255], - whitesmoke: [245, 245, 245], - yellow: [255, 255, 0], - yellowgreen: [154, 205, 50] -}; - -let cx; -let cy; -let px; -let py; -let sx; -let sy; -cx = cy = px = py = sx = sy = 0; - -// parseDataPath copy pasted from svgo -// https://github.com/svg/svgo/blob/e4918ccdd1a2b5831defe0f00c1286744b479448/lib/path.js - -/** - * @typedef {'M' | 'm' | 'Z' | 'z' | 'L' | 'l' | 'H' | 'h' | 'V' | 'v' | 'C' | 'c' | 'S' | 's' | 'Q' | 'q' | 'T' | 't' | 'A' | 'a'} PathDataCommand - */ - -/** - * @typedef {Object} PathDataItem - * @property {PathDataCommand} command - * @property {number[]} args - */ - -const argsCountPerCommand = { - M: 2, - m: 2, - Z: 0, - z: 0, - L: 2, - l: 2, - H: 1, - h: 1, - V: 1, - v: 1, - C: 6, - c: 6, - S: 4, - s: 4, - Q: 4, - q: 4, - T: 2, - t: 2, - A: 7, - a: 7 -}; - -/** - * @type {(c: string) => c is PathDataCommand} - */ -const isCommand = c => { - return c in argsCountPerCommand; -}; - -/** - * @type {(c: string) => boolean} - */ -const isWsp = c => { - const codePoint = c.codePointAt(0); - return codePoint === 0x20 || codePoint === 0x9 || codePoint === 0xd || codePoint === 0xa; -}; - -/** - * @type {(c: string) => boolean} - */ -const isDigit = c => { - const codePoint = c.codePointAt(0); - if (codePoint == null) { - return false; - } - return 48 <= codePoint && codePoint <= 57; -}; - -/** - * @typedef {'none' | 'sign' | 'whole' | 'decimal_point' | 'decimal' | 'e' | 'exponent_sign' | 'exponent'} ReadNumberState - */ - -/** - * @type {(string: string, cursor: number) => [number, number | null]} - */ -const readNumber = (string, cursor) => { - let i = cursor; - let value = ''; - let state = /** @type {ReadNumberState} */'none'; - for (; i < string.length; i += 1) { - const c = string[i]; - if (c === '+' || c === '-') { - if (state === 'none') { - state = 'sign'; - value += c; - continue; - } - if (state === 'e') { - state = 'exponent_sign'; - value += c; - continue; - } - } - if (isDigit(c)) { - if (state === 'none' || state === 'sign' || state === 'whole') { - state = 'whole'; - value += c; - continue; - } - if (state === 'decimal_point' || state === 'decimal') { - state = 'decimal'; - value += c; - continue; - } - if (state === 'e' || state === 'exponent_sign' || state === 'exponent') { - state = 'exponent'; - value += c; - continue; - } - } - if (c === '.') { - if (state === 'none' || state === 'sign' || state === 'whole') { - state = 'decimal_point'; - value += c; - continue; - } - } - if (c === 'E' || c === 'e') { - if (state === 'whole' || state === 'decimal_point' || state === 'decimal') { - state = 'e'; - value += c; - continue; - } - } - break; - } - const number = Number.parseFloat(value); - if (Number.isNaN(number)) { - return [cursor, null]; - } - // step back to delegate iteration to parent loop - return [i - 1, number]; -}; - -/** - * @type {(string: string) => Array} - */ -const parsePathData = string => { - /** - * @type {Array} - */ - const pathData = []; - /** - * @type {null | PathDataCommand} - */ - let command = null; - let args = /** @type {number[]} */[]; - let argsCount = 0; - let canHaveComma = false; - let hadComma = false; - for (let i = 0; i < string.length; i += 1) { - const c = string.charAt(i); - if (isWsp(c)) { - continue; - } - // allow comma only between arguments - if (canHaveComma && c === ',') { - if (hadComma) { - break; - } - hadComma = true; - continue; - } - if (isCommand(c)) { - if (hadComma) { - return pathData; - } - if (command == null) { - // moveto should be leading command - if (c !== 'M' && c !== 'm') { - return pathData; - } - } else { - // stop if previous command arguments are not flushed - if (args.length !== 0) { - return pathData; - } - } - command = c; - args = []; - argsCount = argsCountPerCommand[command]; - canHaveComma = false; - // flush command without arguments - if (argsCount === 0) { - pathData.push({ - command, - args - }); - } - continue; - } - // avoid parsing arguments if no command detected - if (command == null) { - return pathData; - } - // read next argument - let newCursor = i; - let number = null; - if (command === 'A' || command === 'a') { - const position = args.length; - if (position === 0 || position === 1) { - // allow only positive number without sign as first two arguments - if (c !== '+' && c !== '-') { - [newCursor, number] = readNumber(string, i); - } - } - if (position === 2 || position === 5 || position === 6) { - [newCursor, number] = readNumber(string, i); - } - if (position === 3 || position === 4) { - // read flags - if (c === '0') { - number = 0; - } - if (c === '1') { - number = 1; - } - } - } else { - [newCursor, number] = readNumber(string, i); - } - if (number == null) { - return pathData; - } - args.push(number); - canHaveComma = true; - hadComma = false; - i = newCursor; - // flush arguments when necessary count is reached - if (args.length === argsCount) { - pathData.push({ - command, - args - }); - // subsequent moveto coordinates are threated as implicit lineto commands - if (command === 'M') { - command = 'L'; - } - if (command === 'm') { - command = 'l'; - } - args = []; - } - } - return pathData; -}; -const apply = function (commands, doc) { - // current point, control point, and subpath starting point - cx = cy = px = py = sx = sy = 0; - - // run the commands - for (let i = 0; i < commands.length; i++) { - const { - command, - args - } = commands[i]; - if (typeof runners[command] === 'function') { - runners[command](doc, args); - } - } -}; -const runners = { - M(doc, a) { - cx = a[0]; - cy = a[1]; - px = py = null; - sx = cx; - sy = cy; - return doc.moveTo(cx, cy); - }, - m(doc, a) { - cx += a[0]; - cy += a[1]; - px = py = null; - sx = cx; - sy = cy; - return doc.moveTo(cx, cy); - }, - C(doc, a) { - cx = a[4]; - cy = a[5]; - px = a[2]; - py = a[3]; - return doc.bezierCurveTo(...a); - }, - c(doc, a) { - doc.bezierCurveTo(a[0] + cx, a[1] + cy, a[2] + cx, a[3] + cy, a[4] + cx, a[5] + cy); - px = cx + a[2]; - py = cy + a[3]; - cx += a[4]; - return cy += a[5]; - }, - S(doc, a) { - if (px === null) { - px = cx; - py = cy; - } - doc.bezierCurveTo(cx - (px - cx), cy - (py - cy), a[0], a[1], a[2], a[3]); - px = a[0]; - py = a[1]; - cx = a[2]; - return cy = a[3]; - }, - s(doc, a) { - if (px === null) { - px = cx; - py = cy; - } - doc.bezierCurveTo(cx - (px - cx), cy - (py - cy), cx + a[0], cy + a[1], cx + a[2], cy + a[3]); - px = cx + a[0]; - py = cy + a[1]; - cx += a[2]; - return cy += a[3]; - }, - Q(doc, a) { - px = a[0]; - py = a[1]; - cx = a[2]; - cy = a[3]; - return doc.quadraticCurveTo(a[0], a[1], cx, cy); - }, - q(doc, a) { - doc.quadraticCurveTo(a[0] + cx, a[1] + cy, a[2] + cx, a[3] + cy); - px = cx + a[0]; - py = cy + a[1]; - cx += a[2]; - return cy += a[3]; - }, - T(doc, a) { - if (px === null) { - px = cx; - py = cy; - } else { - px = cx - (px - cx); - py = cy - (py - cy); - } - doc.quadraticCurveTo(px, py, a[0], a[1]); - cx = a[0]; - return cy = a[1]; - }, - t(doc, a) { - if (px === null) { - px = cx; - py = cy; - } else { - px = cx - (px - cx); - py = cy - (py - cy); - } - doc.quadraticCurveTo(px, py, cx + a[0], cy + a[1]); - cx += a[0]; - return cy += a[1]; - }, - A(doc, a) { - solveArc(doc, cx, cy, a); - cx = a[5]; - return cy = a[6]; - }, - a(doc, a) { - a[5] += cx; - a[6] += cy; - solveArc(doc, cx, cy, a); - cx = a[5]; - return cy = a[6]; - }, - L(doc, a) { - cx = a[0]; - cy = a[1]; - px = py = null; - return doc.lineTo(cx, cy); - }, - l(doc, a) { - cx += a[0]; - cy += a[1]; - px = py = null; - return doc.lineTo(cx, cy); - }, - H(doc, a) { - cx = a[0]; - px = py = null; - return doc.lineTo(cx, cy); - }, - h(doc, a) { - cx += a[0]; - px = py = null; - return doc.lineTo(cx, cy); - }, - V(doc, a) { - cy = a[0]; - px = py = null; - return doc.lineTo(cx, cy); - }, - v(doc, a) { - cy += a[0]; - px = py = null; - return doc.lineTo(cx, cy); - }, - Z(doc) { - doc.closePath(); - cx = sx; - return cy = sy; - }, - z(doc) { - doc.closePath(); - cx = sx; - return cy = sy; - } -}; -const solveArc = function (doc, x, y, coords) { - const [rx, ry, rot, large, sweep, ex, ey] = coords; - const segs = arcToSegments(ex, ey, rx, ry, large, sweep, rot, x, y); - for (let seg of segs) { - const bez = segmentToBezier(...seg); - doc.bezierCurveTo(...bez); - } -}; - -// from Inkscape svgtopdf, thanks! -const arcToSegments = function (x, y, rx, ry, large, sweep, rotateX, ox, oy) { - const th = rotateX * (Math.PI / 180); - const sin_th = Math.sin(th); - const cos_th = Math.cos(th); - rx = Math.abs(rx); - ry = Math.abs(ry); - px = cos_th * (ox - x) * 0.5 + sin_th * (oy - y) * 0.5; - py = cos_th * (oy - y) * 0.5 - sin_th * (ox - x) * 0.5; - let pl = px * px / (rx * rx) + py * py / (ry * ry); - if (pl > 1) { - pl = Math.sqrt(pl); - rx *= pl; - ry *= pl; - } - const a00 = cos_th / rx; - const a01 = sin_th / rx; - const a10 = -sin_th / ry; - const a11 = cos_th / ry; - const x0 = a00 * ox + a01 * oy; - const y0 = a10 * ox + a11 * oy; - const x1 = a00 * x + a01 * y; - const y1 = a10 * x + a11 * y; - const d = (x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0); - let sfactor_sq = 1 / d - 0.25; - if (sfactor_sq < 0) { - sfactor_sq = 0; - } - let sfactor = Math.sqrt(sfactor_sq); - if (sweep === large) { - sfactor = -sfactor; - } - const xc = 0.5 * (x0 + x1) - sfactor * (y1 - y0); - const yc = 0.5 * (y0 + y1) + sfactor * (x1 - x0); - const th0 = Math.atan2(y0 - yc, x0 - xc); - const th1 = Math.atan2(y1 - yc, x1 - xc); - let th_arc = th1 - th0; - if (th_arc < 0 && sweep === 1) { - th_arc += 2 * Math.PI; - } else if (th_arc > 0 && sweep === 0) { - th_arc -= 2 * Math.PI; - } - const segments = Math.ceil(Math.abs(th_arc / (Math.PI * 0.5 + 0.001))); - const result = []; - for (let i = 0; i < segments; i++) { - const th2 = th0 + i * th_arc / segments; - const th3 = th0 + (i + 1) * th_arc / segments; - result[i] = [xc, yc, th2, th3, rx, ry, sin_th, cos_th]; - } - return result; -}; -const segmentToBezier = function (cx, cy, th0, th1, rx, ry, sin_th, cos_th) { - const a00 = cos_th * rx; - const a01 = -sin_th * ry; - const a10 = sin_th * rx; - const a11 = cos_th * ry; - const th_half = 0.5 * (th1 - th0); - const t = 8 / 3 * Math.sin(th_half * 0.5) * Math.sin(th_half * 0.5) / Math.sin(th_half); - const x1 = cx + Math.cos(th0) - t * Math.sin(th0); - const y1 = cy + Math.sin(th0) + t * Math.cos(th0); - const x3 = cx + Math.cos(th1); - const y3 = cy + Math.sin(th1); - const x2 = x3 + t * Math.sin(th1); - const y2 = y3 - t * Math.cos(th1); - return [a00 * x1 + a01 * y1, a10 * x1 + a11 * y1, a00 * x2 + a01 * y2, a10 * x2 + a11 * y2, a00 * x3 + a01 * y3, a10 * x3 + a11 * y3]; -}; -class SVGPath { - static apply(doc, path) { - const commands = parsePathData(path); - apply(commands, doc); - } -} - -const { - number: number$1 -} = PDFObject; - -// This constant is used to approximate a symmetrical arc using a cubic -// Bezier curve. -const KAPPA = 4.0 * ((Math.sqrt(2) - 1.0) / 3.0); -var VectorMixin = { - initVector() { - this._ctm = [1, 0, 0, 1, 0, 0]; // current transformation matrix - return this._ctmStack = []; - }, - save() { - this._ctmStack.push(this._ctm.slice()); - // TODO: save/restore colorspace and styles so not setting it unnessesarily all the time? - return this.addContent('q'); - }, - restore() { - this._ctm = this._ctmStack.pop() || [1, 0, 0, 1, 0, 0]; - return this.addContent('Q'); - }, - closePath() { - return this.addContent('h'); - }, - lineWidth(w) { - return this.addContent(`${number$1(w)} w`); - }, - _CAP_STYLES: { - BUTT: 0, - ROUND: 1, - SQUARE: 2 - }, - lineCap(c) { - if (typeof c === 'string') { - c = this._CAP_STYLES[c.toUpperCase()]; - } - return this.addContent(`${c} J`); - }, - _JOIN_STYLES: { - MITER: 0, - ROUND: 1, - BEVEL: 2 - }, - lineJoin(j) { - if (typeof j === 'string') { - j = this._JOIN_STYLES[j.toUpperCase()]; - } - return this.addContent(`${j} j`); - }, - miterLimit(m) { - return this.addContent(`${number$1(m)} M`); - }, - dash(length, options) { - if (options === void 0) { - options = {}; - } - const originalLength = length; - if (!Array.isArray(length)) { - length = [length, options.space || length]; - } - const valid = length.every(x => Number.isFinite(x) && x > 0); - if (!valid) { - throw new Error(`dash(${JSON.stringify(originalLength)}, ${JSON.stringify(options)}) invalid, lengths must be numeric and greater than zero`); - } - length = length.map(number$1).join(' '); - return this.addContent(`[${length}] ${number$1(options.phase || 0)} d`); - }, - undash() { - return this.addContent('[] 0 d'); - }, - moveTo(x, y) { - return this.addContent(`${number$1(x)} ${number$1(y)} m`); - }, - lineTo(x, y) { - return this.addContent(`${number$1(x)} ${number$1(y)} l`); - }, - bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y) { - return this.addContent(`${number$1(cp1x)} ${number$1(cp1y)} ${number$1(cp2x)} ${number$1(cp2y)} ${number$1(x)} ${number$1(y)} c`); - }, - quadraticCurveTo(cpx, cpy, x, y) { - return this.addContent(`${number$1(cpx)} ${number$1(cpy)} ${number$1(x)} ${number$1(y)} v`); - }, - rect(x, y, w, h) { - return this.addContent(`${number$1(x)} ${number$1(y)} ${number$1(w)} ${number$1(h)} re`); - }, - roundedRect(x, y, w, h, r) { - if (r == null) { - r = 0; - } - r = Math.min(r, 0.5 * w, 0.5 * h); - - // amount to inset control points from corners (see `ellipse`) - const c = r * (1.0 - KAPPA); - this.moveTo(x + r, y); - this.lineTo(x + w - r, y); - this.bezierCurveTo(x + w - c, y, x + w, y + c, x + w, y + r); - this.lineTo(x + w, y + h - r); - this.bezierCurveTo(x + w, y + h - c, x + w - c, y + h, x + w - r, y + h); - this.lineTo(x + r, y + h); - this.bezierCurveTo(x + c, y + h, x, y + h - c, x, y + h - r); - this.lineTo(x, y + r); - this.bezierCurveTo(x, y + c, x + c, y, x + r, y); - return this.closePath(); - }, - ellipse(x, y, r1, r2) { - // based on http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas/2173084#2173084 - if (r2 == null) { - r2 = r1; - } - x -= r1; - y -= r2; - const ox = r1 * KAPPA; - const oy = r2 * KAPPA; - const xe = x + r1 * 2; - const ye = y + r2 * 2; - const xm = x + r1; - const ym = y + r2; - this.moveTo(x, ym); - this.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); - this.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); - this.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); - this.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); - return this.closePath(); - }, - circle(x, y, radius) { - return this.ellipse(x, y, radius); - }, - arc(x, y, radius, startAngle, endAngle, anticlockwise) { - if (anticlockwise == null) { - anticlockwise = false; - } - const TWO_PI = 2.0 * Math.PI; - const HALF_PI = 0.5 * Math.PI; - let deltaAng = endAngle - startAngle; - if (Math.abs(deltaAng) > TWO_PI) { - // draw only full circle if more than that is specified - deltaAng = TWO_PI; - } else if (deltaAng !== 0 && anticlockwise !== deltaAng < 0) { - // necessary to flip direction of rendering - const dir = anticlockwise ? -1 : 1; - deltaAng = dir * TWO_PI + deltaAng; - } - const numSegs = Math.ceil(Math.abs(deltaAng) / HALF_PI); - const segAng = deltaAng / numSegs; - const handleLen = segAng / HALF_PI * KAPPA * radius; - let curAng = startAngle; - - // component distances between anchor point and control point - let deltaCx = -Math.sin(curAng) * handleLen; - let deltaCy = Math.cos(curAng) * handleLen; - - // anchor point - let ax = x + Math.cos(curAng) * radius; - let ay = y + Math.sin(curAng) * radius; - - // calculate and render segments - this.moveTo(ax, ay); - for (let segIdx = 0; segIdx < numSegs; segIdx++) { - // starting control point - const cp1x = ax + deltaCx; - const cp1y = ay + deltaCy; - - // step angle - curAng += segAng; - - // next anchor point - ax = x + Math.cos(curAng) * radius; - ay = y + Math.sin(curAng) * radius; - - // next control point delta - deltaCx = -Math.sin(curAng) * handleLen; - deltaCy = Math.cos(curAng) * handleLen; - - // ending control point - const cp2x = ax - deltaCx; - const cp2y = ay - deltaCy; - - // render segment - this.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, ax, ay); - } - return this; - }, - polygon() { - for (var _len = arguments.length, points = new Array(_len), _key = 0; _key < _len; _key++) { - points[_key] = arguments[_key]; - } - this.moveTo(...(points.shift() || [])); - for (let point of points) { - this.lineTo(...(point || [])); - } - return this.closePath(); - }, - path(path) { - SVGPath.apply(this, path); - return this; - }, - _windingRule(rule) { - if (/even-?odd/.test(rule)) { - return '*'; - } - return ''; - }, - fill(color, rule) { - if (/(even-?odd)|(non-?zero)/.test(color)) { - rule = color; - color = null; - } - if (color) { - this.fillColor(color); - } - return this.addContent(`f${this._windingRule(rule)}`); - }, - stroke(color) { - if (color) { - this.strokeColor(color); - } - return this.addContent('S'); - }, - fillAndStroke(fillColor, strokeColor, rule) { - if (strokeColor == null) { - strokeColor = fillColor; - } - const isFillRule = /(even-?odd)|(non-?zero)/; - if (isFillRule.test(fillColor)) { - rule = fillColor; - fillColor = null; - } - if (isFillRule.test(strokeColor)) { - rule = strokeColor; - strokeColor = fillColor; - } - if (fillColor) { - this.fillColor(fillColor); - this.strokeColor(strokeColor); - } - return this.addContent(`B${this._windingRule(rule)}`); - }, - clip(rule) { - return this.addContent(`W${this._windingRule(rule)} n`); - }, - transform(m11, m12, m21, m22, dx, dy) { - // keep track of the current transformation matrix - if (m11 === 1 && m12 === 0 && m21 === 0 && m22 === 1 && dx === 0 && dy === 0) { - // Ignore identity transforms - return this; - } - const m = this._ctm; - const [m0, m1, m2, m3, m4, m5] = m; - m[0] = m0 * m11 + m2 * m12; - m[1] = m1 * m11 + m3 * m12; - m[2] = m0 * m21 + m2 * m22; - m[3] = m1 * m21 + m3 * m22; - m[4] = m0 * dx + m2 * dy + m4; - m[5] = m1 * dx + m3 * dy + m5; - const values = [m11, m12, m21, m22, dx, dy].map(v => number$1(v)).join(' '); - return this.addContent(`${values} cm`); - }, - translate(x, y) { - return this.transform(1, 0, 0, 1, x, y); - }, - rotate(angle, options) { - if (options === void 0) { - options = {}; - } - let y; - const rad = angle * Math.PI / 180; - const cos = Math.cos(rad); - const sin = Math.sin(rad); - let x = y = 0; - if (options.origin != null) { - [x, y] = options.origin; - const x1 = x * cos - y * sin; - const y1 = x * sin + y * cos; - x -= x1; - y -= y1; - } - return this.transform(cos, sin, -sin, cos, x, y); - }, - scale(xFactor, yFactor, options) { - if (options === void 0) { - options = {}; - } - let y; - if (yFactor == null) { - yFactor = xFactor; - } - if (typeof yFactor === 'object') { - options = yFactor; - yFactor = xFactor; - } - let x = y = 0; - if (options.origin != null) { - [x, y] = options.origin; - x -= xFactor * x; - y -= yFactor * y; - } - return this.transform(xFactor, 0, 0, yFactor, x, y); - } -}; - -var fs = {}; - -const range = (left, right, inclusive) => { - let range = []; - let end = right + 1 ; - for (let i = left; i < end ; i++ ) { - range.push(i); - } - return range; -}; - -const WIN_ANSI_MAP = { - 402: 131, - 8211: 150, - 8212: 151, - 8216: 145, - 8217: 146, - 8218: 130, - 8220: 147, - 8221: 148, - 8222: 132, - 8224: 134, - 8225: 135, - 8226: 149, - 8230: 133, - 8364: 128, - 8240: 137, - 8249: 139, - 8250: 155, - 710: 136, - 8482: 153, - 338: 140, - 339: 156, - 732: 152, - 352: 138, - 353: 154, - 376: 159, - 381: 142, - 382: 158 -}; -const characters = `\ -.notdef .notdef .notdef .notdef -.notdef .notdef .notdef .notdef -.notdef .notdef .notdef .notdef -.notdef .notdef .notdef .notdef -.notdef .notdef .notdef .notdef -.notdef .notdef .notdef .notdef -.notdef .notdef .notdef .notdef -.notdef .notdef .notdef .notdef - -space exclam quotedbl numbersign -dollar percent ampersand quotesingle -parenleft parenright asterisk plus -comma hyphen period slash -zero one two three -four five six seven -eight nine colon semicolon -less equal greater question - -at A B C -D E F G -H I J K -L M N O -P Q R S -T U V W -X Y Z bracketleft -backslash bracketright asciicircum underscore - -grave a b c -d e f g -h i j k -l m n o -p q r s -t u v w -x y z braceleft -bar braceright asciitilde .notdef - -Euro .notdef quotesinglbase florin -quotedblbase ellipsis dagger daggerdbl -circumflex perthousand Scaron guilsinglleft -OE .notdef Zcaron .notdef -.notdef quoteleft quoteright quotedblleft -quotedblright bullet endash emdash -tilde trademark scaron guilsinglright -oe .notdef zcaron ydieresis - -space exclamdown cent sterling -currency yen brokenbar section -dieresis copyright ordfeminine guillemotleft -logicalnot softhyphen registered macron -degree plusminus twosuperior threesuperior -acute mu paragraph periodcentered -cedilla onesuperior ordmasculine guillemotright -onequarter onehalf threequarters questiondown - -Agrave Aacute Acircumflex Atilde -Adieresis Aring AE Ccedilla -Egrave Eacute Ecircumflex Edieresis -Igrave Iacute Icircumflex Idieresis -Eth Ntilde Ograve Oacute -Ocircumflex Otilde Odieresis multiply -Oslash Ugrave Uacute Ucircumflex -Udieresis Yacute Thorn germandbls - -agrave aacute acircumflex atilde -adieresis aring ae ccedilla -egrave eacute ecircumflex edieresis -igrave iacute icircumflex idieresis -eth ntilde ograve oacute -ocircumflex otilde odieresis divide -oslash ugrave uacute ucircumflex -udieresis yacute thorn ydieresis\ -`.split(/\s+/); -function parse(contents) { - const obj = { - attributes: {}, - glyphWidths: {}, - kernPairs: {} - }; - let section = ''; - for (let line of contents.split('\n')) { - var match; - var a; - if (match = line.match(/^Start(\w+)/)) { - section = match[1]; - continue; - } else if (match = line.match(/^End(\w+)/)) { - section = ''; - continue; - } - switch (section) { - case 'FontMetrics': - match = line.match(/(^\w+)\s+(.*)/); - var key = match[1]; - var value = match[2]; - if (a = obj.attributes[key]) { - if (!Array.isArray(a)) { - a = obj.attributes[key] = [a]; - } - a.push(value); - } else { - obj.attributes[key] = value; - } - break; - case 'CharMetrics': - if (!/^CH?\s/.test(line)) { - continue; - } - var name = line.match(/\bN\s+(\.?\w+)\s*;/)[1]; - obj.glyphWidths[name] = +line.match(/\bWX\s+(\d+)\s*;/)[1]; - break; - case 'KernPairs': - match = line.match(/^KPX\s+(\.?\w+)\s+(\.?\w+)\s+(-?\d+)/); - if (match) { - obj.kernPairs[match[1] + match[2]] = parseInt(match[3]); - } - break; - } - } - return obj; -} -class AFMFont { - static open(filename) { - { - throw new Error('AFMFont.open not available on browser build'); - } - } - static fromJson(json) { - return new AFMFont(json); - } - constructor(contents) { - if (typeof contents === 'string') { - this.contents = contents; - this.parse(); - } else { - this.attributes = contents.attributes; - this.glyphWidths = contents.glyphWidths; - this.kernPairs = contents.kernPairs; - } - this.charWidths = range(0, 255).map(i => this.glyphWidths[characters[i]]); - this.bbox = Array.from(this.attributes.FontBBox.split(/\s+/)).map(e => +e); - this.ascender = +(this.attributes.Ascender || 0); - this.descender = +(this.attributes.Descender || 0); - this.xHeight = +(this.attributes.XHeight || 0); - this.capHeight = +(this.attributes.CapHeight || 0); - this.lineGap = this.bbox[3] - this.bbox[1] - (this.ascender - this.descender); - } - parse() { - const parsed = parse(this.contents); - this.attributes = parsed.attributes; - this.glyphWidths = parsed.glyphWidths; - this.kernPairs = parsed.kernPairs; - } - encodeText(text) { - const res = []; - for (let i = 0, end = text.length, asc = 0 <= end; asc ? i < end : i > end; asc ? i++ : i--) { - let char = text.charCodeAt(i); - char = WIN_ANSI_MAP[char] || char; - res.push(char.toString(16)); - } - return res; - } - glyphsForString(string) { - const glyphs = []; - for (let i = 0, end = string.length, asc = 0 <= end; asc ? i < end : i > end; asc ? i++ : i--) { - const charCode = string.charCodeAt(i); - glyphs.push(this.characterToGlyph(charCode)); - } - return glyphs; - } - characterToGlyph(character) { - return characters[WIN_ANSI_MAP[character] || character] || '.notdef'; - } - widthOfGlyph(glyph) { - return this.glyphWidths[glyph] || 0; - } - getKernPair(left, right) { - return this.kernPairs[left + right] || 0; - } - advancesForGlyphs(glyphs) { - const advances = []; - for (let index = 0; index < glyphs.length; index++) { - const left = glyphs[index]; - const right = glyphs[index + 1]; - advances.push(this.widthOfGlyph(left) + this.getKernPair(left, right)); - } - return advances; - } -} - -var attributes = [ - { - Comment: [ - "Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.", - "Creation Date: Thu May 1 12:43:52 1997", - "UniqueID 43052", - "VMusage 37169 48194" - ], - FontName: "Helvetica-Bold", - FullName: "Helvetica Bold", - FamilyName: "Helvetica", - Weight: "Bold", - ItalicAngle: "0", - IsFixedPitch: "false", - CharacterSet: "ExtendedRoman", - FontBBox: "-170 -228 1003 962 ", - UnderlinePosition: "-100", - UnderlineThickness: "50", - Version: "002.000", - Notice: "Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries.", - EncodingScheme: "AdobeStandardEncoding", - CapHeight: "718", - XHeight: "532", - Ascender: "718", - Descender: "-207", - StdHW: "118", - StdVW: "140" - }, - { - Comment: [ - "Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.", - "Creation Date: Thu May 1 12:45:12 1997", - "UniqueID 43053", - "VMusage 14482 68586" - ], - FontName: "Helvetica-BoldOblique", - FullName: "Helvetica Bold Oblique", - FamilyName: "Helvetica", - Weight: "Bold", - ItalicAngle: "-12", - IsFixedPitch: "false", - CharacterSet: "ExtendedRoman", - FontBBox: "-174 -228 1114 962", - UnderlinePosition: "-100", - UnderlineThickness: "50", - Version: "002.000", - Notice: "Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries.", - EncodingScheme: "AdobeStandardEncoding", - CapHeight: "718", - XHeight: "532", - Ascender: "718", - Descender: "-207", - StdHW: "118", - StdVW: "140" - }, - { - Comment: [ - "Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.", - "Creation Date: Thu May 1 12:44:31 1997", - "UniqueID 43055", - "VMusage 14960 69346" - ], - FontName: "Helvetica-Oblique", - FullName: "Helvetica Oblique", - FamilyName: "Helvetica", - Weight: "Medium", - ItalicAngle: "-12", - IsFixedPitch: "false", - CharacterSet: "ExtendedRoman", - FontBBox: "-170 -225 1116 931 ", - UnderlinePosition: "-100", - UnderlineThickness: "50", - Version: "002.000", - Notice: "Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries.", - EncodingScheme: "AdobeStandardEncoding", - CapHeight: "718", - XHeight: "523", - Ascender: "718", - Descender: "-207", - StdHW: "76", - StdVW: "88" - }, - { - Comment: [ - "Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.", - "Creation Date: Thu May 1 12:38:23 1997", - "UniqueID 43054", - "VMusage 37069 48094" - ], - FontName: "Helvetica", - FullName: "Helvetica", - FamilyName: "Helvetica", - Weight: "Medium", - ItalicAngle: "0", - IsFixedPitch: "false", - CharacterSet: "ExtendedRoman", - FontBBox: "-166 -225 1000 931 ", - UnderlinePosition: "-100", - UnderlineThickness: "50", - Version: "002.000", - Notice: "Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries.", - EncodingScheme: "AdobeStandardEncoding", - CapHeight: "718", - XHeight: "523", - Ascender: "718", - Descender: "-207", - StdHW: "76", - StdVW: "88" - }, - { - Comment: [ - "Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.", - "Creation Date: Thu May 1 12:52:56 1997", - "UniqueID 43065", - "VMusage 41636 52661" - ], - FontName: "Times-Bold", - FullName: "Times Bold", - FamilyName: "Times", - Weight: "Bold", - ItalicAngle: "0", - IsFixedPitch: "false", - CharacterSet: "ExtendedRoman", - FontBBox: "-168 -218 1000 935 ", - UnderlinePosition: "-100", - UnderlineThickness: "50", - Version: "002.000", - Notice: "Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries.", - EncodingScheme: "AdobeStandardEncoding", - CapHeight: "676", - XHeight: "461", - Ascender: "683", - Descender: "-217", - StdHW: "44", - StdVW: "139" - }, - { - Comment: [ - "Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.", - "Creation Date: Thu May 1 13:04:06 1997", - "UniqueID 43066", - "VMusage 45874 56899" - ], - FontName: "Times-BoldItalic", - FullName: "Times Bold Italic", - FamilyName: "Times", - Weight: "Bold", - ItalicAngle: "-15", - IsFixedPitch: "false", - CharacterSet: "ExtendedRoman", - FontBBox: "-200 -218 996 921", - UnderlinePosition: "-100", - UnderlineThickness: "50", - Version: "002.000", - Notice: "Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries.", - EncodingScheme: "AdobeStandardEncoding", - CapHeight: "669", - XHeight: "462", - Ascender: "683", - Descender: "-217", - StdHW: "42", - StdVW: "121" - }, - { - Comment: [ - "Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.", - "Creation Date: Thu May 1 12:56:55 1997", - "UniqueID 43067", - "VMusage 47727 58752" - ], - FontName: "Times-Italic", - FullName: "Times Italic", - FamilyName: "Times", - Weight: "Medium", - ItalicAngle: "-15.5", - IsFixedPitch: "false", - CharacterSet: "ExtendedRoman", - FontBBox: "-169 -217 1010 883 ", - UnderlinePosition: "-100", - UnderlineThickness: "50", - Version: "002.000", - Notice: "Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries.", - EncodingScheme: "AdobeStandardEncoding", - CapHeight: "653", - XHeight: "441", - Ascender: "683", - Descender: "-217", - StdHW: "32", - StdVW: "76" - }, - { - Comment: [ - "Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.", - "Creation Date: Thu May 1 12:49:17 1997", - "UniqueID 43068", - "VMusage 43909 54934" - ], - FontName: "Times-Roman", - FullName: "Times Roman", - FamilyName: "Times", - Weight: "Roman", - ItalicAngle: "0", - IsFixedPitch: "false", - CharacterSet: "ExtendedRoman", - FontBBox: "-168 -218 1000 898 ", - UnderlinePosition: "-100", - UnderlineThickness: "50", - Version: "002.000", - Notice: "Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries.", - EncodingScheme: "AdobeStandardEncoding", - CapHeight: "662", - XHeight: "450", - Ascender: "683", - Descender: "-217", - StdHW: "28", - StdVW: "84" - }, - { - Comment: [ - "Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.", - "Creation Date: Mon Jun 23 16:28:00 1997", - "UniqueID 43048", - "VMusage 41139 52164" - ], - FontName: "Courier-Bold", - FullName: "Courier Bold", - FamilyName: "Courier", - Weight: "Bold", - ItalicAngle: "0", - IsFixedPitch: "true", - CharacterSet: "ExtendedRoman", - FontBBox: "-113 -250 749 801 ", - UnderlinePosition: "-100", - UnderlineThickness: "50", - Version: "003.000", - Notice: "Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.", - EncodingScheme: "AdobeStandardEncoding", - CapHeight: "562", - XHeight: "439", - Ascender: "629", - Descender: "-157", - StdHW: "84", - StdVW: "106" - }, - { - Comment: [ - "Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.", - "Creation Date: Mon Jun 23 16:28:46 1997", - "UniqueID 43049", - "VMusage 17529 79244" - ], - FontName: "Courier-BoldOblique", - FullName: "Courier Bold Oblique", - FamilyName: "Courier", - Weight: "Bold", - ItalicAngle: "-12", - IsFixedPitch: "true", - CharacterSet: "ExtendedRoman", - FontBBox: "-57 -250 869 801", - UnderlinePosition: "-100", - UnderlineThickness: "50", - Version: "003.000", - Notice: "Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.", - EncodingScheme: "AdobeStandardEncoding", - CapHeight: "562", - XHeight: "439", - Ascender: "629", - Descender: "-157", - StdHW: "84", - StdVW: "106" - }, - { - Comment: [ - "Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.", - "Creation Date: Thu May 1 17:37:52 1997", - "UniqueID 43051", - "VMusage 16248 75829" - ], - FontName: "Courier-Oblique", - FullName: "Courier Oblique", - FamilyName: "Courier", - Weight: "Medium", - ItalicAngle: "-12", - IsFixedPitch: "true", - CharacterSet: "ExtendedRoman", - FontBBox: "-27 -250 849 805 ", - UnderlinePosition: "-100", - UnderlineThickness: "50", - Version: "003.000", - Notice: "Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.", - EncodingScheme: "AdobeStandardEncoding", - CapHeight: "562", - XHeight: "426", - Ascender: "629", - Descender: "-157", - StdHW: "51", - StdVW: "51" - }, - { - Comment: [ - "Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.", - "Creation Date: Thu May 1 17:27:09 1997", - "UniqueID 43050", - "VMusage 39754 50779" - ], - FontName: "Courier", - FullName: "Courier", - FamilyName: "Courier", - Weight: "Medium", - ItalicAngle: "0", - IsFixedPitch: "true", - CharacterSet: "ExtendedRoman", - FontBBox: "-23 -250 715 805 ", - UnderlinePosition: "-100", - UnderlineThickness: "50", - Version: "003.000", - Notice: "Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.", - EncodingScheme: "AdobeStandardEncoding", - CapHeight: "562", - XHeight: "426", - Ascender: "629", - Descender: "-157", - StdHW: "51", - StdVW: "51" - } -]; -var glyphWidths = { - space: [ - 278, - 278, - 278, - 278, - 250, - 250, - 250, - 250, - 600, - 600, - 600, - 600 - ], - exclam: [ - 333, - 333, - 278, - 278, - 333, - 389, - 333, - 333, - 600, - 600, - 600, - 600 - ], - quotedbl: [ - 474, - 474, - 355, - 355, - 555, - 555, - 420, - 408, - 600, - 600, - 600, - 600 - ], - numbersign: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - dollar: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - percent: [ - 889, - 889, - 889, - 889, - 1000, - 833, - 833, - 833, - 600, - 600, - 600, - 600 - ], - ampersand: [ - 722, - 722, - 667, - 667, - 833, - 778, - 778, - 778, - 600, - 600, - 600, - 600 - ], - quoteright: [ - 278, - 278, - 222, - 222, - 333, - 333, - 333, - 333, - 600, - 600, - 600, - 600 - ], - parenleft: [ - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 600, - 600, - 600, - 600 - ], - parenright: [ - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 600, - 600, - 600, - 600 - ], - asterisk: [ - 389, - 389, - 389, - 389, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - plus: [ - 584, - 584, - 584, - 584, - 570, - 570, - 675, - 564, - 600, - 600, - 600, - 600 - ], - comma: [ - 278, - 278, - 278, - 278, - 250, - 250, - 250, - 250, - 600, - 600, - 600, - 600 - ], - hyphen: [ - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 600, - 600, - 600, - 600 - ], - period: [ - 278, - 278, - 278, - 278, - 250, - 250, - 250, - 250, - 600, - 600, - 600, - 600 - ], - slash: [ - 278, - 278, - 278, - 278, - 278, - 278, - 278, - 278, - 600, - 600, - 600, - 600 - ], - zero: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - one: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - two: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - three: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - four: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - five: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - six: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - seven: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - eight: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - nine: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - colon: [ - 333, - 333, - 278, - 278, - 333, - 333, - 333, - 278, - 600, - 600, - 600, - 600 - ], - semicolon: [ - 333, - 333, - 278, - 278, - 333, - 333, - 333, - 278, - 600, - 600, - 600, - 600 - ], - less: [ - 584, - 584, - 584, - 584, - 570, - 570, - 675, - 564, - 600, - 600, - 600, - 600 - ], - equal: [ - 584, - 584, - 584, - 584, - 570, - 570, - 675, - 564, - 600, - 600, - 600, - 600 - ], - greater: [ - 584, - 584, - 584, - 584, - 570, - 570, - 675, - 564, - 600, - 600, - 600, - 600 - ], - question: [ - 611, - 611, - 556, - 556, - 500, - 500, - 500, - 444, - 600, - 600, - 600, - 600 - ], - at: [ - 975, - 975, - 1015, - 1015, - 930, - 832, - 920, - 921, - 600, - 600, - 600, - 600 - ], - A: [ - 722, - 722, - 667, - 667, - 722, - 667, - 611, - 722, - 600, - 600, - 600, - 600 - ], - B: [ - 722, - 722, - 667, - 667, - 667, - 667, - 611, - 667, - 600, - 600, - 600, - 600 - ], - C: [ - 722, - 722, - 722, - 722, - 722, - 667, - 667, - 667, - 600, - 600, - 600, - 600 - ], - D: [ - 722, - 722, - 722, - 722, - 722, - 722, - 722, - 722, - 600, - 600, - 600, - 600 - ], - E: [ - 667, - 667, - 667, - 667, - 667, - 667, - 611, - 611, - 600, - 600, - 600, - 600 - ], - F: [ - 611, - 611, - 611, - 611, - 611, - 667, - 611, - 556, - 600, - 600, - 600, - 600 - ], - G: [ - 778, - 778, - 778, - 778, - 778, - 722, - 722, - 722, - 600, - 600, - 600, - 600 - ], - H: [ - 722, - 722, - 722, - 722, - 778, - 778, - 722, - 722, - 600, - 600, - 600, - 600 - ], - I: [ - 278, - 278, - 278, - 278, - 389, - 389, - 333, - 333, - 600, - 600, - 600, - 600 - ], - J: [ - 556, - 556, - 500, - 500, - 500, - 500, - 444, - 389, - 600, - 600, - 600, - 600 - ], - K: [ - 722, - 722, - 667, - 667, - 778, - 667, - 667, - 722, - 600, - 600, - 600, - 600 - ], - L: [ - 611, - 611, - 556, - 556, - 667, - 611, - 556, - 611, - 600, - 600, - 600, - 600 - ], - M: [ - 833, - 833, - 833, - 833, - 944, - 889, - 833, - 889, - 600, - 600, - 600, - 600 - ], - N: [ - 722, - 722, - 722, - 722, - 722, - 722, - 667, - 722, - 600, - 600, - 600, - 600 - ], - O: [ - 778, - 778, - 778, - 778, - 778, - 722, - 722, - 722, - 600, - 600, - 600, - 600 - ], - P: [ - 667, - 667, - 667, - 667, - 611, - 611, - 611, - 556, - 600, - 600, - 600, - 600 - ], - Q: [ - 778, - 778, - 778, - 778, - 778, - 722, - 722, - 722, - 600, - 600, - 600, - 600 - ], - R: [ - 722, - 722, - 722, - 722, - 722, - 667, - 611, - 667, - 600, - 600, - 600, - 600 - ], - S: [ - 667, - 667, - 667, - 667, - 556, - 556, - 500, - 556, - 600, - 600, - 600, - 600 - ], - T: [ - 611, - 611, - 611, - 611, - 667, - 611, - 556, - 611, - 600, - 600, - 600, - 600 - ], - U: [ - 722, - 722, - 722, - 722, - 722, - 722, - 722, - 722, - 600, - 600, - 600, - 600 - ], - V: [ - 667, - 667, - 667, - 667, - 722, - 667, - 611, - 722, - 600, - 600, - 600, - 600 - ], - W: [ - 944, - 944, - 944, - 944, - 1000, - 889, - 833, - 944, - 600, - 600, - 600, - 600 - ], - X: [ - 667, - 667, - 667, - 667, - 722, - 667, - 611, - 722, - 600, - 600, - 600, - 600 - ], - Y: [ - 667, - 667, - 667, - 667, - 722, - 611, - 556, - 722, - 600, - 600, - 600, - 600 - ], - Z: [ - 611, - 611, - 611, - 611, - 667, - 611, - 556, - 611, - 600, - 600, - 600, - 600 - ], - bracketleft: [ - 333, - 333, - 278, - 278, - 333, - 333, - 389, - 333, - 600, - 600, - 600, - 600 - ], - backslash: [ - 278, - 278, - 278, - 278, - 278, - 278, - 278, - 278, - 600, - 600, - 600, - 600 - ], - bracketright: [ - 333, - 333, - 278, - 278, - 333, - 333, - 389, - 333, - 600, - 600, - 600, - 600 - ], - asciicircum: [ - 584, - 584, - 469, - 469, - 581, - 570, - 422, - 469, - 600, - 600, - 600, - 600 - ], - underscore: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - quoteleft: [ - 278, - 278, - 222, - 222, - 333, - 333, - 333, - 333, - 600, - 600, - 600, - 600 - ], - a: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 444, - 600, - 600, - 600, - 600 - ], - b: [ - 611, - 611, - 556, - 556, - 556, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - c: [ - 556, - 556, - 500, - 500, - 444, - 444, - 444, - 444, - 600, - 600, - 600, - 600 - ], - d: [ - 611, - 611, - 556, - 556, - 556, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - e: [ - 556, - 556, - 556, - 556, - 444, - 444, - 444, - 444, - 600, - 600, - 600, - 600 - ], - f: [ - 333, - 333, - 278, - 278, - 333, - 333, - 278, - 333, - 600, - 600, - 600, - 600 - ], - g: [ - 611, - 611, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - h: [ - 611, - 611, - 556, - 556, - 556, - 556, - 500, - 500, - 600, - 600, - 600, - 600 - ], - i: [ - 278, - 278, - 222, - 222, - 278, - 278, - 278, - 278, - 600, - 600, - 600, - 600 - ], - j: [ - 278, - 278, - 222, - 222, - 333, - 278, - 278, - 278, - 600, - 600, - 600, - 600 - ], - k: [ - 556, - 556, - 500, - 500, - 556, - 500, - 444, - 500, - 600, - 600, - 600, - 600 - ], - l: [ - 278, - 278, - 222, - 222, - 278, - 278, - 278, - 278, - 600, - 600, - 600, - 600 - ], - m: [ - 889, - 889, - 833, - 833, - 833, - 778, - 722, - 778, - 600, - 600, - 600, - 600 - ], - n: [ - 611, - 611, - 556, - 556, - 556, - 556, - 500, - 500, - 600, - 600, - 600, - 600 - ], - o: [ - 611, - 611, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - p: [ - 611, - 611, - 556, - 556, - 556, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - q: [ - 611, - 611, - 556, - 556, - 556, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - r: [ - 389, - 389, - 333, - 333, - 444, - 389, - 389, - 333, - 600, - 600, - 600, - 600 - ], - s: [ - 556, - 556, - 500, - 500, - 389, - 389, - 389, - 389, - 600, - 600, - 600, - 600 - ], - t: [ - 333, - 333, - 278, - 278, - 333, - 278, - 278, - 278, - 600, - 600, - 600, - 600 - ], - u: [ - 611, - 611, - 556, - 556, - 556, - 556, - 500, - 500, - 600, - 600, - 600, - 600 - ], - v: [ - 556, - 556, - 500, - 500, - 500, - 444, - 444, - 500, - 600, - 600, - 600, - 600 - ], - w: [ - 778, - 778, - 722, - 722, - 722, - 667, - 667, - 722, - 600, - 600, - 600, - 600 - ], - x: [ - 556, - 556, - 500, - 500, - 500, - 500, - 444, - 500, - 600, - 600, - 600, - 600 - ], - y: [ - 556, - 556, - 500, - 500, - 500, - 444, - 444, - 500, - 600, - 600, - 600, - 600 - ], - z: [ - 500, - 500, - 500, - 500, - 444, - 389, - 389, - 444, - 600, - 600, - 600, - 600 - ], - braceleft: [ - 389, - 389, - 334, - 334, - 394, - 348, - 400, - 480, - 600, - 600, - 600, - 600 - ], - bar: [ - 280, - 280, - 260, - 260, - 220, - 220, - 275, - 200, - 600, - 600, - 600, - 600 - ], - braceright: [ - 389, - 389, - 334, - 334, - 394, - 348, - 400, - 480, - 600, - 600, - 600, - 600 - ], - asciitilde: [ - 584, - 584, - 584, - 584, - 520, - 570, - 541, - 541, - 600, - 600, - 600, - 600 - ], - exclamdown: [ - 333, - 333, - 333, - 333, - 333, - 389, - 389, - 333, - 600, - 600, - 600, - 600 - ], - cent: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - sterling: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - fraction: [ - 167, - 167, - 167, - 167, - 167, - 167, - 167, - 167, - 600, - 600, - 600, - 600 - ], - yen: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - florin: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - section: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - currency: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - quotesingle: [ - 238, - 238, - 191, - 191, - 278, - 278, - 214, - 180, - 600, - 600, - 600, - 600 - ], - quotedblleft: [ - 500, - 500, - 333, - 333, - 500, - 500, - 556, - 444, - 600, - 600, - 600, - 600 - ], - guillemotleft: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - guilsinglleft: [ - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 600, - 600, - 600, - 600 - ], - guilsinglright: [ - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 600, - 600, - 600, - 600 - ], - fi: [ - 611, - 611, - 500, - 500, - 556, - 556, - 500, - 556, - 600, - 600, - 600, - 600 - ], - fl: [ - 611, - 611, - 500, - 500, - 556, - 556, - 500, - 556, - 600, - 600, - 600, - 600 - ], - endash: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - dagger: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - daggerdbl: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - periodcentered: [ - 278, - 278, - 278, - 278, - 250, - 250, - 250, - 250, - 600, - 600, - 600, - 600 - ], - paragraph: [ - 556, - 556, - 537, - 537, - 540, - 500, - 523, - 453, - 600, - 600, - 600, - 600 - ], - bullet: [ - 350, - 350, - 350, - 350, - 350, - 350, - 350, - 350, - 600, - 600, - 600, - 600 - ], - quotesinglbase: [ - 278, - 278, - 222, - 222, - 333, - 333, - 333, - 333, - 600, - 600, - 600, - 600 - ], - quotedblbase: [ - 500, - 500, - 333, - 333, - 500, - 500, - 556, - 444, - 600, - 600, - 600, - 600 - ], - quotedblright: [ - 500, - 500, - 333, - 333, - 500, - 500, - 556, - 444, - 600, - 600, - 600, - 600 - ], - guillemotright: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - ellipsis: [ - 1000, - 1000, - 1000, - 1000, - 1000, - 1000, - 889, - 1000, - 600, - 600, - 600, - 600 - ], - perthousand: [ - 1000, - 1000, - 1000, - 1000, - 1000, - 1000, - 1000, - 1000, - 600, - 600, - 600, - 600 - ], - questiondown: [ - 611, - 611, - 611, - 611, - 500, - 500, - 500, - 444, - 600, - 600, - 600, - 600 - ], - grave: [ - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 600, - 600, - 600, - 600 - ], - acute: [ - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 600, - 600, - 600, - 600 - ], - circumflex: [ - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 600, - 600, - 600, - 600 - ], - tilde: [ - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 600, - 600, - 600, - 600 - ], - macron: [ - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 600, - 600, - 600, - 600 - ], - breve: [ - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 600, - 600, - 600, - 600 - ], - dotaccent: [ - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 600, - 600, - 600, - 600 - ], - dieresis: [ - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 600, - 600, - 600, - 600 - ], - ring: [ - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 600, - 600, - 600, - 600 - ], - cedilla: [ - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 600, - 600, - 600, - 600 - ], - hungarumlaut: [ - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 600, - 600, - 600, - 600 - ], - ogonek: [ - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 600, - 600, - 600, - 600 - ], - caron: [ - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 600, - 600, - 600, - 600 - ], - emdash: [ - 1000, - 1000, - 1000, - 1000, - 1000, - 1000, - 889, - 1000, - 600, - 600, - 600, - 600 - ], - AE: [ - 1000, - 1000, - 1000, - 1000, - 1000, - 944, - 889, - 889, - 600, - 600, - 600, - 600 - ], - ordfeminine: [ - 370, - 370, - 370, - 370, - 300, - 266, - 276, - 276, - 600, - 600, - 600, - 600 - ], - Lslash: [ - 611, - 611, - 556, - 556, - 667, - 611, - 556, - 611, - 600, - 600, - 600, - 600 - ], - Oslash: [ - 778, - 778, - 778, - 778, - 778, - 722, - 722, - 722, - 600, - 600, - 600, - 600 - ], - OE: [ - 1000, - 1000, - 1000, - 1000, - 1000, - 944, - 944, - 889, - 600, - 600, - 600, - 600 - ], - ordmasculine: [ - 365, - 365, - 365, - 365, - 330, - 300, - 310, - 310, - 600, - 600, - 600, - 600 - ], - ae: [ - 889, - 889, - 889, - 889, - 722, - 722, - 667, - 667, - 600, - 600, - 600, - 600 - ], - dotlessi: [ - 278, - 278, - 278, - 278, - 278, - 278, - 278, - 278, - 600, - 600, - 600, - 600 - ], - lslash: [ - 278, - 278, - 222, - 222, - 278, - 278, - 278, - 278, - 600, - 600, - 600, - 600 - ], - oslash: [ - 611, - 611, - 611, - 611, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - oe: [ - 944, - 944, - 944, - 944, - 722, - 722, - 667, - 722, - 600, - 600, - 600, - 600 - ], - germandbls: [ - 611, - 611, - 611, - 611, - 556, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - Idieresis: [ - 278, - 278, - 278, - 278, - 389, - 389, - 333, - 333, - 600, - 600, - 600, - 600 - ], - eacute: [ - 556, - 556, - 556, - 556, - 444, - 444, - 444, - 444, - 600, - 600, - 600, - 600 - ], - abreve: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 444, - 600, - 600, - 600, - 600 - ], - uhungarumlaut: [ - 611, - 611, - 556, - 556, - 556, - 556, - 500, - 500, - 600, - 600, - 600, - 600 - ], - ecaron: [ - 556, - 556, - 556, - 556, - 444, - 444, - 444, - 444, - 600, - 600, - 600, - 600 - ], - Ydieresis: [ - 667, - 667, - 667, - 667, - 722, - 611, - 556, - 722, - 600, - 600, - 600, - 600 - ], - divide: [ - 584, - 584, - 584, - 584, - 570, - 570, - 675, - 564, - 600, - 600, - 600, - 600 - ], - Yacute: [ - 667, - 667, - 667, - 667, - 722, - 611, - 556, - 722, - 600, - 600, - 600, - 600 - ], - Acircumflex: [ - 722, - 722, - 667, - 667, - 722, - 667, - 611, - 722, - 600, - 600, - 600, - 600 - ], - aacute: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 444, - 600, - 600, - 600, - 600 - ], - Ucircumflex: [ - 722, - 722, - 722, - 722, - 722, - 722, - 722, - 722, - 600, - 600, - 600, - 600 - ], - yacute: [ - 556, - 556, - 500, - 500, - 500, - 444, - 444, - 500, - 600, - 600, - 600, - 600 - ], - scommaaccent: [ - 556, - 556, - 500, - 500, - 389, - 389, - 389, - 389, - 600, - 600, - 600, - 600 - ], - ecircumflex: [ - 556, - 556, - 556, - 556, - 444, - 444, - 444, - 444, - 600, - 600, - 600, - 600 - ], - Uring: [ - 722, - 722, - 722, - 722, - 722, - 722, - 722, - 722, - 600, - 600, - 600, - 600 - ], - Udieresis: [ - 722, - 722, - 722, - 722, - 722, - 722, - 722, - 722, - 600, - 600, - 600, - 600 - ], - aogonek: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 444, - 600, - 600, - 600, - 600 - ], - Uacute: [ - 722, - 722, - 722, - 722, - 722, - 722, - 722, - 722, - 600, - 600, - 600, - 600 - ], - uogonek: [ - 611, - 611, - 556, - 556, - 556, - 556, - 500, - 500, - 600, - 600, - 600, - 600 - ], - Edieresis: [ - 667, - 667, - 667, - 667, - 667, - 667, - 611, - 611, - 600, - 600, - 600, - 600 - ], - Dcroat: [ - 722, - 722, - 722, - 722, - 722, - 722, - 722, - 722, - 600, - 600, - 600, - 600 - ], - commaaccent: [ - 250, - 250, - 250, - 250, - 250, - 250, - 250, - 250, - 600, - 600, - 600, - 600 - ], - copyright: [ - 737, - 737, - 737, - 737, - 747, - 747, - 760, - 760, - 600, - 600, - 600, - 600 - ], - Emacron: [ - 667, - 667, - 667, - 667, - 667, - 667, - 611, - 611, - 600, - 600, - 600, - 600 - ], - ccaron: [ - 556, - 556, - 500, - 500, - 444, - 444, - 444, - 444, - 600, - 600, - 600, - 600 - ], - aring: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 444, - 600, - 600, - 600, - 600 - ], - Ncommaaccent: [ - 722, - 722, - 722, - 722, - 722, - 722, - 667, - 722, - 600, - 600, - 600, - 600 - ], - lacute: [ - 278, - 278, - 222, - 222, - 278, - 278, - 278, - 278, - 600, - 600, - 600, - 600 - ], - agrave: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 444, - 600, - 600, - 600, - 600 - ], - Tcommaaccent: [ - 611, - 611, - 611, - 611, - 667, - 611, - 556, - 611, - 600, - 600, - 600, - 600 - ], - Cacute: [ - 722, - 722, - 722, - 722, - 722, - 667, - 667, - 667, - 600, - 600, - 600, - 600 - ], - atilde: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 444, - 600, - 600, - 600, - 600 - ], - Edotaccent: [ - 667, - 667, - 667, - 667, - 667, - 667, - 611, - 611, - 600, - 600, - 600, - 600 - ], - scaron: [ - 556, - 556, - 500, - 500, - 389, - 389, - 389, - 389, - 600, - 600, - 600, - 600 - ], - scedilla: [ - 556, - 556, - 500, - 500, - 389, - 389, - 389, - 389, - 600, - 600, - 600, - 600 - ], - iacute: [ - 278, - 278, - 278, - 278, - 278, - 278, - 278, - 278, - 600, - 600, - 600, - 600 - ], - lozenge: [ - 494, - 494, - 471, - 471, - 494, - 494, - 471, - 471, - 600, - 600, - 600, - 600 - ], - Rcaron: [ - 722, - 722, - 722, - 722, - 722, - 667, - 611, - 667, - 600, - 600, - 600, - 600 - ], - Gcommaaccent: [ - 778, - 778, - 778, - 778, - 778, - 722, - 722, - 722, - 600, - 600, - 600, - 600 - ], - ucircumflex: [ - 611, - 611, - 556, - 556, - 556, - 556, - 500, - 500, - 600, - 600, - 600, - 600 - ], - acircumflex: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 444, - 600, - 600, - 600, - 600 - ], - Amacron: [ - 722, - 722, - 667, - 667, - 722, - 667, - 611, - 722, - 600, - 600, - 600, - 600 - ], - rcaron: [ - 389, - 389, - 333, - 333, - 444, - 389, - 389, - 333, - 600, - 600, - 600, - 600 - ], - ccedilla: [ - 556, - 556, - 500, - 500, - 444, - 444, - 444, - 444, - 600, - 600, - 600, - 600 - ], - Zdotaccent: [ - 611, - 611, - 611, - 611, - 667, - 611, - 556, - 611, - 600, - 600, - 600, - 600 - ], - Thorn: [ - 667, - 667, - 667, - 667, - 611, - 611, - 611, - 556, - 600, - 600, - 600, - 600 - ], - Omacron: [ - 778, - 778, - 778, - 778, - 778, - 722, - 722, - 722, - 600, - 600, - 600, - 600 - ], - Racute: [ - 722, - 722, - 722, - 722, - 722, - 667, - 611, - 667, - 600, - 600, - 600, - 600 - ], - Sacute: [ - 667, - 667, - 667, - 667, - 556, - 556, - 500, - 556, - 600, - 600, - 600, - 600 - ], - dcaron: [ - 743, - 743, - 643, - 643, - 672, - 608, - 544, - 588, - 600, - 600, - 600, - 600 - ], - Umacron: [ - 722, - 722, - 722, - 722, - 722, - 722, - 722, - 722, - 600, - 600, - 600, - 600 - ], - uring: [ - 611, - 611, - 556, - 556, - 556, - 556, - 500, - 500, - 600, - 600, - 600, - 600 - ], - threesuperior: [ - 333, - 333, - 333, - 333, - 300, - 300, - 300, - 300, - 600, - 600, - 600, - 600 - ], - Ograve: [ - 778, - 778, - 778, - 778, - 778, - 722, - 722, - 722, - 600, - 600, - 600, - 600 - ], - Agrave: [ - 722, - 722, - 667, - 667, - 722, - 667, - 611, - 722, - 600, - 600, - 600, - 600 - ], - Abreve: [ - 722, - 722, - 667, - 667, - 722, - 667, - 611, - 722, - 600, - 600, - 600, - 600 - ], - multiply: [ - 584, - 584, - 584, - 584, - 570, - 570, - 675, - 564, - 600, - 600, - 600, - 600 - ], - uacute: [ - 611, - 611, - 556, - 556, - 556, - 556, - 500, - 500, - 600, - 600, - 600, - 600 - ], - Tcaron: [ - 611, - 611, - 611, - 611, - 667, - 611, - 556, - 611, - 600, - 600, - 600, - 600 - ], - partialdiff: [ - 494, - 494, - 476, - 476, - 494, - 494, - 476, - 476, - 600, - 600, - 600, - 600 - ], - ydieresis: [ - 556, - 556, - 500, - 500, - 500, - 444, - 444, - 500, - 600, - 600, - 600, - 600 - ], - Nacute: [ - 722, - 722, - 722, - 722, - 722, - 722, - 667, - 722, - 600, - 600, - 600, - 600 - ], - icircumflex: [ - 278, - 278, - 278, - 278, - 278, - 278, - 278, - 278, - 600, - 600, - 600, - 600 - ], - Ecircumflex: [ - 667, - 667, - 667, - 667, - 667, - 667, - 611, - 611, - 600, - 600, - 600, - 600 - ], - adieresis: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 444, - 600, - 600, - 600, - 600 - ], - edieresis: [ - 556, - 556, - 556, - 556, - 444, - 444, - 444, - 444, - 600, - 600, - 600, - 600 - ], - cacute: [ - 556, - 556, - 500, - 500, - 444, - 444, - 444, - 444, - 600, - 600, - 600, - 600 - ], - nacute: [ - 611, - 611, - 556, - 556, - 556, - 556, - 500, - 500, - 600, - 600, - 600, - 600 - ], - umacron: [ - 611, - 611, - 556, - 556, - 556, - 556, - 500, - 500, - 600, - 600, - 600, - 600 - ], - Ncaron: [ - 722, - 722, - 722, - 722, - 722, - 722, - 667, - 722, - 600, - 600, - 600, - 600 - ], - Iacute: [ - 278, - 278, - 278, - 278, - 389, - 389, - 333, - 333, - 600, - 600, - 600, - 600 - ], - plusminus: [ - 584, - 584, - 584, - 584, - 570, - 570, - 675, - 564, - 600, - 600, - 600, - 600 - ], - brokenbar: [ - 280, - 280, - 260, - 260, - 220, - 220, - 275, - 200, - 600, - 600, - 600, - 600 - ], - registered: [ - 737, - 737, - 737, - 737, - 747, - 747, - 760, - 760, - 600, - 600, - 600, - 600 - ], - Gbreve: [ - 778, - 778, - 778, - 778, - 778, - 722, - 722, - 722, - 600, - 600, - 600, - 600 - ], - Idotaccent: [ - 278, - 278, - 278, - 278, - 389, - 389, - 333, - 333, - 600, - 600, - 600, - 600 - ], - summation: [ - 600, - 600, - 600, - 600, - 600, - 600, - 600, - 600, - 600, - 600, - 600, - 600 - ], - Egrave: [ - 667, - 667, - 667, - 667, - 667, - 667, - 611, - 611, - 600, - 600, - 600, - 600 - ], - racute: [ - 389, - 389, - 333, - 333, - 444, - 389, - 389, - 333, - 600, - 600, - 600, - 600 - ], - omacron: [ - 611, - 611, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - Zacute: [ - 611, - 611, - 611, - 611, - 667, - 611, - 556, - 611, - 600, - 600, - 600, - 600 - ], - Zcaron: [ - 611, - 611, - 611, - 611, - 667, - 611, - 556, - 611, - 600, - 600, - 600, - 600 - ], - greaterequal: [ - 549, - 549, - 549, - 549, - 549, - 549, - 549, - 549, - 600, - 600, - 600, - 600 - ], - Eth: [ - 722, - 722, - 722, - 722, - 722, - 722, - 722, - 722, - 600, - 600, - 600, - 600 - ], - Ccedilla: [ - 722, - 722, - 722, - 722, - 722, - 667, - 667, - 667, - 600, - 600, - 600, - 600 - ], - lcommaaccent: [ - 278, - 278, - 222, - 222, - 278, - 278, - 278, - 278, - 600, - 600, - 600, - 600 - ], - tcaron: [ - 389, - 389, - 317, - 317, - 416, - 366, - 300, - 326, - 600, - 600, - 600, - 600 - ], - eogonek: [ - 556, - 556, - 556, - 556, - 444, - 444, - 444, - 444, - 600, - 600, - 600, - 600 - ], - Uogonek: [ - 722, - 722, - 722, - 722, - 722, - 722, - 722, - 722, - 600, - 600, - 600, - 600 - ], - Aacute: [ - 722, - 722, - 667, - 667, - 722, - 667, - 611, - 722, - 600, - 600, - 600, - 600 - ], - Adieresis: [ - 722, - 722, - 667, - 667, - 722, - 667, - 611, - 722, - 600, - 600, - 600, - 600 - ], - egrave: [ - 556, - 556, - 556, - 556, - 444, - 444, - 444, - 444, - 600, - 600, - 600, - 600 - ], - zacute: [ - 500, - 500, - 500, - 500, - 444, - 389, - 389, - 444, - 600, - 600, - 600, - 600 - ], - iogonek: [ - 278, - 278, - 222, - 222, - 278, - 278, - 278, - 278, - 600, - 600, - 600, - 600 - ], - Oacute: [ - 778, - 778, - 778, - 778, - 778, - 722, - 722, - 722, - 600, - 600, - 600, - 600 - ], - oacute: [ - 611, - 611, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - amacron: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 444, - 600, - 600, - 600, - 600 - ], - sacute: [ - 556, - 556, - 500, - 500, - 389, - 389, - 389, - 389, - 600, - 600, - 600, - 600 - ], - idieresis: [ - 278, - 278, - 278, - 278, - 278, - 278, - 278, - 278, - 600, - 600, - 600, - 600 - ], - Ocircumflex: [ - 778, - 778, - 778, - 778, - 778, - 722, - 722, - 722, - 600, - 600, - 600, - 600 - ], - Ugrave: [ - 722, - 722, - 722, - 722, - 722, - 722, - 722, - 722, - 600, - 600, - 600, - 600 - ], - Delta: [ - 612, - 612, - 612, - 612, - 612, - 612, - 612, - 612, - 600, - 600, - 600, - 600 - ], - thorn: [ - 611, - 611, - 556, - 556, - 556, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - twosuperior: [ - 333, - 333, - 333, - 333, - 300, - 300, - 300, - 300, - 600, - 600, - 600, - 600 - ], - Odieresis: [ - 778, - 778, - 778, - 778, - 778, - 722, - 722, - 722, - 600, - 600, - 600, - 600 - ], - mu: [ - 611, - 611, - 556, - 556, - 556, - 576, - 500, - 500, - 600, - 600, - 600, - 600 - ], - igrave: [ - 278, - 278, - 278, - 278, - 278, - 278, - 278, - 278, - 600, - 600, - 600, - 600 - ], - ohungarumlaut: [ - 611, - 611, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - Eogonek: [ - 667, - 667, - 667, - 667, - 667, - 667, - 611, - 611, - 600, - 600, - 600, - 600 - ], - dcroat: [ - 611, - 611, - 556, - 556, - 556, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - threequarters: [ - 834, - 834, - 834, - 834, - 750, - 750, - 750, - 750, - 600, - 600, - 600, - 600 - ], - Scedilla: [ - 667, - 667, - 667, - 667, - 556, - 556, - 500, - 556, - 600, - 600, - 600, - 600 - ], - lcaron: [ - 400, - 400, - 299, - 299, - 394, - 382, - 300, - 344, - 600, - 600, - 600, - 600 - ], - Kcommaaccent: [ - 722, - 722, - 667, - 667, - 778, - 667, - 667, - 722, - 600, - 600, - 600, - 600 - ], - Lacute: [ - 611, - 611, - 556, - 556, - 667, - 611, - 556, - 611, - 600, - 600, - 600, - 600 - ], - trademark: [ - 1000, - 1000, - 1000, - 1000, - 1000, - 1000, - 980, - 980, - 600, - 600, - 600, - 600 - ], - edotaccent: [ - 556, - 556, - 556, - 556, - 444, - 444, - 444, - 444, - 600, - 600, - 600, - 600 - ], - Igrave: [ - 278, - 278, - 278, - 278, - 389, - 389, - 333, - 333, - 600, - 600, - 600, - 600 - ], - Imacron: [ - 278, - 278, - 278, - 278, - 389, - 389, - 333, - 333, - 600, - 600, - 600, - 600 - ], - Lcaron: [ - 611, - 611, - 556, - 556, - 667, - 611, - 611, - 611, - 600, - 600, - 600, - 600 - ], - onehalf: [ - 834, - 834, - 834, - 834, - 750, - 750, - 750, - 750, - 600, - 600, - 600, - 600 - ], - lessequal: [ - 549, - 549, - 549, - 549, - 549, - 549, - 549, - 549, - 600, - 600, - 600, - 600 - ], - ocircumflex: [ - 611, - 611, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - ntilde: [ - 611, - 611, - 556, - 556, - 556, - 556, - 500, - 500, - 600, - 600, - 600, - 600 - ], - Uhungarumlaut: [ - 722, - 722, - 722, - 722, - 722, - 722, - 722, - 722, - 600, - 600, - 600, - 600 - ], - Eacute: [ - 667, - 667, - 667, - 667, - 667, - 667, - 611, - 611, - 600, - 600, - 600, - 600 - ], - emacron: [ - 556, - 556, - 556, - 556, - 444, - 444, - 444, - 444, - 600, - 600, - 600, - 600 - ], - gbreve: [ - 611, - 611, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - onequarter: [ - 834, - 834, - 834, - 834, - 750, - 750, - 750, - 750, - 600, - 600, - 600, - 600 - ], - Scaron: [ - 667, - 667, - 667, - 667, - 556, - 556, - 500, - 556, - 600, - 600, - 600, - 600 - ], - Scommaaccent: [ - 667, - 667, - 667, - 667, - 556, - 556, - 500, - 556, - 600, - 600, - 600, - 600 - ], - Ohungarumlaut: [ - 778, - 778, - 778, - 778, - 778, - 722, - 722, - 722, - 600, - 600, - 600, - 600 - ], - degree: [ - 400, - 400, - 400, - 400, - 400, - 400, - 400, - 400, - 600, - 600, - 600, - 600 - ], - ograve: [ - 611, - 611, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - Ccaron: [ - 722, - 722, - 722, - 722, - 722, - 667, - 667, - 667, - 600, - 600, - 600, - 600 - ], - ugrave: [ - 611, - 611, - 556, - 556, - 556, - 556, - 500, - 500, - 600, - 600, - 600, - 600 - ], - radical: [ - 549, - 549, - 453, - 453, - 549, - 549, - 453, - 453, - 600, - 600, - 600, - 600 - ], - Dcaron: [ - 722, - 722, - 722, - 722, - 722, - 722, - 722, - 722, - 600, - 600, - 600, - 600 - ], - rcommaaccent: [ - 389, - 389, - 333, - 333, - 444, - 389, - 389, - 333, - 600, - 600, - 600, - 600 - ], - Ntilde: [ - 722, - 722, - 722, - 722, - 722, - 722, - 667, - 722, - 600, - 600, - 600, - 600 - ], - otilde: [ - 611, - 611, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - Rcommaaccent: [ - 722, - 722, - 722, - 722, - 722, - 667, - 611, - 667, - 600, - 600, - 600, - 600 - ], - Lcommaaccent: [ - 611, - 611, - 556, - 556, - 667, - 611, - 556, - 611, - 600, - 600, - 600, - 600 - ], - Atilde: [ - 722, - 722, - 667, - 667, - 722, - 667, - 611, - 722, - 600, - 600, - 600, - 600 - ], - Aogonek: [ - 722, - 722, - 667, - 667, - 722, - 667, - 611, - 722, - 600, - 600, - 600, - 600 - ], - Aring: [ - 722, - 722, - 667, - 667, - 722, - 667, - 611, - 722, - 600, - 600, - 600, - 600 - ], - Otilde: [ - 778, - 778, - 778, - 778, - 778, - 722, - 722, - 722, - 600, - 600, - 600, - 600 - ], - zdotaccent: [ - 500, - 500, - 500, - 500, - 444, - 389, - 389, - 444, - 600, - 600, - 600, - 600 - ], - Ecaron: [ - 667, - 667, - 667, - 667, - 667, - 667, - 611, - 611, - 600, - 600, - 600, - 600 - ], - Iogonek: [ - 278, - 278, - 278, - 278, - 389, - 389, - 333, - 333, - 600, - 600, - 600, - 600 - ], - kcommaaccent: [ - 556, - 556, - 500, - 500, - 556, - 500, - 444, - 500, - 600, - 600, - 600, - 600 - ], - minus: [ - 584, - 584, - 584, - 584, - 570, - 606, - 675, - 564, - 600, - 600, - 600, - 600 - ], - Icircumflex: [ - 278, - 278, - 278, - 278, - 389, - 389, - 333, - 333, - 600, - 600, - 600, - 600 - ], - ncaron: [ - 611, - 611, - 556, - 556, - 556, - 556, - 500, - 500, - 600, - 600, - 600, - 600 - ], - tcommaaccent: [ - 333, - 333, - 278, - 278, - 333, - 278, - 278, - 278, - 600, - 600, - 600, - 600 - ], - logicalnot: [ - 584, - 584, - 584, - 584, - 570, - 606, - 675, - 564, - 600, - 600, - 600, - 600 - ], - odieresis: [ - 611, - 611, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - udieresis: [ - 611, - 611, - 556, - 556, - 556, - 556, - 500, - 500, - 600, - 600, - 600, - 600 - ], - notequal: [ - 549, - 549, - 549, - 549, - 549, - 549, - 549, - 549, - 600, - 600, - 600, - 600 - ], - gcommaaccent: [ - 611, - 611, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - eth: [ - 611, - 611, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - zcaron: [ - 500, - 500, - 500, - 500, - 444, - 389, - 389, - 444, - 600, - 600, - 600, - 600 - ], - ncommaaccent: [ - 611, - 611, - 556, - 556, - 556, - 556, - 500, - 500, - 600, - 600, - 600, - 600 - ], - onesuperior: [ - 333, - 333, - 333, - 333, - 300, - 300, - 300, - 300, - 600, - 600, - 600, - 600 - ], - imacron: [ - 278, - 278, - 278, - 278, - 278, - 278, - 278, - 278, - 600, - 600, - 600, - 600 - ], - Euro: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ] -}; -var kernPairs = { - AC: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - ACacute: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - ACcaron: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - ACcedilla: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AG: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AGbreve: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AGcommaaccent: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AO: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AOacute: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AOcircumflex: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AOdieresis: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AOgrave: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AOhungarumlaut: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AOmacron: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AOslash: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AOtilde: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AQ: [ - -40, - -40, - -30, - -30, - -45, - -55, - -40, - -55 - ], - AT: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - ATcaron: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - ATcommaaccent: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - AU: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AUacute: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AUcircumflex: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AUdieresis: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AUgrave: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AUhungarumlaut: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AUmacron: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AUogonek: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AUring: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AV: [ - -80, - -80, - -70, - -70, - -145, - -95, - -105, - -135 - ], - AW: [ - -60, - -60, - -50, - -50, - -130, - -100, - -95, - -90 - ], - AY: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - AYacute: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - AYdieresis: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - Au: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Auacute: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Aucircumflex: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Audieresis: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Augrave: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Auhungarumlaut: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Aumacron: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Auogonek: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Auring: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Av: [ - -40, - -40, - -40, - -40, - -100, - -74, - -55, - -74 - ], - Aw: [ - -30, - -30, - -40, - -40, - -90, - -74, - -55, - -92 - ], - Ay: [ - -30, - -30, - -40, - -40, - -74, - -74, - -55, - -92 - ], - Ayacute: [ - -30, - -30, - -40, - -40, - -74, - -74, - -55, - -92 - ], - Aydieresis: [ - -30, - -30, - -40, - -40, - -74, - -74, - -55, - -92 - ], - AacuteC: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AacuteCacute: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AacuteCcaron: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AacuteCcedilla: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AacuteG: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AacuteGbreve: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AacuteGcommaaccent: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AacuteO: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AacuteOacute: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AacuteOcircumflex: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AacuteOdieresis: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AacuteOgrave: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AacuteOhungarumlaut: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AacuteOmacron: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AacuteOslash: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AacuteOtilde: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AacuteQ: [ - -40, - -40, - -30, - -30, - -45, - -55, - -40, - -55 - ], - AacuteT: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - AacuteTcaron: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - AacuteTcommaaccent: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - AacuteU: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AacuteUacute: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AacuteUcircumflex: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AacuteUdieresis: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AacuteUgrave: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AacuteUhungarumlaut: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AacuteUmacron: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AacuteUogonek: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AacuteUring: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AacuteV: [ - -80, - -80, - -70, - -70, - -145, - -95, - -105, - -135 - ], - AacuteW: [ - -60, - -60, - -50, - -50, - -130, - -100, - -95, - -90 - ], - AacuteY: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - AacuteYacute: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - AacuteYdieresis: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - Aacuteu: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Aacuteuacute: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Aacuteucircumflex: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Aacuteudieresis: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Aacuteugrave: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Aacuteuhungarumlaut: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Aacuteumacron: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Aacuteuogonek: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Aacuteuring: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Aacutev: [ - -40, - -40, - -40, - -40, - -100, - -74, - -55, - -74 - ], - Aacutew: [ - -30, - -30, - -40, - -40, - -90, - -74, - -55, - -92 - ], - Aacutey: [ - -30, - -30, - -40, - -40, - -74, - -74, - -55, - -92 - ], - Aacuteyacute: [ - -30, - -30, - -40, - -40, - -74, - -74, - -55, - -92 - ], - Aacuteydieresis: [ - -30, - -30, - -40, - -40, - -74, - -74, - -55, - -92 - ], - AbreveC: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AbreveCacute: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AbreveCcaron: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AbreveCcedilla: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AbreveG: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AbreveGbreve: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AbreveGcommaaccent: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AbreveO: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AbreveOacute: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AbreveOcircumflex: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AbreveOdieresis: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AbreveOgrave: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AbreveOhungarumlaut: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AbreveOmacron: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AbreveOslash: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AbreveOtilde: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AbreveQ: [ - -40, - -40, - -30, - -30, - -45, - -55, - -40, - -55 - ], - AbreveT: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - AbreveTcaron: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - AbreveTcommaaccent: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - AbreveU: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AbreveUacute: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AbreveUcircumflex: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AbreveUdieresis: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AbreveUgrave: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AbreveUhungarumlaut: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AbreveUmacron: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AbreveUogonek: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AbreveUring: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AbreveV: [ - -80, - -80, - -70, - -70, - -145, - -95, - -105, - -135 - ], - AbreveW: [ - -60, - -60, - -50, - -50, - -130, - -100, - -95, - -90 - ], - AbreveY: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - AbreveYacute: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - AbreveYdieresis: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - Abreveu: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Abreveuacute: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Abreveucircumflex: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Abreveudieresis: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Abreveugrave: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Abreveuhungarumlaut: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Abreveumacron: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Abreveuogonek: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Abreveuring: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Abrevev: [ - -40, - -40, - -40, - -40, - -100, - -74, - -55, - -74 - ], - Abrevew: [ - -30, - -30, - -40, - -40, - -90, - -74, - -55, - -92 - ], - Abrevey: [ - -30, - -30, - -40, - -40, - -74, - -74, - -55, - -92 - ], - Abreveyacute: [ - -30, - -30, - -40, - -40, - -74, - -74, - -55, - -92 - ], - Abreveydieresis: [ - -30, - -30, - -40, - -40, - -74, - -74, - -55, - -92 - ], - AcircumflexC: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AcircumflexCacute: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AcircumflexCcaron: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AcircumflexCcedilla: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AcircumflexG: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AcircumflexGbreve: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AcircumflexGcommaaccent: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AcircumflexO: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AcircumflexOacute: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AcircumflexOcircumflex: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AcircumflexOdieresis: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AcircumflexOgrave: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AcircumflexOhungarumlaut: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AcircumflexOmacron: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AcircumflexOslash: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AcircumflexOtilde: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AcircumflexQ: [ - -40, - -40, - -30, - -30, - -45, - -55, - -40, - -55 - ], - AcircumflexT: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - AcircumflexTcaron: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - AcircumflexTcommaaccent: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - AcircumflexU: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AcircumflexUacute: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AcircumflexUcircumflex: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AcircumflexUdieresis: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AcircumflexUgrave: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AcircumflexUhungarumlaut: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AcircumflexUmacron: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AcircumflexUogonek: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AcircumflexUring: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AcircumflexV: [ - -80, - -80, - -70, - -70, - -145, - -95, - -105, - -135 - ], - AcircumflexW: [ - -60, - -60, - -50, - -50, - -130, - -100, - -95, - -90 - ], - AcircumflexY: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - AcircumflexYacute: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - AcircumflexYdieresis: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - Acircumflexu: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Acircumflexuacute: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Acircumflexucircumflex: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Acircumflexudieresis: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Acircumflexugrave: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Acircumflexuhungarumlaut: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Acircumflexumacron: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Acircumflexuogonek: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Acircumflexuring: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Acircumflexv: [ - -40, - -40, - -40, - -40, - -100, - -74, - -55, - -74 - ], - Acircumflexw: [ - -30, - -30, - -40, - -40, - -90, - -74, - -55, - -92 - ], - Acircumflexy: [ - -30, - -30, - -40, - -40, - -74, - -74, - -55, - -92 - ], - Acircumflexyacute: [ - -30, - -30, - -40, - -40, - -74, - -74, - -55, - -92 - ], - Acircumflexydieresis: [ - -30, - -30, - -40, - -40, - -74, - -74, - -55, - -92 - ], - AdieresisC: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AdieresisCacute: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AdieresisCcaron: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AdieresisCcedilla: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AdieresisG: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AdieresisGbreve: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AdieresisGcommaaccent: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AdieresisO: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AdieresisOacute: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AdieresisOcircumflex: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AdieresisOdieresis: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AdieresisOgrave: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AdieresisOhungarumlaut: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AdieresisOmacron: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AdieresisOslash: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AdieresisOtilde: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AdieresisQ: [ - -40, - -40, - -30, - -30, - -45, - -55, - -40, - -55 - ], - AdieresisT: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - AdieresisTcaron: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - AdieresisTcommaaccent: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - AdieresisU: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AdieresisUacute: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AdieresisUcircumflex: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AdieresisUdieresis: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AdieresisUgrave: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AdieresisUhungarumlaut: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AdieresisUmacron: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AdieresisUogonek: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AdieresisUring: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AdieresisV: [ - -80, - -80, - -70, - -70, - -145, - -95, - -105, - -135 - ], - AdieresisW: [ - -60, - -60, - -50, - -50, - -130, - -100, - -95, - -90 - ], - AdieresisY: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - AdieresisYacute: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - AdieresisYdieresis: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - Adieresisu: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Adieresisuacute: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Adieresisucircumflex: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Adieresisudieresis: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Adieresisugrave: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Adieresisuhungarumlaut: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Adieresisumacron: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Adieresisuogonek: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Adieresisuring: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Adieresisv: [ - -40, - -40, - -40, - -40, - -100, - -74, - -55, - -74 - ], - Adieresisw: [ - -30, - -30, - -40, - -40, - -90, - -74, - -55, - -92 - ], - Adieresisy: [ - -30, - -30, - -40, - -40, - -74, - -74, - -55, - -92 - ], - Adieresisyacute: [ - -30, - -30, - -40, - -40, - -74, - -74, - -55, - -92 - ], - Adieresisydieresis: [ - -30, - -30, - -40, - -40, - -74, - -74, - -55, - -92 - ], - AgraveC: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AgraveCacute: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AgraveCcaron: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AgraveCcedilla: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AgraveG: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AgraveGbreve: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AgraveGcommaaccent: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AgraveO: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AgraveOacute: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AgraveOcircumflex: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AgraveOdieresis: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AgraveOgrave: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AgraveOhungarumlaut: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AgraveOmacron: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AgraveOslash: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AgraveOtilde: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AgraveQ: [ - -40, - -40, - -30, - -30, - -45, - -55, - -40, - -55 - ], - AgraveT: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - AgraveTcaron: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - AgraveTcommaaccent: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - AgraveU: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AgraveUacute: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AgraveUcircumflex: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AgraveUdieresis: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AgraveUgrave: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AgraveUhungarumlaut: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AgraveUmacron: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AgraveUogonek: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AgraveUring: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AgraveV: [ - -80, - -80, - -70, - -70, - -145, - -95, - -105, - -135 - ], - AgraveW: [ - -60, - -60, - -50, - -50, - -130, - -100, - -95, - -90 - ], - AgraveY: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - AgraveYacute: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - AgraveYdieresis: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - Agraveu: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Agraveuacute: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Agraveucircumflex: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Agraveudieresis: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Agraveugrave: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Agraveuhungarumlaut: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Agraveumacron: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Agraveuogonek: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Agraveuring: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Agravev: [ - -40, - -40, - -40, - -40, - -100, - -74, - -55, - -74 - ], - Agravew: [ - -30, - -30, - -40, - -40, - -90, - -74, - -55, - -92 - ], - Agravey: [ - -30, - -30, - -40, - -40, - -74, - -74, - -55, - -92 - ], - Agraveyacute: [ - -30, - -30, - -40, - -40, - -74, - -74, - -55, - -92 - ], - Agraveydieresis: [ - -30, - -30, - -40, - -40, - -74, - -74, - -55, - -92 - ], - AmacronC: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AmacronCacute: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AmacronCcaron: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AmacronCcedilla: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AmacronG: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AmacronGbreve: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AmacronGcommaaccent: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AmacronO: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AmacronOacute: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AmacronOcircumflex: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AmacronOdieresis: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AmacronOgrave: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AmacronOhungarumlaut: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AmacronOmacron: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AmacronOslash: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AmacronOtilde: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AmacronQ: [ - -40, - -40, - -30, - -30, - -45, - -55, - -40, - -55 - ], - AmacronT: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - AmacronTcaron: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - AmacronTcommaaccent: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - AmacronU: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AmacronUacute: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AmacronUcircumflex: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AmacronUdieresis: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AmacronUgrave: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AmacronUhungarumlaut: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AmacronUmacron: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AmacronUogonek: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AmacronUring: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AmacronV: [ - -80, - -80, - -70, - -70, - -145, - -95, - -105, - -135 - ], - AmacronW: [ - -60, - -60, - -50, - -50, - -130, - -100, - -95, - -90 - ], - AmacronY: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - AmacronYacute: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - AmacronYdieresis: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - Amacronu: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Amacronuacute: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Amacronucircumflex: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Amacronudieresis: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Amacronugrave: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Amacronuhungarumlaut: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Amacronumacron: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Amacronuogonek: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Amacronuring: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Amacronv: [ - -40, - -40, - -40, - -40, - -100, - -74, - -55, - -74 - ], - Amacronw: [ - -30, - -30, - -40, - -40, - -90, - -74, - -55, - -92 - ], - Amacrony: [ - -30, - -30, - -40, - -40, - -74, - -74, - -55, - -92 - ], - Amacronyacute: [ - -30, - -30, - -40, - -40, - -74, - -74, - -55, - -92 - ], - Amacronydieresis: [ - -30, - -30, - -40, - -40, - -74, - -74, - -55, - -92 - ], - AogonekC: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AogonekCacute: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AogonekCcaron: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AogonekCcedilla: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AogonekG: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AogonekGbreve: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AogonekGcommaaccent: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AogonekO: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AogonekOacute: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AogonekOcircumflex: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AogonekOdieresis: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AogonekOgrave: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AogonekOhungarumlaut: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AogonekOmacron: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AogonekOslash: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AogonekOtilde: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AogonekQ: [ - -40, - -40, - -30, - -30, - -45, - -55, - -40, - -55 - ], - AogonekT: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - AogonekTcaron: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - AogonekTcommaaccent: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - AogonekU: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AogonekUacute: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AogonekUcircumflex: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AogonekUdieresis: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AogonekUgrave: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AogonekUhungarumlaut: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AogonekUmacron: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AogonekUogonek: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AogonekUring: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AogonekV: [ - -80, - -80, - -70, - -70, - -145, - -95, - -105, - -135 - ], - AogonekW: [ - -60, - -60, - -50, - -50, - -130, - -100, - -95, - -90 - ], - AogonekY: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - AogonekYacute: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - AogonekYdieresis: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - Aogoneku: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Aogonekuacute: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Aogonekucircumflex: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Aogonekudieresis: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Aogonekugrave: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Aogonekuhungarumlaut: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Aogonekumacron: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Aogonekuogonek: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Aogonekuring: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Aogonekv: [ - -40, - -40, - -40, - -40, - -100, - -74, - -55, - -74 - ], - Aogonekw: [ - -30, - -30, - -40, - -40, - -90, - -74, - -55, - -52 - ], - Aogoneky: [ - -30, - -30, - -40, - -40, - -34, - -34, - -55, - -52 - ], - Aogonekyacute: [ - -30, - -30, - -40, - -40, - -34, - -34, - -55, - -52 - ], - Aogonekydieresis: [ - -30, - -30, - -40, - -40, - -34, - -34, - -55, - -52 - ], - AringC: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AringCacute: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AringCcaron: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AringCcedilla: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AringG: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AringGbreve: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AringGcommaaccent: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AringO: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AringOacute: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AringOcircumflex: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AringOdieresis: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AringOgrave: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AringOhungarumlaut: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AringOmacron: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AringOslash: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AringOtilde: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AringQ: [ - -40, - -40, - -30, - -30, - -45, - -55, - -40, - -55 - ], - AringT: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - AringTcaron: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - AringTcommaaccent: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - AringU: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AringUacute: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AringUcircumflex: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AringUdieresis: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AringUgrave: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AringUhungarumlaut: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AringUmacron: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AringUogonek: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AringUring: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AringV: [ - -80, - -80, - -70, - -70, - -145, - -95, - -105, - -135 - ], - AringW: [ - -60, - -60, - -50, - -50, - -130, - -100, - -95, - -90 - ], - AringY: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - AringYacute: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - AringYdieresis: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - Aringu: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Aringuacute: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Aringucircumflex: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Aringudieresis: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Aringugrave: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Aringuhungarumlaut: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Aringumacron: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Aringuogonek: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Aringuring: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Aringv: [ - -40, - -40, - -40, - -40, - -100, - -74, - -55, - -74 - ], - Aringw: [ - -30, - -30, - -40, - -40, - -90, - -74, - -55, - -92 - ], - Aringy: [ - -30, - -30, - -40, - -40, - -74, - -74, - -55, - -92 - ], - Aringyacute: [ - -30, - -30, - -40, - -40, - -74, - -74, - -55, - -92 - ], - Aringydieresis: [ - -30, - -30, - -40, - -40, - -74, - -74, - -55, - -92 - ], - AtildeC: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AtildeCacute: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AtildeCcaron: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AtildeCcedilla: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AtildeG: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AtildeGbreve: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AtildeGcommaaccent: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AtildeO: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AtildeOacute: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AtildeOcircumflex: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AtildeOdieresis: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AtildeOgrave: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AtildeOhungarumlaut: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AtildeOmacron: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AtildeOslash: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AtildeOtilde: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AtildeQ: [ - -40, - -40, - -30, - -30, - -45, - -55, - -40, - -55 - ], - AtildeT: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - AtildeTcaron: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - AtildeTcommaaccent: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - AtildeU: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AtildeUacute: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AtildeUcircumflex: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AtildeUdieresis: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AtildeUgrave: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AtildeUhungarumlaut: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AtildeUmacron: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AtildeUogonek: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AtildeUring: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AtildeV: [ - -80, - -80, - -70, - -70, - -145, - -95, - -105, - -135 - ], - AtildeW: [ - -60, - -60, - -50, - -50, - -130, - -100, - -95, - -90 - ], - AtildeY: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - AtildeYacute: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - AtildeYdieresis: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - Atildeu: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Atildeuacute: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Atildeucircumflex: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Atildeudieresis: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Atildeugrave: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Atildeuhungarumlaut: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Atildeumacron: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Atildeuogonek: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Atildeuring: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Atildev: [ - -40, - -40, - -40, - -40, - -100, - -74, - -55, - -74 - ], - Atildew: [ - -30, - -30, - -40, - -40, - -90, - -74, - -55, - -92 - ], - Atildey: [ - -30, - -30, - -40, - -40, - -74, - -74, - -55, - -92 - ], - Atildeyacute: [ - -30, - -30, - -40, - -40, - -74, - -74, - -55, - -92 - ], - Atildeydieresis: [ - -30, - -30, - -40, - -40, - -74, - -74, - -55, - -92 - ], - BA: [ - -30, - -30, - 0, - 0, - -30, - -25, - -25, - -35 - ], - BAacute: [ - -30, - -30, - 0, - 0, - -30, - -25, - -25, - -35 - ], - BAbreve: [ - -30, - -30, - 0, - 0, - -30, - -25, - -25, - -35 - ], - BAcircumflex: [ - -30, - -30, - 0, - 0, - -30, - -25, - -25, - -35 - ], - BAdieresis: [ - -30, - -30, - 0, - 0, - -30, - -25, - -25, - -35 - ], - BAgrave: [ - -30, - -30, - 0, - 0, - -30, - -25, - -25, - -35 - ], - BAmacron: [ - -30, - -30, - 0, - 0, - -30, - -25, - -25, - -35 - ], - BAogonek: [ - -30, - -30, - 0, - 0, - -30, - -25, - -25, - -35 - ], - BAring: [ - -30, - -30, - 0, - 0, - -30, - -25, - -25, - -35 - ], - BAtilde: [ - -30, - -30, - 0, - 0, - -30, - -25, - -25, - -35 - ], - BU: [ - -10, - -10, - -10, - -10, - -10, - -10, - -10, - -10 - ], - BUacute: [ - -10, - -10, - -10, - -10, - -10, - -10, - -10, - -10 - ], - BUcircumflex: [ - -10, - -10, - -10, - -10, - -10, - -10, - -10, - -10 - ], - BUdieresis: [ - -10, - -10, - -10, - -10, - -10, - -10, - -10, - -10 - ], - BUgrave: [ - -10, - -10, - -10, - -10, - -10, - -10, - -10, - -10 - ], - BUhungarumlaut: [ - -10, - -10, - -10, - -10, - -10, - -10, - -10, - -10 - ], - BUmacron: [ - -10, - -10, - -10, - -10, - -10, - -10, - -10, - -10 - ], - BUogonek: [ - -10, - -10, - -10, - -10, - -10, - -10, - -10, - -10 - ], - BUring: [ - -10, - -10, - -10, - -10, - -10, - -10, - -10, - -10 - ], - DA: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DAacute: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DAbreve: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DAcircumflex: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DAdieresis: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DAgrave: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DAmacron: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DAogonek: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DAring: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DAtilde: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DV: [ - -40, - -40, - -70, - -70, - -40, - -50, - -40, - -40 - ], - DW: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -30 - ], - DY: [ - -70, - -70, - -90, - -90, - -40, - -50, - -40, - -55 - ], - DYacute: [ - -70, - -70, - -90, - -90, - -40, - -50, - -40, - -55 - ], - DYdieresis: [ - -70, - -70, - -90, - -90, - -40, - -50, - -40, - -55 - ], - Dcomma: [ - -30, - -30, - -70, - -70 - ], - Dperiod: [ - -30, - -30, - -70, - -70, - -20 - ], - DcaronA: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DcaronAacute: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DcaronAbreve: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DcaronAcircumflex: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DcaronAdieresis: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DcaronAgrave: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DcaronAmacron: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DcaronAogonek: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DcaronAring: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DcaronAtilde: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DcaronV: [ - -40, - -40, - -70, - -70, - -40, - -50, - -40, - -40 - ], - DcaronW: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -30 - ], - DcaronY: [ - -70, - -70, - -90, - -90, - -40, - -50, - -40, - -55 - ], - DcaronYacute: [ - -70, - -70, - -90, - -90, - -40, - -50, - -40, - -55 - ], - DcaronYdieresis: [ - -70, - -70, - -90, - -90, - -40, - -50, - -40, - -55 - ], - Dcaroncomma: [ - -30, - -30, - -70, - -70 - ], - Dcaronperiod: [ - -30, - -30, - -70, - -70, - -20 - ], - DcroatA: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DcroatAacute: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DcroatAbreve: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DcroatAcircumflex: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DcroatAdieresis: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DcroatAgrave: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DcroatAmacron: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DcroatAogonek: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DcroatAring: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DcroatAtilde: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DcroatV: [ - -40, - -40, - -70, - -70, - -40, - -50, - -40, - -40 - ], - DcroatW: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -30 - ], - DcroatY: [ - -70, - -70, - -90, - -90, - -40, - -50, - -40, - -55 - ], - DcroatYacute: [ - -70, - -70, - -90, - -90, - -40, - -50, - -40, - -55 - ], - DcroatYdieresis: [ - -70, - -70, - -90, - -90, - -40, - -50, - -40, - -55 - ], - Dcroatcomma: [ - -30, - -30, - -70, - -70 - ], - Dcroatperiod: [ - -30, - -30, - -70, - -70, - -20 - ], - FA: [ - -80, - -80, - -80, - -80, - -90, - -100, - -115, - -74 - ], - FAacute: [ - -80, - -80, - -80, - -80, - -90, - -100, - -115, - -74 - ], - FAbreve: [ - -80, - -80, - -80, - -80, - -90, - -100, - -115, - -74 - ], - FAcircumflex: [ - -80, - -80, - -80, - -80, - -90, - -100, - -115, - -74 - ], - FAdieresis: [ - -80, - -80, - -80, - -80, - -90, - -100, - -115, - -74 - ], - FAgrave: [ - -80, - -80, - -80, - -80, - -90, - -100, - -115, - -74 - ], - FAmacron: [ - -80, - -80, - -80, - -80, - -90, - -100, - -115, - -74 - ], - FAogonek: [ - -80, - -80, - -80, - -80, - -90, - -100, - -115, - -74 - ], - FAring: [ - -80, - -80, - -80, - -80, - -90, - -100, - -115, - -74 - ], - FAtilde: [ - -80, - -80, - -80, - -80, - -90, - -100, - -115, - -74 - ], - Fa: [ - -20, - -20, - -50, - -50, - -25, - -95, - -75, - -15 - ], - Faacute: [ - -20, - -20, - -50, - -50, - -25, - -95, - -75, - -15 - ], - Fabreve: [ - -20, - -20, - -50, - -50, - -25, - -95, - -75, - -15 - ], - Facircumflex: [ - -20, - -20, - -50, - -50, - -25, - -95, - -75, - -15 - ], - Fadieresis: [ - -20, - -20, - -50, - -50, - -25, - -95, - -75, - -15 - ], - Fagrave: [ - -20, - -20, - -50, - -50, - -25, - -95, - -75, - -15 - ], - Famacron: [ - -20, - -20, - -50, - -50, - -25, - -95, - -75, - -15 - ], - Faogonek: [ - -20, - -20, - -50, - -50, - -25, - -95, - -75, - -15 - ], - Faring: [ - -20, - -20, - -50, - -50, - -25, - -95, - -75, - -15 - ], - Fatilde: [ - -20, - -20, - -50, - -50, - -25, - -95, - -75, - -15 - ], - Fcomma: [ - -100, - -100, - -150, - -150, - -92, - -129, - -135, - -80 - ], - Fperiod: [ - -100, - -100, - -150, - -150, - -110, - -129, - -135, - -80 - ], - JA: [ - -20, - -20, - -20, - -20, - -30, - -25, - -40, - -60 - ], - JAacute: [ - -20, - -20, - -20, - -20, - -30, - -25, - -40, - -60 - ], - JAbreve: [ - -20, - -20, - -20, - -20, - -30, - -25, - -40, - -60 - ], - JAcircumflex: [ - -20, - -20, - -20, - -20, - -30, - -25, - -40, - -60 - ], - JAdieresis: [ - -20, - -20, - -20, - -20, - -30, - -25, - -40, - -60 - ], - JAgrave: [ - -20, - -20, - -20, - -20, - -30, - -25, - -40, - -60 - ], - JAmacron: [ - -20, - -20, - -20, - -20, - -30, - -25, - -40, - -60 - ], - JAogonek: [ - -20, - -20, - -20, - -20, - -30, - -25, - -40, - -60 - ], - JAring: [ - -20, - -20, - -20, - -20, - -30, - -25, - -40, - -60 - ], - JAtilde: [ - -20, - -20, - -20, - -20, - -30, - -25, - -40, - -60 - ], - Jcomma: [ - -20, - -20, - -30, - -30, - 0, - -10, - -25 - ], - Jperiod: [ - -20, - -20, - -30, - -30, - -20, - -10, - -25 - ], - Ju: [ - -20, - -20, - -20, - -20, - -15, - -40, - -35 - ], - Juacute: [ - -20, - -20, - -20, - -20, - -15, - -40, - -35 - ], - Jucircumflex: [ - -20, - -20, - -20, - -20, - -15, - -40, - -35 - ], - Judieresis: [ - -20, - -20, - -20, - -20, - -15, - -40, - -35 - ], - Jugrave: [ - -20, - -20, - -20, - -20, - -15, - -40, - -35 - ], - Juhungarumlaut: [ - -20, - -20, - -20, - -20, - -15, - -40, - -35 - ], - Jumacron: [ - -20, - -20, - -20, - -20, - -15, - -40, - -35 - ], - Juogonek: [ - -20, - -20, - -20, - -20, - -15, - -40, - -35 - ], - Juring: [ - -20, - -20, - -20, - -20, - -15, - -40, - -35 - ], - KO: [ - -30, - -30, - -50, - -50, - -30, - -30, - -50, - -30 - ], - KOacute: [ - -30, - -30, - -50, - -50, - -30, - -30, - -50, - -30 - ], - KOcircumflex: [ - -30, - -30, - -50, - -50, - -30, - -30, - -50, - -30 - ], - KOdieresis: [ - -30, - -30, - -50, - -50, - -30, - -30, - -50, - -30 - ], - KOgrave: [ - -30, - -30, - -50, - -50, - -30, - -30, - -50, - -30 - ], - KOhungarumlaut: [ - -30, - -30, - -50, - -50, - -30, - -30, - -50, - -30 - ], - KOmacron: [ - -30, - -30, - -50, - -50, - -30, - -30, - -50, - -30 - ], - KOslash: [ - -30, - -30, - -50, - -50, - -30, - -30, - -50, - -30 - ], - KOtilde: [ - -30, - -30, - -50, - -50, - -30, - -30, - -50, - -30 - ], - Ke: [ - -15, - -15, - -40, - -40, - -25, - -25, - -35, - -25 - ], - Keacute: [ - -15, - -15, - -40, - -40, - -25, - -25, - -35, - -25 - ], - Kecaron: [ - -15, - -15, - -40, - -40, - -25, - -25, - -35, - -25 - ], - Kecircumflex: [ - -15, - -15, - -40, - -40, - -25, - -25, - -35, - -25 - ], - Kedieresis: [ - -15, - -15, - -40, - -40, - -25, - -25, - -35, - -25 - ], - Kedotaccent: [ - -15, - -15, - -40, - -40, - -25, - -25, - -35, - -25 - ], - Kegrave: [ - -15, - -15, - -40, - -40, - -25, - -25, - -35, - -25 - ], - Kemacron: [ - -15, - -15, - -40, - -40, - -25, - -25, - -35, - -25 - ], - Keogonek: [ - -15, - -15, - -40, - -40, - -25, - -25, - -35, - -25 - ], - Ko: [ - -35, - -35, - -40, - -40, - -25, - -25, - -40, - -35 - ], - Koacute: [ - -35, - -35, - -40, - -40, - -25, - -25, - -40, - -35 - ], - Kocircumflex: [ - -35, - -35, - -40, - -40, - -25, - -25, - -40, - -35 - ], - Kodieresis: [ - -35, - -35, - -40, - -40, - -25, - -25, - -40, - -35 - ], - Kograve: [ - -35, - -35, - -40, - -40, - -25, - -25, - -40, - -35 - ], - Kohungarumlaut: [ - -35, - -35, - -40, - -40, - -25, - -25, - -40, - -35 - ], - Komacron: [ - -35, - -35, - -40, - -40, - -25, - -25, - -40, - -35 - ], - Koslash: [ - -35, - -35, - -40, - -40, - -25, - -25, - -40, - -35 - ], - Kotilde: [ - -35, - -35, - -40, - -40, - -25, - -25, - -40, - -35 - ], - Ku: [ - -30, - -30, - -30, - -30, - -15, - -20, - -40, - -15 - ], - Kuacute: [ - -30, - -30, - -30, - -30, - -15, - -20, - -40, - -15 - ], - Kucircumflex: [ - -30, - -30, - -30, - -30, - -15, - -20, - -40, - -15 - ], - Kudieresis: [ - -30, - -30, - -30, - -30, - -15, - -20, - -40, - -15 - ], - Kugrave: [ - -30, - -30, - -30, - -30, - -15, - -20, - -40, - -15 - ], - Kuhungarumlaut: [ - -30, - -30, - -30, - -30, - -15, - -20, - -40, - -15 - ], - Kumacron: [ - -30, - -30, - -30, - -30, - -15, - -20, - -40, - -15 - ], - Kuogonek: [ - -30, - -30, - -30, - -30, - -15, - -20, - -40, - -15 - ], - Kuring: [ - -30, - -30, - -30, - -30, - -15, - -20, - -40, - -15 - ], - Ky: [ - -40, - -40, - -50, - -50, - -45, - -20, - -40, - -25 - ], - Kyacute: [ - -40, - -40, - -50, - -50, - -45, - -20, - -40, - -25 - ], - Kydieresis: [ - -40, - -40, - -50, - -50, - -45, - -20, - -40, - -25 - ], - KcommaaccentO: [ - -30, - -30, - -50, - -50, - -30, - -30, - -50, - -30 - ], - KcommaaccentOacute: [ - -30, - -30, - -50, - -50, - -30, - -30, - -50, - -30 - ], - KcommaaccentOcircumflex: [ - -30, - -30, - -50, - -50, - -30, - -30, - -50, - -30 - ], - KcommaaccentOdieresis: [ - -30, - -30, - -50, - -50, - -30, - -30, - -50, - -30 - ], - KcommaaccentOgrave: [ - -30, - -30, - -50, - -50, - -30, - -30, - -50, - -30 - ], - KcommaaccentOhungarumlaut: [ - -30, - -30, - -50, - -50, - -30, - -30, - -50, - -30 - ], - KcommaaccentOmacron: [ - -30, - -30, - -50, - -50, - -30, - -30, - -50, - -30 - ], - KcommaaccentOslash: [ - -30, - -30, - -50, - -50, - -30, - -30, - -50, - -30 - ], - KcommaaccentOtilde: [ - -30, - -30, - -50, - -50, - -30, - -30, - -50, - -30 - ], - Kcommaaccente: [ - -15, - -15, - -40, - -40, - -25, - -25, - -35, - -25 - ], - Kcommaaccenteacute: [ - -15, - -15, - -40, - -40, - -25, - -25, - -35, - -25 - ], - Kcommaaccentecaron: [ - -15, - -15, - -40, - -40, - -25, - -25, - -35, - -25 - ], - Kcommaaccentecircumflex: [ - -15, - -15, - -40, - -40, - -25, - -25, - -35, - -25 - ], - Kcommaaccentedieresis: [ - -15, - -15, - -40, - -40, - -25, - -25, - -35, - -25 - ], - Kcommaaccentedotaccent: [ - -15, - -15, - -40, - -40, - -25, - -25, - -35, - -25 - ], - Kcommaaccentegrave: [ - -15, - -15, - -40, - -40, - -25, - -25, - -35, - -25 - ], - Kcommaaccentemacron: [ - -15, - -15, - -40, - -40, - -25, - -25, - -35, - -25 - ], - Kcommaaccenteogonek: [ - -15, - -15, - -40, - -40, - -25, - -25, - -35, - -25 - ], - Kcommaaccento: [ - -35, - -35, - -40, - -40, - -25, - -25, - -40, - -35 - ], - Kcommaaccentoacute: [ - -35, - -35, - -40, - -40, - -25, - -25, - -40, - -35 - ], - Kcommaaccentocircumflex: [ - -35, - -35, - -40, - -40, - -25, - -25, - -40, - -35 - ], - Kcommaaccentodieresis: [ - -35, - -35, - -40, - -40, - -25, - -25, - -40, - -35 - ], - Kcommaaccentograve: [ - -35, - -35, - -40, - -40, - -25, - -25, - -40, - -35 - ], - Kcommaaccentohungarumlaut: [ - -35, - -35, - -40, - -40, - -25, - -25, - -40, - -35 - ], - Kcommaaccentomacron: [ - -35, - -35, - -40, - -40, - -25, - -25, - -40, - -35 - ], - Kcommaaccentoslash: [ - -35, - -35, - -40, - -40, - -25, - -25, - -40, - -35 - ], - Kcommaaccentotilde: [ - -35, - -35, - -40, - -40, - -25, - -25, - -40, - -35 - ], - Kcommaaccentu: [ - -30, - -30, - -30, - -30, - -15, - -20, - -40, - -15 - ], - Kcommaaccentuacute: [ - -30, - -30, - -30, - -30, - -15, - -20, - -40, - -15 - ], - Kcommaaccentucircumflex: [ - -30, - -30, - -30, - -30, - -15, - -20, - -40, - -15 - ], - Kcommaaccentudieresis: [ - -30, - -30, - -30, - -30, - -15, - -20, - -40, - -15 - ], - Kcommaaccentugrave: [ - -30, - -30, - -30, - -30, - -15, - -20, - -40, - -15 - ], - Kcommaaccentuhungarumlaut: [ - -30, - -30, - -30, - -30, - -15, - -20, - -40, - -15 - ], - Kcommaaccentumacron: [ - -30, - -30, - -30, - -30, - -15, - -20, - -40, - -15 - ], - Kcommaaccentuogonek: [ - -30, - -30, - -30, - -30, - -15, - -20, - -40, - -15 - ], - Kcommaaccenturing: [ - -30, - -30, - -30, - -30, - -15, - -20, - -40, - -15 - ], - Kcommaaccenty: [ - -40, - -40, - -50, - -50, - -45, - -20, - -40, - -25 - ], - Kcommaaccentyacute: [ - -40, - -40, - -50, - -50, - -45, - -20, - -40, - -25 - ], - Kcommaaccentydieresis: [ - -40, - -40, - -50, - -50, - -45, - -20, - -40, - -25 - ], - LT: [ - -90, - -90, - -110, - -110, - -92, - -18, - -20, - -92 - ], - LTcaron: [ - -90, - -90, - -110, - -110, - -92, - -18, - -20, - -92 - ], - LTcommaaccent: [ - -90, - -90, - -110, - -110, - -92, - -18, - -20, - -92 - ], - LV: [ - -110, - -110, - -110, - -110, - -92, - -37, - -55, - -100 - ], - LW: [ - -80, - -80, - -70, - -70, - -92, - -37, - -55, - -74 - ], - LY: [ - -120, - -120, - -140, - -140, - -92, - -37, - -20, - -100 - ], - LYacute: [ - -120, - -120, - -140, - -140, - -92, - -37, - -20, - -100 - ], - LYdieresis: [ - -120, - -120, - -140, - -140, - -92, - -37, - -20, - -100 - ], - Lquotedblright: [ - -140, - -140, - -140, - -140, - -20 - ], - Lquoteright: [ - -140, - -140, - -160, - -160, - -110, - -55, - -37, - -92 - ], - Ly: [ - -30, - -30, - -30, - -30, - -55, - -37, - -30, - -55 - ], - Lyacute: [ - -30, - -30, - -30, - -30, - -55, - -37, - -30, - -55 - ], - Lydieresis: [ - -30, - -30, - -30, - -30, - -55, - -37, - -30, - -55 - ], - LacuteT: [ - -90, - -90, - -110, - -110, - -92, - -18, - -20, - -92 - ], - LacuteTcaron: [ - -90, - -90, - -110, - -110, - -92, - -18, - -20, - -92 - ], - LacuteTcommaaccent: [ - -90, - -90, - -110, - -110, - -92, - -18, - -20, - -92 - ], - LacuteV: [ - -110, - -110, - -110, - -110, - -92, - -37, - -55, - -100 - ], - LacuteW: [ - -80, - -80, - -70, - -70, - -92, - -37, - -55, - -74 - ], - LacuteY: [ - -120, - -120, - -140, - -140, - -92, - -37, - -20, - -100 - ], - LacuteYacute: [ - -120, - -120, - -140, - -140, - -92, - -37, - -20, - -100 - ], - LacuteYdieresis: [ - -120, - -120, - -140, - -140, - -92, - -37, - -20, - -100 - ], - Lacutequotedblright: [ - -140, - -140, - -140, - -140, - -20 - ], - Lacutequoteright: [ - -140, - -140, - -160, - -160, - -110, - -55, - -37, - -92 - ], - Lacutey: [ - -30, - -30, - -30, - -30, - -55, - -37, - -30, - -55 - ], - Lacuteyacute: [ - -30, - -30, - -30, - -30, - -55, - -37, - -30, - -55 - ], - Lacuteydieresis: [ - -30, - -30, - -30, - -30, - -55, - -37, - -30, - -55 - ], - LcommaaccentT: [ - -90, - -90, - -110, - -110, - -92, - -18, - -20, - -92 - ], - LcommaaccentTcaron: [ - -90, - -90, - -110, - -110, - -92, - -18, - -20, - -92 - ], - LcommaaccentTcommaaccent: [ - -90, - -90, - -110, - -110, - -92, - -18, - -20, - -92 - ], - LcommaaccentV: [ - -110, - -110, - -110, - -110, - -92, - -37, - -55, - -100 - ], - LcommaaccentW: [ - -80, - -80, - -70, - -70, - -92, - -37, - -55, - -74 - ], - LcommaaccentY: [ - -120, - -120, - -140, - -140, - -92, - -37, - -20, - -100 - ], - LcommaaccentYacute: [ - -120, - -120, - -140, - -140, - -92, - -37, - -20, - -100 - ], - LcommaaccentYdieresis: [ - -120, - -120, - -140, - -140, - -92, - -37, - -20, - -100 - ], - Lcommaaccentquotedblright: [ - -140, - -140, - -140, - -140, - -20 - ], - Lcommaaccentquoteright: [ - -140, - -140, - -160, - -160, - -110, - -55, - -37, - -92 - ], - Lcommaaccenty: [ - -30, - -30, - -30, - -30, - -55, - -37, - -30, - -55 - ], - Lcommaaccentyacute: [ - -30, - -30, - -30, - -30, - -55, - -37, - -30, - -55 - ], - Lcommaaccentydieresis: [ - -30, - -30, - -30, - -30, - -55, - -37, - -30, - -55 - ], - LslashT: [ - -90, - -90, - -110, - -110, - -92, - -18, - -20, - -92 - ], - LslashTcaron: [ - -90, - -90, - -110, - -110, - -92, - -18, - -20, - -92 - ], - LslashTcommaaccent: [ - -90, - -90, - -110, - -110, - -92, - -18, - -20, - -92 - ], - LslashV: [ - -110, - -110, - -110, - -110, - -92, - -37, - -55, - -100 - ], - LslashW: [ - -80, - -80, - -70, - -70, - -92, - -37, - -55, - -74 - ], - LslashY: [ - -120, - -120, - -140, - -140, - -92, - -37, - -20, - -100 - ], - LslashYacute: [ - -120, - -120, - -140, - -140, - -92, - -37, - -20, - -100 - ], - LslashYdieresis: [ - -120, - -120, - -140, - -140, - -92, - -37, - -20, - -100 - ], - Lslashquotedblright: [ - -140, - -140, - -140, - -140, - -20 - ], - Lslashquoteright: [ - -140, - -140, - -160, - -160, - -110, - -55, - -37, - -92 - ], - Lslashy: [ - -30, - -30, - -30, - -30, - -55, - -37, - -30, - -55 - ], - Lslashyacute: [ - -30, - -30, - -30, - -30, - -55, - -37, - -30, - -55 - ], - Lslashydieresis: [ - -30, - -30, - -30, - -30, - -55, - -37, - -30, - -55 - ], - OA: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OAacute: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OAbreve: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OAcircumflex: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OAdieresis: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OAgrave: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OAmacron: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OAogonek: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OAring: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OAtilde: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OT: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -40 - ], - OTcaron: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -40 - ], - OTcommaaccent: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -40 - ], - OV: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -50 - ], - OW: [ - -50, - -50, - -30, - -30, - -50, - -50, - -50, - -35 - ], - OX: [ - -50, - -50, - -60, - -60, - -40, - -40, - -40, - -40 - ], - OY: [ - -70, - -70, - -70, - -70, - -50, - -50, - -50, - -50 - ], - OYacute: [ - -70, - -70, - -70, - -70, - -50, - -50, - -50, - -50 - ], - OYdieresis: [ - -70, - -70, - -70, - -70, - -50, - -50, - -50, - -50 - ], - Ocomma: [ - -40, - -40, - -40, - -40 - ], - Operiod: [ - -40, - -40, - -40, - -40 - ], - OacuteA: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OacuteAacute: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OacuteAbreve: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OacuteAcircumflex: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OacuteAdieresis: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OacuteAgrave: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OacuteAmacron: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OacuteAogonek: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OacuteAring: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OacuteAtilde: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OacuteT: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -40 - ], - OacuteTcaron: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -40 - ], - OacuteTcommaaccent: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -40 - ], - OacuteV: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -50 - ], - OacuteW: [ - -50, - -50, - -30, - -30, - -50, - -50, - -50, - -35 - ], - OacuteX: [ - -50, - -50, - -60, - -60, - -40, - -40, - -40, - -40 - ], - OacuteY: [ - -70, - -70, - -70, - -70, - -50, - -50, - -50, - -50 - ], - OacuteYacute: [ - -70, - -70, - -70, - -70, - -50, - -50, - -50, - -50 - ], - OacuteYdieresis: [ - -70, - -70, - -70, - -70, - -50, - -50, - -50, - -50 - ], - Oacutecomma: [ - -40, - -40, - -40, - -40 - ], - Oacuteperiod: [ - -40, - -40, - -40, - -40 - ], - OcircumflexA: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OcircumflexAacute: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OcircumflexAbreve: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OcircumflexAcircumflex: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OcircumflexAdieresis: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OcircumflexAgrave: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OcircumflexAmacron: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OcircumflexAogonek: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OcircumflexAring: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OcircumflexAtilde: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OcircumflexT: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -40 - ], - OcircumflexTcaron: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -40 - ], - OcircumflexTcommaaccent: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -40 - ], - OcircumflexV: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -50 - ], - OcircumflexW: [ - -50, - -50, - -30, - -30, - -50, - -50, - -50, - -35 - ], - OcircumflexX: [ - -50, - -50, - -60, - -60, - -40, - -40, - -40, - -40 - ], - OcircumflexY: [ - -70, - -70, - -70, - -70, - -50, - -50, - -50, - -50 - ], - OcircumflexYacute: [ - -70, - -70, - -70, - -70, - -50, - -50, - -50, - -50 - ], - OcircumflexYdieresis: [ - -70, - -70, - -70, - -70, - -50, - -50, - -50, - -50 - ], - Ocircumflexcomma: [ - -40, - -40, - -40, - -40 - ], - Ocircumflexperiod: [ - -40, - -40, - -40, - -40 - ], - OdieresisA: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OdieresisAacute: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OdieresisAbreve: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OdieresisAcircumflex: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OdieresisAdieresis: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OdieresisAgrave: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OdieresisAmacron: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OdieresisAogonek: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OdieresisAring: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OdieresisAtilde: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OdieresisT: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -40 - ], - OdieresisTcaron: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -40 - ], - OdieresisTcommaaccent: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -40 - ], - OdieresisV: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -50 - ], - OdieresisW: [ - -50, - -50, - -30, - -30, - -50, - -50, - -50, - -35 - ], - OdieresisX: [ - -50, - -50, - -60, - -60, - -40, - -40, - -40, - -40 - ], - OdieresisY: [ - -70, - -70, - -70, - -70, - -50, - -50, - -50, - -50 - ], - OdieresisYacute: [ - -70, - -70, - -70, - -70, - -50, - -50, - -50, - -50 - ], - OdieresisYdieresis: [ - -70, - -70, - -70, - -70, - -50, - -50, - -50, - -50 - ], - Odieresiscomma: [ - -40, - -40, - -40, - -40 - ], - Odieresisperiod: [ - -40, - -40, - -40, - -40 - ], - OgraveA: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OgraveAacute: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OgraveAbreve: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OgraveAcircumflex: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OgraveAdieresis: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OgraveAgrave: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OgraveAmacron: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OgraveAogonek: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OgraveAring: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OgraveAtilde: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OgraveT: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -40 - ], - OgraveTcaron: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -40 - ], - OgraveTcommaaccent: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -40 - ], - OgraveV: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -50 - ], - OgraveW: [ - -50, - -50, - -30, - -30, - -50, - -50, - -50, - -35 - ], - OgraveX: [ - -50, - -50, - -60, - -60, - -40, - -40, - -40, - -40 - ], - OgraveY: [ - -70, - -70, - -70, - -70, - -50, - -50, - -50, - -50 - ], - OgraveYacute: [ - -70, - -70, - -70, - -70, - -50, - -50, - -50, - -50 - ], - OgraveYdieresis: [ - -70, - -70, - -70, - -70, - -50, - -50, - -50, - -50 - ], - Ogravecomma: [ - -40, - -40, - -40, - -40 - ], - Ograveperiod: [ - -40, - -40, - -40, - -40 - ], - OhungarumlautA: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OhungarumlautAacute: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OhungarumlautAbreve: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OhungarumlautAcircumflex: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OhungarumlautAdieresis: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OhungarumlautAgrave: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OhungarumlautAmacron: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OhungarumlautAogonek: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OhungarumlautAring: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OhungarumlautAtilde: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OhungarumlautT: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -40 - ], - OhungarumlautTcaron: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -40 - ], - OhungarumlautTcommaaccent: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -40 - ], - OhungarumlautV: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -50 - ], - OhungarumlautW: [ - -50, - -50, - -30, - -30, - -50, - -50, - -50, - -35 - ], - OhungarumlautX: [ - -50, - -50, - -60, - -60, - -40, - -40, - -40, - -40 - ], - OhungarumlautY: [ - -70, - -70, - -70, - -70, - -50, - -50, - -50, - -50 - ], - OhungarumlautYacute: [ - -70, - -70, - -70, - -70, - -50, - -50, - -50, - -50 - ], - OhungarumlautYdieresis: [ - -70, - -70, - -70, - -70, - -50, - -50, - -50, - -50 - ], - Ohungarumlautcomma: [ - -40, - -40, - -40, - -40 - ], - Ohungarumlautperiod: [ - -40, - -40, - -40, - -40 - ], - OmacronA: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OmacronAacute: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OmacronAbreve: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OmacronAcircumflex: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OmacronAdieresis: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OmacronAgrave: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OmacronAmacron: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OmacronAogonek: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OmacronAring: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OmacronAtilde: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OmacronT: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -40 - ], - OmacronTcaron: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -40 - ], - OmacronTcommaaccent: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -40 - ], - OmacronV: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -50 - ], - OmacronW: [ - -50, - -50, - -30, - -30, - -50, - -50, - -50, - -35 - ], - OmacronX: [ - -50, - -50, - -60, - -60, - -40, - -40, - -40, - -40 - ], - OmacronY: [ - -70, - -70, - -70, - -70, - -50, - -50, - -50, - -50 - ], - OmacronYacute: [ - -70, - -70, - -70, - -70, - -50, - -50, - -50, - -50 - ], - OmacronYdieresis: [ - -70, - -70, - -70, - -70, - -50, - -50, - -50, - -50 - ], - Omacroncomma: [ - -40, - -40, - -40, - -40 - ], - Omacronperiod: [ - -40, - -40, - -40, - -40 - ], - OslashA: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OslashAacute: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OslashAbreve: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OslashAcircumflex: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OslashAdieresis: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OslashAgrave: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OslashAmacron: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OslashAogonek: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OslashAring: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OslashAtilde: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OslashT: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -40 - ], - OslashTcaron: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -40 - ], - OslashTcommaaccent: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -40 - ], - OslashV: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -50 - ], - OslashW: [ - -50, - -50, - -30, - -30, - -50, - -50, - -50, - -35 - ], - OslashX: [ - -50, - -50, - -60, - -60, - -40, - -40, - -40, - -40 - ], - OslashY: [ - -70, - -70, - -70, - -70, - -50, - -50, - -50, - -50 - ], - OslashYacute: [ - -70, - -70, - -70, - -70, - -50, - -50, - -50, - -50 - ], - OslashYdieresis: [ - -70, - -70, - -70, - -70, - -50, - -50, - -50, - -50 - ], - Oslashcomma: [ - -40, - -40, - -40, - -40 - ], - Oslashperiod: [ - -40, - -40, - -40, - -40 - ], - OtildeA: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OtildeAacute: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OtildeAbreve: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OtildeAcircumflex: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OtildeAdieresis: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OtildeAgrave: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OtildeAmacron: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OtildeAogonek: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OtildeAring: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OtildeAtilde: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OtildeT: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -40 - ], - OtildeTcaron: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -40 - ], - OtildeTcommaaccent: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -40 - ], - OtildeV: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -50 - ], - OtildeW: [ - -50, - -50, - -30, - -30, - -50, - -50, - -50, - -35 - ], - OtildeX: [ - -50, - -50, - -60, - -60, - -40, - -40, - -40, - -40 - ], - OtildeY: [ - -70, - -70, - -70, - -70, - -50, - -50, - -50, - -50 - ], - OtildeYacute: [ - -70, - -70, - -70, - -70, - -50, - -50, - -50, - -50 - ], - OtildeYdieresis: [ - -70, - -70, - -70, - -70, - -50, - -50, - -50, - -50 - ], - Otildecomma: [ - -40, - -40, - -40, - -40 - ], - Otildeperiod: [ - -40, - -40, - -40, - -40 - ], - PA: [ - -100, - -100, - -120, - -120, - -74, - -85, - -90, - -92 - ], - PAacute: [ - -100, - -100, - -120, - -120, - -74, - -85, - -90, - -92 - ], - PAbreve: [ - -100, - -100, - -120, - -120, - -74, - -85, - -90, - -92 - ], - PAcircumflex: [ - -100, - -100, - -120, - -120, - -74, - -85, - -90, - -92 - ], - PAdieresis: [ - -100, - -100, - -120, - -120, - -74, - -85, - -90, - -92 - ], - PAgrave: [ - -100, - -100, - -120, - -120, - -74, - -85, - -90, - -92 - ], - PAmacron: [ - -100, - -100, - -120, - -120, - -74, - -85, - -90, - -92 - ], - PAogonek: [ - -100, - -100, - -120, - -120, - -74, - -85, - -90, - -92 - ], - PAring: [ - -100, - -100, - -120, - -120, - -74, - -85, - -90, - -92 - ], - PAtilde: [ - -100, - -100, - -120, - -120, - -74, - -85, - -90, - -92 - ], - Pa: [ - -30, - -30, - -40, - -40, - -10, - -40, - -80, - -15 - ], - Paacute: [ - -30, - -30, - -40, - -40, - -10, - -40, - -80, - -15 - ], - Pabreve: [ - -30, - -30, - -40, - -40, - -10, - -40, - -80, - -15 - ], - Pacircumflex: [ - -30, - -30, - -40, - -40, - -10, - -40, - -80, - -15 - ], - Padieresis: [ - -30, - -30, - -40, - -40, - -10, - -40, - -80, - -15 - ], - Pagrave: [ - -30, - -30, - -40, - -40, - -10, - -40, - -80, - -15 - ], - Pamacron: [ - -30, - -30, - -40, - -40, - -10, - -40, - -80, - -15 - ], - Paogonek: [ - -30, - -30, - -40, - -40, - -10, - -40, - -80, - -15 - ], - Paring: [ - -30, - -30, - -40, - -40, - -10, - -40, - -80, - -15 - ], - Patilde: [ - -30, - -30, - -40, - -40, - -10, - -40, - -80, - -15 - ], - Pcomma: [ - -120, - -120, - -180, - -180, - -92, - -129, - -135, - -111 - ], - Pe: [ - -30, - -30, - -50, - -50, - -20, - -50, - -80 - ], - Peacute: [ - -30, - -30, - -50, - -50, - -20, - -50, - -80 - ], - Pecaron: [ - -30, - -30, - -50, - -50, - -20, - -50, - -80 - ], - Pecircumflex: [ - -30, - -30, - -50, - -50, - -20, - -50, - -80 - ], - Pedieresis: [ - -30, - -30, - -50, - -50, - -20, - -50, - -80 - ], - Pedotaccent: [ - -30, - -30, - -50, - -50, - -20, - -50, - -80 - ], - Pegrave: [ - -30, - -30, - -50, - -50, - -20, - -50, - -80 - ], - Pemacron: [ - -30, - -30, - -50, - -50, - -20, - -50, - -80 - ], - Peogonek: [ - -30, - -30, - -50, - -50, - -20, - -50, - -80 - ], - Po: [ - -40, - -40, - -50, - -50, - -20, - -55, - -80 - ], - Poacute: [ - -40, - -40, - -50, - -50, - -20, - -55, - -80 - ], - Pocircumflex: [ - -40, - -40, - -50, - -50, - -20, - -55, - -80 - ], - Podieresis: [ - -40, - -40, - -50, - -50, - -20, - -55, - -80 - ], - Pograve: [ - -40, - -40, - -50, - -50, - -20, - -55, - -80 - ], - Pohungarumlaut: [ - -40, - -40, - -50, - -50, - -20, - -55, - -80 - ], - Pomacron: [ - -40, - -40, - -50, - -50, - -20, - -55, - -80 - ], - Poslash: [ - -40, - -40, - -50, - -50, - -20, - -55, - -80 - ], - Potilde: [ - -40, - -40, - -50, - -50, - -20, - -55, - -80 - ], - Pperiod: [ - -120, - -120, - -180, - -180, - -110, - -129, - -135, - -111 - ], - QU: [ - -10, - -10, - -10, - -10, - -10, - -10, - -10, - -10 - ], - QUacute: [ - -10, - -10, - -10, - -10, - -10, - -10, - -10, - -10 - ], - QUcircumflex: [ - -10, - -10, - -10, - -10, - -10, - -10, - -10, - -10 - ], - QUdieresis: [ - -10, - -10, - -10, - -10, - -10, - -10, - -10, - -10 - ], - QUgrave: [ - -10, - -10, - -10, - -10, - -10, - -10, - -10, - -10 - ], - QUhungarumlaut: [ - -10, - -10, - -10, - -10, - -10, - -10, - -10, - -10 - ], - QUmacron: [ - -10, - -10, - -10, - -10, - -10, - -10, - -10, - -10 - ], - QUogonek: [ - -10, - -10, - -10, - -10, - -10, - -10, - -10, - -10 - ], - QUring: [ - -10, - -10, - -10, - -10, - -10, - -10, - -10, - -10 - ], - Qcomma: [ - 20, - 20 - ], - Qperiod: [ - 20, - 20, - 0, - 0, - -20 - ], - RO: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - ROacute: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - ROcircumflex: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - ROdieresis: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - ROgrave: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - ROhungarumlaut: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - ROmacron: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - ROslash: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - ROtilde: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - RT: [ - -20, - -20, - -30, - -30, - -40, - -30, - 0, - -60 - ], - RTcaron: [ - -20, - -20, - -30, - -30, - -40, - -30, - 0, - -60 - ], - RTcommaaccent: [ - -20, - -20, - -30, - -30, - -40, - -30, - 0, - -60 - ], - RU: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RUacute: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RUcircumflex: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RUdieresis: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RUgrave: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RUhungarumlaut: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RUmacron: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RUogonek: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RUring: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RV: [ - -50, - -50, - -50, - -50, - -55, - -18, - -18, - -80 - ], - RW: [ - -40, - -40, - -30, - -30, - -35, - -18, - -18, - -55 - ], - RY: [ - -50, - -50, - -50, - -50, - -35, - -18, - -18, - -65 - ], - RYacute: [ - -50, - -50, - -50, - -50, - -35, - -18, - -18, - -65 - ], - RYdieresis: [ - -50, - -50, - -50, - -50, - -35, - -18, - -18, - -65 - ], - RacuteO: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - RacuteOacute: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - RacuteOcircumflex: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - RacuteOdieresis: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - RacuteOgrave: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - RacuteOhungarumlaut: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - RacuteOmacron: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - RacuteOslash: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - RacuteOtilde: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - RacuteT: [ - -20, - -20, - -30, - -30, - -40, - -30, - 0, - -60 - ], - RacuteTcaron: [ - -20, - -20, - -30, - -30, - -40, - -30, - 0, - -60 - ], - RacuteTcommaaccent: [ - -20, - -20, - -30, - -30, - -40, - -30, - 0, - -60 - ], - RacuteU: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RacuteUacute: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RacuteUcircumflex: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RacuteUdieresis: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RacuteUgrave: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RacuteUhungarumlaut: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RacuteUmacron: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RacuteUogonek: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RacuteUring: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RacuteV: [ - -50, - -50, - -50, - -50, - -55, - -18, - -18, - -80 - ], - RacuteW: [ - -40, - -40, - -30, - -30, - -35, - -18, - -18, - -55 - ], - RacuteY: [ - -50, - -50, - -50, - -50, - -35, - -18, - -18, - -65 - ], - RacuteYacute: [ - -50, - -50, - -50, - -50, - -35, - -18, - -18, - -65 - ], - RacuteYdieresis: [ - -50, - -50, - -50, - -50, - -35, - -18, - -18, - -65 - ], - RcaronO: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - RcaronOacute: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - RcaronOcircumflex: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - RcaronOdieresis: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - RcaronOgrave: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - RcaronOhungarumlaut: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - RcaronOmacron: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - RcaronOslash: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - RcaronOtilde: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - RcaronT: [ - -20, - -20, - -30, - -30, - -40, - -30, - 0, - -60 - ], - RcaronTcaron: [ - -20, - -20, - -30, - -30, - -40, - -30, - 0, - -60 - ], - RcaronTcommaaccent: [ - -20, - -20, - -30, - -30, - -40, - -30, - 0, - -60 - ], - RcaronU: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RcaronUacute: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RcaronUcircumflex: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RcaronUdieresis: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RcaronUgrave: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RcaronUhungarumlaut: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RcaronUmacron: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RcaronUogonek: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RcaronUring: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RcaronV: [ - -50, - -50, - -50, - -50, - -55, - -18, - -18, - -80 - ], - RcaronW: [ - -40, - -40, - -30, - -30, - -35, - -18, - -18, - -55 - ], - RcaronY: [ - -50, - -50, - -50, - -50, - -35, - -18, - -18, - -65 - ], - RcaronYacute: [ - -50, - -50, - -50, - -50, - -35, - -18, - -18, - -65 - ], - RcaronYdieresis: [ - -50, - -50, - -50, - -50, - -35, - -18, - -18, - -65 - ], - RcommaaccentO: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - RcommaaccentOacute: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - RcommaaccentOcircumflex: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - RcommaaccentOdieresis: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - RcommaaccentOgrave: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - RcommaaccentOhungarumlaut: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - RcommaaccentOmacron: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - RcommaaccentOslash: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - RcommaaccentOtilde: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - RcommaaccentT: [ - -20, - -20, - -30, - -30, - -40, - -30, - 0, - -60 - ], - RcommaaccentTcaron: [ - -20, - -20, - -30, - -30, - -40, - -30, - 0, - -60 - ], - RcommaaccentTcommaaccent: [ - -20, - -20, - -30, - -30, - -40, - -30, - 0, - -60 - ], - RcommaaccentU: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RcommaaccentUacute: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RcommaaccentUcircumflex: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RcommaaccentUdieresis: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RcommaaccentUgrave: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RcommaaccentUhungarumlaut: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RcommaaccentUmacron: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RcommaaccentUogonek: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RcommaaccentUring: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RcommaaccentV: [ - -50, - -50, - -50, - -50, - -55, - -18, - -18, - -80 - ], - RcommaaccentW: [ - -40, - -40, - -30, - -30, - -35, - -18, - -18, - -55 - ], - RcommaaccentY: [ - -50, - -50, - -50, - -50, - -35, - -18, - -18, - -65 - ], - RcommaaccentYacute: [ - -50, - -50, - -50, - -50, - -35, - -18, - -18, - -65 - ], - RcommaaccentYdieresis: [ - -50, - -50, - -50, - -50, - -35, - -18, - -18, - -65 - ], - TA: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TAacute: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TAbreve: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TAcircumflex: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TAdieresis: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TAgrave: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TAmacron: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TAogonek: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TAring: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TAtilde: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TO: [ - -40, - -40, - -40, - -40, - -18, - -18, - -18, - -18 - ], - TOacute: [ - -40, - -40, - -40, - -40, - -18, - -18, - -18, - -18 - ], - TOcircumflex: [ - -40, - -40, - -40, - -40, - -18, - -18, - -18, - -18 - ], - TOdieresis: [ - -40, - -40, - -40, - -40, - -18, - -18, - -18, - -18 - ], - TOgrave: [ - -40, - -40, - -40, - -40, - -18, - -18, - -18, - -18 - ], - TOhungarumlaut: [ - -40, - -40, - -40, - -40, - -18, - -18, - -18, - -18 - ], - TOmacron: [ - -40, - -40, - -40, - -40, - -18, - -18, - -18, - -18 - ], - TOslash: [ - -40, - -40, - -40, - -40, - -18, - -18, - -18, - -18 - ], - TOtilde: [ - -40, - -40, - -40, - -40, - -18, - -18, - -18, - -18 - ], - Ta: [ - -80, - -80, - -120, - -120, - -92, - -92, - -92, - -80 - ], - Taacute: [ - -80, - -80, - -120, - -120, - -92, - -92, - -92, - -80 - ], - Tabreve: [ - -80, - -80, - -60, - -60, - -52, - -92, - -92, - -80 - ], - Tacircumflex: [ - -80, - -80, - -120, - -120, - -52, - -92, - -92, - -80 - ], - Tadieresis: [ - -80, - -80, - -120, - -120, - -52, - -92, - -92, - -40 - ], - Tagrave: [ - -80, - -80, - -120, - -120, - -52, - -92, - -92, - -40 - ], - Tamacron: [ - -80, - -80, - -60, - -60, - -52, - -92, - -92, - -40 - ], - Taogonek: [ - -80, - -80, - -120, - -120, - -92, - -92, - -92, - -80 - ], - Taring: [ - -80, - -80, - -120, - -120, - -92, - -92, - -92, - -80 - ], - Tatilde: [ - -80, - -80, - -60, - -60, - -52, - -92, - -92, - -40 - ], - Tcolon: [ - -40, - -40, - -20, - -20, - -74, - -74, - -55, - -50 - ], - Tcomma: [ - -80, - -80, - -120, - -120, - -74, - -92, - -74, - -74 - ], - Te: [ - -60, - -60, - -120, - -120, - -92, - -92, - -92, - -70 - ], - Teacute: [ - -60, - -60, - -120, - -120, - -92, - -92, - -92, - -70 - ], - Tecaron: [ - -60, - -60, - -120, - -120, - -92, - -92, - -92, - -70 - ], - Tecircumflex: [ - -60, - -60, - -120, - -120, - -92, - -92, - -52, - -70 - ], - Tedieresis: [ - -60, - -60, - -120, - -120, - -52, - -52, - -52, - -30 - ], - Tedotaccent: [ - -60, - -60, - -120, - -120, - -92, - -92, - -92, - -70 - ], - Tegrave: [ - -60, - -60, - -60, - -60, - -52, - -52, - -52, - -70 - ], - Temacron: [ - -60, - -60, - -60, - -60, - -52, - -52, - -52, - -30 - ], - Teogonek: [ - -60, - -60, - -120, - -120, - -92, - -92, - -92, - -70 - ], - Thyphen: [ - -120, - -120, - -140, - -140, - -92, - -92, - -74, - -92 - ], - To: [ - -80, - -80, - -120, - -120, - -92, - -95, - -92, - -80 - ], - Toacute: [ - -80, - -80, - -120, - -120, - -92, - -95, - -92, - -80 - ], - Tocircumflex: [ - -80, - -80, - -120, - -120, - -92, - -95, - -92, - -80 - ], - Todieresis: [ - -80, - -80, - -120, - -120, - -92, - -95, - -92, - -80 - ], - Tograve: [ - -80, - -80, - -120, - -120, - -92, - -95, - -92, - -80 - ], - Tohungarumlaut: [ - -80, - -80, - -120, - -120, - -92, - -95, - -92, - -80 - ], - Tomacron: [ - -80, - -80, - -60, - -60, - -92, - -95, - -92, - -80 - ], - Toslash: [ - -80, - -80, - -120, - -120, - -92, - -95, - -92, - -80 - ], - Totilde: [ - -80, - -80, - -60, - -60, - -92, - -95, - -92, - -80 - ], - Tperiod: [ - -80, - -80, - -120, - -120, - -90, - -92, - -74, - -74 - ], - Tr: [ - -80, - -80, - -120, - -120, - -74, - -37, - -55, - -35 - ], - Tracute: [ - -80, - -80, - -120, - -120, - -74, - -37, - -55, - -35 - ], - Trcommaaccent: [ - -80, - -80, - -120, - -120, - -74, - -37, - -55, - -35 - ], - Tsemicolon: [ - -40, - -40, - -20, - -20, - -74, - -74, - -65, - -55 - ], - Tu: [ - -90, - -90, - -120, - -120, - -92, - -37, - -55, - -45 - ], - Tuacute: [ - -90, - -90, - -120, - -120, - -92, - -37, - -55, - -45 - ], - Tucircumflex: [ - -90, - -90, - -120, - -120, - -92, - -37, - -55, - -45 - ], - Tudieresis: [ - -90, - -90, - -120, - -120, - -92, - -37, - -55, - -45 - ], - Tugrave: [ - -90, - -90, - -120, - -120, - -92, - -37, - -55, - -45 - ], - Tuhungarumlaut: [ - -90, - -90, - -120, - -120, - -92, - -37, - -55, - -45 - ], - Tumacron: [ - -90, - -90, - -60, - -60, - -92, - -37, - -55, - -45 - ], - Tuogonek: [ - -90, - -90, - -120, - -120, - -92, - -37, - -55, - -45 - ], - Turing: [ - -90, - -90, - -120, - -120, - -92, - -37, - -55, - -45 - ], - Tw: [ - -60, - -60, - -120, - -120, - -74, - -37, - -74, - -80 - ], - Ty: [ - -60, - -60, - -120, - -120, - -34, - -37, - -74, - -80 - ], - Tyacute: [ - -60, - -60, - -120, - -120, - -34, - -37, - -74, - -80 - ], - Tydieresis: [ - -60, - -60, - -60, - -60, - -34, - -37, - -34, - -80 - ], - TcaronA: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TcaronAacute: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TcaronAbreve: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TcaronAcircumflex: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TcaronAdieresis: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TcaronAgrave: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TcaronAmacron: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TcaronAogonek: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TcaronAring: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TcaronAtilde: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TcaronO: [ - -40, - -40, - -40, - -40, - -18, - -18, - -18, - -18 - ], - TcaronOacute: [ - -40, - -40, - -40, - -40, - -18, - -18, - -18, - -18 - ], - TcaronOcircumflex: [ - -40, - -40, - -40, - -40, - -18, - -18, - -18, - -18 - ], - TcaronOdieresis: [ - -40, - -40, - -40, - -40, - -18, - -18, - -18, - -18 - ], - TcaronOgrave: [ - -40, - -40, - -40, - -40, - -18, - -18, - -18, - -18 - ], - TcaronOhungarumlaut: [ - -40, - -40, - -40, - -40, - -18, - -18, - -18, - -18 - ], - TcaronOmacron: [ - -40, - -40, - -40, - -40, - -18, - -18, - -18, - -18 - ], - TcaronOslash: [ - -40, - -40, - -40, - -40, - -18, - -18, - -18, - -18 - ], - TcaronOtilde: [ - -40, - -40, - -40, - -40, - -18, - -18, - -18, - -18 - ], - Tcarona: [ - -80, - -80, - -120, - -120, - -92, - -92, - -92, - -80 - ], - Tcaronaacute: [ - -80, - -80, - -120, - -120, - -92, - -92, - -92, - -80 - ], - Tcaronabreve: [ - -80, - -80, - -60, - -60, - -52, - -92, - -92, - -80 - ], - Tcaronacircumflex: [ - -80, - -80, - -120, - -120, - -52, - -92, - -92, - -80 - ], - Tcaronadieresis: [ - -80, - -80, - -120, - -120, - -52, - -92, - -92, - -40 - ], - Tcaronagrave: [ - -80, - -80, - -120, - -120, - -52, - -92, - -92, - -40 - ], - Tcaronamacron: [ - -80, - -80, - -60, - -60, - -52, - -92, - -92, - -40 - ], - Tcaronaogonek: [ - -80, - -80, - -120, - -120, - -92, - -92, - -92, - -80 - ], - Tcaronaring: [ - -80, - -80, - -120, - -120, - -92, - -92, - -92, - -80 - ], - Tcaronatilde: [ - -80, - -80, - -60, - -60, - -52, - -92, - -92, - -40 - ], - Tcaroncolon: [ - -40, - -40, - -20, - -20, - -74, - -74, - -55, - -50 - ], - Tcaroncomma: [ - -80, - -80, - -120, - -120, - -74, - -92, - -74, - -74 - ], - Tcarone: [ - -60, - -60, - -120, - -120, - -92, - -92, - -92, - -70 - ], - Tcaroneacute: [ - -60, - -60, - -120, - -120, - -92, - -92, - -92, - -70 - ], - Tcaronecaron: [ - -60, - -60, - -120, - -120, - -92, - -92, - -92, - -70 - ], - Tcaronecircumflex: [ - -60, - -60, - -120, - -120, - -92, - -92, - -52, - -30 - ], - Tcaronedieresis: [ - -60, - -60, - -120, - -120, - -52, - -52, - -52, - -30 - ], - Tcaronedotaccent: [ - -60, - -60, - -120, - -120, - -92, - -92, - -92, - -70 - ], - Tcaronegrave: [ - -60, - -60, - -60, - -60, - -52, - -52, - -52, - -70 - ], - Tcaronemacron: [ - -60, - -60, - -60, - -60, - -52, - -52, - -52, - -30 - ], - Tcaroneogonek: [ - -60, - -60, - -120, - -120, - -92, - -92, - -92, - -70 - ], - Tcaronhyphen: [ - -120, - -120, - -140, - -140, - -92, - -92, - -74, - -92 - ], - Tcarono: [ - -80, - -80, - -120, - -120, - -92, - -95, - -92, - -80 - ], - Tcaronoacute: [ - -80, - -80, - -120, - -120, - -92, - -95, - -92, - -80 - ], - Tcaronocircumflex: [ - -80, - -80, - -120, - -120, - -92, - -95, - -92, - -80 - ], - Tcaronodieresis: [ - -80, - -80, - -120, - -120, - -92, - -95, - -92, - -80 - ], - Tcaronograve: [ - -80, - -80, - -120, - -120, - -92, - -95, - -92, - -80 - ], - Tcaronohungarumlaut: [ - -80, - -80, - -120, - -120, - -92, - -95, - -92, - -80 - ], - Tcaronomacron: [ - -80, - -80, - -60, - -60, - -92, - -95, - -92, - -80 - ], - Tcaronoslash: [ - -80, - -80, - -120, - -120, - -92, - -95, - -92, - -80 - ], - Tcaronotilde: [ - -80, - -80, - -60, - -60, - -92, - -95, - -92, - -80 - ], - Tcaronperiod: [ - -80, - -80, - -120, - -120, - -90, - -92, - -74, - -74 - ], - Tcaronr: [ - -80, - -80, - -120, - -120, - -74, - -37, - -55, - -35 - ], - Tcaronracute: [ - -80, - -80, - -120, - -120, - -74, - -37, - -55, - -35 - ], - Tcaronrcommaaccent: [ - -80, - -80, - -120, - -120, - -74, - -37, - -55, - -35 - ], - Tcaronsemicolon: [ - -40, - -40, - -20, - -20, - -74, - -74, - -65, - -55 - ], - Tcaronu: [ - -90, - -90, - -120, - -120, - -92, - -37, - -55, - -45 - ], - Tcaronuacute: [ - -90, - -90, - -120, - -120, - -92, - -37, - -55, - -45 - ], - Tcaronucircumflex: [ - -90, - -90, - -120, - -120, - -92, - -37, - -55, - -45 - ], - Tcaronudieresis: [ - -90, - -90, - -120, - -120, - -92, - -37, - -55, - -45 - ], - Tcaronugrave: [ - -90, - -90, - -120, - -120, - -92, - -37, - -55, - -45 - ], - Tcaronuhungarumlaut: [ - -90, - -90, - -120, - -120, - -92, - -37, - -55, - -45 - ], - Tcaronumacron: [ - -90, - -90, - -60, - -60, - -92, - -37, - -55, - -45 - ], - Tcaronuogonek: [ - -90, - -90, - -120, - -120, - -92, - -37, - -55, - -45 - ], - Tcaronuring: [ - -90, - -90, - -120, - -120, - -92, - -37, - -55, - -45 - ], - Tcaronw: [ - -60, - -60, - -120, - -120, - -74, - -37, - -74, - -80 - ], - Tcarony: [ - -60, - -60, - -120, - -120, - -34, - -37, - -74, - -80 - ], - Tcaronyacute: [ - -60, - -60, - -120, - -120, - -34, - -37, - -74, - -80 - ], - Tcaronydieresis: [ - -60, - -60, - -60, - -60, - -34, - -37, - -34, - -80 - ], - TcommaaccentA: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TcommaaccentAacute: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TcommaaccentAbreve: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TcommaaccentAcircumflex: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TcommaaccentAdieresis: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TcommaaccentAgrave: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TcommaaccentAmacron: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TcommaaccentAogonek: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TcommaaccentAring: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TcommaaccentAtilde: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TcommaaccentO: [ - -40, - -40, - -40, - -40, - -18, - -18, - -18, - -18 - ], - TcommaaccentOacute: [ - -40, - -40, - -40, - -40, - -18, - -18, - -18, - -18 - ], - TcommaaccentOcircumflex: [ - -40, - -40, - -40, - -40, - -18, - -18, - -18, - -18 - ], - TcommaaccentOdieresis: [ - -40, - -40, - -40, - -40, - -18, - -18, - -18, - -18 - ], - TcommaaccentOgrave: [ - -40, - -40, - -40, - -40, - -18, - -18, - -18, - -18 - ], - TcommaaccentOhungarumlaut: [ - -40, - -40, - -40, - -40, - -18, - -18, - -18, - -18 - ], - TcommaaccentOmacron: [ - -40, - -40, - -40, - -40, - -18, - -18, - -18, - -18 - ], - TcommaaccentOslash: [ - -40, - -40, - -40, - -40, - -18, - -18, - -18, - -18 - ], - TcommaaccentOtilde: [ - -40, - -40, - -40, - -40, - -18, - -18, - -18, - -18 - ], - Tcommaaccenta: [ - -80, - -80, - -120, - -120, - -92, - -92, - -92, - -80 - ], - Tcommaaccentaacute: [ - -80, - -80, - -120, - -120, - -92, - -92, - -92, - -80 - ], - Tcommaaccentabreve: [ - -80, - -80, - -60, - -60, - -52, - -92, - -92, - -80 - ], - Tcommaaccentacircumflex: [ - -80, - -80, - -120, - -120, - -52, - -92, - -92, - -80 - ], - Tcommaaccentadieresis: [ - -80, - -80, - -120, - -120, - -52, - -92, - -92, - -40 - ], - Tcommaaccentagrave: [ - -80, - -80, - -120, - -120, - -52, - -92, - -92, - -40 - ], - Tcommaaccentamacron: [ - -80, - -80, - -60, - -60, - -52, - -92, - -92, - -40 - ], - Tcommaaccentaogonek: [ - -80, - -80, - -120, - -120, - -92, - -92, - -92, - -80 - ], - Tcommaaccentaring: [ - -80, - -80, - -120, - -120, - -92, - -92, - -92, - -80 - ], - Tcommaaccentatilde: [ - -80, - -80, - -60, - -60, - -52, - -92, - -92, - -40 - ], - Tcommaaccentcolon: [ - -40, - -40, - -20, - -20, - -74, - -74, - -55, - -50 - ], - Tcommaaccentcomma: [ - -80, - -80, - -120, - -120, - -74, - -92, - -74, - -74 - ], - Tcommaaccente: [ - -60, - -60, - -120, - -120, - -92, - -92, - -92, - -70 - ], - Tcommaaccenteacute: [ - -60, - -60, - -120, - -120, - -92, - -92, - -92, - -70 - ], - Tcommaaccentecaron: [ - -60, - -60, - -120, - -120, - -92, - -92, - -92, - -70 - ], - Tcommaaccentecircumflex: [ - -60, - -60, - -120, - -120, - -92, - -92, - -52, - -30 - ], - Tcommaaccentedieresis: [ - -60, - -60, - -120, - -120, - -52, - -52, - -52, - -30 - ], - Tcommaaccentedotaccent: [ - -60, - -60, - -120, - -120, - -92, - -92, - -92, - -70 - ], - Tcommaaccentegrave: [ - -60, - -60, - -60, - -60, - -52, - -52, - -52, - -30 - ], - Tcommaaccentemacron: [ - -60, - -60, - -60, - -60, - -52, - -52, - -52, - -70 - ], - Tcommaaccenteogonek: [ - -60, - -60, - -120, - -120, - -92, - -92, - -92, - -70 - ], - Tcommaaccenthyphen: [ - -120, - -120, - -140, - -140, - -92, - -92, - -74, - -92 - ], - Tcommaaccento: [ - -80, - -80, - -120, - -120, - -92, - -95, - -92, - -80 - ], - Tcommaaccentoacute: [ - -80, - -80, - -120, - -120, - -92, - -95, - -92, - -80 - ], - Tcommaaccentocircumflex: [ - -80, - -80, - -120, - -120, - -92, - -95, - -92, - -80 - ], - Tcommaaccentodieresis: [ - -80, - -80, - -120, - -120, - -92, - -95, - -92, - -80 - ], - Tcommaaccentograve: [ - -80, - -80, - -120, - -120, - -92, - -95, - -92, - -80 - ], - Tcommaaccentohungarumlaut: [ - -80, - -80, - -120, - -120, - -92, - -95, - -92, - -80 - ], - Tcommaaccentomacron: [ - -80, - -80, - -60, - -60, - -92, - -95, - -92, - -80 - ], - Tcommaaccentoslash: [ - -80, - -80, - -120, - -120, - -92, - -95, - -92, - -80 - ], - Tcommaaccentotilde: [ - -80, - -80, - -60, - -60, - -92, - -95, - -92, - -80 - ], - Tcommaaccentperiod: [ - -80, - -80, - -120, - -120, - -90, - -92, - -74, - -74 - ], - Tcommaaccentr: [ - -80, - -80, - -120, - -120, - -74, - -37, - -55, - -35 - ], - Tcommaaccentracute: [ - -80, - -80, - -120, - -120, - -74, - -37, - -55, - -35 - ], - Tcommaaccentrcommaaccent: [ - -80, - -80, - -120, - -120, - -74, - -37, - -55, - -35 - ], - Tcommaaccentsemicolon: [ - -40, - -40, - -20, - -20, - -74, - -74, - -65, - -55 - ], - Tcommaaccentu: [ - -90, - -90, - -120, - -120, - -92, - -37, - -55, - -45 - ], - Tcommaaccentuacute: [ - -90, - -90, - -120, - -120, - -92, - -37, - -55, - -45 - ], - Tcommaaccentucircumflex: [ - -90, - -90, - -120, - -120, - -92, - -37, - -55, - -45 - ], - Tcommaaccentudieresis: [ - -90, - -90, - -120, - -120, - -92, - -37, - -55, - -45 - ], - Tcommaaccentugrave: [ - -90, - -90, - -120, - -120, - -92, - -37, - -55, - -45 - ], - Tcommaaccentuhungarumlaut: [ - -90, - -90, - -120, - -120, - -92, - -37, - -55, - -45 - ], - Tcommaaccentumacron: [ - -90, - -90, - -60, - -60, - -92, - -37, - -55, - -45 - ], - Tcommaaccentuogonek: [ - -90, - -90, - -120, - -120, - -92, - -37, - -55, - -45 - ], - Tcommaaccenturing: [ - -90, - -90, - -120, - -120, - -92, - -37, - -55, - -45 - ], - Tcommaaccentw: [ - -60, - -60, - -120, - -120, - -74, - -37, - -74, - -80 - ], - Tcommaaccenty: [ - -60, - -60, - -120, - -120, - -34, - -37, - -74, - -80 - ], - Tcommaaccentyacute: [ - -60, - -60, - -120, - -120, - -34, - -37, - -74, - -80 - ], - Tcommaaccentydieresis: [ - -60, - -60, - -60, - -60, - -34, - -37, - -34, - -80 - ], - UA: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UAacute: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UAbreve: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UAcircumflex: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UAdieresis: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UAgrave: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UAmacron: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UAogonek: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UAring: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UAtilde: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - Ucomma: [ - -30, - -30, - -40, - -40, - -50, - 0, - -25 - ], - Uperiod: [ - -30, - -30, - -40, - -40, - -50, - 0, - -25 - ], - UacuteA: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UacuteAacute: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UacuteAbreve: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UacuteAcircumflex: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UacuteAdieresis: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UacuteAgrave: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UacuteAmacron: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UacuteAogonek: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UacuteAring: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UacuteAtilde: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - Uacutecomma: [ - -30, - -30, - -40, - -40, - -50, - 0, - -25 - ], - Uacuteperiod: [ - -30, - -30, - -40, - -40, - -50, - 0, - -25 - ], - UcircumflexA: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UcircumflexAacute: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UcircumflexAbreve: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UcircumflexAcircumflex: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UcircumflexAdieresis: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UcircumflexAgrave: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UcircumflexAmacron: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UcircumflexAogonek: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UcircumflexAring: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UcircumflexAtilde: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - Ucircumflexcomma: [ - -30, - -30, - -40, - -40, - -50, - 0, - -25 - ], - Ucircumflexperiod: [ - -30, - -30, - -40, - -40, - -50, - 0, - -25 - ], - UdieresisA: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UdieresisAacute: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UdieresisAbreve: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UdieresisAcircumflex: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UdieresisAdieresis: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UdieresisAgrave: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UdieresisAmacron: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UdieresisAogonek: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UdieresisAring: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UdieresisAtilde: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - Udieresiscomma: [ - -30, - -30, - -40, - -40, - -50, - 0, - -25 - ], - Udieresisperiod: [ - -30, - -30, - -40, - -40, - -50, - 0, - -25 - ], - UgraveA: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UgraveAacute: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UgraveAbreve: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UgraveAcircumflex: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UgraveAdieresis: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UgraveAgrave: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UgraveAmacron: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UgraveAogonek: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UgraveAring: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UgraveAtilde: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - Ugravecomma: [ - -30, - -30, - -40, - -40, - -50, - 0, - -25 - ], - Ugraveperiod: [ - -30, - -30, - -40, - -40, - -50, - 0, - -25 - ], - UhungarumlautA: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UhungarumlautAacute: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UhungarumlautAbreve: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UhungarumlautAcircumflex: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UhungarumlautAdieresis: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UhungarumlautAgrave: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UhungarumlautAmacron: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UhungarumlautAogonek: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UhungarumlautAring: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UhungarumlautAtilde: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - Uhungarumlautcomma: [ - -30, - -30, - -40, - -40, - -50, - 0, - -25 - ], - Uhungarumlautperiod: [ - -30, - -30, - -40, - -40, - -50, - 0, - -25 - ], - UmacronA: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UmacronAacute: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UmacronAbreve: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UmacronAcircumflex: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UmacronAdieresis: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UmacronAgrave: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UmacronAmacron: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UmacronAogonek: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UmacronAring: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UmacronAtilde: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - Umacroncomma: [ - -30, - -30, - -40, - -40, - -50, - 0, - -25 - ], - Umacronperiod: [ - -30, - -30, - -40, - -40, - -50, - 0, - -25 - ], - UogonekA: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UogonekAacute: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UogonekAbreve: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UogonekAcircumflex: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UogonekAdieresis: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UogonekAgrave: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UogonekAmacron: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UogonekAogonek: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UogonekAring: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UogonekAtilde: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - Uogonekcomma: [ - -30, - -30, - -40, - -40, - -50, - 0, - -25 - ], - Uogonekperiod: [ - -30, - -30, - -40, - -40, - -50, - 0, - -25 - ], - UringA: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UringAacute: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UringAbreve: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UringAcircumflex: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UringAdieresis: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UringAgrave: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UringAmacron: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UringAogonek: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UringAring: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UringAtilde: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - Uringcomma: [ - -30, - -30, - -40, - -40, - -50, - 0, - -25 - ], - Uringperiod: [ - -30, - -30, - -40, - -40, - -50, - 0, - -25 - ], - VA: [ - -80, - -80, - -80, - -80, - -135, - -85, - -60, - -135 - ], - VAacute: [ - -80, - -80, - -80, - -80, - -135, - -85, - -60, - -135 - ], - VAbreve: [ - -80, - -80, - -80, - -80, - -135, - -85, - -60, - -135 - ], - VAcircumflex: [ - -80, - -80, - -80, - -80, - -135, - -85, - -60, - -135 - ], - VAdieresis: [ - -80, - -80, - -80, - -80, - -135, - -85, - -60, - -135 - ], - VAgrave: [ - -80, - -80, - -80, - -80, - -135, - -85, - -60, - -135 - ], - VAmacron: [ - -80, - -80, - -80, - -80, - -135, - -85, - -60, - -135 - ], - VAogonek: [ - -80, - -80, - -80, - -80, - -135, - -85, - -60, - -135 - ], - VAring: [ - -80, - -80, - -80, - -80, - -135, - -85, - -60, - -135 - ], - VAtilde: [ - -80, - -80, - -80, - -80, - -135, - -85, - -60, - -135 - ], - VG: [ - -50, - -50, - -40, - -40, - -30, - -10, - 0, - -15 - ], - VGbreve: [ - -50, - -50, - -40, - -40, - -30, - -10, - 0, - -15 - ], - VGcommaaccent: [ - -50, - -50, - -40, - -40, - -30, - -10, - 0, - -15 - ], - VO: [ - -50, - -50, - -40, - -40, - -45, - -30, - -30, - -40 - ], - VOacute: [ - -50, - -50, - -40, - -40, - -45, - -30, - -30, - -40 - ], - VOcircumflex: [ - -50, - -50, - -40, - -40, - -45, - -30, - -30, - -40 - ], - VOdieresis: [ - -50, - -50, - -40, - -40, - -45, - -30, - -30, - -40 - ], - VOgrave: [ - -50, - -50, - -40, - -40, - -45, - -30, - -30, - -40 - ], - VOhungarumlaut: [ - -50, - -50, - -40, - -40, - -45, - -30, - -30, - -40 - ], - VOmacron: [ - -50, - -50, - -40, - -40, - -45, - -30, - -30, - -40 - ], - VOslash: [ - -50, - -50, - -40, - -40, - -45, - -30, - -30, - -40 - ], - VOtilde: [ - -50, - -50, - -40, - -40, - -45, - -30, - -30, - -40 - ], - Va: [ - -60, - -60, - -70, - -70, - -92, - -111, - -111, - -111 - ], - Vaacute: [ - -60, - -60, - -70, - -70, - -92, - -111, - -111, - -111 - ], - Vabreve: [ - -60, - -60, - -70, - -70, - -92, - -111, - -111, - -111 - ], - Vacircumflex: [ - -60, - -60, - -70, - -70, - -92, - -111, - -111, - -71 - ], - Vadieresis: [ - -60, - -60, - -70, - -70, - -92, - -111, - -111, - -71 - ], - Vagrave: [ - -60, - -60, - -70, - -70, - -92, - -111, - -111, - -71 - ], - Vamacron: [ - -60, - -60, - -70, - -70, - -92, - -111, - -111, - -71 - ], - Vaogonek: [ - -60, - -60, - -70, - -70, - -92, - -111, - -111, - -111 - ], - Varing: [ - -60, - -60, - -70, - -70, - -92, - -111, - -111, - -111 - ], - Vatilde: [ - -60, - -60, - -70, - -70, - -92, - -111, - -111, - -71 - ], - Vcolon: [ - -40, - -40, - -40, - -40, - -92, - -74, - -65, - -74 - ], - Vcomma: [ - -120, - -120, - -125, - -125, - -129, - -129, - -129, - -129 - ], - Ve: [ - -50, - -50, - -80, - -80, - -100, - -111, - -111, - -111 - ], - Veacute: [ - -50, - -50, - -80, - -80, - -100, - -111, - -111, - -111 - ], - Vecaron: [ - -50, - -50, - -80, - -80, - -100, - -111, - -111, - -71 - ], - Vecircumflex: [ - -50, - -50, - -80, - -80, - -100, - -111, - -111, - -71 - ], - Vedieresis: [ - -50, - -50, - -80, - -80, - -100, - -71, - -71, - -71 - ], - Vedotaccent: [ - -50, - -50, - -80, - -80, - -100, - -111, - -111, - -111 - ], - Vegrave: [ - -50, - -50, - -80, - -80, - -100, - -71, - -71, - -71 - ], - Vemacron: [ - -50, - -50, - -80, - -80, - -100, - -71, - -71, - -71 - ], - Veogonek: [ - -50, - -50, - -80, - -80, - -100, - -111, - -111, - -111 - ], - Vhyphen: [ - -80, - -80, - -80, - -80, - -74, - -70, - -55, - -100 - ], - Vo: [ - -90, - -90, - -80, - -80, - -100, - -111, - -111, - -129 - ], - Voacute: [ - -90, - -90, - -80, - -80, - -100, - -111, - -111, - -129 - ], - Vocircumflex: [ - -90, - -90, - -80, - -80, - -100, - -111, - -111, - -129 - ], - Vodieresis: [ - -90, - -90, - -80, - -80, - -100, - -111, - -111, - -89 - ], - Vograve: [ - -90, - -90, - -80, - -80, - -100, - -111, - -111, - -89 - ], - Vohungarumlaut: [ - -90, - -90, - -80, - -80, - -100, - -111, - -111, - -129 - ], - Vomacron: [ - -90, - -90, - -80, - -80, - -100, - -111, - -111, - -89 - ], - Voslash: [ - -90, - -90, - -80, - -80, - -100, - -111, - -111, - -129 - ], - Votilde: [ - -90, - -90, - -80, - -80, - -100, - -111, - -111, - -89 - ], - Vperiod: [ - -120, - -120, - -125, - -125, - -145, - -129, - -129, - -129 - ], - Vsemicolon: [ - -40, - -40, - -40, - -40, - -92, - -74, - -74, - -74 - ], - Vu: [ - -60, - -60, - -70, - -70, - -92, - -55, - -74, - -75 - ], - Vuacute: [ - -60, - -60, - -70, - -70, - -92, - -55, - -74, - -75 - ], - Vucircumflex: [ - -60, - -60, - -70, - -70, - -92, - -55, - -74, - -75 - ], - Vudieresis: [ - -60, - -60, - -70, - -70, - -92, - -55, - -74, - -75 - ], - Vugrave: [ - -60, - -60, - -70, - -70, - -92, - -55, - -74, - -75 - ], - Vuhungarumlaut: [ - -60, - -60, - -70, - -70, - -92, - -55, - -74, - -75 - ], - Vumacron: [ - -60, - -60, - -70, - -70, - -92, - -55, - -74, - -75 - ], - Vuogonek: [ - -60, - -60, - -70, - -70, - -92, - -55, - -74, - -75 - ], - Vuring: [ - -60, - -60, - -70, - -70, - -92, - -55, - -74, - -75 - ], - WA: [ - -60, - -60, - -50, - -50, - -120, - -74, - -60, - -120 - ], - WAacute: [ - -60, - -60, - -50, - -50, - -120, - -74, - -60, - -120 - ], - WAbreve: [ - -60, - -60, - -50, - -50, - -120, - -74, - -60, - -120 - ], - WAcircumflex: [ - -60, - -60, - -50, - -50, - -120, - -74, - -60, - -120 - ], - WAdieresis: [ - -60, - -60, - -50, - -50, - -120, - -74, - -60, - -120 - ], - WAgrave: [ - -60, - -60, - -50, - -50, - -120, - -74, - -60, - -120 - ], - WAmacron: [ - -60, - -60, - -50, - -50, - -120, - -74, - -60, - -120 - ], - WAogonek: [ - -60, - -60, - -50, - -50, - -120, - -74, - -60, - -120 - ], - WAring: [ - -60, - -60, - -50, - -50, - -120, - -74, - -60, - -120 - ], - WAtilde: [ - -60, - -60, - -50, - -50, - -120, - -74, - -60, - -120 - ], - WO: [ - -20, - -20, - -20, - -20, - -10, - -15, - -25, - -10 - ], - WOacute: [ - -20, - -20, - -20, - -20, - -10, - -15, - -25, - -10 - ], - WOcircumflex: [ - -20, - -20, - -20, - -20, - -10, - -15, - -25, - -10 - ], - WOdieresis: [ - -20, - -20, - -20, - -20, - -10, - -15, - -25, - -10 - ], - WOgrave: [ - -20, - -20, - -20, - -20, - -10, - -15, - -25, - -10 - ], - WOhungarumlaut: [ - -20, - -20, - -20, - -20, - -10, - -15, - -25, - -10 - ], - WOmacron: [ - -20, - -20, - -20, - -20, - -10, - -15, - -25, - -10 - ], - WOslash: [ - -20, - -20, - -20, - -20, - -10, - -15, - -25, - -10 - ], - WOtilde: [ - -20, - -20, - -20, - -20, - -10, - -15, - -25, - -10 - ], - Wa: [ - -40, - -40, - -40, - -40, - -65, - -85, - -92, - -80 - ], - Waacute: [ - -40, - -40, - -40, - -40, - -65, - -85, - -92, - -80 - ], - Wabreve: [ - -40, - -40, - -40, - -40, - -65, - -85, - -92, - -80 - ], - Wacircumflex: [ - -40, - -40, - -40, - -40, - -65, - -85, - -92, - -80 - ], - Wadieresis: [ - -40, - -40, - -40, - -40, - -65, - -85, - -92, - -80 - ], - Wagrave: [ - -40, - -40, - -40, - -40, - -65, - -85, - -92, - -80 - ], - Wamacron: [ - -40, - -40, - -40, - -40, - -65, - -85, - -92, - -80 - ], - Waogonek: [ - -40, - -40, - -40, - -40, - -65, - -85, - -92, - -80 - ], - Waring: [ - -40, - -40, - -40, - -40, - -65, - -85, - -92, - -80 - ], - Watilde: [ - -40, - -40, - -40, - -40, - -65, - -85, - -92, - -80 - ], - Wcolon: [ - -10, - -10, - 0, - 0, - -55, - -55, - -65, - -37 - ], - Wcomma: [ - -80, - -80, - -80, - -80, - -92, - -74, - -92, - -92 - ], - We: [ - -35, - -35, - -30, - -30, - -65, - -90, - -92, - -80 - ], - Weacute: [ - -35, - -35, - -30, - -30, - -65, - -90, - -92, - -80 - ], - Wecaron: [ - -35, - -35, - -30, - -30, - -65, - -90, - -92, - -80 - ], - Wecircumflex: [ - -35, - -35, - -30, - -30, - -65, - -90, - -92, - -80 - ], - Wedieresis: [ - -35, - -35, - -30, - -30, - -65, - -50, - -52, - -40 - ], - Wedotaccent: [ - -35, - -35, - -30, - -30, - -65, - -90, - -92, - -80 - ], - Wegrave: [ - -35, - -35, - -30, - -30, - -65, - -50, - -52, - -40 - ], - Wemacron: [ - -35, - -35, - -30, - -30, - -65, - -50, - -52, - -40 - ], - Weogonek: [ - -35, - -35, - -30, - -30, - -65, - -90, - -92, - -80 - ], - Whyphen: [ - -40, - -40, - -40, - -40, - -37, - -50, - -37, - -65 - ], - Wo: [ - -60, - -60, - -30, - -30, - -75, - -80, - -92, - -80 - ], - Woacute: [ - -60, - -60, - -30, - -30, - -75, - -80, - -92, - -80 - ], - Wocircumflex: [ - -60, - -60, - -30, - -30, - -75, - -80, - -92, - -80 - ], - Wodieresis: [ - -60, - -60, - -30, - -30, - -75, - -80, - -92, - -80 - ], - Wograve: [ - -60, - -60, - -30, - -30, - -75, - -80, - -92, - -80 - ], - Wohungarumlaut: [ - -60, - -60, - -30, - -30, - -75, - -80, - -92, - -80 - ], - Womacron: [ - -60, - -60, - -30, - -30, - -75, - -80, - -92, - -80 - ], - Woslash: [ - -60, - -60, - -30, - -30, - -75, - -80, - -92, - -80 - ], - Wotilde: [ - -60, - -60, - -30, - -30, - -75, - -80, - -92, - -80 - ], - Wperiod: [ - -80, - -80, - -80, - -80, - -92, - -74, - -92, - -92 - ], - Wsemicolon: [ - -10, - -10, - 0, - 0, - -55, - -55, - -65, - -37 - ], - Wu: [ - -45, - -45, - -30, - -30, - -50, - -55, - -55, - -50 - ], - Wuacute: [ - -45, - -45, - -30, - -30, - -50, - -55, - -55, - -50 - ], - Wucircumflex: [ - -45, - -45, - -30, - -30, - -50, - -55, - -55, - -50 - ], - Wudieresis: [ - -45, - -45, - -30, - -30, - -50, - -55, - -55, - -50 - ], - Wugrave: [ - -45, - -45, - -30, - -30, - -50, - -55, - -55, - -50 - ], - Wuhungarumlaut: [ - -45, - -45, - -30, - -30, - -50, - -55, - -55, - -50 - ], - Wumacron: [ - -45, - -45, - -30, - -30, - -50, - -55, - -55, - -50 - ], - Wuogonek: [ - -45, - -45, - -30, - -30, - -50, - -55, - -55, - -50 - ], - Wuring: [ - -45, - -45, - -30, - -30, - -50, - -55, - -55, - -50 - ], - Wy: [ - -20, - -20, - -20, - -20, - -60, - -55, - -70, - -73 - ], - Wyacute: [ - -20, - -20, - -20, - -20, - -60, - -55, - -70, - -73 - ], - Wydieresis: [ - -20, - -20, - -20, - -20, - -60, - -55, - -70, - -73 - ], - YA: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YAacute: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YAbreve: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YAcircumflex: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YAdieresis: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YAgrave: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YAmacron: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YAogonek: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YAring: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YAtilde: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YO: [ - -70, - -70, - -85, - -85, - -35, - -25, - -15, - -30 - ], - YOacute: [ - -70, - -70, - -85, - -85, - -35, - -25, - -15, - -30 - ], - YOcircumflex: [ - -70, - -70, - -85, - -85, - -35, - -25, - -15, - -30 - ], - YOdieresis: [ - -70, - -70, - -85, - -85, - -35, - -25, - -15, - -30 - ], - YOgrave: [ - -70, - -70, - -85, - -85, - -35, - -25, - -15, - -30 - ], - YOhungarumlaut: [ - -70, - -70, - -85, - -85, - -35, - -25, - -15, - -30 - ], - YOmacron: [ - -70, - -70, - -85, - -85, - -35, - -25, - -15, - -30 - ], - YOslash: [ - -70, - -70, - -85, - -85, - -35, - -25, - -15, - -30 - ], - YOtilde: [ - -70, - -70, - -85, - -85, - -35, - -25, - -15, - -30 - ], - Ya: [ - -90, - -90, - -140, - -140, - -85, - -92, - -92, - -100 - ], - Yaacute: [ - -90, - -90, - -140, - -140, - -85, - -92, - -92, - -100 - ], - Yabreve: [ - -90, - -90, - -70, - -70, - -85, - -92, - -92, - -100 - ], - Yacircumflex: [ - -90, - -90, - -140, - -140, - -85, - -92, - -92, - -100 - ], - Yadieresis: [ - -90, - -90, - -140, - -140, - -85, - -92, - -92, - -60 - ], - Yagrave: [ - -90, - -90, - -140, - -140, - -85, - -92, - -92, - -60 - ], - Yamacron: [ - -90, - -90, - -70, - -70, - -85, - -92, - -92, - -60 - ], - Yaogonek: [ - -90, - -90, - -140, - -140, - -85, - -92, - -92, - -100 - ], - Yaring: [ - -90, - -90, - -140, - -140, - -85, - -92, - -92, - -100 - ], - Yatilde: [ - -90, - -90, - -140, - -140, - -85, - -92, - -92, - -60 - ], - Ycolon: [ - -50, - -50, - -60, - -60, - -92, - -92, - -65, - -92 - ], - Ycomma: [ - -100, - -100, - -140, - -140, - -92, - -92, - -92, - -129 - ], - Ye: [ - -80, - -80, - -140, - -140, - -111, - -111, - -92, - -100 - ], - Yeacute: [ - -80, - -80, - -140, - -140, - -111, - -111, - -92, - -100 - ], - Yecaron: [ - -80, - -80, - -140, - -140, - -111, - -111, - -92, - -100 - ], - Yecircumflex: [ - -80, - -80, - -140, - -140, - -111, - -71, - -92, - -100 - ], - Yedieresis: [ - -80, - -80, - -140, - -140, - -71, - -71, - -52, - -60 - ], - Yedotaccent: [ - -80, - -80, - -140, - -140, - -111, - -111, - -92, - -100 - ], - Yegrave: [ - -80, - -80, - -140, - -140, - -71, - -71, - -52, - -60 - ], - Yemacron: [ - -80, - -80, - -70, - -70, - -71, - -71, - -52, - -60 - ], - Yeogonek: [ - -80, - -80, - -140, - -140, - -111, - -111, - -92, - -100 - ], - Yo: [ - -100, - -100, - -140, - -140, - -111, - -111, - -92, - -110 - ], - Yoacute: [ - -100, - -100, - -140, - -140, - -111, - -111, - -92, - -110 - ], - Yocircumflex: [ - -100, - -100, - -140, - -140, - -111, - -111, - -92, - -110 - ], - Yodieresis: [ - -100, - -100, - -140, - -140, - -111, - -111, - -92, - -70 - ], - Yograve: [ - -100, - -100, - -140, - -140, - -111, - -111, - -92, - -70 - ], - Yohungarumlaut: [ - -100, - -100, - -140, - -140, - -111, - -111, - -92, - -110 - ], - Yomacron: [ - -100, - -100, - -140, - -140, - -111, - -111, - -92, - -70 - ], - Yoslash: [ - -100, - -100, - -140, - -140, - -111, - -111, - -92, - -110 - ], - Yotilde: [ - -100, - -100, - -140, - -140, - -111, - -111, - -92, - -70 - ], - Yperiod: [ - -100, - -100, - -140, - -140, - -92, - -74, - -92, - -129 - ], - Ysemicolon: [ - -50, - -50, - -60, - -60, - -92, - -92, - -65, - -92 - ], - Yu: [ - -100, - -100, - -110, - -110, - -92, - -92, - -92, - -111 - ], - Yuacute: [ - -100, - -100, - -110, - -110, - -92, - -92, - -92, - -111 - ], - Yucircumflex: [ - -100, - -100, - -110, - -110, - -92, - -92, - -92, - -111 - ], - Yudieresis: [ - -100, - -100, - -110, - -110, - -92, - -92, - -92, - -71 - ], - Yugrave: [ - -100, - -100, - -110, - -110, - -92, - -92, - -92, - -71 - ], - Yuhungarumlaut: [ - -100, - -100, - -110, - -110, - -92, - -92, - -92, - -111 - ], - Yumacron: [ - -100, - -100, - -110, - -110, - -92, - -92, - -92, - -71 - ], - Yuogonek: [ - -100, - -100, - -110, - -110, - -92, - -92, - -92, - -111 - ], - Yuring: [ - -100, - -100, - -110, - -110, - -92, - -92, - -92, - -111 - ], - YacuteA: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YacuteAacute: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YacuteAbreve: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YacuteAcircumflex: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YacuteAdieresis: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YacuteAgrave: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YacuteAmacron: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YacuteAogonek: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YacuteAring: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YacuteAtilde: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YacuteO: [ - -70, - -70, - -85, - -85, - -35, - -25, - -15, - -30 - ], - YacuteOacute: [ - -70, - -70, - -85, - -85, - -35, - -25, - -15, - -30 - ], - YacuteOcircumflex: [ - -70, - -70, - -85, - -85, - -35, - -25, - -15, - -30 - ], - YacuteOdieresis: [ - -70, - -70, - -85, - -85, - -35, - -25, - -15, - -30 - ], - YacuteOgrave: [ - -70, - -70, - -85, - -85, - -35, - -25, - -15, - -30 - ], - YacuteOhungarumlaut: [ - -70, - -70, - -85, - -85, - -35, - -25, - -15, - -30 - ], - YacuteOmacron: [ - -70, - -70, - -85, - -85, - -35, - -25, - -15, - -30 - ], - YacuteOslash: [ - -70, - -70, - -85, - -85, - -35, - -25, - -15, - -30 - ], - YacuteOtilde: [ - -70, - -70, - -85, - -85, - -35, - -25, - -15, - -30 - ], - Yacutea: [ - -90, - -90, - -140, - -140, - -85, - -92, - -92, - -100 - ], - Yacuteaacute: [ - -90, - -90, - -140, - -140, - -85, - -92, - -92, - -100 - ], - Yacuteabreve: [ - -90, - -90, - -70, - -70, - -85, - -92, - -92, - -100 - ], - Yacuteacircumflex: [ - -90, - -90, - -140, - -140, - -85, - -92, - -92, - -100 - ], - Yacuteadieresis: [ - -90, - -90, - -140, - -140, - -85, - -92, - -92, - -60 - ], - Yacuteagrave: [ - -90, - -90, - -140, - -140, - -85, - -92, - -92, - -60 - ], - Yacuteamacron: [ - -90, - -90, - -70, - -70, - -85, - -92, - -92, - -60 - ], - Yacuteaogonek: [ - -90, - -90, - -140, - -140, - -85, - -92, - -92, - -100 - ], - Yacutearing: [ - -90, - -90, - -140, - -140, - -85, - -92, - -92, - -100 - ], - Yacuteatilde: [ - -90, - -90, - -70, - -70, - -85, - -92, - -92, - -60 - ], - Yacutecolon: [ - -50, - -50, - -60, - -60, - -92, - -92, - -65, - -92 - ], - Yacutecomma: [ - -100, - -100, - -140, - -140, - -92, - -92, - -92, - -129 - ], - Yacutee: [ - -80, - -80, - -140, - -140, - -111, - -111, - -92, - -100 - ], - Yacuteeacute: [ - -80, - -80, - -140, - -140, - -111, - -111, - -92, - -100 - ], - Yacuteecaron: [ - -80, - -80, - -140, - -140, - -111, - -111, - -92, - -100 - ], - Yacuteecircumflex: [ - -80, - -80, - -140, - -140, - -111, - -71, - -92, - -100 - ], - Yacuteedieresis: [ - -80, - -80, - -140, - -140, - -71, - -71, - -52, - -60 - ], - Yacuteedotaccent: [ - -80, - -80, - -140, - -140, - -111, - -111, - -92, - -100 - ], - Yacuteegrave: [ - -80, - -80, - -140, - -140, - -71, - -71, - -52, - -60 - ], - Yacuteemacron: [ - -80, - -80, - -70, - -70, - -71, - -71, - -52, - -60 - ], - Yacuteeogonek: [ - -80, - -80, - -140, - -140, - -111, - -111, - -92, - -100 - ], - Yacuteo: [ - -100, - -100, - -140, - -140, - -111, - -111, - -92, - -110 - ], - Yacuteoacute: [ - -100, - -100, - -140, - -140, - -111, - -111, - -92, - -110 - ], - Yacuteocircumflex: [ - -100, - -100, - -140, - -140, - -111, - -111, - -92, - -110 - ], - Yacuteodieresis: [ - -100, - -100, - -140, - -140, - -111, - -111, - -92, - -70 - ], - Yacuteograve: [ - -100, - -100, - -140, - -140, - -111, - -111, - -92, - -70 - ], - Yacuteohungarumlaut: [ - -100, - -100, - -140, - -140, - -111, - -111, - -92, - -110 - ], - Yacuteomacron: [ - -100, - -100, - -70, - -70, - -111, - -111, - -92, - -70 - ], - Yacuteoslash: [ - -100, - -100, - -140, - -140, - -111, - -111, - -92, - -110 - ], - Yacuteotilde: [ - -100, - -100, - -140, - -140, - -111, - -111, - -92, - -70 - ], - Yacuteperiod: [ - -100, - -100, - -140, - -140, - -92, - -74, - -92, - -129 - ], - Yacutesemicolon: [ - -50, - -50, - -60, - -60, - -92, - -92, - -65, - -92 - ], - Yacuteu: [ - -100, - -100, - -110, - -110, - -92, - -92, - -92, - -111 - ], - Yacuteuacute: [ - -100, - -100, - -110, - -110, - -92, - -92, - -92, - -111 - ], - Yacuteucircumflex: [ - -100, - -100, - -110, - -110, - -92, - -92, - -92, - -111 - ], - Yacuteudieresis: [ - -100, - -100, - -110, - -110, - -92, - -92, - -92, - -71 - ], - Yacuteugrave: [ - -100, - -100, - -110, - -110, - -92, - -92, - -92, - -71 - ], - Yacuteuhungarumlaut: [ - -100, - -100, - -110, - -110, - -92, - -92, - -92, - -111 - ], - Yacuteumacron: [ - -100, - -100, - -110, - -110, - -92, - -92, - -92, - -71 - ], - Yacuteuogonek: [ - -100, - -100, - -110, - -110, - -92, - -92, - -92, - -111 - ], - Yacuteuring: [ - -100, - -100, - -110, - -110, - -92, - -92, - -92, - -111 - ], - YdieresisA: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YdieresisAacute: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YdieresisAbreve: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YdieresisAcircumflex: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YdieresisAdieresis: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YdieresisAgrave: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YdieresisAmacron: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YdieresisAogonek: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YdieresisAring: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YdieresisAtilde: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YdieresisO: [ - -70, - -70, - -85, - -85, - -35, - -25, - -15, - -30 - ], - YdieresisOacute: [ - -70, - -70, - -85, - -85, - -35, - -25, - -15, - -30 - ], - YdieresisOcircumflex: [ - -70, - -70, - -85, - -85, - -35, - -25, - -15, - -30 - ], - YdieresisOdieresis: [ - -70, - -70, - -85, - -85, - -35, - -25, - -15, - -30 - ], - YdieresisOgrave: [ - -70, - -70, - -85, - -85, - -35, - -25, - -15, - -30 - ], - YdieresisOhungarumlaut: [ - -70, - -70, - -85, - -85, - -35, - -25, - -15, - -30 - ], - YdieresisOmacron: [ - -70, - -70, - -85, - -85, - -35, - -25, - -15, - -30 - ], - YdieresisOslash: [ - -70, - -70, - -85, - -85, - -35, - -25, - -15, - -30 - ], - YdieresisOtilde: [ - -70, - -70, - -85, - -85, - -35, - -25, - -15, - -30 - ], - Ydieresisa: [ - -90, - -90, - -140, - -140, - -85, - -92, - -92, - -100 - ], - Ydieresisaacute: [ - -90, - -90, - -140, - -140, - -85, - -92, - -92, - -100 - ], - Ydieresisabreve: [ - -90, - -90, - -70, - -70, - -85, - -92, - -92, - -100 - ], - Ydieresisacircumflex: [ - -90, - -90, - -140, - -140, - -85, - -92, - -92, - -100 - ], - Ydieresisadieresis: [ - -90, - -90, - -140, - -140, - -85, - -92, - -92, - -60 - ], - Ydieresisagrave: [ - -90, - -90, - -140, - -140, - -85, - -92, - -92, - -60 - ], - Ydieresisamacron: [ - -90, - -90, - -70, - -70, - -85, - -92, - -92, - -60 - ], - Ydieresisaogonek: [ - -90, - -90, - -140, - -140, - -85, - -92, - -92, - -100 - ], - Ydieresisaring: [ - -90, - -90, - -140, - -140, - -85, - -92, - -92, - -100 - ], - Ydieresisatilde: [ - -90, - -90, - -70, - -70, - -85, - -92, - -92, - -100 - ], - Ydieresiscolon: [ - -50, - -50, - -60, - -60, - -92, - -92, - -65, - -92 - ], - Ydieresiscomma: [ - -100, - -100, - -140, - -140, - -92, - -92, - -92, - -129 - ], - Ydieresise: [ - -80, - -80, - -140, - -140, - -111, - -111, - -92, - -100 - ], - Ydieresiseacute: [ - -80, - -80, - -140, - -140, - -111, - -111, - -92, - -100 - ], - Ydieresisecaron: [ - -80, - -80, - -140, - -140, - -111, - -111, - -92, - -100 - ], - Ydieresisecircumflex: [ - -80, - -80, - -140, - -140, - -111, - -71, - -92, - -100 - ], - Ydieresisedieresis: [ - -80, - -80, - -140, - -140, - -71, - -71, - -52, - -60 - ], - Ydieresisedotaccent: [ - -80, - -80, - -140, - -140, - -111, - -111, - -92, - -100 - ], - Ydieresisegrave: [ - -80, - -80, - -140, - -140, - -71, - -71, - -52, - -60 - ], - Ydieresisemacron: [ - -80, - -80, - -70, - -70, - -71, - -71, - -52, - -60 - ], - Ydieresiseogonek: [ - -80, - -80, - -140, - -140, - -111, - -111, - -92, - -100 - ], - Ydieresiso: [ - -100, - -100, - -140, - -140, - -111, - -111, - -92, - -110 - ], - Ydieresisoacute: [ - -100, - -100, - -140, - -140, - -111, - -111, - -92, - -110 - ], - Ydieresisocircumflex: [ - -100, - -100, - -140, - -140, - -111, - -111, - -92, - -110 - ], - Ydieresisodieresis: [ - -100, - -100, - -140, - -140, - -111, - -111, - -92, - -70 - ], - Ydieresisograve: [ - -100, - -100, - -140, - -140, - -111, - -111, - -92, - -70 - ], - Ydieresisohungarumlaut: [ - -100, - -100, - -140, - -140, - -111, - -111, - -92, - -110 - ], - Ydieresisomacron: [ - -100, - -100, - -140, - -140, - -111, - -111, - -92, - -70 - ], - Ydieresisoslash: [ - -100, - -100, - -140, - -140, - -111, - -111, - -92, - -110 - ], - Ydieresisotilde: [ - -100, - -100, - -140, - -140, - -111, - -111, - -92, - -70 - ], - Ydieresisperiod: [ - -100, - -100, - -140, - -140, - -92, - -74, - -92, - -129 - ], - Ydieresissemicolon: [ - -50, - -50, - -60, - -60, - -92, - -92, - -65, - -92 - ], - Ydieresisu: [ - -100, - -100, - -110, - -110, - -92, - -92, - -92, - -111 - ], - Ydieresisuacute: [ - -100, - -100, - -110, - -110, - -92, - -92, - -92, - -111 - ], - Ydieresisucircumflex: [ - -100, - -100, - -110, - -110, - -92, - -92, - -92, - -111 - ], - Ydieresisudieresis: [ - -100, - -100, - -110, - -110, - -92, - -92, - -92, - -71 - ], - Ydieresisugrave: [ - -100, - -100, - -110, - -110, - -92, - -92, - -92, - -71 - ], - Ydieresisuhungarumlaut: [ - -100, - -100, - -110, - -110, - -92, - -92, - -92, - -111 - ], - Ydieresisumacron: [ - -100, - -100, - -110, - -110, - -92, - -92, - -92, - -71 - ], - Ydieresisuogonek: [ - -100, - -100, - -110, - -110, - -92, - -92, - -92, - -111 - ], - Ydieresisuring: [ - -100, - -100, - -110, - -110, - -92, - -92, - -92, - -111 - ], - ag: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - agbreve: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - agcommaaccent: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - av: [ - -15, - -15, - -20, - -20, - -25, - 0, - 0, - -20 - ], - aw: [ - -15, - -15, - -20, - -20, - 0, - 0, - 0, - -15 - ], - ay: [ - -20, - -20, - -30, - -30 - ], - ayacute: [ - -20, - -20, - -30, - -30 - ], - aydieresis: [ - -20, - -20, - -30, - -30 - ], - aacuteg: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - aacutegbreve: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - aacutegcommaaccent: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - aacutev: [ - -15, - -15, - -20, - -20, - -25, - 0, - 0, - -20 - ], - aacutew: [ - -15, - -15, - -20, - -20, - 0, - 0, - 0, - -15 - ], - aacutey: [ - -20, - -20, - -30, - -30 - ], - aacuteyacute: [ - -20, - -20, - -30, - -30 - ], - aacuteydieresis: [ - -20, - -20, - -30, - -30 - ], - abreveg: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - abrevegbreve: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - abrevegcommaaccent: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - abrevev: [ - -15, - -15, - -20, - -20, - -25, - 0, - 0, - -20 - ], - abrevew: [ - -15, - -15, - -20, - -20, - 0, - 0, - 0, - -15 - ], - abrevey: [ - -20, - -20, - -30, - -30 - ], - abreveyacute: [ - -20, - -20, - -30, - -30 - ], - abreveydieresis: [ - -20, - -20, - -30, - -30 - ], - acircumflexg: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - acircumflexgbreve: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - acircumflexgcommaaccent: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - acircumflexv: [ - -15, - -15, - -20, - -20, - -25, - 0, - 0, - -20 - ], - acircumflexw: [ - -15, - -15, - -20, - -20, - 0, - 0, - 0, - -15 - ], - acircumflexy: [ - -20, - -20, - -30, - -30 - ], - acircumflexyacute: [ - -20, - -20, - -30, - -30 - ], - acircumflexydieresis: [ - -20, - -20, - -30, - -30 - ], - adieresisg: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - adieresisgbreve: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - adieresisgcommaaccent: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - adieresisv: [ - -15, - -15, - -20, - -20, - -25, - 0, - 0, - -20 - ], - adieresisw: [ - -15, - -15, - -20, - -20, - 0, - 0, - 0, - -15 - ], - adieresisy: [ - -20, - -20, - -30, - -30 - ], - adieresisyacute: [ - -20, - -20, - -30, - -30 - ], - adieresisydieresis: [ - -20, - -20, - -30, - -30 - ], - agraveg: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - agravegbreve: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - agravegcommaaccent: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - agravev: [ - -15, - -15, - -20, - -20, - -25, - 0, - 0, - -20 - ], - agravew: [ - -15, - -15, - -20, - -20, - 0, - 0, - 0, - -15 - ], - agravey: [ - -20, - -20, - -30, - -30 - ], - agraveyacute: [ - -20, - -20, - -30, - -30 - ], - agraveydieresis: [ - -20, - -20, - -30, - -30 - ], - amacrong: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - amacrongbreve: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - amacrongcommaaccent: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - amacronv: [ - -15, - -15, - -20, - -20, - -25, - 0, - 0, - -20 - ], - amacronw: [ - -15, - -15, - -20, - -20, - 0, - 0, - 0, - -15 - ], - amacrony: [ - -20, - -20, - -30, - -30 - ], - amacronyacute: [ - -20, - -20, - -30, - -30 - ], - amacronydieresis: [ - -20, - -20, - -30, - -30 - ], - aogonekg: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - aogonekgbreve: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - aogonekgcommaaccent: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - aogonekv: [ - -15, - -15, - -20, - -20, - -25, - 0, - 0, - -20 - ], - aogonekw: [ - -15, - -15, - -20, - -20, - 0, - 0, - 0, - -15 - ], - aogoneky: [ - -20, - -20, - -30, - -30 - ], - aogonekyacute: [ - -20, - -20, - -30, - -30 - ], - aogonekydieresis: [ - -20, - -20, - -30, - -30 - ], - aringg: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - aringgbreve: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - aringgcommaaccent: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - aringv: [ - -15, - -15, - -20, - -20, - -25, - 0, - 0, - -20 - ], - aringw: [ - -15, - -15, - -20, - -20, - 0, - 0, - 0, - -15 - ], - aringy: [ - -20, - -20, - -30, - -30 - ], - aringyacute: [ - -20, - -20, - -30, - -30 - ], - aringydieresis: [ - -20, - -20, - -30, - -30 - ], - atildeg: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - atildegbreve: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - atildegcommaaccent: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - atildev: [ - -15, - -15, - -20, - -20, - -25, - 0, - 0, - -20 - ], - atildew: [ - -15, - -15, - -20, - -20, - 0, - 0, - 0, - -15 - ], - atildey: [ - -20, - -20, - -30, - -30 - ], - atildeyacute: [ - -20, - -20, - -30, - -30 - ], - atildeydieresis: [ - -20, - -20, - -30, - -30 - ], - bl: [ - -10, - -10, - -20, - -20 - ], - blacute: [ - -10, - -10, - -20, - -20 - ], - blcommaaccent: [ - -10, - -10, - -20, - -20 - ], - blslash: [ - -10, - -10, - -20, - -20 - ], - bu: [ - -20, - -20, - -20, - -20, - -20, - -20, - -20, - -20 - ], - buacute: [ - -20, - -20, - -20, - -20, - -20, - -20, - -20, - -20 - ], - bucircumflex: [ - -20, - -20, - -20, - -20, - -20, - -20, - -20, - -20 - ], - budieresis: [ - -20, - -20, - -20, - -20, - -20, - -20, - -20, - -20 - ], - bugrave: [ - -20, - -20, - -20, - -20, - -20, - -20, - -20, - -20 - ], - buhungarumlaut: [ - -20, - -20, - -20, - -20, - -20, - -20, - -20, - -20 - ], - bumacron: [ - -20, - -20, - -20, - -20, - -20, - -20, - -20, - -20 - ], - buogonek: [ - -20, - -20, - -20, - -20, - -20, - -20, - -20, - -20 - ], - buring: [ - -20, - -20, - -20, - -20, - -20, - -20, - -20, - -20 - ], - bv: [ - -20, - -20, - -20, - -20, - -15, - 0, - 0, - -15 - ], - by: [ - -20, - -20, - -20, - -20 - ], - byacute: [ - -20, - -20, - -20, - -20 - ], - bydieresis: [ - -20, - -20, - -20, - -20 - ], - ch: [ - -10, - -10, - 0, - 0, - 0, - -10, - -15 - ], - ck: [ - -20, - -20, - -20, - -20, - 0, - -10, - -20 - ], - ckcommaaccent: [ - -20, - -20, - -20, - -20, - 0, - -10, - -20 - ], - cl: [ - -20, - -20 - ], - clacute: [ - -20, - -20 - ], - clcommaaccent: [ - -20, - -20 - ], - clslash: [ - -20, - -20 - ], - cy: [ - -10, - -10, - 0, - 0, - 0, - 0, - 0, - -15 - ], - cyacute: [ - -10, - -10, - 0, - 0, - 0, - 0, - 0, - -15 - ], - cydieresis: [ - -10, - -10, - 0, - 0, - 0, - 0, - 0, - -15 - ], - cacuteh: [ - -10, - -10, - 0, - 0, - 0, - -10, - -15 - ], - cacutek: [ - -20, - -20, - -20, - -20, - 0, - -10, - -20 - ], - cacutekcommaaccent: [ - -20, - -20, - -20, - -20, - 0, - -10, - -20 - ], - cacutel: [ - -20, - -20 - ], - cacutelacute: [ - -20, - -20 - ], - cacutelcommaaccent: [ - -20, - -20 - ], - cacutelslash: [ - -20, - -20 - ], - cacutey: [ - -10, - -10, - 0, - 0, - 0, - 0, - 0, - -15 - ], - cacuteyacute: [ - -10, - -10, - 0, - 0, - 0, - 0, - 0, - -15 - ], - cacuteydieresis: [ - -10, - -10, - 0, - 0, - 0, - 0, - 0, - -15 - ], - ccaronh: [ - -10, - -10, - 0, - 0, - 0, - -10, - -15 - ], - ccaronk: [ - -20, - -20, - -20, - -20, - 0, - -10, - -20 - ], - ccaronkcommaaccent: [ - -20, - -20, - -20, - -20, - 0, - -10, - -20 - ], - ccaronl: [ - -20, - -20 - ], - ccaronlacute: [ - -20, - -20 - ], - ccaronlcommaaccent: [ - -20, - -20 - ], - ccaronlslash: [ - -20, - -20 - ], - ccarony: [ - -10, - -10, - 0, - 0, - 0, - 0, - 0, - -15 - ], - ccaronyacute: [ - -10, - -10, - 0, - 0, - 0, - 0, - 0, - -15 - ], - ccaronydieresis: [ - -10, - -10, - 0, - 0, - 0, - 0, - 0, - -15 - ], - ccedillah: [ - -10, - -10, - 0, - 0, - 0, - -10, - -15 - ], - ccedillak: [ - -20, - -20, - -20, - -20, - 0, - -10, - -20 - ], - ccedillakcommaaccent: [ - -20, - -20, - -20, - -20, - 0, - -10, - -20 - ], - ccedillal: [ - -20, - -20 - ], - ccedillalacute: [ - -20, - -20 - ], - ccedillalcommaaccent: [ - -20, - -20 - ], - ccedillalslash: [ - -20, - -20 - ], - ccedillay: [ - -10, - -10, - 0, - 0, - 0, - 0, - 0, - -15 - ], - ccedillayacute: [ - -10, - -10, - 0, - 0, - 0, - 0, - 0, - -15 - ], - ccedillaydieresis: [ - -10, - -10, - 0, - 0, - 0, - 0, - 0, - -15 - ], - colonspace: [ - -40, - -40, - -50, - -50 - ], - commaquotedblright: [ - -120, - -120, - -100, - -100, - -45, - -95, - -140, - -70 - ], - commaquoteright: [ - -120, - -120, - -100, - -100, - -55, - -95, - -140, - -70 - ], - commaspace: [ - -40, - -40 - ], - dd: [ - -10, - -10 - ], - ddcroat: [ - -10, - -10 - ], - dv: [ - -15, - -15 - ], - dw: [ - -15, - -15, - 0, - 0, - -15 - ], - dy: [ - -15, - -15 - ], - dyacute: [ - -15, - -15 - ], - dydieresis: [ - -15, - -15 - ], - dcroatd: [ - -10, - -10 - ], - dcroatdcroat: [ - -10, - -10 - ], - dcroatv: [ - -15, - -15 - ], - dcroatw: [ - -15, - -15, - 0, - 0, - -15 - ], - dcroaty: [ - -15, - -15 - ], - dcroatyacute: [ - -15, - -15 - ], - dcroatydieresis: [ - -15, - -15 - ], - ecomma: [ - 10, - 10, - -15, - -15, - 0, - 0, - -10 - ], - eperiod: [ - 20, - 20, - -15, - -15, - 0, - 0, - -15 - ], - ev: [ - -15, - -15, - -30, - -30, - -15, - 0, - -15, - -25 - ], - ew: [ - -15, - -15, - -20, - -20, - 0, - 0, - -15, - -25 - ], - ex: [ - -15, - -15, - -30, - -30, - 0, - 0, - -20, - -15 - ], - ey: [ - -15, - -15, - -20, - -20, - 0, - 0, - -30, - -15 - ], - eyacute: [ - -15, - -15, - -20, - -20, - 0, - 0, - -30, - -15 - ], - eydieresis: [ - -15, - -15, - -20, - -20, - 0, - 0, - -30, - -15 - ], - eacutecomma: [ - 10, - 10, - -15, - -15, - 0, - 0, - -10 - ], - eacuteperiod: [ - 20, - 20, - -15, - -15, - 0, - 0, - -15 - ], - eacutev: [ - -15, - -15, - -30, - -30, - -15, - 0, - -15, - -25 - ], - eacutew: [ - -15, - -15, - -20, - -20, - 0, - 0, - -15, - -25 - ], - eacutex: [ - -15, - -15, - -30, - -30, - 0, - 0, - -20, - -15 - ], - eacutey: [ - -15, - -15, - -20, - -20, - 0, - 0, - -30, - -15 - ], - eacuteyacute: [ - -15, - -15, - -20, - -20, - 0, - 0, - -30, - -15 - ], - eacuteydieresis: [ - -15, - -15, - -20, - -20, - 0, - 0, - -30, - -15 - ], - ecaroncomma: [ - 10, - 10, - -15, - -15, - 0, - 0, - -10 - ], - ecaronperiod: [ - 20, - 20, - -15, - -15, - 0, - 0, - -15 - ], - ecaronv: [ - -15, - -15, - -30, - -30, - -15, - 0, - -15, - -25 - ], - ecaronw: [ - -15, - -15, - -20, - -20, - 0, - 0, - -15, - -25 - ], - ecaronx: [ - -15, - -15, - -30, - -30, - 0, - 0, - -20, - -15 - ], - ecarony: [ - -15, - -15, - -20, - -20, - 0, - 0, - -30, - -15 - ], - ecaronyacute: [ - -15, - -15, - -20, - -20, - 0, - 0, - -30, - -15 - ], - ecaronydieresis: [ - -15, - -15, - -20, - -20, - 0, - 0, - -30, - -15 - ], - ecircumflexcomma: [ - 10, - 10, - -15, - -15, - 0, - 0, - -10 - ], - ecircumflexperiod: [ - 20, - 20, - -15, - -15, - 0, - 0, - -15 - ], - ecircumflexv: [ - -15, - -15, - -30, - -30, - -15, - 0, - -15, - -25 - ], - ecircumflexw: [ - -15, - -15, - -20, - -20, - 0, - 0, - -15, - -25 - ], - ecircumflexx: [ - -15, - -15, - -30, - -30, - 0, - 0, - -20, - -15 - ], - ecircumflexy: [ - -15, - -15, - -20, - -20, - 0, - 0, - -30, - -15 - ], - ecircumflexyacute: [ - -15, - -15, - -20, - -20, - 0, - 0, - -30, - -15 - ], - ecircumflexydieresis: [ - -15, - -15, - -20, - -20, - 0, - 0, - -30, - -15 - ], - edieresiscomma: [ - 10, - 10, - -15, - -15, - 0, - 0, - -10 - ], - edieresisperiod: [ - 20, - 20, - -15, - -15, - 0, - 0, - -15 - ], - edieresisv: [ - -15, - -15, - -30, - -30, - -15, - 0, - -15, - -25 - ], - edieresisw: [ - -15, - -15, - -20, - -20, - 0, - 0, - -15, - -25 - ], - edieresisx: [ - -15, - -15, - -30, - -30, - 0, - 0, - -20, - -15 - ], - edieresisy: [ - -15, - -15, - -20, - -20, - 0, - 0, - -30, - -15 - ], - edieresisyacute: [ - -15, - -15, - -20, - -20, - 0, - 0, - -30, - -15 - ], - edieresisydieresis: [ - -15, - -15, - -20, - -20, - 0, - 0, - -30, - -15 - ], - edotaccentcomma: [ - 10, - 10, - -15, - -15, - 0, - 0, - -10 - ], - edotaccentperiod: [ - 20, - 20, - -15, - -15, - 0, - 0, - -15 - ], - edotaccentv: [ - -15, - -15, - -30, - -30, - -15, - 0, - -15, - -25 - ], - edotaccentw: [ - -15, - -15, - -20, - -20, - 0, - 0, - -15, - -25 - ], - edotaccentx: [ - -15, - -15, - -30, - -30, - 0, - 0, - -20, - -15 - ], - edotaccenty: [ - -15, - -15, - -20, - -20, - 0, - 0, - -30, - -15 - ], - edotaccentyacute: [ - -15, - -15, - -20, - -20, - 0, - 0, - -30, - -15 - ], - edotaccentydieresis: [ - -15, - -15, - -20, - -20, - 0, - 0, - -30, - -15 - ], - egravecomma: [ - 10, - 10, - -15, - -15, - 0, - 0, - -10 - ], - egraveperiod: [ - 20, - 20, - -15, - -15, - 0, - 0, - -15 - ], - egravev: [ - -15, - -15, - -30, - -30, - -15, - 0, - -15, - -25 - ], - egravew: [ - -15, - -15, - -20, - -20, - 0, - 0, - -15, - -25 - ], - egravex: [ - -15, - -15, - -30, - -30, - 0, - 0, - -20, - -15 - ], - egravey: [ - -15, - -15, - -20, - -20, - 0, - 0, - -30, - -15 - ], - egraveyacute: [ - -15, - -15, - -20, - -20, - 0, - 0, - -30, - -15 - ], - egraveydieresis: [ - -15, - -15, - -20, - -20, - 0, - 0, - -30, - -15 - ], - emacroncomma: [ - 10, - 10, - -15, - -15, - 0, - 0, - -10 - ], - emacronperiod: [ - 20, - 20, - -15, - -15, - 0, - 0, - -15 - ], - emacronv: [ - -15, - -15, - -30, - -30, - -15, - 0, - -15, - -25 - ], - emacronw: [ - -15, - -15, - -20, - -20, - 0, - 0, - -15, - -25 - ], - emacronx: [ - -15, - -15, - -30, - -30, - 0, - 0, - -20, - -15 - ], - emacrony: [ - -15, - -15, - -20, - -20, - 0, - 0, - -30, - -15 - ], - emacronyacute: [ - -15, - -15, - -20, - -20, - 0, - 0, - -30, - -15 - ], - emacronydieresis: [ - -15, - -15, - -20, - -20, - 0, - 0, - -30, - -15 - ], - eogonekcomma: [ - 10, - 10, - -15, - -15, - 0, - 0, - -10 - ], - eogonekperiod: [ - 20, - 20, - -15, - -15, - 0, - 0, - -15 - ], - eogonekv: [ - -15, - -15, - -30, - -30, - -15, - 0, - -15, - -25 - ], - eogonekw: [ - -15, - -15, - -20, - -20, - 0, - 0, - -15, - -25 - ], - eogonekx: [ - -15, - -15, - -30, - -30, - 0, - 0, - -20, - -15 - ], - eogoneky: [ - -15, - -15, - -20, - -20, - 0, - 0, - -30, - -15 - ], - eogonekyacute: [ - -15, - -15, - -20, - -20, - 0, - 0, - -30, - -15 - ], - eogonekydieresis: [ - -15, - -15, - -20, - -20, - 0, - 0, - -30, - -15 - ], - fcomma: [ - -10, - -10, - -30, - -30, - -15, - -10, - -10 - ], - fe: [ - -10, - -10, - -30, - -30, - 0, - -10 - ], - feacute: [ - -10, - -10, - -30, - -30, - 0, - -10 - ], - fecaron: [ - -10, - -10, - -30, - -30 - ], - fecircumflex: [ - -10, - -10, - -30, - -30 - ], - fedieresis: [ - -10, - -10, - -30, - -30 - ], - fedotaccent: [ - -10, - -10, - -30, - -30, - 0, - -10 - ], - fegrave: [ - -10, - -10, - -30, - -30 - ], - femacron: [ - -10, - -10, - -30, - -30 - ], - feogonek: [ - -10, - -10, - -30, - -30, - 0, - -10 - ], - fo: [ - -20, - -20, - -30, - -30, - -25, - -10 - ], - foacute: [ - -20, - -20, - -30, - -30, - -25, - -10 - ], - focircumflex: [ - -20, - -20, - -30, - -30, - -25, - -10 - ], - fodieresis: [ - -20, - -20, - -30, - -30, - -25 - ], - fograve: [ - -20, - -20, - -30, - -30, - -25, - -10 - ], - fohungarumlaut: [ - -20, - -20, - -30, - -30, - -25, - -10 - ], - fomacron: [ - -20, - -20, - -30, - -30, - -25 - ], - foslash: [ - -20, - -20, - -30, - -30, - -25, - -10 - ], - fotilde: [ - -20, - -20, - -30, - -30, - -25, - -10 - ], - fperiod: [ - -10, - -10, - -30, - -30, - -15, - -10, - -15 - ], - fquotedblright: [ - 30, - 30, - 60, - 60, - 50 - ], - fquoteright: [ - 30, - 30, - 50, - 50, - 55, - 55, - 92, - 55 - ], - ge: [ - 10, - 10, - 0, - 0, - 0, - 0, - -10 - ], - geacute: [ - 10, - 10, - 0, - 0, - 0, - 0, - -10 - ], - gecaron: [ - 10, - 10, - 0, - 0, - 0, - 0, - -10 - ], - gecircumflex: [ - 10, - 10, - 0, - 0, - 0, - 0, - -10 - ], - gedieresis: [ - 10, - 10, - 0, - 0, - 0, - 0, - -10 - ], - gedotaccent: [ - 10, - 10, - 0, - 0, - 0, - 0, - -10 - ], - gegrave: [ - 10, - 10, - 0, - 0, - 0, - 0, - -10 - ], - gemacron: [ - 10, - 10, - 0, - 0, - 0, - 0, - -10 - ], - geogonek: [ - 10, - 10, - 0, - 0, - 0, - 0, - -10 - ], - gg: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - ggbreve: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - ggcommaaccent: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - gbrevee: [ - 10, - 10, - 0, - 0, - 0, - 0, - -10 - ], - gbreveeacute: [ - 10, - 10, - 0, - 0, - 0, - 0, - -10 - ], - gbreveecaron: [ - 10, - 10, - 0, - 0, - 0, - 0, - -10 - ], - gbreveecircumflex: [ - 10, - 10, - 0, - 0, - 0, - 0, - -10 - ], - gbreveedieresis: [ - 10, - 10, - 0, - 0, - 0, - 0, - -10 - ], - gbreveedotaccent: [ - 10, - 10, - 0, - 0, - 0, - 0, - -10 - ], - gbreveegrave: [ - 10, - 10, - 0, - 0, - 0, - 0, - -10 - ], - gbreveemacron: [ - 10, - 10, - 0, - 0, - 0, - 0, - -10 - ], - gbreveeogonek: [ - 10, - 10, - 0, - 0, - 0, - 0, - -10 - ], - gbreveg: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - gbrevegbreve: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - gbrevegcommaaccent: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - gcommaaccente: [ - 10, - 10, - 0, - 0, - 0, - 0, - -10 - ], - gcommaaccenteacute: [ - 10, - 10, - 0, - 0, - 0, - 0, - -10 - ], - gcommaaccentecaron: [ - 10, - 10, - 0, - 0, - 0, - 0, - -10 - ], - gcommaaccentecircumflex: [ - 10, - 10, - 0, - 0, - 0, - 0, - -10 - ], - gcommaaccentedieresis: [ - 10, - 10, - 0, - 0, - 0, - 0, - -10 - ], - gcommaaccentedotaccent: [ - 10, - 10, - 0, - 0, - 0, - 0, - -10 - ], - gcommaaccentegrave: [ - 10, - 10, - 0, - 0, - 0, - 0, - -10 - ], - gcommaaccentemacron: [ - 10, - 10, - 0, - 0, - 0, - 0, - -10 - ], - gcommaaccenteogonek: [ - 10, - 10, - 0, - 0, - 0, - 0, - -10 - ], - gcommaaccentg: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - gcommaaccentgbreve: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - gcommaaccentgcommaaccent: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - hy: [ - -20, - -20, - -30, - -30, - -15, - 0, - 0, - -5 - ], - hyacute: [ - -20, - -20, - -30, - -30, - -15, - 0, - 0, - -5 - ], - hydieresis: [ - -20, - -20, - -30, - -30, - -15, - 0, - 0, - -5 - ], - ko: [ - -15, - -15, - -20, - -20, - -15, - -10, - -10, - -10 - ], - koacute: [ - -15, - -15, - -20, - -20, - -15, - -10, - -10, - -10 - ], - kocircumflex: [ - -15, - -15, - -20, - -20, - -15, - -10, - -10, - -10 - ], - kodieresis: [ - -15, - -15, - -20, - -20, - -15, - -10, - -10, - -10 - ], - kograve: [ - -15, - -15, - -20, - -20, - -15, - -10, - -10, - -10 - ], - kohungarumlaut: [ - -15, - -15, - -20, - -20, - -15, - -10, - -10, - -10 - ], - komacron: [ - -15, - -15, - -20, - -20, - -15, - -10, - -10, - -10 - ], - koslash: [ - -15, - -15, - -20, - -20, - -15, - -10, - -10, - -10 - ], - kotilde: [ - -15, - -15, - -20, - -20, - -15, - -10, - -10, - -10 - ], - kcommaaccento: [ - -15, - -15, - -20, - -20, - -15, - -10, - -10, - -10 - ], - kcommaaccentoacute: [ - -15, - -15, - -20, - -20, - -15, - -10, - -10, - -10 - ], - kcommaaccentocircumflex: [ - -15, - -15, - -20, - -20, - -15, - -10, - -10, - -10 - ], - kcommaaccentodieresis: [ - -15, - -15, - -20, - -20, - -15, - -10, - -10, - -10 - ], - kcommaaccentograve: [ - -15, - -15, - -20, - -20, - -15, - -10, - -10, - -10 - ], - kcommaaccentohungarumlaut: [ - -15, - -15, - -20, - -20, - -15, - -10, - -10, - -10 - ], - kcommaaccentomacron: [ - -15, - -15, - -20, - -20, - -15, - -10, - -10, - -10 - ], - kcommaaccentoslash: [ - -15, - -15, - -20, - -20, - -15, - -10, - -10, - -10 - ], - kcommaaccentotilde: [ - -15, - -15, - -20, - -20, - -15, - -10, - -10, - -10 - ], - lw: [ - -15, - -15, - 0, - 0, - 0, - 0, - 0, - -10 - ], - ly: [ - -15, - -15 - ], - lyacute: [ - -15, - -15 - ], - lydieresis: [ - -15, - -15 - ], - lacutew: [ - -15, - -15, - 0, - 0, - 0, - 0, - 0, - -10 - ], - lacutey: [ - -15, - -15 - ], - lacuteyacute: [ - -15, - -15 - ], - lacuteydieresis: [ - -15, - -15 - ], - lcommaaccentw: [ - -15, - -15, - 0, - 0, - 0, - 0, - 0, - -10 - ], - lcommaaccenty: [ - -15, - -15 - ], - lcommaaccentyacute: [ - -15, - -15 - ], - lcommaaccentydieresis: [ - -15, - -15 - ], - lslashw: [ - -15, - -15, - 0, - 0, - 0, - 0, - 0, - -10 - ], - lslashy: [ - -15, - -15 - ], - lslashyacute: [ - -15, - -15 - ], - lslashydieresis: [ - -15, - -15 - ], - mu: [ - -20, - -20, - -10, - -10 - ], - muacute: [ - -20, - -20, - -10, - -10 - ], - mucircumflex: [ - -20, - -20, - -10, - -10 - ], - mudieresis: [ - -20, - -20, - -10, - -10 - ], - mugrave: [ - -20, - -20, - -10, - -10 - ], - muhungarumlaut: [ - -20, - -20, - -10, - -10 - ], - mumacron: [ - -20, - -20, - -10, - -10 - ], - muogonek: [ - -20, - -20, - -10, - -10 - ], - muring: [ - -20, - -20, - -10, - -10 - ], - my: [ - -30, - -30, - -15, - -15 - ], - myacute: [ - -30, - -30, - -15, - -15 - ], - mydieresis: [ - -30, - -30, - -15, - -15 - ], - nu: [ - -10, - -10, - -10, - -10 - ], - nuacute: [ - -10, - -10, - -10, - -10 - ], - nucircumflex: [ - -10, - -10, - -10, - -10 - ], - nudieresis: [ - -10, - -10, - -10, - -10 - ], - nugrave: [ - -10, - -10, - -10, - -10 - ], - nuhungarumlaut: [ - -10, - -10, - -10, - -10 - ], - numacron: [ - -10, - -10, - -10, - -10 - ], - nuogonek: [ - -10, - -10, - -10, - -10 - ], - nuring: [ - -10, - -10, - -10, - -10 - ], - nv: [ - -40, - -40, - -20, - -20, - -40, - -40, - -40, - -40 - ], - ny: [ - -20, - -20, - -15, - -15, - 0, - 0, - 0, - -15 - ], - nyacute: [ - -20, - -20, - -15, - -15, - 0, - 0, - 0, - -15 - ], - nydieresis: [ - -20, - -20, - -15, - -15, - 0, - 0, - 0, - -15 - ], - nacuteu: [ - -10, - -10, - -10, - -10 - ], - nacuteuacute: [ - -10, - -10, - -10, - -10 - ], - nacuteucircumflex: [ - -10, - -10, - -10, - -10 - ], - nacuteudieresis: [ - -10, - -10, - -10, - -10 - ], - nacuteugrave: [ - -10, - -10, - -10, - -10 - ], - nacuteuhungarumlaut: [ - -10, - -10, - -10, - -10 - ], - nacuteumacron: [ - -10, - -10, - -10, - -10 - ], - nacuteuogonek: [ - -10, - -10, - -10, - -10 - ], - nacuteuring: [ - -10, - -10, - -10, - -10 - ], - nacutev: [ - -40, - -40, - -20, - -20, - -40, - -40, - -40, - -40 - ], - nacutey: [ - -20, - -20, - -15, - -15, - 0, - 0, - 0, - -15 - ], - nacuteyacute: [ - -20, - -20, - -15, - -15, - 0, - 0, - 0, - -15 - ], - nacuteydieresis: [ - -20, - -20, - -15, - -15, - 0, - 0, - 0, - -15 - ], - ncaronu: [ - -10, - -10, - -10, - -10 - ], - ncaronuacute: [ - -10, - -10, - -10, - -10 - ], - ncaronucircumflex: [ - -10, - -10, - -10, - -10 - ], - ncaronudieresis: [ - -10, - -10, - -10, - -10 - ], - ncaronugrave: [ - -10, - -10, - -10, - -10 - ], - ncaronuhungarumlaut: [ - -10, - -10, - -10, - -10 - ], - ncaronumacron: [ - -10, - -10, - -10, - -10 - ], - ncaronuogonek: [ - -10, - -10, - -10, - -10 - ], - ncaronuring: [ - -10, - -10, - -10, - -10 - ], - ncaronv: [ - -40, - -40, - -20, - -20, - -40, - -40, - -40, - -40 - ], - ncarony: [ - -20, - -20, - -15, - -15, - 0, - 0, - 0, - -15 - ], - ncaronyacute: [ - -20, - -20, - -15, - -15, - 0, - 0, - 0, - -15 - ], - ncaronydieresis: [ - -20, - -20, - -15, - -15, - 0, - 0, - 0, - -15 - ], - ncommaaccentu: [ - -10, - -10, - -10, - -10 - ], - ncommaaccentuacute: [ - -10, - -10, - -10, - -10 - ], - ncommaaccentucircumflex: [ - -10, - -10, - -10, - -10 - ], - ncommaaccentudieresis: [ - -10, - -10, - -10, - -10 - ], - ncommaaccentugrave: [ - -10, - -10, - -10, - -10 - ], - ncommaaccentuhungarumlaut: [ - -10, - -10, - -10, - -10 - ], - ncommaaccentumacron: [ - -10, - -10, - -10, - -10 - ], - ncommaaccentuogonek: [ - -10, - -10, - -10, - -10 - ], - ncommaaccenturing: [ - -10, - -10, - -10, - -10 - ], - ncommaaccentv: [ - -40, - -40, - -20, - -20, - -40, - -40, - -40, - -40 - ], - ncommaaccenty: [ - -20, - -20, - -15, - -15, - 0, - 0, - 0, - -15 - ], - ncommaaccentyacute: [ - -20, - -20, - -15, - -15, - 0, - 0, - 0, - -15 - ], - ncommaaccentydieresis: [ - -20, - -20, - -15, - -15, - 0, - 0, - 0, - -15 - ], - ntildeu: [ - -10, - -10, - -10, - -10 - ], - ntildeuacute: [ - -10, - -10, - -10, - -10 - ], - ntildeucircumflex: [ - -10, - -10, - -10, - -10 - ], - ntildeudieresis: [ - -10, - -10, - -10, - -10 - ], - ntildeugrave: [ - -10, - -10, - -10, - -10 - ], - ntildeuhungarumlaut: [ - -10, - -10, - -10, - -10 - ], - ntildeumacron: [ - -10, - -10, - -10, - -10 - ], - ntildeuogonek: [ - -10, - -10, - -10, - -10 - ], - ntildeuring: [ - -10, - -10, - -10, - -10 - ], - ntildev: [ - -40, - -40, - -20, - -20, - -40, - -40, - -40, - -40 - ], - ntildey: [ - -20, - -20, - -15, - -15, - 0, - 0, - 0, - -15 - ], - ntildeyacute: [ - -20, - -20, - -15, - -15, - 0, - 0, - 0, - -15 - ], - ntildeydieresis: [ - -20, - -20, - -15, - -15, - 0, - 0, - 0, - -15 - ], - ov: [ - -20, - -20, - -15, - -15, - -10, - -15, - -10, - -15 - ], - ow: [ - -15, - -15, - -15, - -15, - -10, - -25, - 0, - -25 - ], - ox: [ - -30, - -30, - -30, - -30, - 0, - -10 - ], - oy: [ - -20, - -20, - -30, - -30, - 0, - -10, - 0, - -10 - ], - oyacute: [ - -20, - -20, - -30, - -30, - 0, - -10, - 0, - -10 - ], - oydieresis: [ - -20, - -20, - -30, - -30, - 0, - -10, - 0, - -10 - ], - oacutev: [ - -20, - -20, - -15, - -15, - -10, - -15, - -10, - -15 - ], - oacutew: [ - -15, - -15, - -15, - -15, - -10, - -25, - 0, - -25 - ], - oacutex: [ - -30, - -30, - -30, - -30, - 0, - -10 - ], - oacutey: [ - -20, - -20, - -30, - -30, - 0, - -10, - 0, - -10 - ], - oacuteyacute: [ - -20, - -20, - -30, - -30, - 0, - -10, - 0, - -10 - ], - oacuteydieresis: [ - -20, - -20, - -30, - -30, - 0, - -10, - 0, - -10 - ], - ocircumflexv: [ - -20, - -20, - -15, - -15, - -10, - -15, - -10, - -15 - ], - ocircumflexw: [ - -15, - -15, - -15, - -15, - -10, - -25, - 0, - -25 - ], - ocircumflexx: [ - -30, - -30, - -30, - -30, - 0, - -10 - ], - ocircumflexy: [ - -20, - -20, - -30, - -30, - 0, - -10, - 0, - -10 - ], - ocircumflexyacute: [ - -20, - -20, - -30, - -30, - 0, - -10, - 0, - -10 - ], - ocircumflexydieresis: [ - -20, - -20, - -30, - -30, - 0, - -10, - 0, - -10 - ], - odieresisv: [ - -20, - -20, - -15, - -15, - -10, - -15, - -10, - -15 - ], - odieresisw: [ - -15, - -15, - -15, - -15, - -10, - -25, - 0, - -25 - ], - odieresisx: [ - -30, - -30, - -30, - -30, - 0, - -10 - ], - odieresisy: [ - -20, - -20, - -30, - -30, - 0, - -10, - 0, - -10 - ], - odieresisyacute: [ - -20, - -20, - -30, - -30, - 0, - -10, - 0, - -10 - ], - odieresisydieresis: [ - -20, - -20, - -30, - -30, - 0, - -10, - 0, - -10 - ], - ogravev: [ - -20, - -20, - -15, - -15, - -10, - -15, - -10, - -15 - ], - ogravew: [ - -15, - -15, - -15, - -15, - -10, - -25, - 0, - -25 - ], - ogravex: [ - -30, - -30, - -30, - -30, - 0, - -10 - ], - ogravey: [ - -20, - -20, - -30, - -30, - 0, - -10, - 0, - -10 - ], - ograveyacute: [ - -20, - -20, - -30, - -30, - 0, - -10, - 0, - -10 - ], - ograveydieresis: [ - -20, - -20, - -30, - -30, - 0, - -10, - 0, - -10 - ], - ohungarumlautv: [ - -20, - -20, - -15, - -15, - -10, - -15, - -10, - -15 - ], - ohungarumlautw: [ - -15, - -15, - -15, - -15, - -10, - -25, - 0, - -25 - ], - ohungarumlautx: [ - -30, - -30, - -30, - -30, - 0, - -10 - ], - ohungarumlauty: [ - -20, - -20, - -30, - -30, - 0, - -10, - 0, - -10 - ], - ohungarumlautyacute: [ - -20, - -20, - -30, - -30, - 0, - -10, - 0, - -10 - ], - ohungarumlautydieresis: [ - -20, - -20, - -30, - -30, - 0, - -10, - 0, - -10 - ], - omacronv: [ - -20, - -20, - -15, - -15, - -10, - -15, - -10, - -15 - ], - omacronw: [ - -15, - -15, - -15, - -15, - -10, - -25, - 0, - -25 - ], - omacronx: [ - -30, - -30, - -30, - -30, - 0, - -10 - ], - omacrony: [ - -20, - -20, - -30, - -30, - 0, - -10, - 0, - -10 - ], - omacronyacute: [ - -20, - -20, - -30, - -30, - 0, - -10, - 0, - -10 - ], - omacronydieresis: [ - -20, - -20, - -30, - -30, - 0, - -10, - 0, - -10 - ], - oslashv: [ - -20, - -20, - -70, - -70, - -10, - -15, - -10, - -15 - ], - oslashw: [ - -15, - -15, - -70, - -70, - -10, - -25, - 0, - -25 - ], - oslashx: [ - -30, - -30, - -85, - -85, - 0, - -10 - ], - oslashy: [ - -20, - -20, - -70, - -70, - 0, - -10, - 0, - -10 - ], - oslashyacute: [ - -20, - -20, - -70, - -70, - 0, - -10, - 0, - -10 - ], - oslashydieresis: [ - -20, - -20, - -70, - -70, - 0, - -10, - 0, - -10 - ], - otildev: [ - -20, - -20, - -15, - -15, - -10, - -15, - -10, - -15 - ], - otildew: [ - -15, - -15, - -15, - -15, - -10, - -25, - 0, - -25 - ], - otildex: [ - -30, - -30, - -30, - -30, - 0, - -10 - ], - otildey: [ - -20, - -20, - -30, - -30, - 0, - -10, - 0, - -10 - ], - otildeyacute: [ - -20, - -20, - -30, - -30, - 0, - -10, - 0, - -10 - ], - otildeydieresis: [ - -20, - -20, - -30, - -30, - 0, - -10, - 0, - -10 - ], - py: [ - -15, - -15, - -30, - -30, - 0, - 0, - 0, - -10 - ], - pyacute: [ - -15, - -15, - -30, - -30, - 0, - 0, - 0, - -10 - ], - pydieresis: [ - -15, - -15, - -30, - -30, - 0, - 0, - 0, - -10 - ], - periodquotedblright: [ - -120, - -120, - -100, - -100, - -55, - -95, - -140, - -70 - ], - periodquoteright: [ - -120, - -120, - -100, - -100, - -55, - -95, - -140, - -70 - ], - periodspace: [ - -40, - -40, - -60, - -60 - ], - quotedblrightspace: [ - -80, - -80, - -40, - -40 - ], - quoteleftquoteleft: [ - -46, - -46, - -57, - -57, - -63, - -74, - -111, - -74 - ], - quoterightd: [ - -80, - -80, - -50, - -50, - -20, - -15, - -25, - -50 - ], - quoterightdcroat: [ - -80, - -80, - -50, - -50, - -20, - -15, - -25, - -50 - ], - quoterightl: [ - -20, - -20, - 0, - 0, - 0, - 0, - 0, - -10 - ], - quoterightlacute: [ - -20, - -20, - 0, - 0, - 0, - 0, - 0, - -10 - ], - quoterightlcommaaccent: [ - -20, - -20, - 0, - 0, - 0, - 0, - 0, - -10 - ], - quoterightlslash: [ - -20, - -20, - 0, - 0, - 0, - 0, - 0, - -10 - ], - quoterightquoteright: [ - -46, - -46, - -57, - -57, - -63, - -74, - -111, - -74 - ], - quoterightr: [ - -40, - -40, - -50, - -50, - -20, - -15, - -25, - -50 - ], - quoterightracute: [ - -40, - -40, - -50, - -50, - -20, - -15, - -25, - -50 - ], - quoterightrcaron: [ - -40, - -40, - -50, - -50, - -20, - -15, - -25, - -50 - ], - quoterightrcommaaccent: [ - -40, - -40, - -50, - -50, - -20, - -15, - -25, - -50 - ], - quoterights: [ - -60, - -60, - -50, - -50, - -37, - -74, - -40, - -55 - ], - quoterightsacute: [ - -60, - -60, - -50, - -50, - -37, - -74, - -40, - -55 - ], - quoterightscaron: [ - -60, - -60, - -50, - -50, - -37, - -74, - -40, - -55 - ], - quoterightscedilla: [ - -60, - -60, - -50, - -50, - -37, - -74, - -40, - -55 - ], - quoterightscommaaccent: [ - -60, - -60, - -50, - -50, - -37, - -74, - -40, - -55 - ], - quoterightspace: [ - -80, - -80, - -70, - -70, - -74, - -74, - -111, - -74 - ], - quoterightv: [ - -20, - -20, - 0, - 0, - -20, - -15, - -10, - -50 - ], - rc: [ - -20, - -20, - 0, - 0, - -18, - 0, - -37 - ], - rcacute: [ - -20, - -20, - 0, - 0, - -18, - 0, - -37 - ], - rccaron: [ - -20, - -20, - 0, - 0, - -18, - 0, - -37 - ], - rccedilla: [ - -20, - -20, - 0, - 0, - -18, - 0, - -37 - ], - rcomma: [ - -60, - -60, - -50, - -50, - -92, - -65, - -111, - -40 - ], - rd: [ - -20, - -20, - 0, - 0, - 0, - 0, - -37 - ], - rdcroat: [ - -20, - -20, - 0, - 0, - 0, - 0, - -37 - ], - rg: [ - -15, - -15, - 0, - 0, - -10, - 0, - -37, - -18 - ], - rgbreve: [ - -15, - -15, - 0, - 0, - -10, - 0, - -37, - -18 - ], - rgcommaaccent: [ - -15, - -15, - 0, - 0, - -10, - 0, - -37, - -18 - ], - rhyphen: [ - -20, - -20, - 0, - 0, - -37, - 0, - -20, - -20 - ], - ro: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - roacute: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - rocircumflex: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - rodieresis: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - rograve: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - rohungarumlaut: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - romacron: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - roslash: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - rotilde: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - rperiod: [ - -60, - -60, - -50, - -50, - -100, - -65, - -111, - -55 - ], - rq: [ - -20, - -20, - 0, - 0, - -18, - 0, - -37 - ], - rs: [ - -15, - -15, - 0, - 0, - 0, - 0, - -10 - ], - rsacute: [ - -15, - -15, - 0, - 0, - 0, - 0, - -10 - ], - rscaron: [ - -15, - -15, - 0, - 0, - 0, - 0, - -10 - ], - rscedilla: [ - -15, - -15, - 0, - 0, - 0, - 0, - -10 - ], - rscommaaccent: [ - -15, - -15, - 0, - 0, - 0, - 0, - -10 - ], - rt: [ - 20, - 20, - 40, - 40 - ], - rtcommaaccent: [ - 20, - 20, - 40, - 40 - ], - rv: [ - 10, - 10, - 30, - 30, - -10 - ], - ry: [ - 10, - 10, - 30, - 30 - ], - ryacute: [ - 10, - 10, - 30, - 30 - ], - rydieresis: [ - 10, - 10, - 30, - 30 - ], - racutec: [ - -20, - -20, - 0, - 0, - -18, - 0, - -37 - ], - racutecacute: [ - -20, - -20, - 0, - 0, - -18, - 0, - -37 - ], - racuteccaron: [ - -20, - -20, - 0, - 0, - -18, - 0, - -37 - ], - racuteccedilla: [ - -20, - -20, - 0, - 0, - -18, - 0, - -37 - ], - racutecomma: [ - -60, - -60, - -50, - -50, - -92, - -65, - -111, - -40 - ], - racuted: [ - -20, - -20, - 0, - 0, - 0, - 0, - -37 - ], - racutedcroat: [ - -20, - -20, - 0, - 0, - 0, - 0, - -37 - ], - racuteg: [ - -15, - -15, - 0, - 0, - -10, - 0, - -37, - -18 - ], - racutegbreve: [ - -15, - -15, - 0, - 0, - -10, - 0, - -37, - -18 - ], - racutegcommaaccent: [ - -15, - -15, - 0, - 0, - -10, - 0, - -37, - -18 - ], - racutehyphen: [ - -20, - -20, - 0, - 0, - -37, - 0, - -20, - -20 - ], - racuteo: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - racuteoacute: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - racuteocircumflex: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - racuteodieresis: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - racuteograve: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - racuteohungarumlaut: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - racuteomacron: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - racuteoslash: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - racuteotilde: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - racuteperiod: [ - -60, - -60, - -50, - -50, - -100, - -65, - -111, - -55 - ], - racuteq: [ - -20, - -20, - 0, - 0, - -18, - 0, - -37 - ], - racutes: [ - -15, - -15, - 0, - 0, - 0, - 0, - -10 - ], - racutesacute: [ - -15, - -15, - 0, - 0, - 0, - 0, - -10 - ], - racutescaron: [ - -15, - -15, - 0, - 0, - 0, - 0, - -10 - ], - racutescedilla: [ - -15, - -15, - 0, - 0, - 0, - 0, - -10 - ], - racutescommaaccent: [ - -15, - -15, - 0, - 0, - 0, - 0, - -10 - ], - racutet: [ - 20, - 20, - 40, - 40 - ], - racutetcommaaccent: [ - 20, - 20, - 40, - 40 - ], - racutev: [ - 10, - 10, - 30, - 30, - -10 - ], - racutey: [ - 10, - 10, - 30, - 30 - ], - racuteyacute: [ - 10, - 10, - 30, - 30 - ], - racuteydieresis: [ - 10, - 10, - 30, - 30 - ], - rcaronc: [ - -20, - -20, - 0, - 0, - -18, - 0, - -37 - ], - rcaroncacute: [ - -20, - -20, - 0, - 0, - -18, - 0, - -37 - ], - rcaronccaron: [ - -20, - -20, - 0, - 0, - -18, - 0, - -37 - ], - rcaronccedilla: [ - -20, - -20, - 0, - 0, - -18, - 0, - -37 - ], - rcaroncomma: [ - -60, - -60, - -50, - -50, - -92, - -65, - -111, - -40 - ], - rcarond: [ - -20, - -20, - 0, - 0, - 0, - 0, - -37 - ], - rcarondcroat: [ - -20, - -20, - 0, - 0, - 0, - 0, - -37 - ], - rcarong: [ - -15, - -15, - 0, - 0, - -10, - 0, - -37, - -18 - ], - rcarongbreve: [ - -15, - -15, - 0, - 0, - -10, - 0, - -37, - -18 - ], - rcarongcommaaccent: [ - -15, - -15, - 0, - 0, - -10, - 0, - -37, - -18 - ], - rcaronhyphen: [ - -20, - -20, - 0, - 0, - -37, - 0, - -20, - -20 - ], - rcarono: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - rcaronoacute: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - rcaronocircumflex: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - rcaronodieresis: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - rcaronograve: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - rcaronohungarumlaut: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - rcaronomacron: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - rcaronoslash: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - rcaronotilde: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - rcaronperiod: [ - -60, - -60, - -50, - -50, - -100, - -65, - -111, - -55 - ], - rcaronq: [ - -20, - -20, - 0, - 0, - -18, - 0, - -37 - ], - rcarons: [ - -15, - -15, - 0, - 0, - 0, - 0, - -10 - ], - rcaronsacute: [ - -15, - -15, - 0, - 0, - 0, - 0, - -10 - ], - rcaronscaron: [ - -15, - -15, - 0, - 0, - 0, - 0, - -10 - ], - rcaronscedilla: [ - -15, - -15, - 0, - 0, - 0, - 0, - -10 - ], - rcaronscommaaccent: [ - -15, - -15, - 0, - 0, - 0, - 0, - -10 - ], - rcaront: [ - 20, - 20, - 40, - 40 - ], - rcarontcommaaccent: [ - 20, - 20, - 40, - 40 - ], - rcaronv: [ - 10, - 10, - 30, - 30, - -10 - ], - rcarony: [ - 10, - 10, - 30, - 30 - ], - rcaronyacute: [ - 10, - 10, - 30, - 30 - ], - rcaronydieresis: [ - 10, - 10, - 30, - 30 - ], - rcommaaccentc: [ - -20, - -20, - 0, - 0, - -18, - 0, - -37 - ], - rcommaaccentcacute: [ - -20, - -20, - 0, - 0, - -18, - 0, - -37 - ], - rcommaaccentccaron: [ - -20, - -20, - 0, - 0, - -18, - 0, - -37 - ], - rcommaaccentccedilla: [ - -20, - -20, - 0, - 0, - -18, - 0, - -37 - ], - rcommaaccentcomma: [ - -60, - -60, - -50, - -50, - -92, - -65, - -111, - -40 - ], - rcommaaccentd: [ - -20, - -20, - 0, - 0, - 0, - 0, - -37 - ], - rcommaaccentdcroat: [ - -20, - -20, - 0, - 0, - 0, - 0, - -37 - ], - rcommaaccentg: [ - -15, - -15, - 0, - 0, - -10, - 0, - -37, - -18 - ], - rcommaaccentgbreve: [ - -15, - -15, - 0, - 0, - -10, - 0, - -37, - -18 - ], - rcommaaccentgcommaaccent: [ - -15, - -15, - 0, - 0, - -10, - 0, - -37, - -18 - ], - rcommaaccenthyphen: [ - -20, - -20, - 0, - 0, - -37, - 0, - -20, - -20 - ], - rcommaaccento: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - rcommaaccentoacute: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - rcommaaccentocircumflex: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - rcommaaccentodieresis: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - rcommaaccentograve: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - rcommaaccentohungarumlaut: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - rcommaaccentomacron: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - rcommaaccentoslash: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - rcommaaccentotilde: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - rcommaaccentperiod: [ - -60, - -60, - -50, - -50, - -100, - -65, - -111, - -55 - ], - rcommaaccentq: [ - -20, - -20, - 0, - 0, - -18, - 0, - -37 - ], - rcommaaccents: [ - -15, - -15, - 0, - 0, - 0, - 0, - -10 - ], - rcommaaccentsacute: [ - -15, - -15, - 0, - 0, - 0, - 0, - -10 - ], - rcommaaccentscaron: [ - -15, - -15, - 0, - 0, - 0, - 0, - -10 - ], - rcommaaccentscedilla: [ - -15, - -15, - 0, - 0, - 0, - 0, - -10 - ], - rcommaaccentscommaaccent: [ - -15, - -15, - 0, - 0, - 0, - 0, - -10 - ], - rcommaaccentt: [ - 20, - 20, - 40, - 40 - ], - rcommaaccenttcommaaccent: [ - 20, - 20, - 40, - 40 - ], - rcommaaccentv: [ - 10, - 10, - 30, - 30, - -10 - ], - rcommaaccenty: [ - 10, - 10, - 30, - 30 - ], - rcommaaccentyacute: [ - 10, - 10, - 30, - 30 - ], - rcommaaccentydieresis: [ - 10, - 10, - 30, - 30 - ], - sw: [ - -15, - -15, - -30, - -30 - ], - sacutew: [ - -15, - -15, - -30, - -30 - ], - scaronw: [ - -15, - -15, - -30, - -30 - ], - scedillaw: [ - -15, - -15, - -30, - -30 - ], - scommaaccentw: [ - -15, - -15, - -30, - -30 - ], - semicolonspace: [ - -40, - -40, - -50, - -50 - ], - spaceT: [ - -100, - -100, - -50, - -50, - -30, - 0, - -18, - -18 - ], - spaceTcaron: [ - -100, - -100, - -50, - -50, - -30, - 0, - -18, - -18 - ], - spaceTcommaaccent: [ - -100, - -100, - -50, - -50, - -30, - 0, - -18, - -18 - ], - spaceV: [ - -80, - -80, - -50, - -50, - -45, - -70, - -35, - -50 - ], - spaceW: [ - -80, - -80, - -40, - -40, - -30, - -70, - -40, - -30 - ], - spaceY: [ - -120, - -120, - -90, - -90, - -55, - -70, - -75, - -90 - ], - spaceYacute: [ - -120, - -120, - -90, - -90, - -55, - -70, - -75, - -90 - ], - spaceYdieresis: [ - -120, - -120, - -90, - -90, - -55, - -70, - -75, - -90 - ], - spacequotedblleft: [ - -80, - -80, - -30, - -30 - ], - spacequoteleft: [ - -60, - -60, - -60, - -60 - ], - va: [ - -20, - -20, - -25, - -25, - -10, - 0, - 0, - -25 - ], - vaacute: [ - -20, - -20, - -25, - -25, - -10, - 0, - 0, - -25 - ], - vabreve: [ - -20, - -20, - -25, - -25, - -10, - 0, - 0, - -25 - ], - vacircumflex: [ - -20, - -20, - -25, - -25, - -10, - 0, - 0, - -25 - ], - vadieresis: [ - -20, - -20, - -25, - -25, - -10, - 0, - 0, - -25 - ], - vagrave: [ - -20, - -20, - -25, - -25, - -10, - 0, - 0, - -25 - ], - vamacron: [ - -20, - -20, - -25, - -25, - -10, - 0, - 0, - -25 - ], - vaogonek: [ - -20, - -20, - -25, - -25, - -10, - 0, - 0, - -25 - ], - varing: [ - -20, - -20, - -25, - -25, - -10, - 0, - 0, - -25 - ], - vatilde: [ - -20, - -20, - -25, - -25, - -10, - 0, - 0, - -25 - ], - vcomma: [ - -80, - -80, - -80, - -80, - -55, - -37, - -74, - -65 - ], - vo: [ - -30, - -30, - -25, - -25, - -10, - -15, - 0, - -20 - ], - voacute: [ - -30, - -30, - -25, - -25, - -10, - -15, - 0, - -20 - ], - vocircumflex: [ - -30, - -30, - -25, - -25, - -10, - -15, - 0, - -20 - ], - vodieresis: [ - -30, - -30, - -25, - -25, - -10, - -15, - 0, - -20 - ], - vograve: [ - -30, - -30, - -25, - -25, - -10, - -15, - 0, - -20 - ], - vohungarumlaut: [ - -30, - -30, - -25, - -25, - -10, - -15, - 0, - -20 - ], - vomacron: [ - -30, - -30, - -25, - -25, - -10, - -15, - 0, - -20 - ], - voslash: [ - -30, - -30, - -25, - -25, - -10, - -15, - 0, - -20 - ], - votilde: [ - -30, - -30, - -25, - -25, - -10, - -15, - 0, - -20 - ], - vperiod: [ - -80, - -80, - -80, - -80, - -70, - -37, - -74, - -65 - ], - wcomma: [ - -40, - -40, - -60, - -60, - -55, - -37, - -74, - -65 - ], - wo: [ - -20, - -20, - -10, - -10, - -10, - -15, - 0, - -10 - ], - woacute: [ - -20, - -20, - -10, - -10, - -10, - -15, - 0, - -10 - ], - wocircumflex: [ - -20, - -20, - -10, - -10, - -10, - -15, - 0, - -10 - ], - wodieresis: [ - -20, - -20, - -10, - -10, - -10, - -15, - 0, - -10 - ], - wograve: [ - -20, - -20, - -10, - -10, - -10, - -15, - 0, - -10 - ], - wohungarumlaut: [ - -20, - -20, - -10, - -10, - -10, - -15, - 0, - -10 - ], - womacron: [ - -20, - -20, - -10, - -10, - -10, - -15, - 0, - -10 - ], - woslash: [ - -20, - -20, - -10, - -10, - -10, - -15, - 0, - -10 - ], - wotilde: [ - -20, - -20, - -10, - -10, - -10, - -15, - 0, - -10 - ], - wperiod: [ - -40, - -40, - -60, - -60, - -70, - -37, - -74, - -65 - ], - xe: [ - -10, - -10, - -30, - -30, - 0, - -10, - 0, - -15 - ], - xeacute: [ - -10, - -10, - -30, - -30, - 0, - -10, - 0, - -15 - ], - xecaron: [ - -10, - -10, - -30, - -30, - 0, - -10, - 0, - -15 - ], - xecircumflex: [ - -10, - -10, - -30, - -30, - 0, - -10, - 0, - -15 - ], - xedieresis: [ - -10, - -10, - -30, - -30, - 0, - -10, - 0, - -15 - ], - xedotaccent: [ - -10, - -10, - -30, - -30, - 0, - -10, - 0, - -15 - ], - xegrave: [ - -10, - -10, - -30, - -30, - 0, - -10, - 0, - -15 - ], - xemacron: [ - -10, - -10, - -30, - -30, - 0, - -10, - 0, - -15 - ], - xeogonek: [ - -10, - -10, - -30, - -30, - 0, - -10, - 0, - -15 - ], - ya: [ - -30, - -30, - -20, - -20 - ], - yaacute: [ - -30, - -30, - -20, - -20 - ], - yabreve: [ - -30, - -30, - -20, - -20 - ], - yacircumflex: [ - -30, - -30, - -20, - -20 - ], - yadieresis: [ - -30, - -30, - -20, - -20 - ], - yagrave: [ - -30, - -30, - -20, - -20 - ], - yamacron: [ - -30, - -30, - -20, - -20 - ], - yaogonek: [ - -30, - -30, - -20, - -20 - ], - yaring: [ - -30, - -30, - -20, - -20 - ], - yatilde: [ - -30, - -30, - -20, - -20 - ], - ycomma: [ - -80, - -80, - -100, - -100, - -55, - -37, - -55, - -65 - ], - ye: [ - -10, - -10, - -20, - -20, - -10 - ], - yeacute: [ - -10, - -10, - -20, - -20, - -10 - ], - yecaron: [ - -10, - -10, - -20, - -20, - -10 - ], - yecircumflex: [ - -10, - -10, - -20, - -20, - -10 - ], - yedieresis: [ - -10, - -10, - -20, - -20, - -10 - ], - yedotaccent: [ - -10, - -10, - -20, - -20, - -10 - ], - yegrave: [ - -10, - -10, - -20, - -20, - -10 - ], - yemacron: [ - -10, - -10, - -20, - -20, - -10 - ], - yeogonek: [ - -10, - -10, - -20, - -20, - -10 - ], - yo: [ - -25, - -25, - -20, - -20, - -25 - ], - yoacute: [ - -25, - -25, - -20, - -20, - -25 - ], - yocircumflex: [ - -25, - -25, - -20, - -20, - -25 - ], - yodieresis: [ - -25, - -25, - -20, - -20, - -25 - ], - yograve: [ - -25, - -25, - -20, - -20, - -25 - ], - yohungarumlaut: [ - -25, - -25, - -20, - -20, - -25 - ], - yomacron: [ - -25, - -25, - -20, - -20, - -25 - ], - yoslash: [ - -25, - -25, - -20, - -20, - -25 - ], - yotilde: [ - -25, - -25, - -20, - -20, - -25 - ], - yperiod: [ - -80, - -80, - -100, - -100, - -70, - -37, - -55, - -65 - ], - yacutea: [ - -30, - -30, - -20, - -20 - ], - yacuteaacute: [ - -30, - -30, - -20, - -20 - ], - yacuteabreve: [ - -30, - -30, - -20, - -20 - ], - yacuteacircumflex: [ - -30, - -30, - -20, - -20 - ], - yacuteadieresis: [ - -30, - -30, - -20, - -20 - ], - yacuteagrave: [ - -30, - -30, - -20, - -20 - ], - yacuteamacron: [ - -30, - -30, - -20, - -20 - ], - yacuteaogonek: [ - -30, - -30, - -20, - -20 - ], - yacutearing: [ - -30, - -30, - -20, - -20 - ], - yacuteatilde: [ - -30, - -30, - -20, - -20 - ], - yacutecomma: [ - -80, - -80, - -100, - -100, - -55, - -37, - -55, - -65 - ], - yacutee: [ - -10, - -10, - -20, - -20, - -10 - ], - yacuteeacute: [ - -10, - -10, - -20, - -20, - -10 - ], - yacuteecaron: [ - -10, - -10, - -20, - -20, - -10 - ], - yacuteecircumflex: [ - -10, - -10, - -20, - -20, - -10 - ], - yacuteedieresis: [ - -10, - -10, - -20, - -20, - -10 - ], - yacuteedotaccent: [ - -10, - -10, - -20, - -20, - -10 - ], - yacuteegrave: [ - -10, - -10, - -20, - -20, - -10 - ], - yacuteemacron: [ - -10, - -10, - -20, - -20, - -10 - ], - yacuteeogonek: [ - -10, - -10, - -20, - -20, - -10 - ], - yacuteo: [ - -25, - -25, - -20, - -20, - -25 - ], - yacuteoacute: [ - -25, - -25, - -20, - -20, - -25 - ], - yacuteocircumflex: [ - -25, - -25, - -20, - -20, - -25 - ], - yacuteodieresis: [ - -25, - -25, - -20, - -20, - -25 - ], - yacuteograve: [ - -25, - -25, - -20, - -20, - -25 - ], - yacuteohungarumlaut: [ - -25, - -25, - -20, - -20, - -25 - ], - yacuteomacron: [ - -25, - -25, - -20, - -20, - -25 - ], - yacuteoslash: [ - -25, - -25, - -20, - -20, - -25 - ], - yacuteotilde: [ - -25, - -25, - -20, - -20, - -25 - ], - yacuteperiod: [ - -80, - -80, - -100, - -100, - -70, - -37, - -55, - -65 - ], - ydieresisa: [ - -30, - -30, - -20, - -20 - ], - ydieresisaacute: [ - -30, - -30, - -20, - -20 - ], - ydieresisabreve: [ - -30, - -30, - -20, - -20 - ], - ydieresisacircumflex: [ - -30, - -30, - -20, - -20 - ], - ydieresisadieresis: [ - -30, - -30, - -20, - -20 - ], - ydieresisagrave: [ - -30, - -30, - -20, - -20 - ], - ydieresisamacron: [ - -30, - -30, - -20, - -20 - ], - ydieresisaogonek: [ - -30, - -30, - -20, - -20 - ], - ydieresisaring: [ - -30, - -30, - -20, - -20 - ], - ydieresisatilde: [ - -30, - -30, - -20, - -20 - ], - ydieresiscomma: [ - -80, - -80, - -100, - -100, - -55, - -37, - -55, - -65 - ], - ydieresise: [ - -10, - -10, - -20, - -20, - -10 - ], - ydieresiseacute: [ - -10, - -10, - -20, - -20, - -10 - ], - ydieresisecaron: [ - -10, - -10, - -20, - -20, - -10 - ], - ydieresisecircumflex: [ - -10, - -10, - -20, - -20, - -10 - ], - ydieresisedieresis: [ - -10, - -10, - -20, - -20, - -10 - ], - ydieresisedotaccent: [ - -10, - -10, - -20, - -20, - -10 - ], - ydieresisegrave: [ - -10, - -10, - -20, - -20, - -10 - ], - ydieresisemacron: [ - -10, - -10, - -20, - -20, - -10 - ], - ydieresiseogonek: [ - -10, - -10, - -20, - -20, - -10 - ], - ydieresiso: [ - -25, - -25, - -20, - -20, - -25 - ], - ydieresisoacute: [ - -25, - -25, - -20, - -20, - -25 - ], - ydieresisocircumflex: [ - -25, - -25, - -20, - -20, - -25 - ], - ydieresisodieresis: [ - -25, - -25, - -20, - -20, - -25 - ], - ydieresisograve: [ - -25, - -25, - -20, - -20, - -25 - ], - ydieresisohungarumlaut: [ - -25, - -25, - -20, - -20, - -25 - ], - ydieresisomacron: [ - -25, - -25, - -20, - -20, - -25 - ], - ydieresisoslash: [ - -25, - -25, - -20, - -20, - -25 - ], - ydieresisotilde: [ - -25, - -25, - -20, - -20, - -25 - ], - ydieresisperiod: [ - -80, - -80, - -100, - -100, - -70, - -37, - -55, - -65 - ], - ze: [ - 10, - 10, - -15, - -15 - ], - zeacute: [ - 10, - 10, - -15, - -15 - ], - zecaron: [ - 10, - 10, - -15, - -15 - ], - zecircumflex: [ - 10, - 10, - -15, - -15 - ], - zedieresis: [ - 10, - 10, - -15, - -15 - ], - zedotaccent: [ - 10, - 10, - -15, - -15 - ], - zegrave: [ - 10, - 10, - -15, - -15 - ], - zemacron: [ - 10, - 10, - -15, - -15 - ], - zeogonek: [ - 10, - 10, - -15, - -15 - ], - zacutee: [ - 10, - 10, - -15, - -15 - ], - zacuteeacute: [ - 10, - 10, - -15, - -15 - ], - zacuteecaron: [ - 10, - 10, - -15, - -15 - ], - zacuteecircumflex: [ - 10, - 10, - -15, - -15 - ], - zacuteedieresis: [ - 10, - 10, - -15, - -15 - ], - zacuteedotaccent: [ - 10, - 10, - -15, - -15 - ], - zacuteegrave: [ - 10, - 10, - -15, - -15 - ], - zacuteemacron: [ - 10, - 10, - -15, - -15 - ], - zacuteeogonek: [ - 10, - 10, - -15, - -15 - ], - zcarone: [ - 10, - 10, - -15, - -15 - ], - zcaroneacute: [ - 10, - 10, - -15, - -15 - ], - zcaronecaron: [ - 10, - 10, - -15, - -15 - ], - zcaronecircumflex: [ - 10, - 10, - -15, - -15 - ], - zcaronedieresis: [ - 10, - 10, - -15, - -15 - ], - zcaronedotaccent: [ - 10, - 10, - -15, - -15 - ], - zcaronegrave: [ - 10, - 10, - -15, - -15 - ], - zcaronemacron: [ - 10, - 10, - -15, - -15 - ], - zcaroneogonek: [ - 10, - 10, - -15, - -15 - ], - zdotaccente: [ - 10, - 10, - -15, - -15 - ], - zdotaccenteacute: [ - 10, - 10, - -15, - -15 - ], - zdotaccentecaron: [ - 10, - 10, - -15, - -15 - ], - zdotaccentecircumflex: [ - 10, - 10, - -15, - -15 - ], - zdotaccentedieresis: [ - 10, - 10, - -15, - -15 - ], - zdotaccentedotaccent: [ - 10, - 10, - -15, - -15 - ], - zdotaccentegrave: [ - 10, - 10, - -15, - -15 - ], - zdotaccentemacron: [ - 10, - 10, - -15, - -15 - ], - zdotaccenteogonek: [ - 10, - 10, - -15, - -15 - ], - Bcomma: [ - 0, - 0, - -20, - -20 - ], - Bperiod: [ - 0, - 0, - -20, - -20 - ], - Ccomma: [ - 0, - 0, - -30, - -30 - ], - Cperiod: [ - 0, - 0, - -30, - -30 - ], - Cacutecomma: [ - 0, - 0, - -30, - -30 - ], - Cacuteperiod: [ - 0, - 0, - -30, - -30 - ], - Ccaroncomma: [ - 0, - 0, - -30, - -30 - ], - Ccaronperiod: [ - 0, - 0, - -30, - -30 - ], - Ccedillacomma: [ - 0, - 0, - -30, - -30 - ], - Ccedillaperiod: [ - 0, - 0, - -30, - -30 - ], - Fe: [ - 0, - 0, - -30, - -30, - -25, - -100, - -75 - ], - Feacute: [ - 0, - 0, - -30, - -30, - -25, - -100, - -75 - ], - Fecaron: [ - 0, - 0, - -30, - -30, - -25, - -100, - -75 - ], - Fecircumflex: [ - 0, - 0, - -30, - -30, - -25, - -100, - -75 - ], - Fedieresis: [ - 0, - 0, - -30, - -30, - -25, - -100, - -75 - ], - Fedotaccent: [ - 0, - 0, - -30, - -30, - -25, - -100, - -75 - ], - Fegrave: [ - 0, - 0, - -30, - -30, - -25, - -100, - -75 - ], - Femacron: [ - 0, - 0, - -30, - -30, - -25, - -100, - -75 - ], - Feogonek: [ - 0, - 0, - -30, - -30, - -25, - -100, - -75 - ], - Fo: [ - 0, - 0, - -30, - -30, - -25, - -70, - -105, - -15 - ], - Foacute: [ - 0, - 0, - -30, - -30, - -25, - -70, - -105, - -15 - ], - Focircumflex: [ - 0, - 0, - -30, - -30, - -25, - -70, - -105, - -15 - ], - Fodieresis: [ - 0, - 0, - -30, - -30, - -25, - -70, - -105, - -15 - ], - Fograve: [ - 0, - 0, - -30, - -30, - -25, - -70, - -105, - -15 - ], - Fohungarumlaut: [ - 0, - 0, - -30, - -30, - -25, - -70, - -105, - -15 - ], - Fomacron: [ - 0, - 0, - -30, - -30, - -25, - -70, - -105, - -15 - ], - Foslash: [ - 0, - 0, - -30, - -30, - -25, - -70, - -105, - -15 - ], - Fotilde: [ - 0, - 0, - -30, - -30, - -25, - -70, - -105, - -15 - ], - Fr: [ - 0, - 0, - -45, - -45, - 0, - -50, - -55 - ], - Fracute: [ - 0, - 0, - -45, - -45, - 0, - -50, - -55 - ], - Frcaron: [ - 0, - 0, - -45, - -45, - 0, - -50, - -55 - ], - Frcommaaccent: [ - 0, - 0, - -45, - -45, - 0, - -50, - -55 - ], - Ja: [ - 0, - 0, - -20, - -20, - -15, - -40, - -35 - ], - Jaacute: [ - 0, - 0, - -20, - -20, - -15, - -40, - -35 - ], - Jabreve: [ - 0, - 0, - -20, - -20, - -15, - -40, - -35 - ], - Jacircumflex: [ - 0, - 0, - -20, - -20, - -15, - -40, - -35 - ], - Jadieresis: [ - 0, - 0, - -20, - -20, - -15, - -40, - -35 - ], - Jagrave: [ - 0, - 0, - -20, - -20, - -15, - -40, - -35 - ], - Jamacron: [ - 0, - 0, - -20, - -20, - -15, - -40, - -35 - ], - Jaogonek: [ - 0, - 0, - -20, - -20, - -15, - -40, - -35 - ], - Jaring: [ - 0, - 0, - -20, - -20, - -15, - -40, - -35 - ], - Jatilde: [ - 0, - 0, - -20, - -20, - -15, - -40, - -35 - ], - LcaronT: [ - 0, - 0, - -110, - -110 - ], - LcaronTcaron: [ - 0, - 0, - -110, - -110 - ], - LcaronTcommaaccent: [ - 0, - 0, - -110, - -110 - ], - LcaronV: [ - 0, - 0, - -110, - -110 - ], - LcaronW: [ - 0, - 0, - -70, - -70 - ], - LcaronY: [ - 0, - 0, - -140, - -140 - ], - LcaronYacute: [ - 0, - 0, - -140, - -140 - ], - LcaronYdieresis: [ - 0, - 0, - -140, - -140 - ], - Lcaronquotedblright: [ - 0, - 0, - -140, - -140 - ], - Lcaronquoteright: [ - 0, - 0, - -160, - -160, - 0, - 0, - 0, - -92 - ], - Lcarony: [ - 0, - 0, - -30, - -30, - 0, - 0, - 0, - -55 - ], - Lcaronyacute: [ - 0, - 0, - -30, - -30, - 0, - 0, - 0, - -55 - ], - Lcaronydieresis: [ - 0, - 0, - -30, - -30, - 0, - 0, - 0, - -55 - ], - Scomma: [ - 0, - 0, - -20, - -20 - ], - Speriod: [ - 0, - 0, - -20, - -20 - ], - Sacutecomma: [ - 0, - 0, - -20, - -20 - ], - Sacuteperiod: [ - 0, - 0, - -20, - -20 - ], - Scaroncomma: [ - 0, - 0, - -20, - -20 - ], - Scaronperiod: [ - 0, - 0, - -20, - -20 - ], - Scedillacomma: [ - 0, - 0, - -20, - -20 - ], - Scedillaperiod: [ - 0, - 0, - -20, - -20 - ], - Scommaaccentcomma: [ - 0, - 0, - -20, - -20 - ], - Scommaaccentperiod: [ - 0, - 0, - -20, - -20 - ], - Trcaron: [ - 0, - 0, - -120, - -120, - -74, - -37, - -55, - -35 - ], - Tcaronrcaron: [ - 0, - 0, - -120, - -120, - -74, - -37, - -55, - -35 - ], - Tcommaaccentrcaron: [ - 0, - 0, - -120, - -120, - -74, - -37, - -55, - -35 - ], - Yhyphen: [ - 0, - 0, - -140, - -140, - -92, - -92, - -74, - -111 - ], - Yi: [ - 0, - 0, - -20, - -20, - -37, - -55, - -74, - -55 - ], - Yiacute: [ - 0, - 0, - -20, - -20, - -37, - -55, - -74, - -55 - ], - Yiogonek: [ - 0, - 0, - -20, - -20, - -37, - -55, - -74, - -55 - ], - Yacutehyphen: [ - 0, - 0, - -140, - -140, - -92, - -92, - -74, - -111 - ], - Yacutei: [ - 0, - 0, - -20, - -20, - -37, - -55, - -74, - -55 - ], - Yacuteiacute: [ - 0, - 0, - -20, - -20, - -37, - -55, - -74, - -55 - ], - Yacuteiogonek: [ - 0, - 0, - -20, - -20, - -37, - -55, - -74, - -55 - ], - Ydieresishyphen: [ - 0, - 0, - -140, - -140, - -92, - -92, - -74, - -111 - ], - Ydieresisi: [ - 0, - 0, - -20, - -20, - -37, - -55, - -74, - -55 - ], - Ydieresisiacute: [ - 0, - 0, - -20, - -20, - -37, - -55, - -74, - -55 - ], - Ydieresisiogonek: [ - 0, - 0, - -20, - -20, - -37, - -55, - -74, - -55 - ], - bb: [ - 0, - 0, - -10, - -10, - -10, - -10 - ], - bcomma: [ - 0, - 0, - -40, - -40 - ], - bperiod: [ - 0, - 0, - -40, - -40, - -40, - -40, - -40, - -40 - ], - ccomma: [ - 0, - 0, - -15, - -15 - ], - cacutecomma: [ - 0, - 0, - -15, - -15 - ], - ccaroncomma: [ - 0, - 0, - -15, - -15 - ], - ccedillacomma: [ - 0, - 0, - -15, - -15 - ], - fa: [ - 0, - 0, - -30, - -30, - 0, - 0, - 0, - -10 - ], - faacute: [ - 0, - 0, - -30, - -30, - 0, - 0, - 0, - -10 - ], - fabreve: [ - 0, - 0, - -30, - -30, - 0, - 0, - 0, - -10 - ], - facircumflex: [ - 0, - 0, - -30, - -30, - 0, - 0, - 0, - -10 - ], - fadieresis: [ - 0, - 0, - -30, - -30, - 0, - 0, - 0, - -10 - ], - fagrave: [ - 0, - 0, - -30, - -30, - 0, - 0, - 0, - -10 - ], - famacron: [ - 0, - 0, - -30, - -30, - 0, - 0, - 0, - -10 - ], - faogonek: [ - 0, - 0, - -30, - -30, - 0, - 0, - 0, - -10 - ], - faring: [ - 0, - 0, - -30, - -30, - 0, - 0, - 0, - -10 - ], - fatilde: [ - 0, - 0, - -30, - -30, - 0, - 0, - 0, - -10 - ], - fdotlessi: [ - 0, - 0, - -28, - -28, - -35, - -30, - -60, - -50 - ], - gr: [ - 0, - 0, - -10, - -10 - ], - gracute: [ - 0, - 0, - -10, - -10 - ], - grcaron: [ - 0, - 0, - -10, - -10 - ], - grcommaaccent: [ - 0, - 0, - -10, - -10 - ], - gbrever: [ - 0, - 0, - -10, - -10 - ], - gbreveracute: [ - 0, - 0, - -10, - -10 - ], - gbrevercaron: [ - 0, - 0, - -10, - -10 - ], - gbrevercommaaccent: [ - 0, - 0, - -10, - -10 - ], - gcommaaccentr: [ - 0, - 0, - -10, - -10 - ], - gcommaaccentracute: [ - 0, - 0, - -10, - -10 - ], - gcommaaccentrcaron: [ - 0, - 0, - -10, - -10 - ], - gcommaaccentrcommaaccent: [ - 0, - 0, - -10, - -10 - ], - ke: [ - 0, - 0, - -20, - -20, - -10, - -30, - -10, - -10 - ], - keacute: [ - 0, - 0, - -20, - -20, - -10, - -30, - -10, - -10 - ], - kecaron: [ - 0, - 0, - -20, - -20, - -10, - -30, - -10, - -10 - ], - kecircumflex: [ - 0, - 0, - -20, - -20, - -10, - -30, - -10, - -10 - ], - kedieresis: [ - 0, - 0, - -20, - -20, - -10, - -30, - -10, - -10 - ], - kedotaccent: [ - 0, - 0, - -20, - -20, - -10, - -30, - -10, - -10 - ], - kegrave: [ - 0, - 0, - -20, - -20, - -10, - -30, - -10, - -10 - ], - kemacron: [ - 0, - 0, - -20, - -20, - -10, - -30, - -10, - -10 - ], - keogonek: [ - 0, - 0, - -20, - -20, - -10, - -30, - -10, - -10 - ], - kcommaaccente: [ - 0, - 0, - -20, - -20, - -10, - -30, - -10, - -10 - ], - kcommaaccenteacute: [ - 0, - 0, - -20, - -20, - -10, - -30, - -10, - -10 - ], - kcommaaccentecaron: [ - 0, - 0, - -20, - -20, - -10, - -30, - -10, - -10 - ], - kcommaaccentecircumflex: [ - 0, - 0, - -20, - -20, - -10, - -30, - -10, - -10 - ], - kcommaaccentedieresis: [ - 0, - 0, - -20, - -20, - -10, - -30, - -10, - -10 - ], - kcommaaccentedotaccent: [ - 0, - 0, - -20, - -20, - -10, - -30, - -10, - -10 - ], - kcommaaccentegrave: [ - 0, - 0, - -20, - -20, - -10, - -30, - -10, - -10 - ], - kcommaaccentemacron: [ - 0, - 0, - -20, - -20, - -10, - -30, - -10, - -10 - ], - kcommaaccenteogonek: [ - 0, - 0, - -20, - -20, - -10, - -30, - -10, - -10 - ], - ocomma: [ - 0, - 0, - -40, - -40 - ], - operiod: [ - 0, - 0, - -40, - -40 - ], - oacutecomma: [ - 0, - 0, - -40, - -40 - ], - oacuteperiod: [ - 0, - 0, - -40, - -40 - ], - ocircumflexcomma: [ - 0, - 0, - -40, - -40 - ], - ocircumflexperiod: [ - 0, - 0, - -40, - -40 - ], - odieresiscomma: [ - 0, - 0, - -40, - -40 - ], - odieresisperiod: [ - 0, - 0, - -40, - -40 - ], - ogravecomma: [ - 0, - 0, - -40, - -40 - ], - ograveperiod: [ - 0, - 0, - -40, - -40 - ], - ohungarumlautcomma: [ - 0, - 0, - -40, - -40 - ], - ohungarumlautperiod: [ - 0, - 0, - -40, - -40 - ], - omacroncomma: [ - 0, - 0, - -40, - -40 - ], - omacronperiod: [ - 0, - 0, - -40, - -40 - ], - oslasha: [ - 0, - 0, - -55, - -55 - ], - oslashaacute: [ - 0, - 0, - -55, - -55 - ], - oslashabreve: [ - 0, - 0, - -55, - -55 - ], - oslashacircumflex: [ - 0, - 0, - -55, - -55 - ], - oslashadieresis: [ - 0, - 0, - -55, - -55 - ], - oslashagrave: [ - 0, - 0, - -55, - -55 - ], - oslashamacron: [ - 0, - 0, - -55, - -55 - ], - oslashaogonek: [ - 0, - 0, - -55, - -55 - ], - oslasharing: [ - 0, - 0, - -55, - -55 - ], - oslashatilde: [ - 0, - 0, - -55, - -55 - ], - oslashb: [ - 0, - 0, - -55, - -55 - ], - oslashc: [ - 0, - 0, - -55, - -55 - ], - oslashcacute: [ - 0, - 0, - -55, - -55 - ], - oslashccaron: [ - 0, - 0, - -55, - -55 - ], - oslashccedilla: [ - 0, - 0, - -55, - -55 - ], - oslashcomma: [ - 0, - 0, - -95, - -95 - ], - oslashd: [ - 0, - 0, - -55, - -55 - ], - oslashdcroat: [ - 0, - 0, - -55, - -55 - ], - oslashe: [ - 0, - 0, - -55, - -55 - ], - oslasheacute: [ - 0, - 0, - -55, - -55 - ], - oslashecaron: [ - 0, - 0, - -55, - -55 - ], - oslashecircumflex: [ - 0, - 0, - -55, - -55 - ], - oslashedieresis: [ - 0, - 0, - -55, - -55 - ], - oslashedotaccent: [ - 0, - 0, - -55, - -55 - ], - oslashegrave: [ - 0, - 0, - -55, - -55 - ], - oslashemacron: [ - 0, - 0, - -55, - -55 - ], - oslasheogonek: [ - 0, - 0, - -55, - -55 - ], - oslashf: [ - 0, - 0, - -55, - -55 - ], - oslashg: [ - 0, - 0, - -55, - -55, - 0, - 0, - -10 - ], - oslashgbreve: [ - 0, - 0, - -55, - -55, - 0, - 0, - -10 - ], - oslashgcommaaccent: [ - 0, - 0, - -55, - -55, - 0, - 0, - -10 - ], - oslashh: [ - 0, - 0, - -55, - -55 - ], - oslashi: [ - 0, - 0, - -55, - -55 - ], - oslashiacute: [ - 0, - 0, - -55, - -55 - ], - oslashicircumflex: [ - 0, - 0, - -55, - -55 - ], - oslashidieresis: [ - 0, - 0, - -55, - -55 - ], - oslashigrave: [ - 0, - 0, - -55, - -55 - ], - oslashimacron: [ - 0, - 0, - -55, - -55 - ], - oslashiogonek: [ - 0, - 0, - -55, - -55 - ], - oslashj: [ - 0, - 0, - -55, - -55 - ], - oslashk: [ - 0, - 0, - -55, - -55 - ], - oslashkcommaaccent: [ - 0, - 0, - -55, - -55 - ], - oslashl: [ - 0, - 0, - -55, - -55 - ], - oslashlacute: [ - 0, - 0, - -55, - -55 - ], - oslashlcommaaccent: [ - 0, - 0, - -55, - -55 - ], - oslashlslash: [ - 0, - 0, - -55, - -55 - ], - oslashm: [ - 0, - 0, - -55, - -55 - ], - oslashn: [ - 0, - 0, - -55, - -55 - ], - oslashnacute: [ - 0, - 0, - -55, - -55 - ], - oslashncaron: [ - 0, - 0, - -55, - -55 - ], - oslashncommaaccent: [ - 0, - 0, - -55, - -55 - ], - oslashntilde: [ - 0, - 0, - -55, - -55 - ], - oslasho: [ - 0, - 0, - -55, - -55 - ], - oslashoacute: [ - 0, - 0, - -55, - -55 - ], - oslashocircumflex: [ - 0, - 0, - -55, - -55 - ], - oslashodieresis: [ - 0, - 0, - -55, - -55 - ], - oslashograve: [ - 0, - 0, - -55, - -55 - ], - oslashohungarumlaut: [ - 0, - 0, - -55, - -55 - ], - oslashomacron: [ - 0, - 0, - -55, - -55 - ], - oslashoslash: [ - 0, - 0, - -55, - -55 - ], - oslashotilde: [ - 0, - 0, - -55, - -55 - ], - oslashp: [ - 0, - 0, - -55, - -55 - ], - oslashperiod: [ - 0, - 0, - -95, - -95 - ], - oslashq: [ - 0, - 0, - -55, - -55 - ], - oslashr: [ - 0, - 0, - -55, - -55 - ], - oslashracute: [ - 0, - 0, - -55, - -55 - ], - oslashrcaron: [ - 0, - 0, - -55, - -55 - ], - oslashrcommaaccent: [ - 0, - 0, - -55, - -55 - ], - oslashs: [ - 0, - 0, - -55, - -55 - ], - oslashsacute: [ - 0, - 0, - -55, - -55 - ], - oslashscaron: [ - 0, - 0, - -55, - -55 - ], - oslashscedilla: [ - 0, - 0, - -55, - -55 - ], - oslashscommaaccent: [ - 0, - 0, - -55, - -55 - ], - oslasht: [ - 0, - 0, - -55, - -55 - ], - oslashtcommaaccent: [ - 0, - 0, - -55, - -55 - ], - oslashu: [ - 0, - 0, - -55, - -55 - ], - oslashuacute: [ - 0, - 0, - -55, - -55 - ], - oslashucircumflex: [ - 0, - 0, - -55, - -55 - ], - oslashudieresis: [ - 0, - 0, - -55, - -55 - ], - oslashugrave: [ - 0, - 0, - -55, - -55 - ], - oslashuhungarumlaut: [ - 0, - 0, - -55, - -55 - ], - oslashumacron: [ - 0, - 0, - -55, - -55 - ], - oslashuogonek: [ - 0, - 0, - -55, - -55 - ], - oslashuring: [ - 0, - 0, - -55, - -55 - ], - oslashz: [ - 0, - 0, - -55, - -55 - ], - oslashzacute: [ - 0, - 0, - -55, - -55 - ], - oslashzcaron: [ - 0, - 0, - -55, - -55 - ], - oslashzdotaccent: [ - 0, - 0, - -55, - -55 - ], - otildecomma: [ - 0, - 0, - -40, - -40 - ], - otildeperiod: [ - 0, - 0, - -40, - -40 - ], - pcomma: [ - 0, - 0, - -35, - -35 - ], - pperiod: [ - 0, - 0, - -35, - -35 - ], - ra: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - raacute: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - rabreve: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - racircumflex: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - radieresis: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - ragrave: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - ramacron: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - raogonek: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - raring: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - ratilde: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - rcolon: [ - 0, - 0, - 30, - 30 - ], - ri: [ - 0, - 0, - 15, - 15 - ], - riacute: [ - 0, - 0, - 15, - 15 - ], - ricircumflex: [ - 0, - 0, - 15, - 15 - ], - ridieresis: [ - 0, - 0, - 15, - 15 - ], - rigrave: [ - 0, - 0, - 15, - 15 - ], - rimacron: [ - 0, - 0, - 15, - 15 - ], - riogonek: [ - 0, - 0, - 15, - 15 - ], - rk: [ - 0, - 0, - 15, - 15 - ], - rkcommaaccent: [ - 0, - 0, - 15, - 15 - ], - rl: [ - 0, - 0, - 15, - 15 - ], - rlacute: [ - 0, - 0, - 15, - 15 - ], - rlcommaaccent: [ - 0, - 0, - 15, - 15 - ], - rlslash: [ - 0, - 0, - 15, - 15 - ], - rm: [ - 0, - 0, - 25, - 25 - ], - rn: [ - 0, - 0, - 25, - 25, - -15 - ], - rnacute: [ - 0, - 0, - 25, - 25, - -15 - ], - rncaron: [ - 0, - 0, - 25, - 25, - -15 - ], - rncommaaccent: [ - 0, - 0, - 25, - 25, - -15 - ], - rntilde: [ - 0, - 0, - 25, - 25, - -15 - ], - rp: [ - 0, - 0, - 30, - 30, - -10 - ], - rsemicolon: [ - 0, - 0, - 30, - 30 - ], - ru: [ - 0, - 0, - 15, - 15 - ], - ruacute: [ - 0, - 0, - 15, - 15 - ], - rucircumflex: [ - 0, - 0, - 15, - 15 - ], - rudieresis: [ - 0, - 0, - 15, - 15 - ], - rugrave: [ - 0, - 0, - 15, - 15 - ], - ruhungarumlaut: [ - 0, - 0, - 15, - 15 - ], - rumacron: [ - 0, - 0, - 15, - 15 - ], - ruogonek: [ - 0, - 0, - 15, - 15 - ], - ruring: [ - 0, - 0, - 15, - 15 - ], - racutea: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - racuteaacute: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - racuteabreve: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - racuteacircumflex: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - racuteadieresis: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - racuteagrave: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - racuteamacron: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - racuteaogonek: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - racutearing: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - racuteatilde: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - racutecolon: [ - 0, - 0, - 30, - 30 - ], - racutei: [ - 0, - 0, - 15, - 15 - ], - racuteiacute: [ - 0, - 0, - 15, - 15 - ], - racuteicircumflex: [ - 0, - 0, - 15, - 15 - ], - racuteidieresis: [ - 0, - 0, - 15, - 15 - ], - racuteigrave: [ - 0, - 0, - 15, - 15 - ], - racuteimacron: [ - 0, - 0, - 15, - 15 - ], - racuteiogonek: [ - 0, - 0, - 15, - 15 - ], - racutek: [ - 0, - 0, - 15, - 15 - ], - racutekcommaaccent: [ - 0, - 0, - 15, - 15 - ], - racutel: [ - 0, - 0, - 15, - 15 - ], - racutelacute: [ - 0, - 0, - 15, - 15 - ], - racutelcommaaccent: [ - 0, - 0, - 15, - 15 - ], - racutelslash: [ - 0, - 0, - 15, - 15 - ], - racutem: [ - 0, - 0, - 25, - 25 - ], - racuten: [ - 0, - 0, - 25, - 25, - -15 - ], - racutenacute: [ - 0, - 0, - 25, - 25, - -15 - ], - racutencaron: [ - 0, - 0, - 25, - 25, - -15 - ], - racutencommaaccent: [ - 0, - 0, - 25, - 25, - -15 - ], - racutentilde: [ - 0, - 0, - 25, - 25, - -15 - ], - racutep: [ - 0, - 0, - 30, - 30, - -10 - ], - racutesemicolon: [ - 0, - 0, - 30, - 30 - ], - racuteu: [ - 0, - 0, - 15, - 15 - ], - racuteuacute: [ - 0, - 0, - 15, - 15 - ], - racuteucircumflex: [ - 0, - 0, - 15, - 15 - ], - racuteudieresis: [ - 0, - 0, - 15, - 15 - ], - racuteugrave: [ - 0, - 0, - 15, - 15 - ], - racuteuhungarumlaut: [ - 0, - 0, - 15, - 15 - ], - racuteumacron: [ - 0, - 0, - 15, - 15 - ], - racuteuogonek: [ - 0, - 0, - 15, - 15 - ], - racuteuring: [ - 0, - 0, - 15, - 15 - ], - rcarona: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - rcaronaacute: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - rcaronabreve: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - rcaronacircumflex: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - rcaronadieresis: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - rcaronagrave: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - rcaronamacron: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - rcaronaogonek: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - rcaronaring: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - rcaronatilde: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - rcaroncolon: [ - 0, - 0, - 30, - 30 - ], - rcaroni: [ - 0, - 0, - 15, - 15 - ], - rcaroniacute: [ - 0, - 0, - 15, - 15 - ], - rcaronicircumflex: [ - 0, - 0, - 15, - 15 - ], - rcaronidieresis: [ - 0, - 0, - 15, - 15 - ], - rcaronigrave: [ - 0, - 0, - 15, - 15 - ], - rcaronimacron: [ - 0, - 0, - 15, - 15 - ], - rcaroniogonek: [ - 0, - 0, - 15, - 15 - ], - rcaronk: [ - 0, - 0, - 15, - 15 - ], - rcaronkcommaaccent: [ - 0, - 0, - 15, - 15 - ], - rcaronl: [ - 0, - 0, - 15, - 15 - ], - rcaronlacute: [ - 0, - 0, - 15, - 15 - ], - rcaronlcommaaccent: [ - 0, - 0, - 15, - 15 - ], - rcaronlslash: [ - 0, - 0, - 15, - 15 - ], - rcaronm: [ - 0, - 0, - 25, - 25 - ], - rcaronn: [ - 0, - 0, - 25, - 25, - -15 - ], - rcaronnacute: [ - 0, - 0, - 25, - 25, - -15 - ], - rcaronncaron: [ - 0, - 0, - 25, - 25, - -15 - ], - rcaronncommaaccent: [ - 0, - 0, - 25, - 25, - -15 - ], - rcaronntilde: [ - 0, - 0, - 25, - 25, - -15 - ], - rcaronp: [ - 0, - 0, - 30, - 30, - -10 - ], - rcaronsemicolon: [ - 0, - 0, - 30, - 30 - ], - rcaronu: [ - 0, - 0, - 15, - 15 - ], - rcaronuacute: [ - 0, - 0, - 15, - 15 - ], - rcaronucircumflex: [ - 0, - 0, - 15, - 15 - ], - rcaronudieresis: [ - 0, - 0, - 15, - 15 - ], - rcaronugrave: [ - 0, - 0, - 15, - 15 - ], - rcaronuhungarumlaut: [ - 0, - 0, - 15, - 15 - ], - rcaronumacron: [ - 0, - 0, - 15, - 15 - ], - rcaronuogonek: [ - 0, - 0, - 15, - 15 - ], - rcaronuring: [ - 0, - 0, - 15, - 15 - ], - rcommaaccenta: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - rcommaaccentaacute: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - rcommaaccentabreve: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - rcommaaccentacircumflex: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - rcommaaccentadieresis: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - rcommaaccentagrave: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - rcommaaccentamacron: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - rcommaaccentaogonek: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - rcommaaccentaring: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - rcommaaccentatilde: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - rcommaaccentcolon: [ - 0, - 0, - 30, - 30 - ], - rcommaaccenti: [ - 0, - 0, - 15, - 15 - ], - rcommaaccentiacute: [ - 0, - 0, - 15, - 15 - ], - rcommaaccenticircumflex: [ - 0, - 0, - 15, - 15 - ], - rcommaaccentidieresis: [ - 0, - 0, - 15, - 15 - ], - rcommaaccentigrave: [ - 0, - 0, - 15, - 15 - ], - rcommaaccentimacron: [ - 0, - 0, - 15, - 15 - ], - rcommaaccentiogonek: [ - 0, - 0, - 15, - 15 - ], - rcommaaccentk: [ - 0, - 0, - 15, - 15 - ], - rcommaaccentkcommaaccent: [ - 0, - 0, - 15, - 15 - ], - rcommaaccentl: [ - 0, - 0, - 15, - 15 - ], - rcommaaccentlacute: [ - 0, - 0, - 15, - 15 - ], - rcommaaccentlcommaaccent: [ - 0, - 0, - 15, - 15 - ], - rcommaaccentlslash: [ - 0, - 0, - 15, - 15 - ], - rcommaaccentm: [ - 0, - 0, - 25, - 25 - ], - rcommaaccentn: [ - 0, - 0, - 25, - 25, - -15 - ], - rcommaaccentnacute: [ - 0, - 0, - 25, - 25, - -15 - ], - rcommaaccentncaron: [ - 0, - 0, - 25, - 25, - -15 - ], - rcommaaccentncommaaccent: [ - 0, - 0, - 25, - 25, - -15 - ], - rcommaaccentntilde: [ - 0, - 0, - 25, - 25, - -15 - ], - rcommaaccentp: [ - 0, - 0, - 30, - 30, - -10 - ], - rcommaaccentsemicolon: [ - 0, - 0, - 30, - 30 - ], - rcommaaccentu: [ - 0, - 0, - 15, - 15 - ], - rcommaaccentuacute: [ - 0, - 0, - 15, - 15 - ], - rcommaaccentucircumflex: [ - 0, - 0, - 15, - 15 - ], - rcommaaccentudieresis: [ - 0, - 0, - 15, - 15 - ], - rcommaaccentugrave: [ - 0, - 0, - 15, - 15 - ], - rcommaaccentuhungarumlaut: [ - 0, - 0, - 15, - 15 - ], - rcommaaccentumacron: [ - 0, - 0, - 15, - 15 - ], - rcommaaccentuogonek: [ - 0, - 0, - 15, - 15 - ], - rcommaaccenturing: [ - 0, - 0, - 15, - 15 - ], - scomma: [ - 0, - 0, - -15, - -15 - ], - speriod: [ - 0, - 0, - -15, - -15 - ], - sacutecomma: [ - 0, - 0, - -15, - -15 - ], - sacuteperiod: [ - 0, - 0, - -15, - -15 - ], - scaroncomma: [ - 0, - 0, - -15, - -15 - ], - scaronperiod: [ - 0, - 0, - -15, - -15 - ], - scedillacomma: [ - 0, - 0, - -15, - -15 - ], - scedillaperiod: [ - 0, - 0, - -15, - -15 - ], - scommaaccentcomma: [ - 0, - 0, - -15, - -15 - ], - scommaaccentperiod: [ - 0, - 0, - -15, - -15 - ], - ve: [ - 0, - 0, - -25, - -25, - -10, - -15, - 0, - -15 - ], - veacute: [ - 0, - 0, - -25, - -25, - -10, - -15, - 0, - -15 - ], - vecaron: [ - 0, - 0, - -25, - -25, - -10, - -15, - 0, - -15 - ], - vecircumflex: [ - 0, - 0, - -25, - -25, - -10, - -15, - 0, - -15 - ], - vedieresis: [ - 0, - 0, - -25, - -25, - -10, - -15, - 0, - -15 - ], - vedotaccent: [ - 0, - 0, - -25, - -25, - -10, - -15, - 0, - -15 - ], - vegrave: [ - 0, - 0, - -25, - -25, - -10, - -15, - 0, - -15 - ], - vemacron: [ - 0, - 0, - -25, - -25, - -10, - -15, - 0, - -15 - ], - veogonek: [ - 0, - 0, - -25, - -25, - -10, - -15, - 0, - -15 - ], - wa: [ - 0, - 0, - -15, - -15, - 0, - -10, - 0, - -10 - ], - waacute: [ - 0, - 0, - -15, - -15, - 0, - -10, - 0, - -10 - ], - wabreve: [ - 0, - 0, - -15, - -15, - 0, - -10, - 0, - -10 - ], - wacircumflex: [ - 0, - 0, - -15, - -15, - 0, - -10, - 0, - -10 - ], - wadieresis: [ - 0, - 0, - -15, - -15, - 0, - -10, - 0, - -10 - ], - wagrave: [ - 0, - 0, - -15, - -15, - 0, - -10, - 0, - -10 - ], - wamacron: [ - 0, - 0, - -15, - -15, - 0, - -10, - 0, - -10 - ], - waogonek: [ - 0, - 0, - -15, - -15, - 0, - -10, - 0, - -10 - ], - waring: [ - 0, - 0, - -15, - -15, - 0, - -10, - 0, - -10 - ], - watilde: [ - 0, - 0, - -15, - -15, - 0, - -10, - 0, - -10 - ], - we: [ - 0, - 0, - -10, - -10, - 0, - -10 - ], - weacute: [ - 0, - 0, - -10, - -10, - 0, - -10 - ], - wecaron: [ - 0, - 0, - -10, - -10, - 0, - -10 - ], - wecircumflex: [ - 0, - 0, - -10, - -10, - 0, - -10 - ], - wedieresis: [ - 0, - 0, - -10, - -10, - 0, - -10 - ], - wedotaccent: [ - 0, - 0, - -10, - -10, - 0, - -10 - ], - wegrave: [ - 0, - 0, - -10, - -10, - 0, - -10 - ], - wemacron: [ - 0, - 0, - -10, - -10, - 0, - -10 - ], - weogonek: [ - 0, - 0, - -10, - -10, - 0, - -10 - ], - zo: [ - 0, - 0, - -15, - -15 - ], - zoacute: [ - 0, - 0, - -15, - -15 - ], - zocircumflex: [ - 0, - 0, - -15, - -15 - ], - zodieresis: [ - 0, - 0, - -15, - -15 - ], - zograve: [ - 0, - 0, - -15, - -15 - ], - zohungarumlaut: [ - 0, - 0, - -15, - -15 - ], - zomacron: [ - 0, - 0, - -15, - -15 - ], - zoslash: [ - 0, - 0, - -15, - -15 - ], - zotilde: [ - 0, - 0, - -15, - -15 - ], - zacuteo: [ - 0, - 0, - -15, - -15 - ], - zacuteoacute: [ - 0, - 0, - -15, - -15 - ], - zacuteocircumflex: [ - 0, - 0, - -15, - -15 - ], - zacuteodieresis: [ - 0, - 0, - -15, - -15 - ], - zacuteograve: [ - 0, - 0, - -15, - -15 - ], - zacuteohungarumlaut: [ - 0, - 0, - -15, - -15 - ], - zacuteomacron: [ - 0, - 0, - -15, - -15 - ], - zacuteoslash: [ - 0, - 0, - -15, - -15 - ], - zacuteotilde: [ - 0, - 0, - -15, - -15 - ], - zcarono: [ - 0, - 0, - -15, - -15 - ], - zcaronoacute: [ - 0, - 0, - -15, - -15 - ], - zcaronocircumflex: [ - 0, - 0, - -15, - -15 - ], - zcaronodieresis: [ - 0, - 0, - -15, - -15 - ], - zcaronograve: [ - 0, - 0, - -15, - -15 - ], - zcaronohungarumlaut: [ - 0, - 0, - -15, - -15 - ], - zcaronomacron: [ - 0, - 0, - -15, - -15 - ], - zcaronoslash: [ - 0, - 0, - -15, - -15 - ], - zcaronotilde: [ - 0, - 0, - -15, - -15 - ], - zdotaccento: [ - 0, - 0, - -15, - -15 - ], - zdotaccentoacute: [ - 0, - 0, - -15, - -15 - ], - zdotaccentocircumflex: [ - 0, - 0, - -15, - -15 - ], - zdotaccentodieresis: [ - 0, - 0, - -15, - -15 - ], - zdotaccentograve: [ - 0, - 0, - -15, - -15 - ], - zdotaccentohungarumlaut: [ - 0, - 0, - -15, - -15 - ], - zdotaccentomacron: [ - 0, - 0, - -15, - -15 - ], - zdotaccentoslash: [ - 0, - 0, - -15, - -15 - ], - zdotaccentotilde: [ - 0, - 0, - -15, - -15 - ], - Ap: [ - 0, - 0, - 0, - 0, - -25 - ], - Aquoteright: [ - 0, - 0, - 0, - 0, - -74, - -74, - -37, - -111 - ], - Aacutep: [ - 0, - 0, - 0, - 0, - -25 - ], - Aacutequoteright: [ - 0, - 0, - 0, - 0, - -74, - -74, - -37, - -111 - ], - Abrevep: [ - 0, - 0, - 0, - 0, - -25 - ], - Abrevequoteright: [ - 0, - 0, - 0, - 0, - -74, - -74, - -37, - -111 - ], - Acircumflexp: [ - 0, - 0, - 0, - 0, - -25 - ], - Acircumflexquoteright: [ - 0, - 0, - 0, - 0, - -74, - -74, - -37, - -111 - ], - Adieresisp: [ - 0, - 0, - 0, - 0, - -25 - ], - Adieresisquoteright: [ - 0, - 0, - 0, - 0, - -74, - -74, - -37, - -111 - ], - Agravep: [ - 0, - 0, - 0, - 0, - -25 - ], - Agravequoteright: [ - 0, - 0, - 0, - 0, - -74, - -74, - -37, - -111 - ], - Amacronp: [ - 0, - 0, - 0, - 0, - -25 - ], - Amacronquoteright: [ - 0, - 0, - 0, - 0, - -74, - -74, - -37, - -111 - ], - Aogonekp: [ - 0, - 0, - 0, - 0, - -25 - ], - Aogonekquoteright: [ - 0, - 0, - 0, - 0, - -74, - -74, - -37, - -111 - ], - Aringp: [ - 0, - 0, - 0, - 0, - -25 - ], - Aringquoteright: [ - 0, - 0, - 0, - 0, - -74, - -74, - -37, - -111 - ], - Atildep: [ - 0, - 0, - 0, - 0, - -25 - ], - Atildequoteright: [ - 0, - 0, - 0, - 0, - -74, - -74, - -37, - -111 - ], - Je: [ - 0, - 0, - 0, - 0, - -15, - -40, - -25 - ], - Jeacute: [ - 0, - 0, - 0, - 0, - -15, - -40, - -25 - ], - Jecaron: [ - 0, - 0, - 0, - 0, - -15, - -40, - -25 - ], - Jecircumflex: [ - 0, - 0, - 0, - 0, - -15, - -40, - -25 - ], - Jedieresis: [ - 0, - 0, - 0, - 0, - -15, - -40, - -25 - ], - Jedotaccent: [ - 0, - 0, - 0, - 0, - -15, - -40, - -25 - ], - Jegrave: [ - 0, - 0, - 0, - 0, - -15, - -40, - -25 - ], - Jemacron: [ - 0, - 0, - 0, - 0, - -15, - -40, - -25 - ], - Jeogonek: [ - 0, - 0, - 0, - 0, - -15, - -40, - -25 - ], - Jo: [ - 0, - 0, - 0, - 0, - -15, - -40, - -25 - ], - Joacute: [ - 0, - 0, - 0, - 0, - -15, - -40, - -25 - ], - Jocircumflex: [ - 0, - 0, - 0, - 0, - -15, - -40, - -25 - ], - Jodieresis: [ - 0, - 0, - 0, - 0, - -15, - -40, - -25 - ], - Jograve: [ - 0, - 0, - 0, - 0, - -15, - -40, - -25 - ], - Johungarumlaut: [ - 0, - 0, - 0, - 0, - -15, - -40, - -25 - ], - Jomacron: [ - 0, - 0, - 0, - 0, - -15, - -40, - -25 - ], - Joslash: [ - 0, - 0, - 0, - 0, - -15, - -40, - -25 - ], - Jotilde: [ - 0, - 0, - 0, - 0, - -15, - -40, - -25 - ], - NA: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NAacute: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NAbreve: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NAcircumflex: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NAdieresis: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NAgrave: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NAmacron: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NAogonek: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NAring: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NAtilde: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NacuteA: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NacuteAacute: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NacuteAbreve: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NacuteAcircumflex: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NacuteAdieresis: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NacuteAgrave: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NacuteAmacron: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NacuteAogonek: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NacuteAring: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NacuteAtilde: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NcaronA: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NcaronAacute: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NcaronAbreve: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NcaronAcircumflex: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NcaronAdieresis: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NcaronAgrave: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NcaronAmacron: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NcaronAogonek: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NcaronAring: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NcaronAtilde: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NcommaaccentA: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NcommaaccentAacute: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NcommaaccentAbreve: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NcommaaccentAcircumflex: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NcommaaccentAdieresis: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NcommaaccentAgrave: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NcommaaccentAmacron: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NcommaaccentAogonek: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NcommaaccentAring: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NcommaaccentAtilde: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NtildeA: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NtildeAacute: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NtildeAbreve: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NtildeAcircumflex: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NtildeAdieresis: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NtildeAgrave: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NtildeAmacron: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NtildeAogonek: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NtildeAring: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NtildeAtilde: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - Ti: [ - 0, - 0, - 0, - 0, - -18, - -37, - -55, - -35 - ], - Tiacute: [ - 0, - 0, - 0, - 0, - -18, - -37, - -55, - -35 - ], - Tiogonek: [ - 0, - 0, - 0, - 0, - -18, - -37, - -55, - -35 - ], - Tcaroni: [ - 0, - 0, - 0, - 0, - -18, - -37, - -55, - -35 - ], - Tcaroniacute: [ - 0, - 0, - 0, - 0, - -18, - -37, - -55, - -35 - ], - Tcaroniogonek: [ - 0, - 0, - 0, - 0, - -18, - -37, - -55, - -35 - ], - Tcommaaccenti: [ - 0, - 0, - 0, - 0, - -18, - -37, - -55, - -35 - ], - Tcommaaccentiacute: [ - 0, - 0, - 0, - 0, - -18, - -37, - -55, - -35 - ], - Tcommaaccentiogonek: [ - 0, - 0, - 0, - 0, - -18, - -37, - -55, - -35 - ], - Vi: [ - 0, - 0, - 0, - 0, - -37, - -55, - -74, - -60 - ], - Viacute: [ - 0, - 0, - 0, - 0, - -37, - -55, - -74, - -60 - ], - Vicircumflex: [ - 0, - 0, - 0, - 0, - -37, - 0, - -34, - -20 - ], - Vidieresis: [ - 0, - 0, - 0, - 0, - -37, - 0, - -34, - -20 - ], - Vigrave: [ - 0, - 0, - 0, - 0, - -37, - 0, - -34, - -20 - ], - Vimacron: [ - 0, - 0, - 0, - 0, - -37, - 0, - -34, - -20 - ], - Viogonek: [ - 0, - 0, - 0, - 0, - -37, - -55, - -74, - -60 - ], - Wi: [ - 0, - 0, - 0, - 0, - -18, - -37, - -55, - -40 - ], - Wiacute: [ - 0, - 0, - 0, - 0, - -18, - -37, - -55, - -40 - ], - Wiogonek: [ - 0, - 0, - 0, - 0, - -18, - -37, - -55, - -40 - ], - fi: [ - 0, - 0, - 0, - 0, - -25, - 0, - -20, - -20 - ], - gperiod: [ - 0, - 0, - 0, - 0, - -15, - 0, - -15 - ], - gbreveperiod: [ - 0, - 0, - 0, - 0, - -15, - 0, - -15 - ], - gcommaaccentperiod: [ - 0, - 0, - 0, - 0, - -15, - 0, - -15 - ], - iv: [ - 0, - 0, - 0, - 0, - -10, - 0, - 0, - -25 - ], - iacutev: [ - 0, - 0, - 0, - 0, - -10, - 0, - 0, - -25 - ], - icircumflexv: [ - 0, - 0, - 0, - 0, - -10, - 0, - 0, - -25 - ], - idieresisv: [ - 0, - 0, - 0, - 0, - -10, - 0, - 0, - -25 - ], - igravev: [ - 0, - 0, - 0, - 0, - -10, - 0, - 0, - -25 - ], - imacronv: [ - 0, - 0, - 0, - 0, - -10, - 0, - 0, - -25 - ], - iogonekv: [ - 0, - 0, - 0, - 0, - -10, - 0, - 0, - -25 - ], - ky: [ - 0, - 0, - 0, - 0, - -15, - 0, - -10, - -15 - ], - kyacute: [ - 0, - 0, - 0, - 0, - -15, - 0, - -10, - -15 - ], - kydieresis: [ - 0, - 0, - 0, - 0, - -15, - 0, - -10, - -15 - ], - kcommaaccenty: [ - 0, - 0, - 0, - 0, - -15, - 0, - -10, - -15 - ], - kcommaaccentyacute: [ - 0, - 0, - 0, - 0, - -15, - 0, - -10, - -15 - ], - kcommaaccentydieresis: [ - 0, - 0, - 0, - 0, - -15, - 0, - -10, - -15 - ], - quotedblleftA: [ - 0, - 0, - 0, - 0, - -10, - 0, - 0, - -80 - ], - quotedblleftAacute: [ - 0, - 0, - 0, - 0, - -10, - 0, - 0, - -80 - ], - quotedblleftAbreve: [ - 0, - 0, - 0, - 0, - -10, - 0, - 0, - -80 - ], - quotedblleftAcircumflex: [ - 0, - 0, - 0, - 0, - -10, - 0, - 0, - -80 - ], - quotedblleftAdieresis: [ - 0, - 0, - 0, - 0, - -10, - 0, - 0, - -80 - ], - quotedblleftAgrave: [ - 0, - 0, - 0, - 0, - -10, - 0, - 0, - -80 - ], - quotedblleftAmacron: [ - 0, - 0, - 0, - 0, - -10, - 0, - 0, - -80 - ], - quotedblleftAogonek: [ - 0, - 0, - 0, - 0, - -10, - 0, - 0, - -80 - ], - quotedblleftAring: [ - 0, - 0, - 0, - 0, - -10, - 0, - 0, - -80 - ], - quotedblleftAtilde: [ - 0, - 0, - 0, - 0, - -10, - 0, - 0, - -80 - ], - quoteleftA: [ - 0, - 0, - 0, - 0, - -10, - 0, - 0, - -80 - ], - quoteleftAacute: [ - 0, - 0, - 0, - 0, - -10, - 0, - 0, - -80 - ], - quoteleftAbreve: [ - 0, - 0, - 0, - 0, - -10, - 0, - 0, - -80 - ], - quoteleftAcircumflex: [ - 0, - 0, - 0, - 0, - -10, - 0, - 0, - -80 - ], - quoteleftAdieresis: [ - 0, - 0, - 0, - 0, - -10, - 0, - 0, - -80 - ], - quoteleftAgrave: [ - 0, - 0, - 0, - 0, - -10, - 0, - 0, - -80 - ], - quoteleftAmacron: [ - 0, - 0, - 0, - 0, - -10, - 0, - 0, - -80 - ], - quoteleftAogonek: [ - 0, - 0, - 0, - 0, - -10, - 0, - 0, - -80 - ], - quoteleftAring: [ - 0, - 0, - 0, - 0, - -10, - 0, - 0, - -80 - ], - quoteleftAtilde: [ - 0, - 0, - 0, - 0, - -10, - 0, - 0, - -80 - ], - re: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - reacute: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - recaron: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - recircumflex: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - redieresis: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - redotaccent: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - regrave: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - remacron: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - reogonek: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - racutee: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - racuteeacute: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - racuteecaron: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - racuteecircumflex: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - racuteedieresis: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - racuteedotaccent: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - racuteegrave: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - racuteemacron: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - racuteeogonek: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - rcarone: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - rcaroneacute: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - rcaronecaron: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - rcaronecircumflex: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - rcaronedieresis: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - rcaronedotaccent: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - rcaronegrave: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - rcaronemacron: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - rcaroneogonek: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - rcommaaccente: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - rcommaaccenteacute: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - rcommaaccentecaron: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - rcommaaccentecircumflex: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - rcommaaccentedieresis: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - rcommaaccentedotaccent: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - rcommaaccentegrave: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - rcommaaccentemacron: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - rcommaaccenteogonek: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - spaceA: [ - 0, - 0, - 0, - 0, - -55, - -37, - -18, - -55 - ], - spaceAacute: [ - 0, - 0, - 0, - 0, - -55, - -37, - -18, - -55 - ], - spaceAbreve: [ - 0, - 0, - 0, - 0, - -55, - -37, - -18, - -55 - ], - spaceAcircumflex: [ - 0, - 0, - 0, - 0, - -55, - -37, - -18, - -55 - ], - spaceAdieresis: [ - 0, - 0, - 0, - 0, - -55, - -37, - -18, - -55 - ], - spaceAgrave: [ - 0, - 0, - 0, - 0, - -55, - -37, - -18, - -55 - ], - spaceAmacron: [ - 0, - 0, - 0, - 0, - -55, - -37, - -18, - -55 - ], - spaceAogonek: [ - 0, - 0, - 0, - 0, - -55, - -37, - -18, - -55 - ], - spaceAring: [ - 0, - 0, - 0, - 0, - -55, - -37, - -18, - -55 - ], - spaceAtilde: [ - 0, - 0, - 0, - 0, - -55, - -37, - -18, - -55 - ], - Fi: [ - 0, - 0, - 0, - 0, - 0, - -40, - -45 - ], - Fiacute: [ - 0, - 0, - 0, - 0, - 0, - -40, - -45 - ], - Ficircumflex: [ - 0, - 0, - 0, - 0, - 0, - -40, - -45 - ], - Fidieresis: [ - 0, - 0, - 0, - 0, - 0, - -40, - -45 - ], - Figrave: [ - 0, - 0, - 0, - 0, - 0, - -40, - -45 - ], - Fimacron: [ - 0, - 0, - 0, - 0, - 0, - -40, - -45 - ], - Fiogonek: [ - 0, - 0, - 0, - 0, - 0, - -40, - -45 - ], - eb: [ - 0, - 0, - 0, - 0, - 0, - -10 - ], - eacuteb: [ - 0, - 0, - 0, - 0, - 0, - -10 - ], - ecaronb: [ - 0, - 0, - 0, - 0, - 0, - -10 - ], - ecircumflexb: [ - 0, - 0, - 0, - 0, - 0, - -10 - ], - edieresisb: [ - 0, - 0, - 0, - 0, - 0, - -10 - ], - edotaccentb: [ - 0, - 0, - 0, - 0, - 0, - -10 - ], - egraveb: [ - 0, - 0, - 0, - 0, - 0, - -10 - ], - emacronb: [ - 0, - 0, - 0, - 0, - 0, - -10 - ], - eogonekb: [ - 0, - 0, - 0, - 0, - 0, - -10 - ], - ff: [ - 0, - 0, - 0, - 0, - 0, - -18, - -18, - -25 - ], - quoterightt: [ - 0, - 0, - 0, - 0, - 0, - -37, - -30, - -18 - ], - quoterighttcommaaccent: [ - 0, - 0, - 0, - 0, - 0, - -37, - -30, - -18 - ], - Yicircumflex: [ - 0, - 0, - 0, - 0, - 0, - 0, - -34 - ], - Yidieresis: [ - 0, - 0, - 0, - 0, - 0, - 0, - -34 - ], - Yigrave: [ - 0, - 0, - 0, - 0, - 0, - 0, - -34 - ], - Yimacron: [ - 0, - 0, - 0, - 0, - 0, - 0, - -34 - ], - Yacuteicircumflex: [ - 0, - 0, - 0, - 0, - 0, - 0, - -34 - ], - Yacuteidieresis: [ - 0, - 0, - 0, - 0, - 0, - 0, - -34 - ], - Yacuteigrave: [ - 0, - 0, - 0, - 0, - 0, - 0, - -34 - ], - Yacuteimacron: [ - 0, - 0, - 0, - 0, - 0, - 0, - -34 - ], - Ydieresisicircumflex: [ - 0, - 0, - 0, - 0, - 0, - 0, - -34 - ], - Ydieresisidieresis: [ - 0, - 0, - 0, - 0, - 0, - 0, - -34 - ], - Ydieresisigrave: [ - 0, - 0, - 0, - 0, - 0, - 0, - -34 - ], - Ydieresisimacron: [ - 0, - 0, - 0, - 0, - 0, - 0, - -34 - ], - eg: [ - 0, - 0, - 0, - 0, - 0, - 0, - -40, - -15 - ], - egbreve: [ - 0, - 0, - 0, - 0, - 0, - 0, - -40, - -15 - ], - egcommaaccent: [ - 0, - 0, - 0, - 0, - 0, - 0, - -40, - -15 - ], - eacuteg: [ - 0, - 0, - 0, - 0, - 0, - 0, - -40, - -15 - ], - eacutegbreve: [ - 0, - 0, - 0, - 0, - 0, - 0, - -40, - -15 - ], - eacutegcommaaccent: [ - 0, - 0, - 0, - 0, - 0, - 0, - -40, - -15 - ], - ecarong: [ - 0, - 0, - 0, - 0, - 0, - 0, - -40, - -15 - ], - ecarongbreve: [ - 0, - 0, - 0, - 0, - 0, - 0, - -40, - -15 - ], - ecarongcommaaccent: [ - 0, - 0, - 0, - 0, - 0, - 0, - -40, - -15 - ], - ecircumflexg: [ - 0, - 0, - 0, - 0, - 0, - 0, - -40, - -15 - ], - ecircumflexgbreve: [ - 0, - 0, - 0, - 0, - 0, - 0, - -40, - -15 - ], - ecircumflexgcommaaccent: [ - 0, - 0, - 0, - 0, - 0, - 0, - -40, - -15 - ], - edieresisg: [ - 0, - 0, - 0, - 0, - 0, - 0, - -40, - -15 - ], - edieresisgbreve: [ - 0, - 0, - 0, - 0, - 0, - 0, - -40, - -15 - ], - edieresisgcommaaccent: [ - 0, - 0, - 0, - 0, - 0, - 0, - -40, - -15 - ], - edotaccentg: [ - 0, - 0, - 0, - 0, - 0, - 0, - -40, - -15 - ], - edotaccentgbreve: [ - 0, - 0, - 0, - 0, - 0, - 0, - -40, - -15 - ], - edotaccentgcommaaccent: [ - 0, - 0, - 0, - 0, - 0, - 0, - -40, - -15 - ], - egraveg: [ - 0, - 0, - 0, - 0, - 0, - 0, - -40, - -15 - ], - egravegbreve: [ - 0, - 0, - 0, - 0, - 0, - 0, - -40, - -15 - ], - egravegcommaaccent: [ - 0, - 0, - 0, - 0, - 0, - 0, - -40, - -15 - ], - emacrong: [ - 0, - 0, - 0, - 0, - 0, - 0, - -40, - -15 - ], - emacrongbreve: [ - 0, - 0, - 0, - 0, - 0, - 0, - -40, - -15 - ], - emacrongcommaaccent: [ - 0, - 0, - 0, - 0, - 0, - 0, - -40, - -15 - ], - eogonekg: [ - 0, - 0, - 0, - 0, - 0, - 0, - -40, - -15 - ], - eogonekgbreve: [ - 0, - 0, - 0, - 0, - 0, - 0, - -40, - -15 - ], - eogonekgcommaaccent: [ - 0, - 0, - 0, - 0, - 0, - 0, - -40, - -15 - ], - fiogonek: [ - 0, - 0, - 0, - 0, - 0, - 0, - -20 - ], - gcomma: [ - 0, - 0, - 0, - 0, - 0, - 0, - -10 - ], - gbrevecomma: [ - 0, - 0, - 0, - 0, - 0, - 0, - -10 - ], - gcommaaccentcomma: [ - 0, - 0, - 0, - 0, - 0, - 0, - -10 - ], - og: [ - 0, - 0, - 0, - 0, - 0, - 0, - -10 - ], - ogbreve: [ - 0, - 0, - 0, - 0, - 0, - 0, - -10 - ], - ogcommaaccent: [ - 0, - 0, - 0, - 0, - 0, - 0, - -10 - ], - oacuteg: [ - 0, - 0, - 0, - 0, - 0, - 0, - -10 - ], - oacutegbreve: [ - 0, - 0, - 0, - 0, - 0, - 0, - -10 - ], - oacutegcommaaccent: [ - 0, - 0, - 0, - 0, - 0, - 0, - -10 - ], - ocircumflexg: [ - 0, - 0, - 0, - 0, - 0, - 0, - -10 - ], - ocircumflexgbreve: [ - 0, - 0, - 0, - 0, - 0, - 0, - -10 - ], - ocircumflexgcommaaccent: [ - 0, - 0, - 0, - 0, - 0, - 0, - -10 - ], - odieresisg: [ - 0, - 0, - 0, - 0, - 0, - 0, - -10 - ], - odieresisgbreve: [ - 0, - 0, - 0, - 0, - 0, - 0, - -10 - ], - odieresisgcommaaccent: [ - 0, - 0, - 0, - 0, - 0, - 0, - -10 - ], - ograveg: [ - 0, - 0, - 0, - 0, - 0, - 0, - -10 - ], - ogravegbreve: [ - 0, - 0, - 0, - 0, - 0, - 0, - -10 - ], - ogravegcommaaccent: [ - 0, - 0, - 0, - 0, - 0, - 0, - -10 - ], - ohungarumlautg: [ - 0, - 0, - 0, - 0, - 0, - 0, - -10 - ], - ohungarumlautgbreve: [ - 0, - 0, - 0, - 0, - 0, - 0, - -10 - ], - ohungarumlautgcommaaccent: [ - 0, - 0, - 0, - 0, - 0, - 0, - -10 - ], - omacrong: [ - 0, - 0, - 0, - 0, - 0, - 0, - -10 - ], - omacrongbreve: [ - 0, - 0, - 0, - 0, - 0, - 0, - -10 - ], - omacrongcommaaccent: [ - 0, - 0, - 0, - 0, - 0, - 0, - -10 - ], - otildeg: [ - 0, - 0, - 0, - 0, - 0, - 0, - -10 - ], - otildegbreve: [ - 0, - 0, - 0, - 0, - 0, - 0, - -10 - ], - otildegcommaaccent: [ - 0, - 0, - 0, - 0, - 0, - 0, - -10 - ], - fiacute: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -20 - ], - ga: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ], - gaacute: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ], - gabreve: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ], - gacircumflex: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ], - gadieresis: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ], - gagrave: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ], - gamacron: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ], - gaogonek: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ], - garing: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ], - gatilde: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ], - gbrevea: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ], - gbreveaacute: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ], - gbreveabreve: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ], - gbreveacircumflex: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ], - gbreveadieresis: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ], - gbreveagrave: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ], - gbreveamacron: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ], - gbreveaogonek: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ], - gbrevearing: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ], - gbreveatilde: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ], - gcommaaccenta: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ], - gcommaaccentaacute: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ], - gcommaaccentabreve: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ], - gcommaaccentacircumflex: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ], - gcommaaccentadieresis: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ], - gcommaaccentagrave: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ], - gcommaaccentamacron: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ], - gcommaaccentaogonek: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ], - gcommaaccentaring: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ], - gcommaaccentatilde: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ] -}; -var data = { - attributes: attributes, - glyphWidths: glyphWidths, - kernPairs: kernPairs -}; - -const initFont = font => { - return [font.FontName, { - attributes: font, - glyphWidths: {}, - kernPairs: {} - }]; -}; -const expandData = data => { - const { - attributes, - glyphWidths, - kernPairs - } = data; - const fonts = attributes.map(initFont); - Object.keys(glyphWidths).forEach(key => { - glyphWidths[key].forEach((value, index) => { - if (value) fonts[index][1].glyphWidths[key] = value; - }); - }); - Object.keys(kernPairs).forEach(key => { - kernPairs[key].forEach((value, index) => { - if (value) fonts[index][1].kernPairs[key] = value; - }); - }); - return Object.fromEntries(fonts); -}; - -const STANDARD_FONTS = expandData(data); -const createStandardFont = PDFFont => class StandardFont extends PDFFont { - constructor(document, name, id) { - super(); - this.document = document; - this.name = name; - this.id = id; - this.font = AFMFont.fromJson(STANDARD_FONTS[this.name]); - this.ascender = this.font.ascender; - this.descender = this.font.descender; - this.bbox = this.font.bbox; - this.lineGap = this.font.lineGap; - } - embed() { - this.dictionary.data = { - Type: 'Font', - BaseFont: this.name, - Subtype: 'Type1', - Encoding: 'WinAnsiEncoding' - }; - return this.dictionary.end(); - } - encode(text) { - const encoded = this.font.encodeText(text); - const glyphs = this.font.glyphsForString(`${text}`); - const advances = this.font.advancesForGlyphs(glyphs); - const positions = []; - for (let i = 0; i < glyphs.length; i++) { - const glyph = glyphs[i]; - positions.push({ - xAdvance: advances[i], - yAdvance: 0, - xOffset: 0, - yOffset: 0, - advanceWidth: this.font.widthOfGlyph(glyph) - }); - } - return [encoded, positions]; - } - widthOfString(string, size) { - const glyphs = this.font.glyphsForString(`${string}`); - const advances = this.font.advancesForGlyphs(glyphs); - let width = 0; - for (let advance of Array.from(advances)) { - width += advance; - } - const scale = size / 1000; - return width * scale; - } - static isStandardFont(name) { - return name in STANDARD_FONTS; - } -}; - -const toHex = function () { - for (var _len = arguments.length, codePoints = new Array(_len), _key = 0; _key < _len; _key++) { - codePoints[_key] = arguments[_key]; - } - const codes = Array.from(codePoints).map(code => `0000${code.toString(16)}`.slice(-4)); - return codes.join(''); -}; -const createEmbeddedFont = PDFFont => class EmbeddedFont extends PDFFont { - constructor(document, font, id) { - super(); - this.document = document; - this.font = font; - this.id = id; - this.subset = this.font.createSubset(); - this.unicode = [[0]]; - this.widths = [this.font.getGlyph(0).advanceWidth]; - this.name = this.font.postscriptName; - this.scale = 1000 / this.font.unitsPerEm; - this.ascender = this.font.ascent * this.scale; - this.descender = this.font.descent * this.scale; - this.xHeight = this.font.xHeight * this.scale; - this.capHeight = this.font.capHeight * this.scale; - this.lineGap = this.font.lineGap * this.scale; - this.bbox = this.font.bbox; - this.layoutCache = Object.create(null); - } - layoutRun(text, features) { - // passing LTR To force fontkit to not reverse the string - const run = this.font.layout(text, features, undefined, undefined, 'ltr'); - - // Normalize position values - for (let i = 0; i < run.positions.length; i++) { - const position = run.positions[i]; - for (let key in position) { - position[key] *= this.scale; - } - position.advanceWidth = run.glyphs[i].advanceWidth * this.scale; - } - return run; - } - layoutCached(text) { - let cached; - if (cached = this.layoutCache[text]) { - return cached; - } - const run = this.layoutRun(text); - this.layoutCache[text] = run; - return run; - } - layout(text, features, onlyWidth) { - // Skip the cache if any user defined features are applied - if (onlyWidth == null) { - onlyWidth = false; - } - if (features) { - return this.layoutRun(text, features); - } - const glyphs = onlyWidth ? null : []; - const positions = onlyWidth ? null : []; - let advanceWidth = 0; - - // Split the string by words to increase cache efficiency. - // For this purpose, spaces and tabs are a good enough delimeter. - let last = 0; - let index = 0; - while (index <= text.length) { - let needle; - if (index === text.length && last < index || (needle = text.charAt(index), [' ', '\t'].includes(needle))) { - const run = this.layoutCached(text.slice(last, ++index)); - if (!onlyWidth) { - glyphs.push(...Array.from(run.glyphs || [])); - positions.push(...Array.from(run.positions || [])); - } - advanceWidth += run.advanceWidth; - last = index; - } else { - index++; - } - } - return { - glyphs, - positions, - advanceWidth - }; - } - encode(text, features) { - const { - glyphs, - positions - } = this.layout(text, features); - const res = []; - for (let i = 0; i < glyphs.length; i++) { - const glyph = glyphs[i]; - const gid = this.subset.includeGlyph(glyph.id); - res.push(`0000${gid.toString(16)}`.slice(-4)); - if (this.widths[gid] == null) { - this.widths[gid] = glyph.advanceWidth * this.scale; - } - if (this.unicode[gid] == null) { - this.unicode[gid] = glyph.codePoints; - } - } - return [res, positions]; - } - widthOfString(string, size, features) { - const width = this.layout(string, features, true).advanceWidth; - const scale = size / 1000; - return width * scale; - } - embed() { - const isCFF = this.subset.cff != null; - const fontFile = this.document.ref(); - if (isCFF) { - fontFile.data.Subtype = 'CIDFontType0C'; - } - fontFile.end(this.subset.encode()); - const familyClass = ((this.font['OS/2'] != null ? this.font['OS/2'].sFamilyClass : undefined) || 0) >> 8; - let flags = 0; - if (this.font.post.isFixedPitch) { - flags |= 1 << 0; - } - if (1 <= familyClass && familyClass <= 7) { - flags |= 1 << 1; - } - flags |= 1 << 2; // assume the font uses non-latin characters - if (familyClass === 10) { - flags |= 1 << 3; - } - if (this.font.head.macStyle.italic) { - flags |= 1 << 6; - } - - // generate a random tag (6 uppercase letters. 65 is the char code for 'A') - const tag = [0, 1, 2, 3, 4, 5].map(() => String.fromCharCode(Math.random() * 26 + 65)).join(''); - const name = tag + '+' + this.font.postscriptName; - const { - bbox - } = this.font; - const descriptor = this.document.ref({ - Type: 'FontDescriptor', - FontName: name, - Flags: flags, - FontBBox: [bbox.minX * this.scale, bbox.minY * this.scale, bbox.maxX * this.scale, bbox.maxY * this.scale], - ItalicAngle: this.font.italicAngle, - Ascent: this.ascender, - Descent: this.descender, - CapHeight: (this.font.capHeight || this.font.ascent) * this.scale, - XHeight: (this.font.xHeight || 0) * this.scale, - StemV: 0 - }); // not sure how to calculate this - - if (isCFF) { - descriptor.data.FontFile3 = fontFile; - } else { - descriptor.data.FontFile2 = fontFile; - } - descriptor.end(); - const descendantFontData = { - Type: 'Font', - Subtype: 'CIDFontType0', - BaseFont: name, - CIDSystemInfo: { - Registry: new String('Adobe'), - Ordering: new String('Identity'), - Supplement: 0 - }, - FontDescriptor: descriptor, - W: [0, this.widths] - }; - if (!isCFF) { - descendantFontData.Subtype = 'CIDFontType2'; - descendantFontData.CIDToGIDMap = 'Identity'; - } - const descendantFont = this.document.ref(descendantFontData); - descendantFont.end(); - this.dictionary.data = { - Type: 'Font', - Subtype: 'Type0', - BaseFont: name, - Encoding: 'Identity-H', - DescendantFonts: [descendantFont], - ToUnicode: this.toUnicodeCmap() - }; - return this.dictionary.end(); - } - - // Maps the glyph ids encoded in the PDF back to unicode strings - // Because of ligature substitutions and the like, there may be one or more - // unicode characters represented by each glyph. - toUnicodeCmap() { - const cmap = this.document.ref(); - let entries = []; - let unicodeMap = '/CIDInit /ProcSet findresource begin\n12 dict begin\nbegincmap\n/CIDSystemInfo <<\n /Registry (Adobe)\n /Ordering (UCS)\n /Supplement 0\n>> def\n/CMapName /Adobe-Identity-UCS def\n/CMapType 2 def\n1 begincodespacerange\n<0000>\nendcodespacerange'; - for (let [index, codePoints] of this.unicode.entries()) { - const encoded = []; - if (entries.length >= 100) { - unicodeMap += '\n' + entries.length + ' beginbfchar\n' + entries.join('\n') + '\nendbfchar'; - entries = []; - } - // encode codePoints to utf16 - for (let value of codePoints) { - if (value > 0xffff) { - value -= 0x10000; - encoded.push(toHex(value >>> 10 & 0x3ff | 0xd800)); - value = 0xdc00 | value & 0x3ff; - } - encoded.push(toHex(value)); - } - entries.push('<' + toHex(index) + '>' + '<' + encoded.join(' ') + '>'); - } - if (entries.length) { - unicodeMap += '\n' + entries.length + ' beginbfchar\n' + entries.join('\n') + '\nendbfchar\n'; - } - unicodeMap += 'endcmap\nCMapName currentdict /CMap defineresource pop\nend\nend'; - cmap.end(unicodeMap); - return cmap; - } -}; - -class PDFFont { - static open(document, src, family, id) { - let font; - if (typeof src === 'string') { - if (StandardFont.isStandardFont(src)) { - return new StandardFont(document, src, id); - } - { - throw new Error(`Can't open ${src} in browser build`); - } - } else if (src instanceof Uint8Array) { - font = fontkit.create(src, family); - } else if (src instanceof ArrayBuffer) { - font = fontkit.create(new Uint8Array(src), family); - } else if (typeof src === 'object') { - font = src; - } - if (font == null) { - throw new Error('Not a supported font format or standard PDF font.'); - } - return new EmbeddedFont(document, font, id); - } - encode() { - throw new Error('Must be implemented by subclasses'); - } - widthOfString() { - throw new Error('Must be implemented by subclasses'); - } - ref() { - return this.dictionary != null ? this.dictionary : this.dictionary = this.document.ref(); - } - finalize() { - if (this.embedded || this.dictionary == null) { - return; - } - this.embed(); - return this.embedded = true; - } - embed() { - throw new Error('Must be implemented by subclasses'); - } - lineHeight(size, includeGap) { - if (includeGap == null) { - includeGap = false; - } - const gap = includeGap ? this.lineGap : 0; - return (this.ascender + gap - this.descender) / 1000 * size; - } -} -const StandardFont = createStandardFont(PDFFont); -const EmbeddedFont = createEmbeddedFont(PDFFont); - -var FontsMixin = { - initFonts() { - // Lookup table for embedded fonts - this._fontFamilies = {}; - this._fontCount = 0; - - // Font state - this._fontSize = 12; - this._font = null; - this._registeredFonts = {}; - - // Set the default font - return this.font('Helvetica'); - }, - font(src, family, size) { - let cacheKey; - let font; - if (typeof family === 'number') { - size = family; - family = null; - } - - // check registered fonts if src is a string - if (typeof src === 'string' && this._registeredFonts[src]) { - cacheKey = src; - ({ - src, - family - } = this._registeredFonts[src]); - } else { - cacheKey = family || src; - if (typeof cacheKey !== 'string') { - cacheKey = null; - } - } - if (size != null) { - this.fontSize(size); - } - - // fast path: check if the font is already in the PDF - if (font = this._fontFamilies[cacheKey]) { - this._font = font; - return this; - } - - // load the font - const id = `F${++this._fontCount}`; - this._font = PDFFont.open(this, src, family, id); - - // check for existing font familes with the same name already in the PDF - // useful if the font was passed as a buffer - if (font = this._fontFamilies[this._font.name]) { - this._font = font; - return this; - } - - // save the font for reuse later - if (cacheKey) { - this._fontFamilies[cacheKey] = this._font; - } - if (this._font.name) { - this._fontFamilies[this._font.name] = this._font; - } - return this; - }, - fontSize(_fontSize) { - this._fontSize = _fontSize; - return this; - }, - currentLineHeight(includeGap) { - if (includeGap == null) { - includeGap = false; - } - return this._font.lineHeight(this._fontSize, includeGap); - }, - registerFont(name, src, family) { - this._registeredFonts[name] = { - src, - family - }; - return this; - } -}; - -function PDFNumber(n) { - // PDF numbers are strictly 32bit - // so convert this number to the nearest 32bit number - // @see ISO 32000-1 Annex C.2 (real numbers) - return Math.fround(n); -} - -const SOFT_HYPHEN = '\u00AD'; -const HYPHEN = '-'; -class LineWrapper extends EventEmitter { - constructor(document, options) { - super(); - this.document = document; - this.horizontalScaling = options.horizontalScaling || 100; - this.indent = (options.indent || 0) * this.horizontalScaling / 100; - this.characterSpacing = (options.characterSpacing || 0) * this.horizontalScaling / 100; - this.wordSpacing = (options.wordSpacing === 0) * this.horizontalScaling / 100; - this.columns = options.columns || 1; - this.columnGap = (options.columnGap != null ? options.columnGap : 18) * this.horizontalScaling / 100; // 1/4 inch - this.lineWidth = (options.width * this.horizontalScaling / 100 - this.columnGap * (this.columns - 1)) / this.columns; - this.spaceLeft = this.lineWidth; - this.startX = this.document.x; - this.startY = this.document.y; - this.column = 1; - this.ellipsis = options.ellipsis; - this.continuedX = 0; - this.features = options.features; - - // calculate the maximum Y position the text can appear at - if (options.height != null) { - this.height = options.height; - this.maxY = PDFNumber(this.startY + options.height); - } else { - this.maxY = PDFNumber(this.document.page.maxY()); - } - - // handle paragraph indents - this.on('firstLine', options => { - // if this is the first line of the text segment, and - // we're continuing where we left off, indent that much - // otherwise use the user specified indent option - const indent = this.continuedX || this.indent; - this.document.x += indent; - this.lineWidth -= indent; - - // if indentAllLines is set to true - // we're not resetting the indentation for this paragraph after the first line - if (options.indentAllLines) { - return; - } - - // otherwise we start the next line without indent - return this.once('line', () => { - this.document.x -= indent; - this.lineWidth += indent; - if (options.continued && !this.continuedX) { - this.continuedX = this.indent; - } - if (!options.continued) { - return this.continuedX = 0; - } - }); - }); - - // handle left aligning last lines of paragraphs - this.on('lastLine', options => { - const { - align - } = options; - if (align === 'justify') { - options.align = 'left'; - } - this.lastLine = true; - return this.once('line', () => { - this.document.y += options.paragraphGap || 0; - options.align = align; - return this.lastLine = false; - }); - }); - } - wordWidth(word) { - return this.document.widthOfString(word, this) + this.characterSpacing + this.wordSpacing; - } - canFit(word, w) { - if (word[word.length - 1] != SOFT_HYPHEN) { - return w <= this.spaceLeft; - } - return w + this.wordWidth(HYPHEN) <= this.spaceLeft; - } - eachWord(text, fn) { - // setup a unicode line breaker - let bk; - const breaker = new LineBreaker(text); - let last = null; - const wordWidths = Object.create(null); - while (bk = breaker.nextBreak()) { - var shouldContinue; - let word = text.slice((last != null ? last.position : undefined) || 0, bk.position); - let w = wordWidths[word] != null ? wordWidths[word] : wordWidths[word] = this.wordWidth(word); - - // if the word is longer than the whole line, chop it up - // TODO: break by grapheme clusters, not JS string characters - if (w > this.lineWidth + this.continuedX) { - // make some fake break objects - let lbk = last; - const fbk = {}; - while (word.length) { - // fit as much of the word as possible into the space we have - var l, mightGrow; - if (w > this.spaceLeft) { - // start our check at the end of our available space - this method is faster than a loop of each character and it resolves - // an issue with long loops when processing massive words, such as a huge number of spaces - l = Math.ceil(this.spaceLeft / (w / word.length)); - w = this.wordWidth(word.slice(0, l)); - mightGrow = w <= this.spaceLeft && l < word.length; - } else { - l = word.length; - } - let mustShrink = w > this.spaceLeft && l > 0; - // shrink or grow word as necessary after our near-guess above - while (mustShrink || mightGrow) { - if (mustShrink) { - w = this.wordWidth(word.slice(0, --l)); - mustShrink = w > this.spaceLeft && l > 0; - } else { - w = this.wordWidth(word.slice(0, ++l)); - mustShrink = w > this.spaceLeft && l > 0; - mightGrow = w <= this.spaceLeft && l < word.length; - } - } - - // check for the edge case where a single character cannot fit into a line. - if (l === 0 && this.spaceLeft === this.lineWidth) { - l = 1; - } - - // send a required break unless this is the last piece and a linebreak is not specified - fbk.required = bk.required || l < word.length; - shouldContinue = fn(word.slice(0, l), w, fbk, lbk); - lbk = { - required: false - }; - - // get the remaining piece of the word - word = word.slice(l); - w = this.wordWidth(word); - if (shouldContinue === false) { - break; - } - } - } else { - // otherwise just emit the break as it was given to us - shouldContinue = fn(word, w, bk, last); - } - if (shouldContinue === false) { - break; - } - last = bk; - } - } - wrap(text, options) { - // override options from previous continued fragments - this.horizontalScaling = options.horizontalScaling || 100; - if (options.indent != null) { - this.indent = options.indent * this.horizontalScaling / 100; - } - if (options.characterSpacing != null) { - this.characterSpacing = options.characterSpacing * this.horizontalScaling / 100; - } - if (options.wordSpacing != null) { - this.wordSpacing = options.wordSpacing * this.horizontalScaling / 100; - } - if (options.ellipsis != null) { - this.ellipsis = options.ellipsis; - } - - // make sure we're actually on the page - // and that the first line of is never by - // itself at the bottom of a page (orphans) - const nextY = this.document.y + this.document.currentLineHeight(true); - if (this.document.y > this.maxY || nextY > this.maxY) { - this.nextSection(); - } - let buffer = ''; - let textWidth = 0; - let wc = 0; - let lc = 0; - let { - y - } = this.document; // used to reset Y pos if options.continued (below) - const emitLine = () => { - options.textWidth = textWidth + this.wordSpacing * (wc - 1); - options.wordCount = wc; - options.lineWidth = this.lineWidth; - ({ - y - } = this.document); - this.emit('line', buffer, options, this); - return lc++; - }; - this.emit('sectionStart', options, this); - this.eachWord(text, (word, w, bk, last) => { - if (last == null || last.required) { - this.emit('firstLine', options, this); - this.spaceLeft = this.lineWidth; - } - if (this.canFit(word, w)) { - buffer += word; - textWidth += w; - wc++; - } - if (bk.required || !this.canFit(word, w)) { - // if the user specified a max height and an ellipsis, and is about to pass the - // max height and max columns after the next line, append the ellipsis - const lh = this.document.currentLineHeight(true); - if (this.height != null && this.ellipsis && PDFNumber(this.document.y + lh * 2) > this.maxY && this.column >= this.columns) { - if (this.ellipsis === true) { - this.ellipsis = '…'; - } // map default ellipsis character - buffer = buffer.replace(/\s+$/, ''); - textWidth = this.wordWidth(buffer + this.ellipsis); - - // remove characters from the buffer until the ellipsis fits - // to avoid infinite loop need to stop while-loop if buffer is empty string - while (buffer && textWidth > this.lineWidth) { - buffer = buffer.slice(0, -1).replace(/\s+$/, ''); - textWidth = this.wordWidth(buffer + this.ellipsis); - } - // need to add ellipsis only if there is enough space for it - if (textWidth <= this.lineWidth) { - buffer = buffer + this.ellipsis; - } - textWidth = this.wordWidth(buffer); - } - if (bk.required) { - if (w > this.spaceLeft) { - emitLine(); - buffer = word; - textWidth = w; - wc = 1; - } - this.emit('lastLine', options, this); - } - - // Previous entry is a soft hyphen - add visible hyphen. - if (buffer[buffer.length - 1] == SOFT_HYPHEN) { - buffer = buffer.slice(0, -1) + HYPHEN; - this.spaceLeft -= this.wordWidth(HYPHEN); - } - emitLine(); - - // if we've reached the edge of the page, - // continue on a new page or column - if (PDFNumber(this.document.y + lh) > this.maxY) { - const shouldContinue = this.nextSection(); - - // stop if we reached the maximum height - if (!shouldContinue) { - wc = 0; - buffer = ''; - return false; - } - } - - // reset the space left and buffer - if (bk.required) { - this.spaceLeft = this.lineWidth; - buffer = ''; - textWidth = 0; - return wc = 0; - } else { - // reset the space left and buffer - this.spaceLeft = this.lineWidth - w; - buffer = word; - textWidth = w; - return wc = 1; - } - } else { - return this.spaceLeft -= w; - } - }); - if (wc > 0) { - this.emit('lastLine', options, this); - emitLine(); - } - this.emit('sectionEnd', options, this); - - // if the wrap is set to be continued, save the X position - // to start the first line of the next segment at, and reset - // the y position - if (options.continued === true) { - if (lc > 1) { - this.continuedX = 0; - } - this.continuedX += options.textWidth || 0; - return this.document.y = y; - } else { - return this.document.x = this.startX; - } - } - nextSection(options) { - this.emit('sectionEnd', options, this); - if (++this.column > this.columns) { - // if a max height was specified by the user, we're done. - // otherwise, the default is to make a new page at the bottom. - if (this.height != null) { - return false; - } - this.document.continueOnNewPage(); - this.column = 1; - this.startY = this.document.page.margins.top; - this.maxY = this.document.page.maxY(); - this.document.x = this.startX; - if (this.document._fillColor) { - this.document.fillColor(...this.document._fillColor); - } - this.emit('pageBreak', options, this); - } else { - this.document.x += this.lineWidth + this.columnGap; - this.document.y = this.startY; - this.emit('columnBreak', options, this); - } - this.emit('sectionStart', options, this); - return true; - } -} - -const { - number -} = PDFObject; -var TextMixin = { - initText() { - this._line = this._line.bind(this); - - // Current coordinates - this.x = 0; - this.y = 0; - return this._lineGap = 0; - }, - lineGap(_lineGap) { - this._lineGap = _lineGap; - return this; - }, - moveDown(lines) { - if (lines == null) { - lines = 1; - } - this.y += this.currentLineHeight(true) * lines + this._lineGap; - return this; - }, - moveUp(lines) { - if (lines == null) { - lines = 1; - } - this.y -= this.currentLineHeight(true) * lines + this._lineGap; - return this; - }, - _text(text, x, y, options, lineCallback) { - options = this._initOptions(x, y, options); - - // Convert text to a string - text = text == null ? '' : `${text}`; - - // if the wordSpacing option is specified, remove multiple consecutive spaces - if (options.wordSpacing) { - text = text.replace(/\s{2,}/g, ' '); - } - const addStructure = () => { - if (options.structParent) { - options.structParent.add(this.struct(options.structType || 'P', [this.markStructureContent(options.structType || 'P')])); - } - }; - - // We can save some bytes if there is no rotation - if (options.rotation !== 0) { - this.save(); - this.rotate(-options.rotation, { - origin: [this.x, this.y] - }); - } - - // word wrapping - if (options.width) { - let wrapper = this._wrapper; - if (!wrapper) { - wrapper = new LineWrapper(this, options); - wrapper.on('line', lineCallback); - wrapper.on('firstLine', addStructure); - } - this._wrapper = options.continued ? wrapper : null; - this._textOptions = options.continued ? options : null; - wrapper.wrap(text, options); - - // render paragraphs as single lines - } else { - for (let line of text.split('\n')) { - addStructure(); - lineCallback(line, options); - } - } - - // Cleanup if there was a rotation - if (options.rotation !== 0) this.restore(); - return this; - }, - text(text, x, y, options) { - return this._text(text, x, y, options, this._line); - }, - widthOfString(string, options) { - if (options === void 0) { - options = {}; - } - const horizontalScaling = options.horizontalScaling || 100; - return (this._font.widthOfString(string, this._fontSize, options.features) + (options.characterSpacing || 0) * (string.length - 1)) * horizontalScaling / 100; - }, - /** - * Compute the bounding box of a string - * based on what will actually be rendered by `doc.text()` - * - * @param string - The string - * @param x - X position of text (defaults to this.x) - * @param y - Y position of text (defaults to this.y) - * @param options - Any text options (The same you would apply to `doc.text()`) - * @returns {{x: number, y: number, width: number, height: number}} - */ - boundsOfString(string, x, y, options) {}, - heightOfString(text, options) { - const { - x, - y - } = this; - options = this._initOptions(options); - options.height = Infinity; // don't break pages - - const lineGap = options.lineGap || this._lineGap || 0; - this._text(text, this.x, this.y, options, () => { - return this.y += this.currentLineHeight(true) + lineGap; - }); - const height = this.y - y; - this.x = x; - this.y = y; - return height; - }, - list(list, x, y, options, wrapper) { - options = this._initOptions(x, y, options); - const listType = options.listType || 'bullet'; - const unit = Math.round(this._font.ascender / 1000 * this._fontSize); - const midLine = unit / 2; - const r = options.bulletRadius || unit / 3; - const indent = options.textIndent || (listType === 'bullet' ? r * 5 : unit * 2); - const itemIndent = options.bulletIndent || (listType === 'bullet' ? r * 8 : unit * 2); - let level = 1; - const items = []; - const levels = []; - const numbers = []; - var flatten = function (list) { - let n = 1; - for (let i = 0; i < list.length; i++) { - const item = list[i]; - if (Array.isArray(item)) { - level++; - flatten(item); - level--; - } else { - items.push(item); - levels.push(level); - if (listType !== 'bullet') { - numbers.push(n++); - } - } - } - }; - flatten(list); - const label = function (n) { - switch (listType) { - case 'numbered': - return `${n}.`; - case 'lettered': - var letter = String.fromCharCode((n - 1) % 26 + 65); - var times = Math.floor((n - 1) / 26 + 1); - var text = Array(times + 1).join(letter); - return `${text}.`; - } - }; - const drawListItem = function (listItem, i) { - wrapper = new LineWrapper(this, options); - wrapper.on('line', this._line); - level = 1; - wrapper.once('firstLine', () => { - let item, itemType, labelType, bodyType; - if (options.structParent) { - if (options.structTypes) { - [itemType, labelType, bodyType] = options.structTypes; - } else { - [itemType, labelType, bodyType] = ['LI', 'Lbl', 'LBody']; - } - } - if (itemType) { - item = this.struct(itemType); - options.structParent.add(item); - } else if (options.structParent) { - item = options.structParent; - } - let l; - if ((l = levels[i++]) !== level) { - const diff = itemIndent * (l - level); - this.x += diff; - wrapper.lineWidth -= diff; - level = l; - } - if (item && (labelType || bodyType)) { - item.add(this.struct(labelType || bodyType, [this.markStructureContent(labelType || bodyType)])); - } - switch (listType) { - case 'bullet': - this.circle(this.x - indent + r, this.y + midLine, r); - this.fill(); - break; - case 'numbered': - case 'lettered': - var text = label(numbers[i - 1]); - this._fragment(text, this.x - indent, this.y, options); - break; - } - if (item && labelType && bodyType) { - item.add(this.struct(bodyType, [this.markStructureContent(bodyType)])); - } - if (item && item !== options.structParent) { - item.end(); - } - }); - wrapper.on('sectionStart', () => { - const pos = indent + itemIndent * (level - 1); - this.x += pos; - return wrapper.lineWidth -= pos; - }); - wrapper.on('sectionEnd', () => { - const pos = indent + itemIndent * (level - 1); - this.x -= pos; - return wrapper.lineWidth += pos; - }); - wrapper.wrap(listItem, options); - }; - for (let i = 0; i < items.length; i++) { - drawListItem.call(this, items[i], i); - } - return this; - }, - _initOptions(x, y, options) { - var _options$rotation; - if (x === void 0) { - x = {}; - } - if (options === void 0) { - options = {}; - } - if (typeof x === 'object') { - options = x; - x = null; - } - - // clone options object - const result = Object.assign({}, options); - - // extend options with previous values for continued text - if (this._textOptions) { - for (let key in this._textOptions) { - const val = this._textOptions[key]; - if (key !== 'continued') { - if (result[key] === undefined) { - result[key] = val; - } - } - } - } - - // Update the current position - if (x != null) { - this.x = x; - } - if (y != null) { - this.y = y; - } - - // wrap to margins if no x or y position passed - if (result.lineBreak !== false) { - if (result.width == null) { - result.width = this.page.width - this.x - this.page.margins.right; - } - result.width = Math.max(result.width, 0); - } - if (!result.columns) { - result.columns = 0; - } - if (result.columnGap == null) { - result.columnGap = 18; - } // 1/4 inch - - // Normalize rotation to between 0 - 360 - result.rotation = Number((_options$rotation = options.rotation) !== null && _options$rotation !== void 0 ? _options$rotation : 0) % 360; - if (result.rotation < 0) result.rotation += 360; - return result; - }, - _line(text, options, wrapper) { - if (options === void 0) { - options = {}; - } - this._fragment(text, this.x, this.y, options); - const lineGap = options.lineGap || this._lineGap || 0; - if (!wrapper) { - return this.x += this.widthOfString(text, options); - } else { - return this.y += this.currentLineHeight(true) + lineGap; - } - }, - _fragment(text, x, y, options) { - let dy, encoded, i, positions, textWidth, words; - text = `${text}`.replace(/\n/g, ''); - if (text.length === 0) { - return; - } - - // handle options - const align = options.align || 'left'; - let wordSpacing = options.wordSpacing || 0; - const characterSpacing = options.characterSpacing || 0; - const horizontalScaling = options.horizontalScaling || 100; - - // text alignments - if (options.width) { - switch (align) { - case 'right': - textWidth = this.widthOfString(text.replace(/\s+$/, ''), options); - x += options.lineWidth - textWidth; - break; - case 'center': - x += options.lineWidth / 2 - options.textWidth / 2; - break; - case 'justify': - // calculate the word spacing value - words = text.trim().split(/\s+/); - textWidth = this.widthOfString(text.replace(/\s+/g, ''), options); - var spaceWidth = this.widthOfString(' ') + characterSpacing; - wordSpacing = Math.max(0, (options.lineWidth - textWidth) / Math.max(1, words.length - 1) - spaceWidth); - break; - } - } - - // text baseline alignments based on http://wiki.apache.org/xmlgraphics-fop/LineLayout/AlignmentHandling - if (typeof options.baseline === 'number') { - dy = -options.baseline; - } else { - switch (options.baseline) { - case 'svg-middle': - dy = 0.5 * this._font.xHeight; - break; - case 'middle': - case 'svg-central': - dy = 0.5 * (this._font.descender + this._font.ascender); - break; - case 'bottom': - case 'ideographic': - dy = this._font.descender; - break; - case 'alphabetic': - dy = 0; - break; - case 'mathematical': - dy = 0.5 * this._font.ascender; - break; - case 'hanging': - dy = 0.8 * this._font.ascender; - break; - case 'top': - dy = this._font.ascender; - break; - default: - dy = this._font.ascender; - } - dy = dy / 1000 * this._fontSize; - } - - // calculate the actual rendered width of the string after word and character spacing - const renderedWidth = options.textWidth + wordSpacing * (options.wordCount - 1) + characterSpacing * (text.length - 1); - - // create link annotations if the link option is given - if (options.link != null) { - this.link(x, y, renderedWidth, this.currentLineHeight(), options.link); - } - if (options.goTo != null) { - this.goTo(x, y, renderedWidth, this.currentLineHeight(), options.goTo); - } - if (options.destination != null) { - this.addNamedDestination(options.destination, 'XYZ', x, y, null); - } - - // create underline - if (options.underline) { - this.save(); - if (!options.stroke) { - this.strokeColor(...(this._fillColor || [])); - } - const lineWidth = this._fontSize < 10 ? 0.5 : Math.floor(this._fontSize / 10); - this.lineWidth(lineWidth); - let lineY = y + this.currentLineHeight() - lineWidth; - this.moveTo(x, lineY); - this.lineTo(x + renderedWidth, lineY); - this.stroke(); - this.restore(); - } - - // create strikethrough line - if (options.strike) { - this.save(); - if (!options.stroke) { - this.strokeColor(...(this._fillColor || [])); - } - const lineWidth = this._fontSize < 10 ? 0.5 : Math.floor(this._fontSize / 10); - this.lineWidth(lineWidth); - let lineY = y + this.currentLineHeight() / 2; - this.moveTo(x, lineY); - this.lineTo(x + renderedWidth, lineY); - this.stroke(); - this.restore(); - } - this.save(); - - // oblique (angle in degrees or boolean) - if (options.oblique) { - let skew; - if (typeof options.oblique === 'number') { - skew = -Math.tan(options.oblique * Math.PI / 180); - } else { - skew = -0.25; - } - this.transform(1, 0, 0, 1, x, y); - this.transform(1, 0, skew, 1, -skew * dy, 0); - this.transform(1, 0, 0, 1, -x, -y); - } - - // flip coordinate system - this.transform(1, 0, 0, -1, 0, this.page.height); - y = this.page.height - y - dy; - - // add current font to page if necessary - if (this.page.fonts[this._font.id] == null) { - this.page.fonts[this._font.id] = this._font.ref(); - } - - // begin the text object - this.addContent('BT'); - - // text position - this.addContent(`1 0 0 1 ${number(x)} ${number(y)} Tm`); - - // font and font size - this.addContent(`/${this._font.id} ${number(this._fontSize)} Tf`); - - // rendering mode - const mode = options.fill && options.stroke ? 2 : options.stroke ? 1 : 0; - if (mode) { - this.addContent(`${mode} Tr`); - } - - // Character spacing - if (characterSpacing) { - this.addContent(`${number(characterSpacing)} Tc`); - } - - // Horizontal scaling - if (horizontalScaling !== 100) { - this.addContent(`${horizontalScaling} Tz`); - } - - // Add the actual text - // If we have a word spacing value, we need to encode each word separately - // since the normal Tw operator only works on character code 32, which isn't - // used for embedded fonts. - if (wordSpacing) { - words = text.trim().split(/\s+/); - wordSpacing += this.widthOfString(' ') + characterSpacing; - wordSpacing *= 1000 / this._fontSize; - encoded = []; - positions = []; - for (let word of words) { - const [encodedWord, positionsWord] = this._font.encode(word, options.features); - encoded = encoded.concat(encodedWord); - positions = positions.concat(positionsWord); - - // add the word spacing to the end of the word - // clone object because of cache - const space = {}; - const object = positions[positions.length - 1]; - for (let key in object) { - const val = object[key]; - space[key] = val; - } - space.xAdvance += wordSpacing; - positions[positions.length - 1] = space; - } - } else { - [encoded, positions] = this._font.encode(text, options.features); - } - const scale = this._fontSize / 1000; - const commands = []; - let last = 0; - let hadOffset = false; - - // Adds a segment of text to the TJ command buffer - const addSegment = cur => { - if (last < cur) { - const hex = encoded.slice(last, cur).join(''); - const advance = positions[cur - 1].xAdvance - positions[cur - 1].advanceWidth; - commands.push(`<${hex}> ${number(-advance)}`); - } - return last = cur; - }; - - // Flushes the current TJ commands to the output stream - const flush = i => { - addSegment(i); - if (commands.length > 0) { - this.addContent(`[${commands.join(' ')}] TJ`); - return commands.length = 0; - } - }; - for (i = 0; i < positions.length; i++) { - // If we have an x or y offset, we have to break out of the current TJ command - // so we can move the text position. - const pos = positions[i]; - if (pos.xOffset || pos.yOffset) { - // Flush the current buffer - flush(i); - - // Move the text position and flush just the current character - this.addContent(`1 0 0 1 ${number(x + pos.xOffset * scale)} ${number(y + pos.yOffset * scale)} Tm`); - flush(i + 1); - hadOffset = true; - } else { - // If the last character had an offset, reset the text position - if (hadOffset) { - this.addContent(`1 0 0 1 ${number(x)} ${number(y)} Tm`); - hadOffset = false; - } - - // Group segments that don't have any advance adjustments - if (pos.xAdvance - pos.advanceWidth !== 0) { - addSegment(i + 1); - } - } - x += pos.xAdvance * scale; - } - - // Flush any remaining commands - flush(i); - - // end the text object - this.addContent('ET'); - - // restore flipped coordinate system - return this.restore(); - } -}; - -const COLOR_SPACE_MAP = { - 1: 'DeviceGray', - 3: 'DeviceRGB', - 4: 'DeviceCMYK' -}; -class JPEG { - constructor(data, label) { - this.data = data; - this.label = label; - this.orientation = 1; - if (this.data.readUInt16BE(0) !== 0xffd8) { - throw 'SOI not found in JPEG'; - } - const markers = _JPEG.decode(this.data); - for (let i = 0; i < markers.length; i += 1) { - const marker = markers[i]; - if (marker.name === 'EXIF' && marker.entries.orientation) { - this.orientation = marker.entries.orientation; - } - if (marker.name === 'SOF') { - this.bits ||= marker.precision; - this.width ||= marker.width; - this.height ||= marker.height; - this.colorSpace ||= COLOR_SPACE_MAP[marker.numberOfComponents]; - } - } - this.obj = null; - } - embed(document) { - if (this.obj) { - return; - } - this.obj = document.ref({ - Type: 'XObject', - Subtype: 'Image', - BitsPerComponent: this.bits, - Width: this.width, - Height: this.height, - ColorSpace: this.colorSpace, - Filter: 'DCTDecode' - }); - - // add extra decode params for CMYK images. By swapping the - // min and max values from the default, we invert the colors. See - // section 4.8.4 of the spec. - if (this.colorSpace === 'DeviceCMYK') { - this.obj.data['Decode'] = [1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0]; - } - this.obj.end(this.data); - - // free memory - return this.data = null; - } -} - -class PNGImage { - constructor(data, label) { - this.label = label; - this.image = new PNG(data); - this.width = this.image.width; - this.height = this.image.height; - this.imgData = this.image.imgData; - this.obj = null; - } - embed(document) { - let dataDecoded = false; - this.document = document; - if (this.obj) { - return; - } - const hasAlphaChannel = this.image.hasAlphaChannel; - const isInterlaced = this.image.interlaceMethod === 1; - this.obj = this.document.ref({ - Type: 'XObject', - Subtype: 'Image', - BitsPerComponent: hasAlphaChannel ? 8 : this.image.bits, - Width: this.width, - Height: this.height, - Filter: 'FlateDecode' - }); - if (!hasAlphaChannel) { - const params = this.document.ref({ - Predictor: isInterlaced ? 1 : 15, - Colors: this.image.colors, - BitsPerComponent: this.image.bits, - Columns: this.width - }); - this.obj.data.DecodeParms = params; - params.end(); - } - if (this.image.palette.length === 0) { - this.obj.data.ColorSpace = this.image.colorSpace; - } else { - // embed the color palette in the PDF as an object stream - const palette = this.document.ref(); - palette.end(Buffer$2.from(this.image.palette)); - - // build the color space array for the image - this.obj.data.ColorSpace = ['Indexed', 'DeviceRGB', this.image.palette.length / 3 - 1, palette]; - } - - // For PNG color types 0, 2 and 3, the transparency data is stored in - // a dedicated PNG chunk. - if (this.image.transparency.grayscale != null) { - // Use Color Key Masking (spec section 4.8.5) - // An array with N elements, where N is two times the number of color components. - const val = this.image.transparency.grayscale; - this.obj.data.Mask = [val, val]; - } else if (this.image.transparency.rgb) { - // Use Color Key Masking (spec section 4.8.5) - // An array with N elements, where N is two times the number of color components. - const { - rgb - } = this.image.transparency; - const mask = []; - for (let x of rgb) { - mask.push(x, x); - } - this.obj.data.Mask = mask; - } else if (this.image.transparency.indexed) { - // Create a transparency SMask for the image based on the data - // in the PLTE and tRNS sections. See below for details on SMasks. - dataDecoded = true; - return this.loadIndexedAlphaChannel(); - } else if (hasAlphaChannel) { - // For PNG color types 4 and 6, the transparency data is stored as a alpha - // channel mixed in with the main image data. Separate this data out into an - // SMask object and store it separately in the PDF. - dataDecoded = true; - return this.splitAlphaChannel(); - } - if (isInterlaced && !dataDecoded) { - return this.decodeData(); - } - this.finalize(); - } - finalize() { - if (this.alphaChannel) { - const sMask = this.document.ref({ - Type: 'XObject', - Subtype: 'Image', - Height: this.height, - Width: this.width, - BitsPerComponent: 8, - Filter: 'FlateDecode', - ColorSpace: 'DeviceGray', - Decode: [0, 1] - }); - sMask.end(this.alphaChannel); - this.obj.data.SMask = sMask; - } - - // add the actual image data - this.obj.end(this.imgData); - - // free memory - this.image = null; - return this.imgData = null; - } - splitAlphaChannel() { - return this.image.decodePixels(pixels => { - let a; - let p; - const colorCount = this.image.colors; - const pixelCount = this.width * this.height; - const imgData = Buffer$2.alloc(pixelCount * colorCount); - const alphaChannel = Buffer$2.alloc(pixelCount); - let i = p = a = 0; - const len = pixels.length; - // For 16bit images copy only most significant byte (MSB) - PNG data is always stored in network byte order (MSB first) - const skipByteCount = this.image.bits === 16 ? 1 : 0; - while (i < len) { - for (let colorIndex = 0; colorIndex < colorCount; colorIndex++) { - imgData[p++] = pixels[i++]; - i += skipByteCount; - } - alphaChannel[a++] = pixels[i++]; - i += skipByteCount; - } - this.imgData = zlib.deflateSync(imgData); - this.alphaChannel = zlib.deflateSync(alphaChannel); - return this.finalize(); - }); - } - loadIndexedAlphaChannel() { - const transparency = this.image.transparency.indexed; - return this.image.decodePixels(pixels => { - const alphaChannel = Buffer$2.alloc(this.width * this.height); - let i = 0; - for (let j = 0, end = pixels.length; j < end; j++) { - alphaChannel[i++] = transparency[pixels[j]]; - } - this.alphaChannel = zlib.deflateSync(alphaChannel); - return this.finalize(); - }); - } - decodeData() { - this.image.decodePixels(pixels => { - this.imgData = zlib.deflateSync(pixels); - this.finalize(); - }); - } -} - -class PDFImage { - static open(src, label) { - let data; - if (Buffer$2.isBuffer(src)) { - data = src; - } else if (src instanceof ArrayBuffer) { - data = Buffer$2.from(new Uint8Array(src)); - } else { - let match; - if (match = /^data:.+?;base64,(.*)$/.exec(src)) { - data = Buffer$2.from(match[1], 'base64'); - } else { - data = fs.readFileSync(src); - if (!data) { - return; - } - } - } - if (data[0] === 0xff && data[1] === 0xd8) { - return new JPEG(data, label); - } else if (data[0] === 0x89 && data.toString('ascii', 1, 4) === 'PNG') { - return new PNGImage(data, label); - } else { - throw new Error('Unknown image format.'); - } - } -} - -var ImagesMixin = { - initImages() { - this._imageRegistry = {}; - return this._imageCount = 0; - }, - image(src, x, y, options) { - if (options === void 0) { - options = {}; - } - let bh, bp, bw, image, ip, left, left1, rotateAngle, originX, originY; - if (typeof x === 'object') { - options = x; - x = null; - } - - // Ignore orientation based on document options or image options - const ignoreOrientation = options.ignoreOrientation || options.ignoreOrientation !== false && this.options.ignoreOrientation; - x = (left = x != null ? x : options.x) != null ? left : this.x; - y = (left1 = y != null ? y : options.y) != null ? left1 : this.y; - if (typeof src === 'string') { - image = this._imageRegistry[src]; - } - if (!image) { - if (src.width && src.height) { - image = src; - } else { - image = this.openImage(src); - } - } - if (!image.obj) { - image.embed(this); - } - if (this.page.xobjects[image.label] == null) { - this.page.xobjects[image.label] = image.obj; - } - let { - width, - height - } = image; - - // If EXIF orientation calls for it, swap width and height - if (!ignoreOrientation && image.orientation > 4) { - [width, height] = [height, width]; - } - let w = options.width || width; - let h = options.height || height; - if (options.width && !options.height) { - const wp = w / width; - w = width * wp; - h = height * wp; - } else if (options.height && !options.width) { - const hp = h / height; - w = width * hp; - h = height * hp; - } else if (options.scale) { - w = width * options.scale; - h = height * options.scale; - } else if (options.fit) { - [bw, bh] = options.fit; - bp = bw / bh; - ip = width / height; - if (ip > bp) { - w = bw; - h = bw / ip; - } else { - h = bh; - w = bh * ip; - } - } else if (options.cover) { - [bw, bh] = options.cover; - bp = bw / bh; - ip = width / height; - if (ip > bp) { - h = bh; - w = bh * ip; - } else { - w = bw; - h = bw / ip; - } - } - if (options.fit || options.cover) { - if (options.align === 'center') { - x = x + bw / 2 - w / 2; - } else if (options.align === 'right') { - x = x + bw - w; - } - if (options.valign === 'center') { - y = y + bh / 2 - h / 2; - } else if (options.valign === 'bottom') { - y = y + bh - h; - } - } - if (!ignoreOrientation) { - switch (image.orientation) { - // No orientation (need to flip image, though, because of the default transform matrix on the document) - default: - case 1: - h = -h; - y -= h; - rotateAngle = 0; - break; - // Flip Horizontal - case 2: - w = -w; - h = -h; - x -= w; - y -= h; - rotateAngle = 0; - break; - // Rotate 180 degrees - case 3: - originX = x; - originY = y; - h = -h; - x -= w; - rotateAngle = 180; - break; - // Flip vertical - case 4: - // Do nothing, image will be flipped - - break; - // Flip horizontally and rotate 270 degrees CW - case 5: - originX = x; - originY = y; - [w, h] = [h, w]; - y -= h; - rotateAngle = 90; - break; - // Rotate 90 degrees CW - case 6: - originX = x; - originY = y; - [w, h] = [h, w]; - h = -h; - rotateAngle = 90; - break; - // Flip horizontally and rotate 90 degrees CW - case 7: - originX = x; - originY = y; - [w, h] = [h, w]; - h = -h; - w = -w; - x -= w; - rotateAngle = 90; - break; - // Rotate 270 degrees CW - case 8: - originX = x; - originY = y; - [w, h] = [h, w]; - h = -h; - x -= w; - y -= h; - rotateAngle = -90; - break; - } - } else { - h = -h; - y -= h; - rotateAngle = 0; - } - - // create link annotations if the link option is given - if (options.link != null) { - this.link(x, y, w, h, options.link); - } - if (options.goTo != null) { - this.goTo(x, y, w, h, options.goTo); - } - if (options.destination != null) { - this.addNamedDestination(options.destination, 'XYZ', x, y, null); - } - - // Set the current y position to below the image if it is in the document flow - if (this.y === y) { - this.y += h; - } - this.save(); - if (rotateAngle) { - this.rotate(rotateAngle, { - origin: [originX, originY] - }); - } - this.transform(w, 0, 0, h, x, y); - this.addContent(`/${image.label} Do`); - this.restore(); - return this; - }, - openImage(src) { - let image; - if (typeof src === 'string') { - image = this._imageRegistry[src]; - } - if (!image) { - image = PDFImage.open(src, `I${++this._imageCount}`); - if (typeof src === 'string') { - this._imageRegistry[src] = image; - } - } - return image; - } -}; - -var AnnotationsMixin = { - annotate(x, y, w, h, options) { - options.Type = 'Annot'; - options.Rect = this._convertRect(x, y, w, h); - options.Border = [0, 0, 0]; - if (options.Subtype === 'Link' && typeof options.F === 'undefined') { - options.F = 1 << 2; // Print Annotation Flag - } - if (options.Subtype !== 'Link') { - if (options.C == null) { - options.C = this._normalizeColor(options.color || [0, 0, 0]); - } - } // convert colors - delete options.color; - if (typeof options.Dest === 'string') { - options.Dest = new String(options.Dest); - } - - // Capitalize keys - for (let key in options) { - const val = options[key]; - options[key[0].toUpperCase() + key.slice(1)] = val; - } - const ref = this.ref(options); - this.page.annotations.push(ref); - ref.end(); - return this; - }, - note(x, y, w, h, contents, options) { - if (options === void 0) { - options = {}; - } - options.Subtype = 'Text'; - options.Contents = new String(contents); - if (options.Name == null) { - options.Name = 'Comment'; - } - if (options.color == null) { - options.color = [243, 223, 92]; - } - return this.annotate(x, y, w, h, options); - }, - goTo(x, y, w, h, name, options) { - if (options === void 0) { - options = {}; - } - options.Subtype = 'Link'; - options.A = this.ref({ - S: 'GoTo', - D: new String(name) - }); - options.A.end(); - return this.annotate(x, y, w, h, options); - }, - link(x, y, w, h, url, options) { - if (options === void 0) { - options = {}; - } - options.Subtype = 'Link'; - if (typeof url === 'number') { - // Link to a page in the document (the page must already exist) - const pages = this._root.data.Pages.data; - if (url >= 0 && url < pages.Kids.length) { - options.A = this.ref({ - S: 'GoTo', - D: [pages.Kids[url], 'XYZ', null, null, null] - }); - options.A.end(); - } else { - throw new Error(`The document has no page ${url}`); - } - } else { - // Link to an external url - options.A = this.ref({ - S: 'URI', - URI: new String(url) - }); - options.A.end(); - } - return this.annotate(x, y, w, h, options); - }, - _markup(x, y, w, h, options) { - if (options === void 0) { - options = {}; - } - const [x1, y1, x2, y2] = this._convertRect(x, y, w, h); - options.QuadPoints = [x1, y2, x2, y2, x1, y1, x2, y1]; - options.Contents = new String(); - return this.annotate(x, y, w, h, options); - }, - highlight(x, y, w, h, options) { - if (options === void 0) { - options = {}; - } - options.Subtype = 'Highlight'; - if (options.color == null) { - options.color = [241, 238, 148]; - } - return this._markup(x, y, w, h, options); - }, - underline(x, y, w, h, options) { - if (options === void 0) { - options = {}; - } - options.Subtype = 'Underline'; - return this._markup(x, y, w, h, options); - }, - strike(x, y, w, h, options) { - if (options === void 0) { - options = {}; - } - options.Subtype = 'StrikeOut'; - return this._markup(x, y, w, h, options); - }, - lineAnnotation(x1, y1, x2, y2, options) { - if (options === void 0) { - options = {}; - } - options.Subtype = 'Line'; - options.Contents = new String(); - options.L = [x1, this.page.height - y1, x2, this.page.height - y2]; - return this.annotate(x1, y1, x2, y2, options); - }, - rectAnnotation(x, y, w, h, options) { - if (options === void 0) { - options = {}; - } - options.Subtype = 'Square'; - options.Contents = new String(); - return this.annotate(x, y, w, h, options); - }, - ellipseAnnotation(x, y, w, h, options) { - if (options === void 0) { - options = {}; - } - options.Subtype = 'Circle'; - options.Contents = new String(); - return this.annotate(x, y, w, h, options); - }, - textAnnotation(x, y, w, h, text, options) { - if (options === void 0) { - options = {}; - } - options.Subtype = 'FreeText'; - options.Contents = new String(text); - options.DA = new String(); - return this.annotate(x, y, w, h, options); - }, - fileAnnotation(x, y, w, h, file, options) { - if (file === void 0) { - file = {}; - } - if (options === void 0) { - options = {}; - } - // create hidden file - const filespec = this.file(file.src, Object.assign({ - hidden: true - }, file)); - options.Subtype = 'FileAttachment'; - options.FS = filespec; - - // add description from filespec unless description (Contents) has already been set - if (options.Contents) { - options.Contents = new String(options.Contents); - } else if (filespec.data.Desc) { - options.Contents = filespec.data.Desc; - } - return this.annotate(x, y, w, h, options); - }, - _convertRect(x1, y1, w, h) { - // flip y1 and y2 - let y2 = y1; - y1 += h; - - // make x2 - let x2 = x1 + w; - - // apply current transformation matrix to points - const [m0, m1, m2, m3, m4, m5] = this._ctm; - x1 = m0 * x1 + m2 * y1 + m4; - y1 = m1 * x1 + m3 * y1 + m5; - x2 = m0 * x2 + m2 * y2 + m4; - y2 = m1 * x2 + m3 * y2 + m5; - return [x1, y1, x2, y2]; - } -}; - -/* Custom fork start */ -const DEFAULT_OPTIONS = { - top: 0, - left: 0, - zoom: 0, - fit: false, - pageNumber: null, - expanded: false -}; -/* Custom fork end */ - -class PDFOutline { - constructor(document, parent, title, dest, options) { - if (options === void 0) { - options = DEFAULT_OPTIONS; - } - this.document = document; - this.options = options; - this.outlineData = {}; - if (dest !== null) { - /* Custom fork start */ - const destWidth = dest.data.MediaBox[2]; - const destHeight = dest.data.MediaBox[3]; - const top = destHeight - (options.top || 0); - const left = destWidth - (options.left || 0); - const zoom = options.zoom || 0; - this.outlineData['Dest'] = options.fit ? [dest, 'Fit'] : [dest, 'XYZ', left, top, zoom]; - /* Custom fork end */ - } - if (parent !== null) { - this.outlineData['Parent'] = parent; - } - if (title !== null) { - this.outlineData['Title'] = new String(title); - } - this.dictionary = this.document.ref(this.outlineData); - this.children = []; - } - addItem(title, options) { - if (options === void 0) { - options = DEFAULT_OPTIONS; - } - /* Custom fork start */ - const pages = this.document._root.data.Pages.data.Kids; - const dest = options.pageNumber !== null ? pages[options.pageNumber] : this.document.page.dictionary; - /* Custom fork end */ - - const result = new PDFOutline(this.document, this.dictionary, title, dest, options); - this.children.push(result); - return result; - } - endOutline() { - if (this.children.length > 0) { - if (this.options.expanded) { - this.outlineData.Count = this.children.length; - } - const first = this.children[0], - last = this.children[this.children.length - 1]; - this.outlineData.First = first.dictionary; - this.outlineData.Last = last.dictionary; - for (let i = 0, len = this.children.length; i < len; i++) { - const child = this.children[i]; - if (i > 0) { - child.outlineData.Prev = this.children[i - 1].dictionary; - } - if (i < this.children.length - 1) { - child.outlineData.Next = this.children[i + 1].dictionary; - } - child.endOutline(); - } - } - return this.dictionary.end(); - } -} - -var OutlineMixin = { - initOutline() { - return this.outline = new PDFOutline(this, null, null, null); - }, - endOutline() { - this.outline.endOutline(); - if (this.outline.children.length > 0) { - this._root.data.Outlines = this.outline.dictionary; - /* Custom fork start */ - return this._root.data.PageMode = this._root.data.PageMode || 'UseOutlines'; - /* Custom fork end */ - } - } -}; - -/* -PDFStructureContent - a reference to a marked structure content -By Ben Schmidt -*/ - -class PDFStructureContent { - constructor(pageRef, mcid) { - this.refs = [{ - pageRef, - mcid - }]; - } - push(structContent) { - structContent.refs.forEach(ref => this.refs.push(ref)); - } -} - -/* -PDFStructureElement - represents an element in the PDF logical structure tree -By Ben Schmidt -*/ - -class PDFStructureElement { - constructor(document, type, options, children) { - if (options === void 0) { - options = {}; - } - if (children === void 0) { - children = null; - } - this.document = document; - this._attached = false; - this._ended = false; - this._flushed = false; - this.dictionary = document.ref({ - // Type: "StructElem", - S: type - }); - const data = this.dictionary.data; - if (Array.isArray(options) || this._isValidChild(options)) { - children = options; - options = {}; - } - if (typeof options.title !== 'undefined') { - data.T = new String(options.title); - } - if (typeof options.lang !== 'undefined') { - data.Lang = new String(options.lang); - } - if (typeof options.alt !== 'undefined') { - data.Alt = new String(options.alt); - } - if (typeof options.expanded !== 'undefined') { - data.E = new String(options.expanded); - } - if (typeof options.actual !== 'undefined') { - data.ActualText = new String(options.actual); - } - this._children = []; - if (children) { - if (!Array.isArray(children)) { - children = [children]; - } - children.forEach(child => this.add(child)); - this.end(); - } - } - add(child) { - if (this._ended) { - throw new Error(`Cannot add child to already-ended structure element`); - } - if (!this._isValidChild(child)) { - throw new Error(`Invalid structure element child`); - } - if (child instanceof PDFStructureElement) { - child.setParent(this.dictionary); - if (this._attached) { - child.setAttached(); - } - } - if (child instanceof PDFStructureContent) { - this._addContentToParentTree(child); - } - if (typeof child === 'function' && this._attached) { - // _contentForClosure() adds the content to the parent tree - child = this._contentForClosure(child); - } - this._children.push(child); - return this; - } - _addContentToParentTree(content) { - content.refs.forEach(_ref => { - let { - pageRef, - mcid - } = _ref; - const pageStructParents = this.document.getStructParentTree().get(pageRef.data.StructParents); - pageStructParents[mcid] = this.dictionary; - }); - } - setParent(parentRef) { - if (this.dictionary.data.P) { - throw new Error(`Structure element added to more than one parent`); - } - this.dictionary.data.P = parentRef; - this._flush(); - } - setAttached() { - if (this._attached) { - return; - } - this._children.forEach((child, index) => { - if (child instanceof PDFStructureElement) { - child.setAttached(); - } - if (typeof child === 'function') { - this._children[index] = this._contentForClosure(child); - } - }); - this._attached = true; - this._flush(); - } - end() { - if (this._ended) { - return; - } - this._children.filter(child => child instanceof PDFStructureElement).forEach(child => child.end()); - this._ended = true; - this._flush(); - } - _isValidChild(child) { - return child instanceof PDFStructureElement || child instanceof PDFStructureContent || typeof child === 'function'; - } - _contentForClosure(closure) { - const content = this.document.markStructureContent(this.dictionary.data.S); - closure(); - this.document.endMarkedContent(); - this._addContentToParentTree(content); - return content; - } - _isFlushable() { - if (!this.dictionary.data.P || !this._ended) { - return false; - } - return this._children.every(child => { - if (typeof child === 'function') { - return false; - } - if (child instanceof PDFStructureElement) { - return child._isFlushable(); - } - return true; - }); - } - _flush() { - if (this._flushed || !this._isFlushable()) { - return; - } - this.dictionary.data.K = []; - this._children.forEach(child => this._flushChild(child)); - this.dictionary.end(); - - // free memory used by children; the dictionary itself may still be - // referenced by a parent structure element or root, but we can - // at least trim the tree here - this._children = []; - this.dictionary.data.K = null; - this._flushed = true; - } - _flushChild(child) { - if (child instanceof PDFStructureElement) { - this.dictionary.data.K.push(child.dictionary); - } - if (child instanceof PDFStructureContent) { - child.refs.forEach(_ref2 => { - let { - pageRef, - mcid - } = _ref2; - if (!this.dictionary.data.Pg) { - this.dictionary.data.Pg = pageRef; - } - if (this.dictionary.data.Pg === pageRef) { - this.dictionary.data.K.push(mcid); - } else { - this.dictionary.data.K.push({ - Type: 'MCR', - Pg: pageRef, - MCID: mcid - }); - } - }); - } - } -} - -/* -PDFNumberTree - represents a number tree object -*/ - -class PDFNumberTree extends PDFTree { - _compareKeys(a, b) { - return parseInt(a) - parseInt(b); - } - _keysName() { - return 'Nums'; - } - _dataForKey(k) { - return parseInt(k); - } -} - -/* -Markings mixin - support marked content sequences in content streams -By Ben Schmidt -*/ - -var MarkingsMixin = { - initMarkings(options) { - this.structChildren = []; - if (options.tagged) { - this.getMarkInfoDictionary().data.Marked = true; - this.getStructTreeRoot(); - } - }, - markContent(tag, options) { - if (options === void 0) { - options = null; - } - if (tag === 'Artifact' || options && options.mcid) { - let toClose = 0; - this.page.markings.forEach(marking => { - if (toClose || marking.structContent || marking.tag === 'Artifact') { - toClose++; - } - }); - while (toClose--) { - this.endMarkedContent(); - } - } - if (!options) { - this.page.markings.push({ - tag - }); - this.addContent(`/${tag} BMC`); - return this; - } - this.page.markings.push({ - tag, - options - }); - const dictionary = {}; - if (typeof options.mcid !== 'undefined') { - dictionary.MCID = options.mcid; - } - if (tag === 'Artifact') { - if (typeof options.type === 'string') { - dictionary.Type = options.type; - } - if (Array.isArray(options.bbox)) { - dictionary.BBox = [options.bbox[0], this.page.height - options.bbox[3], options.bbox[2], this.page.height - options.bbox[1]]; - } - if (Array.isArray(options.attached) && options.attached.every(val => typeof val === 'string')) { - dictionary.Attached = options.attached; - } - } - if (tag === 'Span') { - if (options.lang) { - dictionary.Lang = new String(options.lang); - } - if (options.alt) { - dictionary.Alt = new String(options.alt); - } - if (options.expanded) { - dictionary.E = new String(options.expanded); - } - if (options.actual) { - dictionary.ActualText = new String(options.actual); - } - } - this.addContent(`/${tag} ${PDFObject.convert(dictionary)} BDC`); - return this; - }, - markStructureContent(tag, options) { - if (options === void 0) { - options = {}; - } - const pageStructParents = this.getStructParentTree().get(this.page.structParentTreeKey); - const mcid = pageStructParents.length; - pageStructParents.push(null); - this.markContent(tag, { - ...options, - mcid - }); - const structContent = new PDFStructureContent(this.page.dictionary, mcid); - this.page.markings.slice(-1)[0].structContent = structContent; - return structContent; - }, - endMarkedContent() { - this.page.markings.pop(); - this.addContent('EMC'); - return this; - }, - struct(type, options, children) { - if (options === void 0) { - options = {}; - } - if (children === void 0) { - children = null; - } - return new PDFStructureElement(this, type, options, children); - }, - addStructure(structElem) { - const structTreeRoot = this.getStructTreeRoot(); - structElem.setParent(structTreeRoot); - structElem.setAttached(); - this.structChildren.push(structElem); - if (!structTreeRoot.data.K) { - structTreeRoot.data.K = []; - } - structTreeRoot.data.K.push(structElem.dictionary); - return this; - }, - initPageMarkings(pageMarkings) { - pageMarkings.forEach(marking => { - if (marking.structContent) { - const structContent = marking.structContent; - const newStructContent = this.markStructureContent(marking.tag, marking.options); - structContent.push(newStructContent); - this.page.markings.slice(-1)[0].structContent = structContent; - } else { - this.markContent(marking.tag, marking.options); - } - }); - }, - endPageMarkings(page) { - const pageMarkings = page.markings; - pageMarkings.forEach(() => page.write('EMC')); - page.markings = []; - return pageMarkings; - }, - getMarkInfoDictionary() { - if (!this._root.data.MarkInfo) { - this._root.data.MarkInfo = this.ref({}); - } - return this._root.data.MarkInfo; - }, - hasMarkInfoDictionary() { - return !!this._root.data.MarkInfo; - }, - getStructTreeRoot() { - if (!this._root.data.StructTreeRoot) { - this._root.data.StructTreeRoot = this.ref({ - Type: 'StructTreeRoot', - ParentTree: new PDFNumberTree(), - ParentTreeNextKey: 0 - }); - } - return this._root.data.StructTreeRoot; - }, - getStructParentTree() { - return this.getStructTreeRoot().data.ParentTree; - }, - createStructParentTreeNextKey() { - // initialise the MarkInfo dictionary - this.getMarkInfoDictionary(); - const structTreeRoot = this.getStructTreeRoot(); - const key = structTreeRoot.data.ParentTreeNextKey++; - structTreeRoot.data.ParentTree.add(key, []); - return key; - }, - endMarkings() { - const structTreeRoot = this._root.data.StructTreeRoot; - if (structTreeRoot) { - structTreeRoot.end(); - this.structChildren.forEach(structElem => structElem.end()); - } - if (this._root.data.MarkInfo) { - this._root.data.MarkInfo.end(); - } - } -}; - -const FIELD_FLAGS = { - readOnly: 1, - required: 2, - noExport: 4, - multiline: 0x1000, - password: 0x2000, - toggleToOffButton: 0x4000, - radioButton: 0x8000, - pushButton: 0x10000, - combo: 0x20000, - edit: 0x40000, - sort: 0x80000, - multiSelect: 0x200000, - noSpell: 0x400000 -}; -const FIELD_JUSTIFY = { - left: 0, - center: 1, - right: 2 -}; -const VALUE_MAP = { - value: 'V', - defaultValue: 'DV' -}; -const FORMAT_SPECIAL = { - zip: '0', - zipPlus4: '1', - zip4: '1', - phone: '2', - ssn: '3' -}; -const FORMAT_DEFAULT = { - number: { - nDec: 0, - sepComma: false, - negStyle: 'MinusBlack', - currency: '', - currencyPrepend: true - }, - percent: { - nDec: 0, - sepComma: false - } -}; -var AcroFormMixin = { - /** - * Must call if adding AcroForms to a document. Must also call font() before - * this method to set the default font. - */ - initForm() { - if (!this._font) { - throw new Error('Must set a font before calling initForm method'); - } - this._acroform = { - fonts: {}, - defaultFont: this._font.name - }; - this._acroform.fonts[this._font.id] = this._font.ref(); - let data = { - Fields: [], - NeedAppearances: true, - DA: new String(`/${this._font.id} 0 Tf 0 g`), - DR: { - Font: {} - } - }; - data.DR.Font[this._font.id] = this._font.ref(); - const AcroForm = this.ref(data); - this._root.data.AcroForm = AcroForm; - return this; - }, - /** - * Called automatically by document.js - */ - endAcroForm() { - if (this._root.data.AcroForm) { - if (!Object.keys(this._acroform.fonts).length && !this._acroform.defaultFont) { - throw new Error('No fonts specified for PDF form'); - } - let fontDict = this._root.data.AcroForm.data.DR.Font; - Object.keys(this._acroform.fonts).forEach(name => { - fontDict[name] = this._acroform.fonts[name]; - }); - this._root.data.AcroForm.data.Fields.forEach(fieldRef => { - this._endChild(fieldRef); - }); - this._root.data.AcroForm.end(); - } - return this; - }, - _endChild(ref) { - if (Array.isArray(ref.data.Kids)) { - ref.data.Kids.forEach(childRef => { - this._endChild(childRef); - }); - ref.end(); - } - return this; - }, - /** - * Creates and adds a form field to the document. Form fields are intermediate - * nodes in a PDF form that are used to specify form name heirarchy and form - * value defaults. - * @param {string} name - field name (T attribute in field dictionary) - * @param {object} options - other attributes to include in field dictionary - */ - formField(name, options) { - if (options === void 0) { - options = {}; - } - let fieldDict = this._fieldDict(name, null, options); - let fieldRef = this.ref(fieldDict); - this._addToParent(fieldRef); - return fieldRef; - }, - /** - * Creates and adds a Form Annotation to the document. Form annotations are - * called Widget annotations internally within a PDF file. - * @param {string} name - form field name (T attribute of widget annotation - * dictionary) - * @param {number} x - * @param {number} y - * @param {number} w - * @param {number} h - * @param {object} options - */ - formAnnotation(name, type, x, y, w, h, options) { - if (options === void 0) { - options = {}; - } - let fieldDict = this._fieldDict(name, type, options); - fieldDict.Subtype = 'Widget'; - if (fieldDict.F === undefined) { - fieldDict.F = 4; // print the annotation - } - - // Add Field annot to page, and get it's ref - this.annotate(x, y, w, h, fieldDict); - let annotRef = this.page.annotations[this.page.annotations.length - 1]; - return this._addToParent(annotRef); - }, - formText(name, x, y, w, h, options) { - if (options === void 0) { - options = {}; - } - return this.formAnnotation(name, 'text', x, y, w, h, options); - }, - formPushButton(name, x, y, w, h, options) { - if (options === void 0) { - options = {}; - } - return this.formAnnotation(name, 'pushButton', x, y, w, h, options); - }, - formCombo(name, x, y, w, h, options) { - if (options === void 0) { - options = {}; - } - return this.formAnnotation(name, 'combo', x, y, w, h, options); - }, - formList(name, x, y, w, h, options) { - if (options === void 0) { - options = {}; - } - return this.formAnnotation(name, 'list', x, y, w, h, options); - }, - formRadioButton(name, x, y, w, h, options) { - if (options === void 0) { - options = {}; - } - return this.formAnnotation(name, 'radioButton', x, y, w, h, options); - }, - formCheckbox(name, x, y, w, h, options) { - if (options === void 0) { - options = {}; - } - return this.formAnnotation(name, 'checkbox', x, y, w, h, options); - }, - _addToParent(fieldRef) { - let parent = fieldRef.data.Parent; - if (parent) { - if (!parent.data.Kids) { - parent.data.Kids = []; - } - parent.data.Kids.push(fieldRef); - } else { - this._root.data.AcroForm.data.Fields.push(fieldRef); - } - return this; - }, - _fieldDict(name, type, options) { - if (options === void 0) { - options = {}; - } - if (!this._acroform) { - throw new Error('Call document.initForm() method before adding form elements to document'); - } - let opts = Object.assign({}, options); - if (type !== null) { - opts = this._resolveType(type, options); - } - opts = this._resolveFlags(opts); - opts = this._resolveJustify(opts); - opts = this._resolveFont(opts); - opts = this._resolveStrings(opts); - opts = this._resolveColors(opts); - opts = this._resolveFormat(opts); - opts.T = new String(name); - if (opts.parent) { - opts.Parent = opts.parent; - delete opts.parent; - } - return opts; - }, - _resolveType(type, opts) { - if (type === 'text') { - opts.FT = 'Tx'; - } else if (type === 'pushButton') { - opts.FT = 'Btn'; - opts.pushButton = true; - } else if (type === 'radioButton') { - opts.FT = 'Btn'; - opts.radioButton = true; - } else if (type === 'checkbox') { - opts.FT = 'Btn'; - } else if (type === 'combo') { - opts.FT = 'Ch'; - opts.combo = true; - } else if (type === 'list') { - opts.FT = 'Ch'; - } else { - throw new Error(`Invalid form annotation type '${type}'`); - } - return opts; - }, - _resolveFormat(opts) { - const f = opts.format; - if (f && f.type) { - let fnKeystroke; - let fnFormat; - let params = ''; - if (FORMAT_SPECIAL[f.type] !== undefined) { - fnKeystroke = `AFSpecial_Keystroke`; - fnFormat = `AFSpecial_Format`; - params = FORMAT_SPECIAL[f.type]; - } else { - let format = f.type.charAt(0).toUpperCase() + f.type.slice(1); - fnKeystroke = `AF${format}_Keystroke`; - fnFormat = `AF${format}_Format`; - if (f.type === 'date') { - fnKeystroke += 'Ex'; - params = String(f.param); - } else if (f.type === 'time') { - params = String(f.param); - } else if (f.type === 'number') { - let p = Object.assign({}, FORMAT_DEFAULT.number, f); - params = String([String(p.nDec), p.sepComma ? '0' : '1', '"' + p.negStyle + '"', 'null', '"' + p.currency + '"', String(p.currencyPrepend)].join(',')); - } else if (f.type === 'percent') { - let p = Object.assign({}, FORMAT_DEFAULT.percent, f); - params = String([String(p.nDec), p.sepComma ? '0' : '1'].join(',')); - } - } - opts.AA = opts.AA ? opts.AA : {}; - opts.AA.K = { - S: 'JavaScript', - JS: new String(`${fnKeystroke}(${params});`) - }; - opts.AA.F = { - S: 'JavaScript', - JS: new String(`${fnFormat}(${params});`) - }; - } - delete opts.format; - return opts; - }, - _resolveColors(opts) { - let color = this._normalizeColor(opts.backgroundColor); - if (color) { - if (!opts.MK) { - opts.MK = {}; - } - opts.MK.BG = color; - } - color = this._normalizeColor(opts.borderColor); - if (color) { - if (!opts.MK) { - opts.MK = {}; - } - opts.MK.BC = color; - } - delete opts.backgroundColor; - delete opts.borderColor; - return opts; - }, - _resolveFlags(options) { - let result = 0; - Object.keys(options).forEach(key => { - if (FIELD_FLAGS[key]) { - if (options[key]) { - result |= FIELD_FLAGS[key]; - } - delete options[key]; - } - }); - if (result !== 0) { - options.Ff = options.Ff ? options.Ff : 0; - options.Ff |= result; - } - return options; - }, - _resolveJustify(options) { - let result = 0; - if (options.align !== undefined) { - if (typeof FIELD_JUSTIFY[options.align] === 'number') { - result = FIELD_JUSTIFY[options.align]; - } - delete options.align; - } - if (result !== 0) { - options.Q = result; // default - } - return options; - }, - _resolveFont(options) { - // add current font to document-level AcroForm dict if necessary - if (this._acroform.fonts[this._font.id] == null) { - this._acroform.fonts[this._font.id] = this._font.ref(); - } - - // add current font to field's resource dict (RD) if not the default acroform font - if (this._acroform.defaultFont !== this._font.name) { - options.DR = { - Font: {} - }; - - // Get the fontSize option. If not set use auto sizing - const fontSize = options.fontSize || 0; - options.DR.Font[this._font.id] = this._font.ref(); - options.DA = new String(`/${this._font.id} ${fontSize} Tf 0 g`); - } - return options; - }, - _resolveStrings(options) { - let select = []; - function appendChoices(a) { - if (Array.isArray(a)) { - for (let idx = 0; idx < a.length; idx++) { - if (typeof a[idx] === 'string') { - select.push(new String(a[idx])); - } else { - select.push(a[idx]); - } - } - } - } - appendChoices(options.Opt); - if (options.select) { - appendChoices(options.select); - delete options.select; - } - if (select.length) { - options.Opt = select; - } - Object.keys(VALUE_MAP).forEach(key => { - if (options[key] !== undefined) { - options[VALUE_MAP[key]] = options[key]; - delete options[key]; - } - }); - ['V', 'DV'].forEach(key => { - if (typeof options[key] === 'string') { - options[key] = new String(options[key]); - } - }); - if (options.MK && options.MK.CA) { - options.MK.CA = new String(options.MK.CA); - } - if (options.label) { - options.MK = options.MK ? options.MK : {}; - options.MK.CA = new String(options.label); - delete options.label; - } - return options; - } -}; - -var AttachmentsMixin = { - /** - * Embed contents of `src` in PDF - * @param {Buffer | ArrayBuffer | string} src input Buffer, ArrayBuffer, base64 encoded string or path to file - * @param {object} options - * * options.name: filename to be shown in PDF, will use `src` if none set - * * options.type: filetype to be shown in PDF - * * options.description: description to be shown in PDF - * * options.hidden: if true, do not add attachment to EmbeddedFiles dictionary. Useful for file attachment annotations - * * options.creationDate: override creation date - * * options.modifiedDate: override modified date - * * options.relationship: Relationship between the PDF document and its attached file. Can be 'Alternative', 'Data', 'Source', 'Supplement' or 'Unspecified'. - * @returns filespec reference - */ - file(src, options) { - if (options === void 0) { - options = {}; - } - options.name = options.name || src; - options.relationship = options.relationship || 'Unspecified'; - const refBody = { - Type: 'EmbeddedFile', - Params: {} - }; - let data; - if (!src) { - throw new Error('No src specified'); - } - if (Buffer$2.isBuffer(src)) { - data = src; - } else if (src instanceof ArrayBuffer) { - data = Buffer$2.from(new Uint8Array(src)); - } else { - let match; - if (match = /^data:(.*?);base64,(.*)$/.exec(src)) { - if (match[1]) { - refBody.Subtype = match[1].replace('/', '#2F'); - } - data = Buffer$2.from(match[2], 'base64'); - } else { - data = fs.readFileSync(src); - if (!data) { - throw new Error(`Could not read contents of file at filepath ${src}`); - } - - // update CreationDate and ModDate - const { - birthtime, - ctime - } = fs.statSync(src); - refBody.Params.CreationDate = birthtime; - refBody.Params.ModDate = ctime; - } - } - - // override creation date and modified date - if (options.creationDate instanceof Date) { - refBody.Params.CreationDate = options.creationDate; - } - if (options.modifiedDate instanceof Date) { - refBody.Params.ModDate = options.modifiedDate; - } - // add optional subtype - if (options.type) { - refBody.Subtype = options.type.replace('/', '#2F'); - } - - // add checksum and size information - const checksum = md5Hex(new Uint8Array(data)); - refBody.Params.CheckSum = new String(checksum); - refBody.Params.Size = data.byteLength; - - // save some space when embedding the same file again - // if a file with the same name and metadata exists, reuse its reference - let ref; - if (!this._fileRegistry) this._fileRegistry = {}; - let file = this._fileRegistry[options.name]; - if (file && isEqual(refBody, file)) { - ref = file.ref; - } else { - ref = this.ref(refBody); - ref.end(data); - this._fileRegistry[options.name] = { - ...refBody, - ref - }; - } - // add filespec for embedded file - const fileSpecBody = { - Type: 'Filespec', - AFRelationship: options.relationship, - F: new String(options.name), - EF: { - F: ref - }, - UF: new String(options.name) - }; - if (options.description) { - fileSpecBody.Desc = new String(options.description); - } - const filespec = this.ref(fileSpecBody); - filespec.end(); - if (!options.hidden) { - this.addNamedEmbeddedFile(options.name, filespec); - } - - // Add file to the catalogue to be PDF/A3 compliant - if (this._root.data.AF) { - this._root.data.AF.push(filespec); - } else { - this._root.data.AF = [filespec]; - } - return filespec; - } -}; - -/** check two embedded file metadata objects for equality */ -function isEqual(a, b) { - return a.Subtype === b.Subtype && a.Params.CheckSum.toString() === b.Params.CheckSum.toString() && a.Params.Size === b.Params.Size && a.Params.CreationDate.getTime() === b.Params.CreationDate.getTime() && (a.Params.ModDate === undefined && b.Params.ModDate === undefined || a.Params.ModDate.getTime() === b.Params.ModDate.getTime()); -} - -var __dirname = '/Users/catic/OneDrive/Harun/Projekti/01. Personal/Rechnung/program/react-pdf/packages/pdfkit'; - -var PDFA = { - initPDFA(pSubset) { - if (pSubset.charAt(pSubset.length - 3) === '-') { - this.subset_conformance = pSubset.charAt(pSubset.length - 1).toUpperCase(); - this.subset = parseInt(pSubset.charAt(pSubset.length - 2)); - } else { - // Default to Basic conformance when user doesn't specify - this.subset_conformance = 'B'; - this.subset = parseInt(pSubset.charAt(pSubset.length - 1)); - } - }, - endSubset() { - this._addPdfaMetadata(); - this._addColorOutputIntent(); - }, - _addColorOutputIntent() { - const iccProfile = fs.readFileSync(`${__dirname}/data/sRGB_IEC61966_2_1.icc`); - const colorProfileRef = this.ref({ - Length: iccProfile.length, - N: 3 - }); - colorProfileRef.write(iccProfile); - colorProfileRef.end(); - const intentRef = this.ref({ - Type: 'OutputIntent', - S: 'GTS_PDFA1', - Info: new String('sRGB IEC61966-2.1'), - OutputConditionIdentifier: new String('sRGB IEC61966-2.1'), - DestOutputProfile: colorProfileRef - }); - intentRef.end(); - this._root.data.OutputIntents = [intentRef]; - }, - _getPdfaid() { - return ` - - ${this.subset} - ${this.subset_conformance} - - `; - }, - _addPdfaMetadata() { - this.appendXML(this._getPdfaid()); - } -}; - -var PDFUA = { - initPDFUA() { - this.subset = 1; - }, - endSubset() { - this._addPdfuaMetadata(); - }, - _addPdfuaMetadata() { - this.appendXML(this._getPdfuaid()); - }, - _getPdfuaid() { - return ` - - ${this.subset} - - `; - } -}; - -var SubsetMixin = { - _importSubset(subset) { - Object.assign(this, subset); - }, - initSubset(options) { - switch (options.subset) { - case 'PDF/A-1': - case 'PDF/A-1a': - case 'PDF/A-1b': - case 'PDF/A-2': - case 'PDF/A-2a': - case 'PDF/A-2b': - case 'PDF/A-3': - case 'PDF/A-3a': - case 'PDF/A-3b': - this._importSubset(PDFA); - this.initPDFA(options.subset); - break; - case 'PDF/UA': - this._importSubset(PDFUA); - this.initPDFUA(); - break; - } - } -}; - -class PDFMetadata { - constructor() { - this._metadata = ` - - - - `; - } - _closeTags() { - this._metadata = this._metadata.concat(` - - - - `); - } - append(xml, newline) { - if (newline === void 0) { - newline = true; - } - this._metadata = this._metadata.concat(xml); - if (newline) this._metadata = this._metadata.concat('\n'); - } - getXML() { - return this._metadata; - } - getLength() { - return this._metadata.length; - } - end() { - this._closeTags(); - this._metadata = this._metadata.trim(); - } -} - -var MetadataMixin = { - initMetadata() { - this.metadata = new PDFMetadata(); - }, - appendXML(xml, newline) { - if (newline === void 0) { - newline = true; - } - this.metadata.append(xml, newline); - }, - _addInfo() { - this.appendXML(` - - ${this.info.CreationDate.toISOString().split('.')[0] + 'Z'} - ${this.info.Creator} - - `); - if (this.info.Title || this.info.Author || this.info.Subject) { - this.appendXML(` - - `); - if (this.info.Title) { - this.appendXML(` - - - ${this.info.Title} - - - `); - } - if (this.info.Author) { - this.appendXML(` - - - ${this.info.Author} - - - `); - } - if (this.info.Subject) { - this.appendXML(` - - - ${this.info.Subject} - - - `); - } - this.appendXML(` - - `); - } - this.appendXML(` - - ${this.info.Creator}`, false); - if (this.info.Keywords) { - this.appendXML(` - ${this.info.Keywords}`, false); - } - this.appendXML(` - - `); - }, - endMetadata() { - this._addInfo(); - this.metadata.end(); - - /* - Metadata was introduced in PDF 1.4, so adding it to 1.3 - will likely only take up more space. - */ - if (this.version != 1.3) { - this.metadataRef = this.ref({ - length: this.metadata.getLength(), - Type: 'Metadata', - Subtype: 'XML' - }); - this.metadataRef.compress = false; - this.metadataRef.write(Buffer$2.from(this.metadata.getXML(), 'utf-8')); - this.metadataRef.end(); - this._root.data.Metadata = this.metadataRef; - } - } -}; - -class PDFDocument extends stream.Readable { - constructor(options) { - if (options === void 0) { - options = {}; - } - super(options); - this.options = options; - - // PDF version - switch (options.pdfVersion) { - case '1.4': - this.version = 1.4; - break; - case '1.5': - this.version = 1.5; - break; - case '1.6': - this.version = 1.6; - break; - case '1.7': - case '1.7ext3': - this.version = 1.7; - break; - default: - this.version = 1.3; - break; - } - - // Whether streams should be compressed - this.compress = this.options.compress != null ? this.options.compress : true; - this._pageBuffer = []; - this._pageBufferStart = 0; - - // The PDF object store - this._offsets = []; - this._waiting = 0; - this._ended = false; - this._offset = 0; - const Pages = this.ref({ - Type: 'Pages', - Count: 0, - Kids: [] - }); - const Names = this.ref({ - Dests: new PDFNameTree() - }); - this._root = this.ref({ - Type: 'Catalog', - Pages, - Names - }); - if (this.options.lang) { - this._root.data.Lang = new String(this.options.lang); - } - - // The current page - this.page = null; - - // Initialize mixins - this.initMetadata(); - this.initColor(); - this.initVector(); - this.initFonts(options.font); - this.initText(); - this.initImages(); - this.initOutline(); - this.initMarkings(options); - this.initSubset(options); - - // Initialize the metadata - this.info = { - Producer: 'PDFKit', - Creator: 'PDFKit', - CreationDate: new Date() - }; - if (this.options.info) { - for (let key in this.options.info) { - const val = this.options.info[key]; - this.info[key] = val; - } - } - if (this.options.displayTitle) { - this._root.data.ViewerPreferences = this.ref({ - DisplayDocTitle: true - }); - } - - // Generate file ID - this._id = PDFSecurity.generateFileID(this.info); - - // Initialize security settings - this._security = PDFSecurity.create(this, options); - - // Write the header - // PDF version - this._write(`%PDF-${this.version}`); - - // 4 binary chars, as recommended by the spec - this._write('%\xFF\xFF\xFF\xFF'); - - // Add the first page - if (this.options.autoFirstPage !== false) { - this.addPage(); - } - } - addPage(options) { - if (options == null) { - ({ - options - } = this); - } - - // end the current page if needed - if (!this.options.bufferPages) { - this.flushPages(); - } - - // create a page object - this.page = new PDFPage(this, options); - this._pageBuffer.push(this.page); - - // add the page to the object store - const pages = this._root.data.Pages.data; - pages.Kids.push(this.page.dictionary); - pages.Count++; - - // reset x and y coordinates - this.x = this.page.margins.left; - this.y = this.page.margins.top; - - // flip PDF coordinate system so that the origin is in - // the top left rather than the bottom left - this._ctm = [1, 0, 0, 1, 0, 0]; - this.transform(1, 0, 0, -1, 0, this.page.height); - this.emit('pageAdded'); - return this; - } - continueOnNewPage(options) { - const pageMarkings = this.endPageMarkings(this.page); - this.addPage(options !== null && options !== void 0 ? options : this.page._options); - this.initPageMarkings(pageMarkings); - return this; - } - bufferedPageRange() { - return { - start: this._pageBufferStart, - count: this._pageBuffer.length - }; - } - switchToPage(n) { - let page; - if (!(page = this._pageBuffer[n - this._pageBufferStart])) { - throw new Error(`switchToPage(${n}) out of bounds, current buffer covers pages ${this._pageBufferStart} to ${this._pageBufferStart + this._pageBuffer.length - 1}`); - } - return this.page = page; - } - flushPages() { - // this local variable exists so we're future-proof against - // reentrant calls to flushPages. - const pages = this._pageBuffer; - this._pageBuffer = []; - this._pageBufferStart += pages.length; - for (let page of pages) { - this.endPageMarkings(page); - page.end(); - } - } - addNamedDestination(name) { - for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - args[_key - 1] = arguments[_key]; - } - if (args.length === 0) { - args = ['XYZ', null, null, null]; - } - if (args[0] === 'XYZ' && args[2] !== null) { - args[2] = this.page.height - args[2]; - } - args.unshift(this.page.dictionary); - this._root.data.Names.data.Dests.add(name, args); - } - addNamedEmbeddedFile(name, ref) { - if (!this._root.data.Names.data.EmbeddedFiles) { - // disabling /Limits for this tree fixes attachments not showing in Adobe Reader - this._root.data.Names.data.EmbeddedFiles = new PDFNameTree({ - limits: false - }); - } - - // add filespec to EmbeddedFiles - this._root.data.Names.data.EmbeddedFiles.add(name, ref); - } - addNamedJavaScript(name, js) { - if (!this._root.data.Names.data.JavaScript) { - this._root.data.Names.data.JavaScript = new PDFNameTree(); - } - let data = { - JS: new String(js), - S: 'JavaScript' - }; - this._root.data.Names.data.JavaScript.add(name, data); - } - ref(data) { - const ref = new PDFReference(this, this._offsets.length + 1, data); - this._offsets.push(null); // placeholder for this object's offset once it is finalized - this._waiting++; - return ref; - } - _read() {} - // do nothing, but this method is required by node - - _write(data) { - if (!Buffer$2.isBuffer(data)) { - data = Buffer$2.from(data + '\n', 'binary'); - } - this.push(data); - return this._offset += data.length; - } - addContent(data) { - this.page.write(data); - return this; - } - _refEnd(ref) { - this._offsets[ref.id - 1] = ref.offset; - if (--this._waiting === 0 && this._ended) { - this._finalize(); - return this._ended = false; - } - } - end() { - this.flushPages(); - this._info = this.ref(); - for (let key in this.info) { - let val = this.info[key]; - if (typeof val === 'string') { - val = new String(val); - } - let entry = this.ref(val); - entry.end(); - this._info.data[key] = entry; - } - this._info.end(); - for (let name in this._fontFamilies) { - const font = this._fontFamilies[name]; - font.finalize(); - } - this.endOutline(); - this.endMarkings(); - if (this.subset) { - this.endSubset(); - } - this.endMetadata(); - this._root.end(); - this._root.data.Pages.end(); - this._root.data.Names.end(); - this.endAcroForm(); - if (this._root.data.ViewerPreferences) { - this._root.data.ViewerPreferences.end(); - } - if (this._security) { - this._security.end(); - } - if (this._waiting === 0) { - return this._finalize(); - } else { - return this._ended = true; - } - } - _finalize() { - // generate xref - const xRefOffset = this._offset; - this._write('xref'); - this._write(`0 ${this._offsets.length + 1}`); - this._write('0000000000 65535 f '); - for (let offset of this._offsets) { - offset = `0000000000${offset}`.slice(-10); - this._write(offset + ' 00000 n '); - } - - // trailer - const trailer = { - Size: this._offsets.length + 1, - Root: this._root, - Info: this._info, - ID: [this._id, this._id] - }; - if (this._security) { - trailer.Encrypt = this._security.dictionary; - } - this._write('trailer'); - this._write(PDFObject.convert(trailer)); - this._write('startxref'); - this._write(`${xRefOffset}`); - this._write('%%EOF'); - - // end the stream - return this.push(null); - } - toString() { - return '[object PDFDocument]'; - } -} -const mixin = methods => { - Object.assign(PDFDocument.prototype, methods); -}; -mixin(MetadataMixin); -mixin(ColorMixin); -mixin(VectorMixin); -mixin(FontsMixin); -mixin(TextMixin); -mixin(ImagesMixin); -mixin(AnnotationsMixin); -mixin(OutlineMixin); -mixin(MarkingsMixin); -mixin(AcroFormMixin); -mixin(AttachmentsMixin); -mixin(SubsetMixin); -PDFDocument.LineWrapper = LineWrapper; - -export { PDFDocument as default }; diff --git a/packages/pdfkit/lib/pdfkit.js b/packages/pdfkit/lib/pdfkit.js deleted file mode 100644 index fe51bbc32..000000000 --- a/packages/pdfkit/lib/pdfkit.js +++ /dev/null @@ -1,40753 +0,0 @@ -import stream from 'stream'; -import zlib from 'zlib'; -import md5 from 'js-md5'; -import { cbc, ecb } from '@noble/ciphers/aes'; -import * as fontkit from 'fontkit'; -import fs from 'fs'; -import { EventEmitter } from 'events'; -import LineBreaker from 'linebreak'; -import _JPEG from 'jay-peg'; -import PNG from '@react-pdf/png-js'; - -/* -PDFReference - represents a reference to another object in the PDF object heirarchy -By Devon Govett -*/ - -class PDFReference extends stream.Writable { - constructor(document, id, data) { - super({ - decodeStrings: false - }); - this.finalize = this.finalize.bind(this); - this.document = document; - this.id = id; - if (data == null) { - data = {}; - } - this.data = data; - this.gen = 0; - this.deflate = null; - this.compress = this.document.compress && !this.data.Filter; - this.uncompressedLength = 0; - this.chunks = []; - } - initDeflate() { - this.data.Filter = 'FlateDecode'; - this.deflate = zlib.createDeflate(); - this.deflate.on('data', chunk => { - this.chunks.push(chunk); - return this.data.Length += chunk.length; - }); - return this.deflate.on('end', this.finalize); - } - _write(chunk, encoding, callback) { - if (!(chunk instanceof Uint8Array)) { - chunk = Buffer.from(chunk + '\n', 'binary'); - } - this.uncompressedLength += chunk.length; - if (this.data.Length == null) { - this.data.Length = 0; - } - if (this.compress) { - if (!this.deflate) { - this.initDeflate(); - } - this.deflate.write(chunk); - } else { - this.chunks.push(chunk); - this.data.Length += chunk.length; - } - return callback(); - } - end() { - super.end(...arguments); - if (this.deflate) { - return this.deflate.end(); - } - return this.finalize(); - } - finalize() { - this.offset = this.document._offset; - const encryptFn = this.document._security ? this.document._security.getEncryptFn(this.id, this.gen) : null; - if (this.chunks.length) { - let buffer = Buffer.concat(this.chunks); - if (encryptFn) { - buffer = encryptFn(buffer); - } - this.data.Length = buffer.length; - this.document._write(`${this.id} ${this.gen} obj`); - this.document._write(PDFObject.convert(this.data, encryptFn)); - this.document._write('stream'); - this.document._write(buffer); - this.chunks.length = 0; - this.document._write('\nendstream'); - } else { - this.document._write(`${this.id} ${this.gen} obj`); - this.document._write(PDFObject.convert(this.data, encryptFn)); - } - this.document._write('endobj'); - return this.document._refEnd(this); - } - toString() { - return `${this.id} ${this.gen} R`; - } -} - -/* -PDFTree - abstract base class for name and number tree objects -*/ - -class PDFTree { - constructor(options) { - if (options === void 0) { - options = {}; - } - this._items = {}; - // disable /Limits output for this tree - this.limits = typeof options.limits === 'boolean' ? options.limits : true; - } - add(key, val) { - return this._items[key] = val; - } - get(key) { - return this._items[key]; - } - toString() { - // Needs to be sorted by key - const sortedKeys = Object.keys(this._items).sort((a, b) => this._compareKeys(a, b)); - const out = ['<<']; - if (this.limits && sortedKeys.length > 1) { - const first = sortedKeys[0], - last = sortedKeys[sortedKeys.length - 1]; - out.push(` /Limits ${PDFObject.convert([this._dataForKey(first), this._dataForKey(last)])}`); - } - out.push(` /${this._keysName()} [`); - for (let key of sortedKeys) { - out.push(` ${PDFObject.convert(this._dataForKey(key))} ${PDFObject.convert(this._items[key])}`); - } - out.push(']'); - out.push('>>'); - return out.join('\n'); - } - _compareKeys( /*a, b*/ - ) { - throw new Error('Must be implemented by subclasses'); - } - _keysName() { - throw new Error('Must be implemented by subclasses'); - } - _dataForKey( /*k*/ - ) { - throw new Error('Must be implemented by subclasses'); - } -} - -/* -PDFNameTree - represents a name tree object -*/ - -class PDFNameTree extends PDFTree { - _compareKeys(a, b) { - return a.localeCompare(b); - } - _keysName() { - return 'Names'; - } - _dataForKey(k) { - return new String(k); - } -} - -/* -PDFObject - converts JavaScript types into their corresponding PDF types. -By Devon Govett -*/ - -const pad = (str, length) => (Array(length + 1).join('0') + str).slice(-length); -const escapableRe = /[\n\r\t\b\f()\\]/g; -const escapable = { - '\n': '\\n', - '\r': '\\r', - '\t': '\\t', - '\b': '\\b', - '\f': '\\f', - '\\': '\\\\', - '(': '\\(', - ')': '\\)' -}; - -// Convert little endian UTF-16 to big endian -const swapBytes = function (buff) { - const l = buff.length; - if (l & 0x01) { - throw new Error('Buffer length must be even'); - } else { - for (let i = 0, end = l - 1; i < end; i += 2) { - const a = buff[i]; - buff[i] = buff[i + 1]; - buff[i + 1] = a; - } - } - return buff; -}; -class PDFObject { - static convert(object, encryptFn) { - if (encryptFn === void 0) { - encryptFn = null; - } - // String literals are converted to the PDF name type - if (typeof object === 'string') { - return `/${object}`; - } - - // String objects are converted to PDF strings (UTF-16) - if (object instanceof String) { - let string = object; - // Detect if this is a unicode string - let isUnicode = false; - for (let i = 0, end = string.length; i < end; i++) { - if (string.charCodeAt(i) > 0x7f) { - isUnicode = true; - break; - } - } - - // If so, encode it as big endian UTF-16 - let stringBuffer; - if (isUnicode) { - stringBuffer = swapBytes(Buffer.from(`\ufeff${string}`, 'utf16le')); - } else { - stringBuffer = Buffer.from(string.valueOf(), 'ascii'); - } - - // Encrypt the string when necessary - if (encryptFn) { - string = encryptFn(stringBuffer).toString('binary'); - } else { - string = stringBuffer.toString('binary'); - } - - // Escape characters as required by the spec - string = string.replace(escapableRe, c => escapable[c]); - return `(${string})`; - - // Buffers are converted to PDF hex strings - } - if (Buffer.isBuffer(object)) { - return `<${object.toString('hex')}>`; - } - if (object instanceof PDFReference || object instanceof PDFNameTree) { - return object.toString(); - } - if (object instanceof Date) { - let string = `D:${pad(object.getUTCFullYear(), 4)}` + pad(object.getUTCMonth() + 1, 2) + pad(object.getUTCDate(), 2) + pad(object.getUTCHours(), 2) + pad(object.getUTCMinutes(), 2) + pad(object.getUTCSeconds(), 2) + 'Z'; - - // Encrypt the string when necessary - if (encryptFn) { - string = encryptFn(Buffer.from(string, 'ascii')).toString('binary'); - string = string.replace(escapableRe, c => escapable[c]); - } - return `(${string})`; - } - if (Array.isArray(object)) { - const items = Array.from(object).map(e => PDFObject.convert(e, encryptFn)).join(' '); - return `[${items}]`; - } - if ({}.toString.call(object) === '[object Object]') { - const out = ['<<']; - for (let key in object) { - const val = object[key]; - out.push(`/${key} ${PDFObject.convert(val, encryptFn)}`); - } - out.push('>>'); - return out.join('\n'); - } - if (typeof object === 'number') { - return PDFObject.number(object); - } - return `${object}`; - } - static number(n) { - if (n > -1e21 && n < 1e21) { - return Math.round(n * 1e6) / 1e6; - } - throw new Error(`unsupported number: ${n}`); - } -} - -/* -PDFPage - represents a single page in the PDF document -By Devon Govett -*/ - -/** - * @type {SideDefinition} - */ -const DEFAULT_MARGINS = { - top: 72, - left: 72, - bottom: 72, - right: 72 -}; -const SIZES = { - '4A0': [4767.87, 6740.79], - '2A0': [3370.39, 4767.87], - A0: [2383.94, 3370.39], - A1: [1683.78, 2383.94], - A2: [1190.55, 1683.78], - A3: [841.89, 1190.55], - A4: [595.28, 841.89], - A5: [419.53, 595.28], - A6: [297.64, 419.53], - A7: [209.76, 297.64], - A8: [147.4, 209.76], - A9: [104.88, 147.4], - A10: [73.7, 104.88], - B0: [2834.65, 4008.19], - B1: [2004.09, 2834.65], - B2: [1417.32, 2004.09], - B3: [1000.63, 1417.32], - B4: [708.66, 1000.63], - B5: [498.9, 708.66], - B6: [354.33, 498.9], - B7: [249.45, 354.33], - B8: [175.75, 249.45], - B9: [124.72, 175.75], - B10: [87.87, 124.72], - C0: [2599.37, 3676.54], - C1: [1836.85, 2599.37], - C2: [1298.27, 1836.85], - C3: [918.43, 1298.27], - C4: [649.13, 918.43], - C5: [459.21, 649.13], - C6: [323.15, 459.21], - C7: [229.61, 323.15], - C8: [161.57, 229.61], - C9: [113.39, 161.57], - C10: [79.37, 113.39], - RA0: [2437.8, 3458.27], - RA1: [1729.13, 2437.8], - RA2: [1218.9, 1729.13], - RA3: [864.57, 1218.9], - RA4: [609.45, 864.57], - SRA0: [2551.18, 3628.35], - SRA1: [1814.17, 2551.18], - SRA2: [1275.59, 1814.17], - SRA3: [907.09, 1275.59], - SRA4: [637.8, 907.09], - EXECUTIVE: [521.86, 756.0], - FOLIO: [612.0, 936.0], - LEGAL: [612.0, 1008.0], - LETTER: [612.0, 792.0], - TABLOID: [792.0, 1224.0] -}; -class PDFPage { - constructor(document, options) { - if (options === void 0) { - options = {}; - } - this.document = document; - this._options = options; - this.size = options.size || 'letter'; - this.layout = options.layout || 'portrait'; - this.userUnit = options.userUnit || 1.0; - - // process margins - if (typeof options.margin === 'number') { - this.margins = { - top: options.margin, - left: options.margin, - bottom: options.margin, - right: options.margin - }; - - // default to 1 inch margins - } else { - this.margins = options.margins || DEFAULT_MARGINS; - } - - // calculate page dimensions - const dimensions = Array.isArray(this.size) ? this.size : SIZES[this.size.toUpperCase()]; - this.width = dimensions[this.layout === 'portrait' ? 0 : 1]; - this.height = dimensions[this.layout === 'portrait' ? 1 : 0]; - this.content = this.document.ref(); - if (options.font) document.font(options.font, options.fontFamily); - if (options.fontSize) document.fontSize(options.fontSize); - - // Initialize the Font, XObject, and ExtGState dictionaries - this.resources = this.document.ref({ - ProcSet: ['PDF', 'Text', 'ImageB', 'ImageC', 'ImageI'] - }); - - // The page dictionary - this.dictionary = this.document.ref({ - Type: 'Page', - Parent: this.document._root.data.Pages, - MediaBox: [0, 0, this.width, this.height], - Contents: this.content, - Resources: this.resources, - UserUnit: this.userUnit - }); - this.markings = []; - } - - // Lazily create these objects - get fonts() { - const data = this.resources.data; - return data.Font != null ? data.Font : data.Font = {}; - } - get xobjects() { - const data = this.resources.data; - return data.XObject != null ? data.XObject : data.XObject = {}; - } - get ext_gstates() { - const data = this.resources.data; - return data.ExtGState != null ? data.ExtGState : data.ExtGState = {}; - } - get patterns() { - const data = this.resources.data; - return data.Pattern != null ? data.Pattern : data.Pattern = {}; - } - get colorSpaces() { - const data = this.resources.data; - return data.ColorSpace || (data.ColorSpace = {}); - } - get annotations() { - const data = this.dictionary.data; - return data.Annots != null ? data.Annots : data.Annots = []; - } - get structParentTreeKey() { - const data = this.dictionary.data; - return data.StructParents != null ? data.StructParents : data.StructParents = this.document.createStructParentTreeNextKey(); - } - maxY() { - return this.height - this.margins.bottom; - } - write(chunk) { - return this.content.write(chunk); - } - - // Set tab order if document is tagged for accessibility. - _setTabOrder() { - if (!this.dictionary.Tabs && this.document.hasMarkInfoDictionary()) { - this.dictionary.data.Tabs = 'S'; - } - } - end() { - this._setTabOrder(); - this.dictionary.end(); - this.resources.data.ColorSpace = this.resources.data.ColorSpace || {}; - for (let color of Object.values(this.document.spotColors)) { - this.resources.data.ColorSpace[color.id] = color; - } - this.resources.end(); - return this.content.end(); - } -} - -function md5Hash(data) { - return new Uint8Array(md5.arrayBuffer(data)); -} -function md5Hex(data) { - return md5(data); -} - -/** - * Utilities for hex, bytes, CSPRNG. - * @module - */ -/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */ -// We use WebCrypto aka globalThis.crypto, which exists in browsers and node.js 16+. -// node.js versions earlier than v19 don't declare it in global scope. -// For node.js, package.json#exports field mapping rewrites import -// from `crypto` to `cryptoNode`, which imports native module. -// Makes the utils un-importable in browsers without a bundler. -// Once node.js 18 is deprecated (2025-04-30), we can just drop the import. -/** Checks if something is Uint8Array. Be careful: nodejs Buffer will return true. */ -function isBytes(a) { - return a instanceof Uint8Array || ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array'; -} -/** Asserts something is Uint8Array. */ -function abytes(b) { - if (!isBytes(b)) throw new Error('Uint8Array expected'); - for (var _len = arguments.length, lengths = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - lengths[_key - 1] = arguments[_key]; - } - if (lengths.length > 0 && !lengths.includes(b.length)) throw new Error('Uint8Array expected of length ' + lengths + ', got length=' + b.length); -} -/** Asserts a hash instance has not been destroyed / finished */ -function aexists(instance, checkFinished) { - if (checkFinished === void 0) { - checkFinished = true; - } - if (instance.destroyed) throw new Error('Hash instance has been destroyed'); - if (checkFinished && instance.finished) throw new Error('Hash#digest() has already been called'); -} -/** Asserts output is properly-sized byte array */ -function aoutput(out, instance) { - abytes(out); - const min = instance.outputLen; - if (out.length < min) { - throw new Error('digestInto() expects output buffer of length at least ' + min); - } -} -/** Zeroize a byte array. Warning: JS provides no guarantees. */ -function clean() { - for (var _len2 = arguments.length, arrays = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { - arrays[_key2] = arguments[_key2]; - } - for (let i = 0; i < arrays.length; i++) { - arrays[i].fill(0); - } -} -/** Create DataView of an array for easy byte-level manipulation. */ -function createView(arr) { - return new DataView(arr.buffer, arr.byteOffset, arr.byteLength); -} -/** The rotate right (circular right shift) operation for uint32 */ -function rotr(word, shift) { - return word << 32 - shift | word >>> shift; -} -/** - * Converts string to bytes using UTF8 encoding. - * @example utf8ToBytes('abc') // Uint8Array.from([97, 98, 99]) - */ -function utf8ToBytes(str) { - if (typeof str !== 'string') throw new Error('string expected'); - return new Uint8Array(new TextEncoder().encode(str)); // https://bugzil.la/1681809 -} -/** - * Normalizes (non-hex) string or Uint8Array to Uint8Array. - * Warning: when Uint8Array is passed, it would NOT get copied. - * Keep in mind for future mutable operations. - */ -function toBytes(data) { - if (typeof data === 'string') data = utf8ToBytes(data); - abytes(data); - return data; -} -/** For runtime check if class implements interface */ -class Hash {} -/** Wraps hash function, creating an interface on top of it */ -function createHasher(hashCons) { - const hashC = msg => hashCons().update(toBytes(msg)).digest(); - const tmp = hashCons(); - hashC.outputLen = tmp.outputLen; - hashC.blockLen = tmp.blockLen; - hashC.create = () => hashCons(); - return hashC; -} - -/** - * Internal Merkle-Damgard hash utils. - * @module - */ -/** Polyfill for Safari 14. https://caniuse.com/mdn-javascript_builtins_dataview_setbiguint64 */ -function setBigUint64(view, byteOffset, value, isLE) { - if (typeof view.setBigUint64 === 'function') return view.setBigUint64(byteOffset, value, isLE); - const _32n = BigInt(32); - const _u32_max = BigInt(0xffffffff); - const wh = Number(value >> _32n & _u32_max); - const wl = Number(value & _u32_max); - const h = isLE ? 4 : 0; - const l = isLE ? 0 : 4; - view.setUint32(byteOffset + h, wh, isLE); - view.setUint32(byteOffset + l, wl, isLE); -} -/** Choice: a ? b : c */ -function Chi(a, b, c) { - return a & b ^ ~a & c; -} -/** Majority function, true if any two inputs is true. */ -function Maj(a, b, c) { - return a & b ^ a & c ^ b & c; -} -/** - * Merkle-Damgard hash construction base class. - * Could be used to create MD5, RIPEMD, SHA1, SHA2. - */ -class HashMD extends Hash { - constructor(blockLen, outputLen, padOffset, isLE) { - super(); - this.finished = false; - this.length = 0; - this.pos = 0; - this.destroyed = false; - this.blockLen = blockLen; - this.outputLen = outputLen; - this.padOffset = padOffset; - this.isLE = isLE; - this.buffer = new Uint8Array(blockLen); - this.view = createView(this.buffer); - } - update(data) { - aexists(this); - data = toBytes(data); - abytes(data); - const { - view, - buffer, - blockLen - } = this; - const len = data.length; - for (let pos = 0; pos < len;) { - const take = Math.min(blockLen - this.pos, len - pos); - // Fast path: we have at least one block in input, cast it to view and process - if (take === blockLen) { - const dataView = createView(data); - for (; blockLen <= len - pos; pos += blockLen) this.process(dataView, pos); - continue; - } - buffer.set(data.subarray(pos, pos + take), this.pos); - this.pos += take; - pos += take; - if (this.pos === blockLen) { - this.process(view, 0); - this.pos = 0; - } - } - this.length += data.length; - this.roundClean(); - return this; - } - digestInto(out) { - aexists(this); - aoutput(out, this); - this.finished = true; - // Padding - // We can avoid allocation of buffer for padding completely if it - // was previously not allocated here. But it won't change performance. - const { - buffer, - view, - blockLen, - isLE - } = this; - let { - pos - } = this; - // append the bit '1' to the message - buffer[pos++] = 0b10000000; - clean(this.buffer.subarray(pos)); - // we have less than padOffset left in buffer, so we cannot put length in - // current block, need process it and pad again - if (this.padOffset > blockLen - pos) { - this.process(view, 0); - pos = 0; - } - // Pad until full block byte with zeros - for (let i = pos; i < blockLen; i++) buffer[i] = 0; - // Note: sha512 requires length to be 128bit integer, but length in JS will overflow before that - // You need to write around 2 exabytes (u64_max / 8 / (1024**6)) for this to happen. - // So we just write lowest 64 bits of that value. - setBigUint64(view, blockLen - 8, BigInt(this.length * 8), isLE); - this.process(view, 0); - const oview = createView(out); - const len = this.outputLen; - // NOTE: we do division by 4 later, which should be fused in single op with modulo by JIT - if (len % 4) throw new Error('_sha2: outputLen should be aligned to 32bit'); - const outLen = len / 4; - const state = this.get(); - if (outLen > state.length) throw new Error('_sha2: outputLen bigger than state'); - for (let i = 0; i < outLen; i++) oview.setUint32(4 * i, state[i], isLE); - } - digest() { - const { - buffer, - outputLen - } = this; - this.digestInto(buffer); - const res = buffer.slice(0, outputLen); - this.destroy(); - return res; - } - _cloneInto(to) { - to || (to = new this.constructor()); - to.set(...this.get()); - const { - blockLen, - buffer, - length, - finished, - destroyed, - pos - } = this; - to.destroyed = destroyed; - to.finished = finished; - to.length = length; - to.pos = pos; - if (length % blockLen) to.buffer.set(buffer); - return to; - } - clone() { - return this._cloneInto(); - } -} -/** - * Initial SHA-2 state: fractional parts of square roots of first 16 primes 2..53. - * Check out `test/misc/sha2-gen-iv.js` for recomputation guide. - */ -/** Initial SHA256 state. Bits 0..32 of frac part of sqrt of primes 2..19 */ -const SHA256_IV = /* @__PURE__ */Uint32Array.from([0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19]); - -/** - * SHA2 hash function. A.k.a. sha256, sha384, sha512, sha512_224, sha512_256. - * SHA256 is the fastest hash implementable in JS, even faster than Blake3. - * Check out [RFC 4634](https://datatracker.ietf.org/doc/html/rfc4634) and - * [FIPS 180-4](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf). - * @module - */ -/** - * Round constants: - * First 32 bits of fractional parts of the cube roots of the first 64 primes 2..311) - */ -// prettier-ignore -const SHA256_K = /* @__PURE__ */Uint32Array.from([0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2]); -/** Reusable temporary buffer. "W" comes straight from spec. */ -const SHA256_W = /* @__PURE__ */new Uint32Array(64); -class SHA256 extends HashMD { - constructor(outputLen) { - if (outputLen === void 0) { - outputLen = 32; - } - super(64, outputLen, 8, false); - // We cannot use array here since array allows indexing by variable - // which means optimizer/compiler cannot use registers. - this.A = SHA256_IV[0] | 0; - this.B = SHA256_IV[1] | 0; - this.C = SHA256_IV[2] | 0; - this.D = SHA256_IV[3] | 0; - this.E = SHA256_IV[4] | 0; - this.F = SHA256_IV[5] | 0; - this.G = SHA256_IV[6] | 0; - this.H = SHA256_IV[7] | 0; - } - get() { - const { - A, - B, - C, - D, - E, - F, - G, - H - } = this; - return [A, B, C, D, E, F, G, H]; - } - // prettier-ignore - set(A, B, C, D, E, F, G, H) { - this.A = A | 0; - this.B = B | 0; - this.C = C | 0; - this.D = D | 0; - this.E = E | 0; - this.F = F | 0; - this.G = G | 0; - this.H = H | 0; - } - process(view, offset) { - // Extend the first 16 words into the remaining 48 words w[16..63] of the message schedule array - for (let i = 0; i < 16; i++, offset += 4) SHA256_W[i] = view.getUint32(offset, false); - for (let i = 16; i < 64; i++) { - const W15 = SHA256_W[i - 15]; - const W2 = SHA256_W[i - 2]; - const s0 = rotr(W15, 7) ^ rotr(W15, 18) ^ W15 >>> 3; - const s1 = rotr(W2, 17) ^ rotr(W2, 19) ^ W2 >>> 10; - SHA256_W[i] = s1 + SHA256_W[i - 7] + s0 + SHA256_W[i - 16] | 0; - } - // Compression function main loop, 64 rounds - let { - A, - B, - C, - D, - E, - F, - G, - H - } = this; - for (let i = 0; i < 64; i++) { - const sigma1 = rotr(E, 6) ^ rotr(E, 11) ^ rotr(E, 25); - const T1 = H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i] | 0; - const sigma0 = rotr(A, 2) ^ rotr(A, 13) ^ rotr(A, 22); - const T2 = sigma0 + Maj(A, B, C) | 0; - H = G; - G = F; - F = E; - E = D + T1 | 0; - D = C; - C = B; - B = A; - A = T1 + T2 | 0; - } - // Add the compressed chunk to the current hash value - A = A + this.A | 0; - B = B + this.B | 0; - C = C + this.C | 0; - D = D + this.D | 0; - E = E + this.E | 0; - F = F + this.F | 0; - G = G + this.G | 0; - H = H + this.H | 0; - this.set(A, B, C, D, E, F, G, H); - } - roundClean() { - clean(SHA256_W); - } - destroy() { - this.set(0, 0, 0, 0, 0, 0, 0, 0); - clean(this.buffer); - } -} -/** - * SHA2-256 hash function from RFC 4634. - * - * It is the fastest JS hash, even faster than Blake3. - * To break sha256 using birthday attack, attackers need to try 2^128 hashes. - * BTC network is doing 2^70 hashes/sec (2^95 hashes/year) as per 2025. - */ -const sha256 = /* @__PURE__ */createHasher(() => new SHA256()); - -function sha256Hash(data) { - return sha256(data); -} - -function aesCbcEncrypt(data, key, iv, padding) { - if (padding === void 0) { - padding = true; - } - return cbc(key, iv, { - disablePadding: !padding - }).encrypt(data); -} -function aesEcbEncrypt(data, key) { - return ecb(key, { - disablePadding: true - }).encrypt(data); -} - -// RC4 (for legacy PDF 1.3-1.5) -function rc4(data, key) { - const s = new Uint8Array(256); - for (let i = 0; i < 256; i++) { - s[i] = i; - } - let j = 0; - for (let i = 0; i < 256; i++) { - j = j + s[i] + key[i % key.length] & 0xff; - [s[i], s[j]] = [s[j], s[i]]; - } - const output = new Uint8Array(data.length); - for (let i = 0, j = 0, k = 0; k < data.length; k++) { - i = i + 1 & 0xff; - j = j + s[i] & 0xff; - [s[i], s[j]] = [s[j], s[i]]; - output[k] = data[k] ^ s[s[i] + s[j] & 0xff]; - } - return output; -} - -function randomBytes(length) { - const bytes = new Uint8Array(length); - globalThis.crypto.getRandomValues(bytes); - return bytes; -} - -/** - * Check if value is in a range group. - * @param {number} value - * @param {number[]} rangeGroup - * @returns {boolean} - */ -function inRange(value, rangeGroup) { - if (value < rangeGroup[0]) return false; - let startRange = 0; - let endRange = rangeGroup.length / 2; - while (startRange <= endRange) { - const middleRange = Math.floor((startRange + endRange) / 2); - - // actual array index - const arrayIndex = middleRange * 2; - - // Check if value is in range pointed by actual index - if (value >= rangeGroup[arrayIndex] && value <= rangeGroup[arrayIndex + 1]) { - return true; - } - if (value > rangeGroup[arrayIndex + 1]) { - // Search Right Side Of Array - startRange = middleRange + 1; - } else { - // Search Left Side Of Array - endRange = middleRange - 1; - } - } - return false; -} - -// prettier-ignore-start -/** - * A.1 Unassigned code points in Unicode 3.2 - * @link https://tools.ietf.org/html/rfc3454#appendix-A.1 - */ -const unassigned_code_points = [0x0221, 0x0221, 0x0234, 0x024f, 0x02ae, 0x02af, 0x02ef, 0x02ff, 0x0350, 0x035f, 0x0370, 0x0373, 0x0376, 0x0379, 0x037b, 0x037d, 0x037f, 0x0383, 0x038b, 0x038b, 0x038d, 0x038d, 0x03a2, 0x03a2, 0x03cf, 0x03cf, 0x03f7, 0x03ff, 0x0487, 0x0487, 0x04cf, 0x04cf, 0x04f6, 0x04f7, 0x04fa, 0x04ff, 0x0510, 0x0530, 0x0557, 0x0558, 0x0560, 0x0560, 0x0588, 0x0588, 0x058b, 0x0590, 0x05a2, 0x05a2, 0x05ba, 0x05ba, 0x05c5, 0x05cf, 0x05eb, 0x05ef, 0x05f5, 0x060b, 0x060d, 0x061a, 0x061c, 0x061e, 0x0620, 0x0620, 0x063b, 0x063f, 0x0656, 0x065f, 0x06ee, 0x06ef, 0x06ff, 0x06ff, 0x070e, 0x070e, 0x072d, 0x072f, 0x074b, 0x077f, 0x07b2, 0x0900, 0x0904, 0x0904, 0x093a, 0x093b, 0x094e, 0x094f, 0x0955, 0x0957, 0x0971, 0x0980, 0x0984, 0x0984, 0x098d, 0x098e, 0x0991, 0x0992, 0x09a9, 0x09a9, 0x09b1, 0x09b1, 0x09b3, 0x09b5, 0x09ba, 0x09bb, 0x09bd, 0x09bd, 0x09c5, 0x09c6, 0x09c9, 0x09ca, 0x09ce, 0x09d6, 0x09d8, 0x09db, 0x09de, 0x09de, 0x09e4, 0x09e5, 0x09fb, 0x0a01, 0x0a03, 0x0a04, 0x0a0b, 0x0a0e, 0x0a11, 0x0a12, 0x0a29, 0x0a29, 0x0a31, 0x0a31, 0x0a34, 0x0a34, 0x0a37, 0x0a37, 0x0a3a, 0x0a3b, 0x0a3d, 0x0a3d, 0x0a43, 0x0a46, 0x0a49, 0x0a4a, 0x0a4e, 0x0a58, 0x0a5d, 0x0a5d, 0x0a5f, 0x0a65, 0x0a75, 0x0a80, 0x0a84, 0x0a84, 0x0a8c, 0x0a8c, 0x0a8e, 0x0a8e, 0x0a92, 0x0a92, 0x0aa9, 0x0aa9, 0x0ab1, 0x0ab1, 0x0ab4, 0x0ab4, 0x0aba, 0x0abb, 0x0ac6, 0x0ac6, 0x0aca, 0x0aca, 0x0ace, 0x0acf, 0x0ad1, 0x0adf, 0x0ae1, 0x0ae5, 0x0af0, 0x0b00, 0x0b04, 0x0b04, 0x0b0d, 0x0b0e, 0x0b11, 0x0b12, 0x0b29, 0x0b29, 0x0b31, 0x0b31, 0x0b34, 0x0b35, 0x0b3a, 0x0b3b, 0x0b44, 0x0b46, 0x0b49, 0x0b4a, 0x0b4e, 0x0b55, 0x0b58, 0x0b5b, 0x0b5e, 0x0b5e, 0x0b62, 0x0b65, 0x0b71, 0x0b81, 0x0b84, 0x0b84, 0x0b8b, 0x0b8d, 0x0b91, 0x0b91, 0x0b96, 0x0b98, 0x0b9b, 0x0b9b, 0x0b9d, 0x0b9d, 0x0ba0, 0x0ba2, 0x0ba5, 0x0ba7, 0x0bab, 0x0bad, 0x0bb6, 0x0bb6, 0x0bba, 0x0bbd, 0x0bc3, 0x0bc5, 0x0bc9, 0x0bc9, 0x0bce, 0x0bd6, 0x0bd8, 0x0be6, 0x0bf3, 0x0c00, 0x0c04, 0x0c04, 0x0c0d, 0x0c0d, 0x0c11, 0x0c11, 0x0c29, 0x0c29, 0x0c34, 0x0c34, 0x0c3a, 0x0c3d, 0x0c45, 0x0c45, 0x0c49, 0x0c49, 0x0c4e, 0x0c54, 0x0c57, 0x0c5f, 0x0c62, 0x0c65, 0x0c70, 0x0c81, 0x0c84, 0x0c84, 0x0c8d, 0x0c8d, 0x0c91, 0x0c91, 0x0ca9, 0x0ca9, 0x0cb4, 0x0cb4, 0x0cba, 0x0cbd, 0x0cc5, 0x0cc5, 0x0cc9, 0x0cc9, 0x0cce, 0x0cd4, 0x0cd7, 0x0cdd, 0x0cdf, 0x0cdf, 0x0ce2, 0x0ce5, 0x0cf0, 0x0d01, 0x0d04, 0x0d04, 0x0d0d, 0x0d0d, 0x0d11, 0x0d11, 0x0d29, 0x0d29, 0x0d3a, 0x0d3d, 0x0d44, 0x0d45, 0x0d49, 0x0d49, 0x0d4e, 0x0d56, 0x0d58, 0x0d5f, 0x0d62, 0x0d65, 0x0d70, 0x0d81, 0x0d84, 0x0d84, 0x0d97, 0x0d99, 0x0db2, 0x0db2, 0x0dbc, 0x0dbc, 0x0dbe, 0x0dbf, 0x0dc7, 0x0dc9, 0x0dcb, 0x0dce, 0x0dd5, 0x0dd5, 0x0dd7, 0x0dd7, 0x0de0, 0x0df1, 0x0df5, 0x0e00, 0x0e3b, 0x0e3e, 0x0e5c, 0x0e80, 0x0e83, 0x0e83, 0x0e85, 0x0e86, 0x0e89, 0x0e89, 0x0e8b, 0x0e8c, 0x0e8e, 0x0e93, 0x0e98, 0x0e98, 0x0ea0, 0x0ea0, 0x0ea4, 0x0ea4, 0x0ea6, 0x0ea6, 0x0ea8, 0x0ea9, 0x0eac, 0x0eac, 0x0eba, 0x0eba, 0x0ebe, 0x0ebf, 0x0ec5, 0x0ec5, 0x0ec7, 0x0ec7, 0x0ece, 0x0ecf, 0x0eda, 0x0edb, 0x0ede, 0x0eff, 0x0f48, 0x0f48, 0x0f6b, 0x0f70, 0x0f8c, 0x0f8f, 0x0f98, 0x0f98, 0x0fbd, 0x0fbd, 0x0fcd, 0x0fce, 0x0fd0, 0x0fff, 0x1022, 0x1022, 0x1028, 0x1028, 0x102b, 0x102b, 0x1033, 0x1035, 0x103a, 0x103f, 0x105a, 0x109f, 0x10c6, 0x10cf, 0x10f9, 0x10fa, 0x10fc, 0x10ff, 0x115a, 0x115e, 0x11a3, 0x11a7, 0x11fa, 0x11ff, 0x1207, 0x1207, 0x1247, 0x1247, 0x1249, 0x1249, 0x124e, 0x124f, 0x1257, 0x1257, 0x1259, 0x1259, 0x125e, 0x125f, 0x1287, 0x1287, 0x1289, 0x1289, 0x128e, 0x128f, 0x12af, 0x12af, 0x12b1, 0x12b1, 0x12b6, 0x12b7, 0x12bf, 0x12bf, 0x12c1, 0x12c1, 0x12c6, 0x12c7, 0x12cf, 0x12cf, 0x12d7, 0x12d7, 0x12ef, 0x12ef, 0x130f, 0x130f, 0x1311, 0x1311, 0x1316, 0x1317, 0x131f, 0x131f, 0x1347, 0x1347, 0x135b, 0x1360, 0x137d, 0x139f, 0x13f5, 0x1400, 0x1677, 0x167f, 0x169d, 0x169f, 0x16f1, 0x16ff, 0x170d, 0x170d, 0x1715, 0x171f, 0x1737, 0x173f, 0x1754, 0x175f, 0x176d, 0x176d, 0x1771, 0x1771, 0x1774, 0x177f, 0x17dd, 0x17df, 0x17ea, 0x17ff, 0x180f, 0x180f, 0x181a, 0x181f, 0x1878, 0x187f, 0x18aa, 0x1dff, 0x1e9c, 0x1e9f, 0x1efa, 0x1eff, 0x1f16, 0x1f17, 0x1f1e, 0x1f1f, 0x1f46, 0x1f47, 0x1f4e, 0x1f4f, 0x1f58, 0x1f58, 0x1f5a, 0x1f5a, 0x1f5c, 0x1f5c, 0x1f5e, 0x1f5e, 0x1f7e, 0x1f7f, 0x1fb5, 0x1fb5, 0x1fc5, 0x1fc5, 0x1fd4, 0x1fd5, 0x1fdc, 0x1fdc, 0x1ff0, 0x1ff1, 0x1ff5, 0x1ff5, 0x1fff, 0x1fff, 0x2053, 0x2056, 0x2058, 0x205e, 0x2064, 0x2069, 0x2072, 0x2073, 0x208f, 0x209f, 0x20b2, 0x20cf, 0x20eb, 0x20ff, 0x213b, 0x213c, 0x214c, 0x2152, 0x2184, 0x218f, 0x23cf, 0x23ff, 0x2427, 0x243f, 0x244b, 0x245f, 0x24ff, 0x24ff, 0x2614, 0x2615, 0x2618, 0x2618, 0x267e, 0x267f, 0x268a, 0x2700, 0x2705, 0x2705, 0x270a, 0x270b, 0x2728, 0x2728, 0x274c, 0x274c, 0x274e, 0x274e, 0x2753, 0x2755, 0x2757, 0x2757, 0x275f, 0x2760, 0x2795, 0x2797, 0x27b0, 0x27b0, 0x27bf, 0x27cf, 0x27ec, 0x27ef, 0x2b00, 0x2e7f, 0x2e9a, 0x2e9a, 0x2ef4, 0x2eff, 0x2fd6, 0x2fef, 0x2ffc, 0x2fff, 0x3040, 0x3040, 0x3097, 0x3098, 0x3100, 0x3104, 0x312d, 0x3130, 0x318f, 0x318f, 0x31b8, 0x31ef, 0x321d, 0x321f, 0x3244, 0x3250, 0x327c, 0x327e, 0x32cc, 0x32cf, 0x32ff, 0x32ff, 0x3377, 0x337a, 0x33de, 0x33df, 0x33ff, 0x33ff, 0x4db6, 0x4dff, 0x9fa6, 0x9fff, 0xa48d, 0xa48f, 0xa4c7, 0xabff, 0xd7a4, 0xd7ff, 0xfa2e, 0xfa2f, 0xfa6b, 0xfaff, 0xfb07, 0xfb12, 0xfb18, 0xfb1c, 0xfb37, 0xfb37, 0xfb3d, 0xfb3d, 0xfb3f, 0xfb3f, 0xfb42, 0xfb42, 0xfb45, 0xfb45, 0xfbb2, 0xfbd2, 0xfd40, 0xfd4f, 0xfd90, 0xfd91, 0xfdc8, 0xfdcf, 0xfdfd, 0xfdff, 0xfe10, 0xfe1f, 0xfe24, 0xfe2f, 0xfe47, 0xfe48, 0xfe53, 0xfe53, 0xfe67, 0xfe67, 0xfe6c, 0xfe6f, 0xfe75, 0xfe75, 0xfefd, 0xfefe, 0xff00, 0xff00, 0xffbf, 0xffc1, 0xffc8, 0xffc9, 0xffd0, 0xffd1, 0xffd8, 0xffd9, 0xffdd, 0xffdf, 0xffe7, 0xffe7, 0xffef, 0xfff8, 0x10000, 0x102ff, 0x1031f, 0x1031f, 0x10324, 0x1032f, 0x1034b, 0x103ff, 0x10426, 0x10427, 0x1044e, 0x1cfff, 0x1d0f6, 0x1d0ff, 0x1d127, 0x1d129, 0x1d1de, 0x1d3ff, 0x1d455, 0x1d455, 0x1d49d, 0x1d49d, 0x1d4a0, 0x1d4a1, 0x1d4a3, 0x1d4a4, 0x1d4a7, 0x1d4a8, 0x1d4ad, 0x1d4ad, 0x1d4ba, 0x1d4ba, 0x1d4bc, 0x1d4bc, 0x1d4c1, 0x1d4c1, 0x1d4c4, 0x1d4c4, 0x1d506, 0x1d506, 0x1d50b, 0x1d50c, 0x1d515, 0x1d515, 0x1d51d, 0x1d51d, 0x1d53a, 0x1d53a, 0x1d53f, 0x1d53f, 0x1d545, 0x1d545, 0x1d547, 0x1d549, 0x1d551, 0x1d551, 0x1d6a4, 0x1d6a7, 0x1d7ca, 0x1d7cd, 0x1d800, 0x1fffd, 0x2a6d7, 0x2f7ff, 0x2fa1e, 0x2fffd, 0x30000, 0x3fffd, 0x40000, 0x4fffd, 0x50000, 0x5fffd, 0x60000, 0x6fffd, 0x70000, 0x7fffd, 0x80000, 0x8fffd, 0x90000, 0x9fffd, 0xa0000, 0xafffd, 0xb0000, 0xbfffd, 0xc0000, 0xcfffd, 0xd0000, 0xdfffd, 0xe0000, 0xe0000, 0xe0002, 0xe001f, 0xe0080, 0xefffd]; -// prettier-ignore-end - -const isUnassignedCodePoint = character => inRange(character, unassigned_code_points); - -// prettier-ignore-start -/** - * B.1 Commonly mapped to nothing - * @link https://tools.ietf.org/html/rfc3454#appendix-B.1 - */ -const commonly_mapped_to_nothing = [0x00ad, 0x00ad, 0x034f, 0x034f, 0x1806, 0x1806, 0x180b, 0x180b, 0x180c, 0x180c, 0x180d, 0x180d, 0x200b, 0x200b, 0x200c, 0x200c, 0x200d, 0x200d, 0x2060, 0x2060, 0xfe00, 0xfe00, 0xfe01, 0xfe01, 0xfe02, 0xfe02, 0xfe03, 0xfe03, 0xfe04, 0xfe04, 0xfe05, 0xfe05, 0xfe06, 0xfe06, 0xfe07, 0xfe07, 0xfe08, 0xfe08, 0xfe09, 0xfe09, 0xfe0a, 0xfe0a, 0xfe0b, 0xfe0b, 0xfe0c, 0xfe0c, 0xfe0d, 0xfe0d, 0xfe0e, 0xfe0e, 0xfe0f, 0xfe0f, 0xfeff, 0xfeff]; -// prettier-ignore-end - -const isCommonlyMappedToNothing = character => inRange(character, commonly_mapped_to_nothing); - -// prettier-ignore-start -/** - * C.1.2 Non-ASCII space characters - * @link https://tools.ietf.org/html/rfc3454#appendix-C.1.2 - */ -const non_ASCII_space_characters = [0x00a0, 0x00a0 /* NO-BREAK SPACE */, 0x1680, 0x1680 /* OGHAM SPACE MARK */, 0x2000, 0x2000 /* EN QUAD */, 0x2001, 0x2001 /* EM QUAD */, 0x2002, 0x2002 /* EN SPACE */, 0x2003, 0x2003 /* EM SPACE */, 0x2004, 0x2004 /* THREE-PER-EM SPACE */, 0x2005, 0x2005 /* FOUR-PER-EM SPACE */, 0x2006, 0x2006 /* SIX-PER-EM SPACE */, 0x2007, 0x2007 /* FIGURE SPACE */, 0x2008, 0x2008 /* PUNCTUATION SPACE */, 0x2009, 0x2009 /* THIN SPACE */, 0x200a, 0x200a /* HAIR SPACE */, 0x200b, 0x200b /* ZERO WIDTH SPACE */, 0x202f, 0x202f /* NARROW NO-BREAK SPACE */, 0x205f, 0x205f /* MEDIUM MATHEMATICAL SPACE */, 0x3000, 0x3000 /* IDEOGRAPHIC SPACE */]; -// prettier-ignore-end - -const isNonASCIISpaceCharacter = character => inRange(character, non_ASCII_space_characters); - -// prettier-ignore-start -const non_ASCII_controls_characters = [ -/** - * C.2.2 Non-ASCII control characters - * @link https://tools.ietf.org/html/rfc3454#appendix-C.2.2 - */ -0x0080, 0x009f /* [CONTROL CHARACTERS] */, 0x06dd, 0x06dd /* ARABIC END OF AYAH */, 0x070f, 0x070f /* SYRIAC ABBREVIATION MARK */, 0x180e, 0x180e /* MONGOLIAN VOWEL SEPARATOR */, 0x200c, 0x200c /* ZERO WIDTH NON-JOINER */, 0x200d, 0x200d /* ZERO WIDTH JOINER */, 0x2028, 0x2028 /* LINE SEPARATOR */, 0x2029, 0x2029 /* PARAGRAPH SEPARATOR */, 0x2060, 0x2060 /* WORD JOINER */, 0x2061, 0x2061 /* FUNCTION APPLICATION */, 0x2062, 0x2062 /* INVISIBLE TIMES */, 0x2063, 0x2063 /* INVISIBLE SEPARATOR */, 0x206a, 0x206f /* [CONTROL CHARACTERS] */, 0xfeff, 0xfeff /* ZERO WIDTH NO-BREAK SPACE */, 0xfff9, 0xfffc /* [CONTROL CHARACTERS] */, 0x1d173, 0x1d17a /* [MUSICAL CONTROL CHARACTERS] */]; -const non_character_codepoints = [ -/** - * C.4 Non-character code points - * @link https://tools.ietf.org/html/rfc3454#appendix-C.4 - */ -0xfdd0, 0xfdef /* [NONCHARACTER CODE POINTS] */, 0xfffe, 0xffff /* [NONCHARACTER CODE POINTS] */, 0x1fffe, 0x1ffff /* [NONCHARACTER CODE POINTS] */, 0x2fffe, 0x2ffff /* [NONCHARACTER CODE POINTS] */, 0x3fffe, 0x3ffff /* [NONCHARACTER CODE POINTS] */, 0x4fffe, 0x4ffff /* [NONCHARACTER CODE POINTS] */, 0x5fffe, 0x5ffff /* [NONCHARACTER CODE POINTS] */, 0x6fffe, 0x6ffff /* [NONCHARACTER CODE POINTS] */, 0x7fffe, 0x7ffff /* [NONCHARACTER CODE POINTS] */, 0x8fffe, 0x8ffff /* [NONCHARACTER CODE POINTS] */, 0x9fffe, 0x9ffff /* [NONCHARACTER CODE POINTS] */, 0xafffe, 0xaffff /* [NONCHARACTER CODE POINTS] */, 0xbfffe, 0xbffff /* [NONCHARACTER CODE POINTS] */, 0xcfffe, 0xcffff /* [NONCHARACTER CODE POINTS] */, 0xdfffe, 0xdffff /* [NONCHARACTER CODE POINTS] */, 0xefffe, 0xeffff /* [NONCHARACTER CODE POINTS] */, 0x10fffe, 0x10ffff /* [NONCHARACTER CODE POINTS] */]; - -/** - * 2.3. Prohibited Output - */ -const prohibited_characters = [ -/** - * C.2.1 ASCII control characters - * @link https://tools.ietf.org/html/rfc3454#appendix-C.2.1 - */ -0, 0x001f /* [CONTROL CHARACTERS] */, 0x007f, 0x007f /* DELETE */, -/** - * C.8 Change display properties or are deprecated - * @link https://tools.ietf.org/html/rfc3454#appendix-C.8 - */ -0x0340, 0x0340 /* COMBINING GRAVE TONE MARK */, 0x0341, 0x0341 /* COMBINING ACUTE TONE MARK */, 0x200e, 0x200e /* LEFT-TO-RIGHT MARK */, 0x200f, 0x200f /* RIGHT-TO-LEFT MARK */, 0x202a, 0x202a /* LEFT-TO-RIGHT EMBEDDING */, 0x202b, 0x202b /* RIGHT-TO-LEFT EMBEDDING */, 0x202c, 0x202c /* POP DIRECTIONAL FORMATTING */, 0x202d, 0x202d /* LEFT-TO-RIGHT OVERRIDE */, 0x202e, 0x202e /* RIGHT-TO-LEFT OVERRIDE */, 0x206a, 0x206a /* INHIBIT SYMMETRIC SWAPPING */, 0x206b, 0x206b /* ACTIVATE SYMMETRIC SWAPPING */, 0x206c, 0x206c /* INHIBIT ARABIC FORM SHAPING */, 0x206d, 0x206d /* ACTIVATE ARABIC FORM SHAPING */, 0x206e, 0x206e /* NATIONAL DIGIT SHAPES */, 0x206f, 0x206f /* NOMINAL DIGIT SHAPES */, -/** - * C.7 Inappropriate for canonical representation - * @link https://tools.ietf.org/html/rfc3454#appendix-C.7 - */ -0x2ff0, 0x2ffb /* [IDEOGRAPHIC DESCRIPTION CHARACTERS] */, -/** - * C.5 Surrogate codes - * @link https://tools.ietf.org/html/rfc3454#appendix-C.5 - */ -0xd800, 0xdfff, -/** - * C.3 Private use - * @link https://tools.ietf.org/html/rfc3454#appendix-C.3 - */ -0xe000, 0xf8ff /* [PRIVATE USE, PLANE 0] */, -/** - * C.6 Inappropriate for plain text - * @link https://tools.ietf.org/html/rfc3454#appendix-C.6 - */ -0xfff9, 0xfff9 /* INTERLINEAR ANNOTATION ANCHOR */, 0xfffa, 0xfffa /* INTERLINEAR ANNOTATION SEPARATOR */, 0xfffb, 0xfffb /* INTERLINEAR ANNOTATION TERMINATOR */, 0xfffc, 0xfffc /* OBJECT REPLACEMENT CHARACTER */, 0xfffd, 0xfffd /* REPLACEMENT CHARACTER */, -/** - * C.9 Tagging characters - * @link https://tools.ietf.org/html/rfc3454#appendix-C.9 - */ -0xe0001, 0xe0001 /* LANGUAGE TAG */, 0xe0020, 0xe007f /* [TAGGING CHARACTERS] */, -/** - * C.3 Private use - * @link https://tools.ietf.org/html/rfc3454#appendix-C.3 - */ - -0xf0000, 0xffffd /* [PRIVATE USE, PLANE 15] */, 0x100000, 0x10fffd /* [PRIVATE USE, PLANE 16] */]; -// prettier-ignore-end - -const isProhibitedCharacter = character => inRange(character, non_ASCII_space_characters) || inRange(character, prohibited_characters) || inRange(character, non_ASCII_controls_characters) || inRange(character, non_character_codepoints); - -// prettier-ignore-start -/** - * D.1 Characters with bidirectional property "R" or "AL" - * @link https://tools.ietf.org/html/rfc3454#appendix-D.1 - */ -const bidirectional_r_al = [0x05be, 0x05be, 0x05c0, 0x05c0, 0x05c3, 0x05c3, 0x05d0, 0x05ea, 0x05f0, 0x05f4, 0x061b, 0x061b, 0x061f, 0x061f, 0x0621, 0x063a, 0x0640, 0x064a, 0x066d, 0x066f, 0x0671, 0x06d5, 0x06dd, 0x06dd, 0x06e5, 0x06e6, 0x06fa, 0x06fe, 0x0700, 0x070d, 0x0710, 0x0710, 0x0712, 0x072c, 0x0780, 0x07a5, 0x07b1, 0x07b1, 0x200f, 0x200f, 0xfb1d, 0xfb1d, 0xfb1f, 0xfb28, 0xfb2a, 0xfb36, 0xfb38, 0xfb3c, 0xfb3e, 0xfb3e, 0xfb40, 0xfb41, 0xfb43, 0xfb44, 0xfb46, 0xfbb1, 0xfbd3, 0xfd3d, 0xfd50, 0xfd8f, 0xfd92, 0xfdc7, 0xfdf0, 0xfdfc, 0xfe70, 0xfe74, 0xfe76, 0xfefc]; -// prettier-ignore-end - -const isBidirectionalRAL = character => inRange(character, bidirectional_r_al); - -// prettier-ignore-start -/** - * D.2 Characters with bidirectional property "L" - * @link https://tools.ietf.org/html/rfc3454#appendix-D.2 - */ -const bidirectional_l = [0x0041, 0x005a, 0x0061, 0x007a, 0x00aa, 0x00aa, 0x00b5, 0x00b5, 0x00ba, 0x00ba, 0x00c0, 0x00d6, 0x00d8, 0x00f6, 0x00f8, 0x0220, 0x0222, 0x0233, 0x0250, 0x02ad, 0x02b0, 0x02b8, 0x02bb, 0x02c1, 0x02d0, 0x02d1, 0x02e0, 0x02e4, 0x02ee, 0x02ee, 0x037a, 0x037a, 0x0386, 0x0386, 0x0388, 0x038a, 0x038c, 0x038c, 0x038e, 0x03a1, 0x03a3, 0x03ce, 0x03d0, 0x03f5, 0x0400, 0x0482, 0x048a, 0x04ce, 0x04d0, 0x04f5, 0x04f8, 0x04f9, 0x0500, 0x050f, 0x0531, 0x0556, 0x0559, 0x055f, 0x0561, 0x0587, 0x0589, 0x0589, 0x0903, 0x0903, 0x0905, 0x0939, 0x093d, 0x0940, 0x0949, 0x094c, 0x0950, 0x0950, 0x0958, 0x0961, 0x0964, 0x0970, 0x0982, 0x0983, 0x0985, 0x098c, 0x098f, 0x0990, 0x0993, 0x09a8, 0x09aa, 0x09b0, 0x09b2, 0x09b2, 0x09b6, 0x09b9, 0x09be, 0x09c0, 0x09c7, 0x09c8, 0x09cb, 0x09cc, 0x09d7, 0x09d7, 0x09dc, 0x09dd, 0x09df, 0x09e1, 0x09e6, 0x09f1, 0x09f4, 0x09fa, 0x0a05, 0x0a0a, 0x0a0f, 0x0a10, 0x0a13, 0x0a28, 0x0a2a, 0x0a30, 0x0a32, 0x0a33, 0x0a35, 0x0a36, 0x0a38, 0x0a39, 0x0a3e, 0x0a40, 0x0a59, 0x0a5c, 0x0a5e, 0x0a5e, 0x0a66, 0x0a6f, 0x0a72, 0x0a74, 0x0a83, 0x0a83, 0x0a85, 0x0a8b, 0x0a8d, 0x0a8d, 0x0a8f, 0x0a91, 0x0a93, 0x0aa8, 0x0aaa, 0x0ab0, 0x0ab2, 0x0ab3, 0x0ab5, 0x0ab9, 0x0abd, 0x0ac0, 0x0ac9, 0x0ac9, 0x0acb, 0x0acc, 0x0ad0, 0x0ad0, 0x0ae0, 0x0ae0, 0x0ae6, 0x0aef, 0x0b02, 0x0b03, 0x0b05, 0x0b0c, 0x0b0f, 0x0b10, 0x0b13, 0x0b28, 0x0b2a, 0x0b30, 0x0b32, 0x0b33, 0x0b36, 0x0b39, 0x0b3d, 0x0b3e, 0x0b40, 0x0b40, 0x0b47, 0x0b48, 0x0b4b, 0x0b4c, 0x0b57, 0x0b57, 0x0b5c, 0x0b5d, 0x0b5f, 0x0b61, 0x0b66, 0x0b70, 0x0b83, 0x0b83, 0x0b85, 0x0b8a, 0x0b8e, 0x0b90, 0x0b92, 0x0b95, 0x0b99, 0x0b9a, 0x0b9c, 0x0b9c, 0x0b9e, 0x0b9f, 0x0ba3, 0x0ba4, 0x0ba8, 0x0baa, 0x0bae, 0x0bb5, 0x0bb7, 0x0bb9, 0x0bbe, 0x0bbf, 0x0bc1, 0x0bc2, 0x0bc6, 0x0bc8, 0x0bca, 0x0bcc, 0x0bd7, 0x0bd7, 0x0be7, 0x0bf2, 0x0c01, 0x0c03, 0x0c05, 0x0c0c, 0x0c0e, 0x0c10, 0x0c12, 0x0c28, 0x0c2a, 0x0c33, 0x0c35, 0x0c39, 0x0c41, 0x0c44, 0x0c60, 0x0c61, 0x0c66, 0x0c6f, 0x0c82, 0x0c83, 0x0c85, 0x0c8c, 0x0c8e, 0x0c90, 0x0c92, 0x0ca8, 0x0caa, 0x0cb3, 0x0cb5, 0x0cb9, 0x0cbe, 0x0cbe, 0x0cc0, 0x0cc4, 0x0cc7, 0x0cc8, 0x0cca, 0x0ccb, 0x0cd5, 0x0cd6, 0x0cde, 0x0cde, 0x0ce0, 0x0ce1, 0x0ce6, 0x0cef, 0x0d02, 0x0d03, 0x0d05, 0x0d0c, 0x0d0e, 0x0d10, 0x0d12, 0x0d28, 0x0d2a, 0x0d39, 0x0d3e, 0x0d40, 0x0d46, 0x0d48, 0x0d4a, 0x0d4c, 0x0d57, 0x0d57, 0x0d60, 0x0d61, 0x0d66, 0x0d6f, 0x0d82, 0x0d83, 0x0d85, 0x0d96, 0x0d9a, 0x0db1, 0x0db3, 0x0dbb, 0x0dbd, 0x0dbd, 0x0dc0, 0x0dc6, 0x0dcf, 0x0dd1, 0x0dd8, 0x0ddf, 0x0df2, 0x0df4, 0x0e01, 0x0e30, 0x0e32, 0x0e33, 0x0e40, 0x0e46, 0x0e4f, 0x0e5b, 0x0e81, 0x0e82, 0x0e84, 0x0e84, 0x0e87, 0x0e88, 0x0e8a, 0x0e8a, 0x0e8d, 0x0e8d, 0x0e94, 0x0e97, 0x0e99, 0x0e9f, 0x0ea1, 0x0ea3, 0x0ea5, 0x0ea5, 0x0ea7, 0x0ea7, 0x0eaa, 0x0eab, 0x0ead, 0x0eb0, 0x0eb2, 0x0eb3, 0x0ebd, 0x0ebd, 0x0ec0, 0x0ec4, 0x0ec6, 0x0ec6, 0x0ed0, 0x0ed9, 0x0edc, 0x0edd, 0x0f00, 0x0f17, 0x0f1a, 0x0f34, 0x0f36, 0x0f36, 0x0f38, 0x0f38, 0x0f3e, 0x0f47, 0x0f49, 0x0f6a, 0x0f7f, 0x0f7f, 0x0f85, 0x0f85, 0x0f88, 0x0f8b, 0x0fbe, 0x0fc5, 0x0fc7, 0x0fcc, 0x0fcf, 0x0fcf, 0x1000, 0x1021, 0x1023, 0x1027, 0x1029, 0x102a, 0x102c, 0x102c, 0x1031, 0x1031, 0x1038, 0x1038, 0x1040, 0x1057, 0x10a0, 0x10c5, 0x10d0, 0x10f8, 0x10fb, 0x10fb, 0x1100, 0x1159, 0x115f, 0x11a2, 0x11a8, 0x11f9, 0x1200, 0x1206, 0x1208, 0x1246, 0x1248, 0x1248, 0x124a, 0x124d, 0x1250, 0x1256, 0x1258, 0x1258, 0x125a, 0x125d, 0x1260, 0x1286, 0x1288, 0x1288, 0x128a, 0x128d, 0x1290, 0x12ae, 0x12b0, 0x12b0, 0x12b2, 0x12b5, 0x12b8, 0x12be, 0x12c0, 0x12c0, 0x12c2, 0x12c5, 0x12c8, 0x12ce, 0x12d0, 0x12d6, 0x12d8, 0x12ee, 0x12f0, 0x130e, 0x1310, 0x1310, 0x1312, 0x1315, 0x1318, 0x131e, 0x1320, 0x1346, 0x1348, 0x135a, 0x1361, 0x137c, 0x13a0, 0x13f4, 0x1401, 0x1676, 0x1681, 0x169a, 0x16a0, 0x16f0, 0x1700, 0x170c, 0x170e, 0x1711, 0x1720, 0x1731, 0x1735, 0x1736, 0x1740, 0x1751, 0x1760, 0x176c, 0x176e, 0x1770, 0x1780, 0x17b6, 0x17be, 0x17c5, 0x17c7, 0x17c8, 0x17d4, 0x17da, 0x17dc, 0x17dc, 0x17e0, 0x17e9, 0x1810, 0x1819, 0x1820, 0x1877, 0x1880, 0x18a8, 0x1e00, 0x1e9b, 0x1ea0, 0x1ef9, 0x1f00, 0x1f15, 0x1f18, 0x1f1d, 0x1f20, 0x1f45, 0x1f48, 0x1f4d, 0x1f50, 0x1f57, 0x1f59, 0x1f59, 0x1f5b, 0x1f5b, 0x1f5d, 0x1f5d, 0x1f5f, 0x1f7d, 0x1f80, 0x1fb4, 0x1fb6, 0x1fbc, 0x1fbe, 0x1fbe, 0x1fc2, 0x1fc4, 0x1fc6, 0x1fcc, 0x1fd0, 0x1fd3, 0x1fd6, 0x1fdb, 0x1fe0, 0x1fec, 0x1ff2, 0x1ff4, 0x1ff6, 0x1ffc, 0x200e, 0x200e, 0x2071, 0x2071, 0x207f, 0x207f, 0x2102, 0x2102, 0x2107, 0x2107, 0x210a, 0x2113, 0x2115, 0x2115, 0x2119, 0x211d, 0x2124, 0x2124, 0x2126, 0x2126, 0x2128, 0x2128, 0x212a, 0x212d, 0x212f, 0x2131, 0x2133, 0x2139, 0x213d, 0x213f, 0x2145, 0x2149, 0x2160, 0x2183, 0x2336, 0x237a, 0x2395, 0x2395, 0x249c, 0x24e9, 0x3005, 0x3007, 0x3021, 0x3029, 0x3031, 0x3035, 0x3038, 0x303c, 0x3041, 0x3096, 0x309d, 0x309f, 0x30a1, 0x30fa, 0x30fc, 0x30ff, 0x3105, 0x312c, 0x3131, 0x318e, 0x3190, 0x31b7, 0x31f0, 0x321c, 0x3220, 0x3243, 0x3260, 0x327b, 0x327f, 0x32b0, 0x32c0, 0x32cb, 0x32d0, 0x32fe, 0x3300, 0x3376, 0x337b, 0x33dd, 0x33e0, 0x33fe, 0x3400, 0x4db5, 0x4e00, 0x9fa5, 0xa000, 0xa48c, 0xac00, 0xd7a3, 0xd800, 0xfa2d, 0xfa30, 0xfa6a, 0xfb00, 0xfb06, 0xfb13, 0xfb17, 0xff21, 0xff3a, 0xff41, 0xff5a, 0xff66, 0xffbe, 0xffc2, 0xffc7, 0xffca, 0xffcf, 0xffd2, 0xffd7, 0xffda, 0xffdc, 0x10300, 0x1031e, 0x10320, 0x10323, 0x10330, 0x1034a, 0x10400, 0x10425, 0x10428, 0x1044d, 0x1d000, 0x1d0f5, 0x1d100, 0x1d126, 0x1d12a, 0x1d166, 0x1d16a, 0x1d172, 0x1d183, 0x1d184, 0x1d18c, 0x1d1a9, 0x1d1ae, 0x1d1dd, 0x1d400, 0x1d454, 0x1d456, 0x1d49c, 0x1d49e, 0x1d49f, 0x1d4a2, 0x1d4a2, 0x1d4a5, 0x1d4a6, 0x1d4a9, 0x1d4ac, 0x1d4ae, 0x1d4b9, 0x1d4bb, 0x1d4bb, 0x1d4bd, 0x1d4c0, 0x1d4c2, 0x1d4c3, 0x1d4c5, 0x1d505, 0x1d507, 0x1d50a, 0x1d50d, 0x1d514, 0x1d516, 0x1d51c, 0x1d51e, 0x1d539, 0x1d53b, 0x1d53e, 0x1d540, 0x1d544, 0x1d546, 0x1d546, 0x1d54a, 0x1d550, 0x1d552, 0x1d6a3, 0x1d6a8, 0x1d7c9, 0x20000, 0x2a6d6, 0x2f800, 0x2fa1d, 0xf0000, 0xffffd, 0x100000, 0x10fffd]; -// prettier-ignore-end - -const isBidirectionalL = character => inRange(character, bidirectional_l); - -// 2.1. Mapping - -/** - * non-ASCII space characters [StringPrep, C.1.2] that can be - * mapped to SPACE (U+0020) - */ -const mapping2space = isNonASCIISpaceCharacter; - -/** - * the "commonly mapped to nothing" characters [StringPrep, B.1] - * that can be mapped to nothing. - */ -const mapping2nothing = isCommonlyMappedToNothing; - -// utils -const getCodePoint = character => character.codePointAt(0); -const first = x => x[0]; -const last = x => x[x.length - 1]; - -/** - * Convert provided string into an array of Unicode Code Points. - * Based on https://stackoverflow.com/a/21409165/1556249 - * and https://www.npmjs.com/package/code-point-at. - * @param {string} input - * @returns {number[]} - */ -function toCodePoints(input) { - const codepoints = []; - const size = input.length; - for (let i = 0; i < size; i += 1) { - const before = input.charCodeAt(i); - if (before >= 0xd800 && before <= 0xdbff && size > i + 1) { - const next = input.charCodeAt(i + 1); - if (next >= 0xdc00 && next <= 0xdfff) { - codepoints.push((before - 0xd800) * 0x400 + next - 0xdc00 + 0x10000); - i += 1; - continue; - } - } - codepoints.push(before); - } - return codepoints; -} - -/** - * SASLprep. - * @param {string} input - * @param {Object} opts - * @param {boolean} opts.allowUnassigned - * @returns {string} - */ -function saslprep(input, opts) { - if (opts === void 0) { - opts = {}; - } - if (typeof input !== 'string') { - throw new TypeError('Expected string.'); - } - if (input.length === 0) { - return ''; - } - - // 1. Map - const mapped_input = toCodePoints(input) - // 1.1 mapping to space - .map(character => mapping2space(character) ? 0x20 : character) - // 1.2 mapping to nothing - .filter(character => !mapping2nothing(character)); - - // 2. Normalize - const normalized_input = String.fromCodePoint.apply(null, mapped_input).normalize('NFKC'); - const normalized_map = toCodePoints(normalized_input); - - // 3. Prohibit - const hasProhibited = normalized_map.some(isProhibitedCharacter); - if (hasProhibited) { - throw new Error('Prohibited character, see https://tools.ietf.org/html/rfc4013#section-2.3'); - } - - // Unassigned Code Points - if (opts.allowUnassigned !== true) { - const hasUnassigned = normalized_map.some(isUnassignedCodePoint); - if (hasUnassigned) { - throw new Error('Unassigned code point, see https://tools.ietf.org/html/rfc4013#section-2.5'); - } - } - - // 4. check bidi - - const hasBidiRAL = normalized_map.some(isBidirectionalRAL); - const hasBidiL = normalized_map.some(isBidirectionalL); - - // 4.1 If a string contains any RandALCat character, the string MUST NOT - // contain any LCat character. - if (hasBidiRAL && hasBidiL) { - throw new Error('String must not contain RandALCat and LCat at the same time,' + ' see https://tools.ietf.org/html/rfc3454#section-6'); - } - - /** - * 4.2 If a string contains any RandALCat character, a RandALCat - * character MUST be the first character of the string, and a - * RandALCat character MUST be the last character of the string. - */ - - const isFirstBidiRAL = isBidirectionalRAL(getCodePoint(first(normalized_input))); - const isLastBidiRAL = isBidirectionalRAL(getCodePoint(last(normalized_input))); - if (hasBidiRAL && !(isFirstBidiRAL && isLastBidiRAL)) { - throw new Error('Bidirectional RandALCat character must be the first and the last' + ' character of the string, see https://tools.ietf.org/html/rfc3454#section-6'); - } - return normalized_input; -} - -/* - PDFSecurity - represents PDF security settings - By Yang Liu - */ - -function concatBytes() { - for (var _len = arguments.length, arrays = new Array(_len), _key = 0; _key < _len; _key++) { - arrays[_key] = arguments[_key]; - } - const length = arrays.reduce((a, b) => a + b.length, 0); - const result = new Uint8Array(length); - let offset = 0; - for (const arr of arrays) { - result.set(arr, offset); - offset += arr.length; - } - return result; -} -class PDFSecurity { - static generateFileID(info) { - if (info === void 0) { - info = {}; - } - let infoStr = `${info.CreationDate.getTime()}\n`; - for (let key in info) { - // eslint-disable-next-line no-prototype-builtins - if (!info.hasOwnProperty(key)) { - continue; - } - infoStr += `${key}: ${info[key].valueOf()}\n`; - } - return Buffer.from(md5Hash(infoStr)); - } - static generateRandomWordArray(bytes) { - return randomBytes(bytes); - } - static create(document, options) { - if (options === void 0) { - options = {}; - } - if (!options.ownerPassword && !options.userPassword) { - return null; - } - return new PDFSecurity(document, options); - } - constructor(document, options) { - if (options === void 0) { - options = {}; - } - if (!options.ownerPassword && !options.userPassword) { - throw new Error('None of owner password and user password is defined.'); - } - this.document = document; - this._setupEncryption(options); - } - _setupEncryption(options) { - switch (options.pdfVersion) { - case '1.4': - case '1.5': - this.version = 2; - break; - case '1.6': - case '1.7': - this.version = 4; - break; - case '1.7ext3': - this.version = 5; - break; - default: - this.version = 1; - break; - } - const encDict = { - Filter: 'Standard' - }; - switch (this.version) { - case 1: - case 2: - case 4: - this._setupEncryptionV1V2V4(this.version, encDict, options); - break; - case 5: - this._setupEncryptionV5(encDict, options); - break; - } - this.dictionary = this.document.ref(encDict); - } - _setupEncryptionV1V2V4(v, encDict, options) { - let r, permissions; - switch (v) { - case 1: - r = 2; - this.keyBits = 40; - permissions = getPermissionsR2(options.permissions); - break; - case 2: - r = 3; - this.keyBits = 128; - permissions = getPermissionsR3(options.permissions); - break; - case 4: - r = 4; - this.keyBits = 128; - permissions = getPermissionsR3(options.permissions); - break; - } - const paddedUserPassword = processPasswordR2R3R4(options.userPassword); - const paddedOwnerPassword = options.ownerPassword ? processPasswordR2R3R4(options.ownerPassword) : paddedUserPassword; - const ownerPasswordEntry = getOwnerPasswordR2R3R4(r, this.keyBits, paddedUserPassword, paddedOwnerPassword); - this.encryptionKey = getEncryptionKeyR2R3R4(r, this.keyBits, this.document._id, paddedUserPassword, ownerPasswordEntry, permissions); - let userPasswordEntry; - if (r === 2) { - userPasswordEntry = getUserPasswordR2(this.encryptionKey); - } else { - userPasswordEntry = getUserPasswordR3R4(this.document._id, this.encryptionKey); - } - encDict.V = v; - if (v >= 2) { - encDict.Length = this.keyBits; - } - if (v === 4) { - encDict.CF = { - StdCF: { - AuthEvent: 'DocOpen', - CFM: 'AESV2', - Length: this.keyBits / 8 - } - }; - encDict.StmF = 'StdCF'; - encDict.StrF = 'StdCF'; - } - encDict.R = r; - encDict.O = Buffer.from(ownerPasswordEntry); - encDict.U = Buffer.from(userPasswordEntry); - encDict.P = permissions; - } - _setupEncryptionV5(encDict, options) { - this.keyBits = 256; - const permissions = getPermissionsR3(options.permissions); - const processedUserPassword = processPasswordR5(options.userPassword); - const processedOwnerPassword = options.ownerPassword ? processPasswordR5(options.ownerPassword) : processedUserPassword; - this.encryptionKey = getEncryptionKeyR5(PDFSecurity.generateRandomWordArray); - const userPasswordEntry = getUserPasswordR5(processedUserPassword, PDFSecurity.generateRandomWordArray); - const userKeySalt = userPasswordEntry.slice(40, 48); - const userEncryptionKeyEntry = getUserEncryptionKeyR5(processedUserPassword, userKeySalt, this.encryptionKey); - const ownerPasswordEntry = getOwnerPasswordR5(processedOwnerPassword, userPasswordEntry, PDFSecurity.generateRandomWordArray); - const ownerKeySalt = ownerPasswordEntry.slice(40, 48); - const ownerEncryptionKeyEntry = getOwnerEncryptionKeyR5(processedOwnerPassword, ownerKeySalt, userPasswordEntry, this.encryptionKey); - const permsEntry = getEncryptedPermissionsR5(permissions, this.encryptionKey, PDFSecurity.generateRandomWordArray); - encDict.V = 5; - encDict.Length = this.keyBits; - encDict.CF = { - StdCF: { - AuthEvent: 'DocOpen', - CFM: 'AESV3', - Length: this.keyBits / 8 - } - }; - encDict.StmF = 'StdCF'; - encDict.StrF = 'StdCF'; - encDict.R = 5; - encDict.O = Buffer.from(ownerPasswordEntry); - encDict.OE = Buffer.from(ownerEncryptionKeyEntry); - encDict.U = Buffer.from(userPasswordEntry); - encDict.UE = Buffer.from(userEncryptionKeyEntry); - encDict.P = permissions; - encDict.Perms = Buffer.from(permsEntry); - } - getEncryptFn(obj, gen) { - let digest; - if (this.version < 5) { - // Create 5-byte object/generation number suffix - const suffix = new Uint8Array([obj & 0xff, obj >> 8 & 0xff, obj >> 16 & 0xff, gen & 0xff, gen >> 8 & 0xff]); - digest = concatBytes(this.encryptionKey, suffix); - } - if (this.version === 1 || this.version === 2) { - let key = md5Hash(digest); - const keyLen = Math.min(16, this.keyBits / 8 + 5); - key = key.slice(0, keyLen); - return buffer => Buffer.from(rc4(new Uint8Array(buffer), key)); - } - let key; - if (this.version === 4) { - // Append "sAlT" marker for AES - const saltMarker = new Uint8Array([0x73, 0x41, 0x6c, 0x54]); - key = md5Hash(concatBytes(digest, saltMarker)); - } else { - key = this.encryptionKey; - } - const iv = PDFSecurity.generateRandomWordArray(16); - return buffer => { - const encrypted = aesCbcEncrypt(new Uint8Array(buffer), key, iv, true); - return Buffer.from(concatBytes(iv, encrypted)); - }; - } - end() { - this.dictionary.end(); - } -} -function getPermissionsR2(permissionObject) { - if (permissionObject === void 0) { - permissionObject = {}; - } - let permissions = 0xffffffc0 >> 0; - if (permissionObject.printing) { - permissions |= 0b000000000100; - } - if (permissionObject.modifying) { - permissions |= 0b000000001000; - } - if (permissionObject.copying) { - permissions |= 0b000000010000; - } - if (permissionObject.annotating) { - permissions |= 0b000000100000; - } - return permissions; -} -function getPermissionsR3(permissionObject) { - if (permissionObject === void 0) { - permissionObject = {}; - } - let permissions = 0xfffff0c0 >> 0; - if (permissionObject.printing === 'lowResolution') { - permissions |= 0b000000000100; - } - if (permissionObject.printing === 'highResolution') { - permissions |= 0b100000000100; - } - if (permissionObject.modifying) { - permissions |= 0b000000001000; - } - if (permissionObject.copying) { - permissions |= 0b000000010000; - } - if (permissionObject.annotating) { - permissions |= 0b000000100000; - } - if (permissionObject.fillingForms) { - permissions |= 0b000100000000; - } - if (permissionObject.contentAccessibility) { - permissions |= 0b001000000000; - } - if (permissionObject.documentAssembly) { - permissions |= 0b010000000000; - } - return permissions; -} -function getUserPasswordR2(encryptionKey) { - return rc4(processPasswordR2R3R4(), encryptionKey); -} -function getUserPasswordR3R4(documentId, encryptionKey) { - const key = encryptionKey.slice(); - let cipher = md5Hash(concatBytes(processPasswordR2R3R4(), new Uint8Array(documentId))); - for (let i = 0; i < 20; i++) { - const xorKey = new Uint8Array(key.length); - for (let j = 0; j < key.length; j++) { - xorKey[j] = encryptionKey[j] ^ i; - } - cipher = rc4(cipher, xorKey); - } - // Pad to 32 bytes - const result = new Uint8Array(32); - result.set(cipher); - return result; -} -function getOwnerPasswordR2R3R4(r, keyBits, paddedUserPassword, paddedOwnerPassword) { - let digest = paddedOwnerPassword; - let round = r >= 3 ? 51 : 1; - for (let i = 0; i < round; i++) { - digest = md5Hash(digest); - } - const keyLen = keyBits / 8; - let key = digest.slice(0, keyLen); - let cipher = paddedUserPassword; - round = r >= 3 ? 20 : 1; - for (let i = 0; i < round; i++) { - const xorKey = new Uint8Array(keyLen); - for (let j = 0; j < keyLen; j++) { - xorKey[j] = key[j] ^ i; - } - cipher = rc4(cipher, xorKey); - } - return cipher; -} -function getEncryptionKeyR2R3R4(r, keyBits, documentId, paddedUserPassword, ownerPasswordEntry, permissions) { - // Build input: password + owner entry + permissions (LSB first) + document ID - const permBytes = new Uint8Array([permissions & 0xff, permissions >> 8 & 0xff, permissions >> 16 & 0xff, permissions >> 24 & 0xff]); - let key = concatBytes(paddedUserPassword, ownerPasswordEntry, permBytes, new Uint8Array(documentId)); - const round = r >= 3 ? 51 : 1; - const keyLen = keyBits / 8; - for (let i = 0; i < round; i++) { - key = md5Hash(key); - key = key.slice(0, keyLen); - } - return key; -} -function getUserPasswordR5(processedUserPassword, generateRandomWordArray) { - const validationSalt = generateRandomWordArray(8); - const keySalt = generateRandomWordArray(8); - const hash = sha256Hash(concatBytes(processedUserPassword, validationSalt)); - return concatBytes(hash, validationSalt, keySalt); -} -function getUserEncryptionKeyR5(processedUserPassword, userKeySalt, encryptionKey) { - const key = sha256Hash(concatBytes(processedUserPassword, userKeySalt)); - const iv = new Uint8Array(16); // Zero IV - return aesCbcEncrypt(encryptionKey, key, iv, false); -} -function getOwnerPasswordR5(processedOwnerPassword, userPasswordEntry, generateRandomWordArray) { - const validationSalt = generateRandomWordArray(8); - const keySalt = generateRandomWordArray(8); - const hash = sha256Hash(concatBytes(processedOwnerPassword, validationSalt, userPasswordEntry)); - return concatBytes(hash, validationSalt, keySalt); -} -function getOwnerEncryptionKeyR5(processedOwnerPassword, ownerKeySalt, userPasswordEntry, encryptionKey) { - const key = sha256Hash(concatBytes(processedOwnerPassword, ownerKeySalt, userPasswordEntry)); - const iv = new Uint8Array(16); // Zero IV - return aesCbcEncrypt(encryptionKey, key, iv, false); -} -function getEncryptionKeyR5(generateRandomWordArray) { - return generateRandomWordArray(32); -} -function getEncryptedPermissionsR5(permissions, encryptionKey, generateRandomWordArray) { - // Build 16-byte block: permissions (4 bytes LSB) + 0xFFFFFFFF (4 bytes) + "adbT" (4 bytes) + random (4 bytes) - const data = new Uint8Array(16); - // Permissions (LSB first) - data[0] = permissions & 0xff; - data[1] = permissions >> 8 & 0xff; - data[2] = permissions >> 16 & 0xff; - data[3] = permissions >> 24 & 0xff; - // 0xFFFFFFFF - data[4] = 0xff; - data[5] = 0xff; - data[6] = 0xff; - data[7] = 0xff; - // "adbT" = 0x54616462 (but stored as individual bytes) - data[8] = 0x54; // 'T' - data[9] = 0x61; // 'a' - data[10] = 0x64; // 'd' - data[11] = 0x62; // 'b' - // Random 4 bytes - const randomPart = generateRandomWordArray(4); - data.set(randomPart, 12); - return aesEcbEncrypt(data, encryptionKey); -} -function processPasswordR2R3R4(password) { - if (password === void 0) { - password = ''; - } - const out = new Uint8Array(32); - const length = password.length; - let index = 0; - while (index < length && index < 32) { - const code = password.charCodeAt(index); - if (code > 0xff) { - throw new Error('Password contains one or more invalid characters.'); - } - out[index] = code; - index++; - } - while (index < 32) { - out[index] = PASSWORD_PADDING[index - length]; - index++; - } - return out; -} -function processPasswordR5(password) { - if (password === void 0) { - password = ''; - } - password = unescape(encodeURIComponent(saslprep(password))); - const length = Math.min(127, password.length); - const out = new Uint8Array(length); - for (let i = 0; i < length; i++) { - out[i] = password.charCodeAt(i); - } - return out; -} -const PASSWORD_PADDING = [0x28, 0xbf, 0x4e, 0x5e, 0x4e, 0x75, 0x8a, 0x41, 0x64, 0x00, 0x4e, 0x56, 0xff, 0xfa, 0x01, 0x08, 0x2e, 0x2e, 0x00, 0xb6, 0xd0, 0x68, 0x3e, 0x80, 0x2f, 0x0c, 0xa9, 0xfe, 0x64, 0x53, 0x69, 0x7a]; - -const { - number: number$2 -} = PDFObject; -let PDFGradient$1 = class PDFGradient { - constructor(doc) { - this.doc = doc; - this.stops = []; - this.embedded = false; - this.transform = [1, 0, 0, 1, 0, 0]; - } - stop(pos, color, opacity) { - if (opacity == null) { - opacity = 1; - } - color = this.doc._normalizeColor(color); - if (this.stops.length === 0) { - if (color.length === 3) { - this._colorSpace = 'DeviceRGB'; - } else if (color.length === 4) { - this._colorSpace = 'DeviceCMYK'; - } else if (color.length === 1) { - this._colorSpace = 'DeviceGray'; - } else { - throw new Error('Unknown color space'); - } - } else if (this._colorSpace === 'DeviceRGB' && color.length !== 3 || this._colorSpace === 'DeviceCMYK' && color.length !== 4 || this._colorSpace === 'DeviceGray' && color.length !== 1) { - throw new Error('All gradient stops must use the same color space'); - } - opacity = Math.max(0, Math.min(1, opacity)); - this.stops.push([pos, color, opacity]); - return this; - } - setTransform(m11, m12, m21, m22, dx, dy) { - this.transform = [m11, m12, m21, m22, dx, dy]; - return this; - } - embed(m) { - let fn; - const stopsLength = this.stops.length; - if (stopsLength === 0) { - return; - } - this.embedded = true; - this.matrix = m; - - // if the last stop comes before 100%, add a copy at 100% - const last = this.stops[stopsLength - 1]; - if (last[0] < 1) { - this.stops.push([1, last[1], last[2]]); - } - const bounds = []; - const encode = []; - const stops = []; - for (let i = 0; i < stopsLength - 1; i++) { - encode.push(0, 1); - if (i + 2 !== stopsLength) { - bounds.push(this.stops[i + 1][0]); - } - fn = this.doc.ref({ - FunctionType: 2, - Domain: [0, 1], - C0: this.stops[i + 0][1], - C1: this.stops[i + 1][1], - N: 1 - }); - stops.push(fn); - fn.end(); - } - - // if there are only two stops, we don't need a stitching function - if (stopsLength === 1) { - fn = stops[0]; - } else { - fn = this.doc.ref({ - FunctionType: 3, - // stitching function - Domain: [0, 1], - Functions: stops, - Bounds: bounds, - Encode: encode - }); - fn.end(); - } - this.id = `Sh${++this.doc._gradCount}`; - const shader = this.shader(fn); - shader.end(); - const pattern = this.doc.ref({ - Type: 'Pattern', - PatternType: 2, - Shading: shader, - Matrix: this.matrix.map(number$2) - }); - pattern.end(); - if (this.stops.some(stop => stop[2] < 1)) { - let grad = this.opacityGradient(); - grad._colorSpace = 'DeviceGray'; - for (let stop of this.stops) { - grad.stop(stop[0], [stop[2]]); - } - grad = grad.embed(this.matrix); - const pageBBox = [0, 0, this.doc.page.width, this.doc.page.height]; - const form = this.doc.ref({ - Type: 'XObject', - Subtype: 'Form', - FormType: 1, - BBox: pageBBox, - Group: { - Type: 'Group', - S: 'Transparency', - CS: 'DeviceGray' - }, - Resources: { - ProcSet: ['PDF', 'Text', 'ImageB', 'ImageC', 'ImageI'], - Pattern: { - Sh1: grad - } - } - }); - form.write('/Pattern cs /Sh1 scn'); - form.end(`${pageBBox.join(' ')} re f`); - const gstate = this.doc.ref({ - Type: 'ExtGState', - SMask: { - Type: 'Mask', - S: 'Luminosity', - G: form - } - }); - gstate.end(); - const opacityPattern = this.doc.ref({ - Type: 'Pattern', - PatternType: 1, - PaintType: 1, - TilingType: 2, - BBox: pageBBox, - XStep: pageBBox[2], - YStep: pageBBox[3], - Resources: { - ProcSet: ['PDF', 'Text', 'ImageB', 'ImageC', 'ImageI'], - Pattern: { - Sh1: pattern - }, - ExtGState: { - Gs1: gstate - } - } - }); - opacityPattern.write('/Gs1 gs /Pattern cs /Sh1 scn'); - opacityPattern.end(`${pageBBox.join(' ')} re f`); - this.doc.page.patterns[this.id] = opacityPattern; - } else { - this.doc.page.patterns[this.id] = pattern; - } - return pattern; - } - apply(stroke) { - // apply gradient transform to existing document ctm - const [m0, m1, m2, m3, m4, m5] = this.doc._ctm; - const [m11, m12, m21, m22, dx, dy] = this.transform; - const m = [m0 * m11 + m2 * m12, m1 * m11 + m3 * m12, m0 * m21 + m2 * m22, m1 * m21 + m3 * m22, m0 * dx + m2 * dy + m4, m1 * dx + m3 * dy + m5]; - if (!this.embedded || m.join(' ') !== this.matrix.join(' ')) { - this.embed(m); - } - this.doc._setColorSpace('Pattern', stroke); - const op = stroke ? 'SCN' : 'scn'; - return this.doc.addContent(`/${this.id} ${op}`); - } -}; -let PDFLinearGradient$1 = class PDFLinearGradient extends PDFGradient$1 { - constructor(doc, x1, y1, x2, y2) { - super(doc); - this.x1 = x1; - this.y1 = y1; - this.x2 = x2; - this.y2 = y2; - } - shader(fn) { - return this.doc.ref({ - ShadingType: 2, - ColorSpace: this._colorSpace, - Coords: [this.x1, this.y1, this.x2, this.y2], - Function: fn, - Extend: [true, true] - }); - } - opacityGradient() { - return new PDFLinearGradient(this.doc, this.x1, this.y1, this.x2, this.y2); - } -}; -let PDFRadialGradient$1 = class PDFRadialGradient extends PDFGradient$1 { - constructor(doc, x1, y1, r1, x2, y2, r2) { - super(doc); - this.doc = doc; - this.x1 = x1; - this.y1 = y1; - this.r1 = r1; - this.x2 = x2; - this.y2 = y2; - this.r2 = r2; - } - shader(fn) { - return this.doc.ref({ - ShadingType: 3, - ColorSpace: this._colorSpace, - Coords: [this.x1, this.y1, this.r1, this.x2, this.y2, this.r2], - Function: fn, - Extend: [true, true] - }); - } - opacityGradient() { - return new PDFRadialGradient(this.doc, this.x1, this.y1, this.r1, this.x2, this.y2, this.r2); - } -}; -var Gradient = { - PDFGradient: PDFGradient$1, - PDFLinearGradient: PDFLinearGradient$1, - PDFRadialGradient: PDFRadialGradient$1 -}; - -/* -PDF tiling pattern support. Uncolored only. - */ - -const underlyingColorSpaces = ['DeviceCMYK', 'DeviceRGB']; -let PDFTilingPattern$1 = class PDFTilingPattern { - constructor(doc, bBox, xStep, yStep, stream) { - this.doc = doc; - this.bBox = bBox; - this.xStep = xStep; - this.yStep = yStep; - this.stream = stream; - } - createPattern() { - // no resources needed for our current usage - // required entry - const resources = this.doc.ref(); - resources.end(); - // apply default transform matrix (flipped in the default doc._ctm) - // see document.js & gradient.js - const [m0, m1, m2, m3, m4, m5] = this.doc._ctm; - const [m11, m12, m21, m22, dx, dy] = [1, 0, 0, 1, 0, 0]; - const m = [m0 * m11 + m2 * m12, m1 * m11 + m3 * m12, m0 * m21 + m2 * m22, m1 * m21 + m3 * m22, m0 * dx + m2 * dy + m4, m1 * dx + m3 * dy + m5]; - const pattern = this.doc.ref({ - Type: 'Pattern', - PatternType: 1, - // tiling - PaintType: 2, - // 1-colored, 2-uncolored - TilingType: 2, - // 2-no distortion - BBox: this.bBox, - XStep: this.xStep, - YStep: this.yStep, - Matrix: m.map(v => +v.toFixed(5)), - Resources: resources - }); - pattern.end(this.stream); - return pattern; - } - embedPatternColorSpaces() { - // map each pattern to an underlying color space - // and embed on each page - underlyingColorSpaces.forEach(csName => { - const csId = this.getPatternColorSpaceId(csName); - if (this.doc.page.colorSpaces[csId]) return; - const cs = this.doc.ref(['Pattern', csName]); - cs.end(); - this.doc.page.colorSpaces[csId] = cs; - }); - } - getPatternColorSpaceId(underlyingColorspace) { - return `CsP${underlyingColorspace}`; - } - embed() { - if (!this.id) { - this.doc._patternCount = this.doc._patternCount + 1; - this.id = 'P' + this.doc._patternCount; - this.pattern = this.createPattern(); - } - - // patterns are embedded in each page - if (!this.doc.page.patterns[this.id]) { - this.doc.page.patterns[this.id] = this.pattern; - } - } - apply(stroke, patternColor) { - // do any embedding/creating that might be needed - this.embedPatternColorSpaces(); - this.embed(); - const normalizedColor = this.doc._normalizeColor(patternColor); - if (!normalizedColor) throw Error(`invalid pattern color. (value: ${patternColor})`); - - // select one of the pattern color spaces - const csId = this.getPatternColorSpaceId(this.doc._getColorSpace(normalizedColor)); - this.doc._setColorSpace(csId, stroke); - - // stroke/fill using the pattern and color (in the above underlying color space) - const op = stroke ? 'SCN' : 'scn'; - return this.doc.addContent(`${normalizedColor.join(' ')} /${this.id} ${op}`); - } -}; -var pattern = { - PDFTilingPattern: PDFTilingPattern$1 -}; - -class SpotColor { - constructor(doc, name, C, M, Y, K) { - this.id = 'CS' + Object.keys(doc.spotColors).length; - this.name = name; - this.values = [C, M, Y, K]; - this.ref = doc.ref(['Separation', this.name, 'DeviceCMYK', { - Range: [0, 1, 0, 1, 0, 1, 0, 1], - C0: [0, 0, 0, 0], - C1: this.values.map(value => value / 100), - FunctionType: 2, - Domain: [0, 1], - N: 1 - }]); - this.ref.end(); - } - toString() { - return `${this.ref.id} 0 R`; - } -} - -const { - PDFGradient, - PDFLinearGradient, - PDFRadialGradient -} = Gradient; -const { - PDFTilingPattern -} = pattern; -var ColorMixin = { - initColor() { - this.spotColors = {}; - // The opacity dictionaries - this._opacityRegistry = {}; - this._opacityCount = 0; - this._patternCount = 0; - return this._gradCount = 0; - }, - _normalizeColor(color) { - if (typeof color === 'string') { - if (color.charAt(0) === '#') { - if (color.length === 4) { - color = color.replace(/#([0-9A-F])([0-9A-F])([0-9A-F])/i, '#$1$1$2$2$3$3'); - } - const hex = parseInt(color.slice(1), 16); - color = [hex >> 16, hex >> 8 & 0xff, hex & 0xff]; - } else if (namedColors[color]) { - color = namedColors[color]; - } else if (this.spotColors[color]) { - return this.spotColors[color]; - } - } - if (Array.isArray(color)) { - // RGB - if (color.length === 3) { - color = color.map(part => part / 255); - // CMYK - } else if (color.length === 4) { - color = color.map(part => part / 100); - } - return color; - } - return null; - }, - _setColor(color, stroke) { - if (color instanceof PDFGradient) { - color.apply(stroke); - return true; - // see if tiling pattern, decode & apply it it - } else if (Array.isArray(color) && color[0] instanceof PDFTilingPattern) { - color[0].apply(stroke, color[1]); - return true; - } - // any other case should be a normal color and not a pattern - return this._setColorCore(color, stroke); - }, - _setColorCore(color, stroke) { - color = this._normalizeColor(color); - if (!color) { - return false; - } - const op = stroke ? 'SCN' : 'scn'; - const space = this._getColorSpace(color); - this._setColorSpace(space, stroke); - if (color instanceof SpotColor) { - this.page.colorSpaces[color.id] = color.ref; - this.addContent(`1 ${op}`); - } else { - this.addContent(`${color.join(' ')} ${op}`); - } - return true; - }, - _setColorSpace(space, stroke) { - const op = stroke ? 'CS' : 'cs'; - return this.addContent(`/${space} ${op}`); - }, - _getColorSpace(color) { - if (color instanceof SpotColor) { - return color.id; - } - return color.length === 4 ? 'DeviceCMYK' : 'DeviceRGB'; - }, - fillColor(color, opacity) { - const set = this._setColor(color, false); - if (set) { - this.fillOpacity(opacity); - } - - // save this for text wrapper, which needs to reset - // the fill color on new pages - this._fillColor = [color, opacity]; - return this; - }, - strokeColor(color, opacity) { - const set = this._setColor(color, true); - if (set) { - this.strokeOpacity(opacity); - } - return this; - }, - opacity(opacity) { - this._doOpacity(opacity, opacity); - return this; - }, - fillOpacity(opacity) { - this._doOpacity(opacity, null); - return this; - }, - strokeOpacity(opacity) { - this._doOpacity(null, opacity); - return this; - }, - _doOpacity(fillOpacity, strokeOpacity) { - let dictionary, name; - if (fillOpacity == null && strokeOpacity == null) { - return; - } - if (fillOpacity != null) { - fillOpacity = Math.max(0, Math.min(1, fillOpacity)); - } - if (strokeOpacity != null) { - strokeOpacity = Math.max(0, Math.min(1, strokeOpacity)); - } - const key = `${fillOpacity}_${strokeOpacity}`; - if (this._opacityRegistry[key]) { - [dictionary, name] = this._opacityRegistry[key]; - } else { - dictionary = { - Type: 'ExtGState' - }; - if (fillOpacity != null) { - dictionary.ca = fillOpacity; - } - if (strokeOpacity != null) { - dictionary.CA = strokeOpacity; - } - dictionary = this.ref(dictionary); - dictionary.end(); - const id = ++this._opacityCount; - name = `Gs${id}`; - this._opacityRegistry[key] = [dictionary, name]; - } - this.page.ext_gstates[name] = dictionary; - return this.addContent(`/${name} gs`); - }, - linearGradient(x1, y1, x2, y2) { - return new PDFLinearGradient(this, x1, y1, x2, y2); - }, - radialGradient(x1, y1, r1, x2, y2, r2) { - return new PDFRadialGradient(this, x1, y1, r1, x2, y2, r2); - }, - pattern(bbox, xStep, yStep, stream) { - return new PDFTilingPattern(this, bbox, xStep, yStep, stream); - }, - addSpotColor(name, C, M, Y, K) { - const color = new SpotColor(this, name, C, M, Y, K); - this.spotColors[name] = color; - return this; - } -}; -var namedColors = { - aliceblue: [240, 248, 255], - antiquewhite: [250, 235, 215], - aqua: [0, 255, 255], - aquamarine: [127, 255, 212], - azure: [240, 255, 255], - beige: [245, 245, 220], - bisque: [255, 228, 196], - black: [0, 0, 0], - blanchedalmond: [255, 235, 205], - blue: [0, 0, 255], - blueviolet: [138, 43, 226], - brown: [165, 42, 42], - burlywood: [222, 184, 135], - cadetblue: [95, 158, 160], - chartreuse: [127, 255, 0], - chocolate: [210, 105, 30], - coral: [255, 127, 80], - cornflowerblue: [100, 149, 237], - cornsilk: [255, 248, 220], - crimson: [220, 20, 60], - cyan: [0, 255, 255], - darkblue: [0, 0, 139], - darkcyan: [0, 139, 139], - darkgoldenrod: [184, 134, 11], - darkgray: [169, 169, 169], - darkgreen: [0, 100, 0], - darkgrey: [169, 169, 169], - darkkhaki: [189, 183, 107], - darkmagenta: [139, 0, 139], - darkolivegreen: [85, 107, 47], - darkorange: [255, 140, 0], - darkorchid: [153, 50, 204], - darkred: [139, 0, 0], - darksalmon: [233, 150, 122], - darkseagreen: [143, 188, 143], - darkslateblue: [72, 61, 139], - darkslategray: [47, 79, 79], - darkslategrey: [47, 79, 79], - darkturquoise: [0, 206, 209], - darkviolet: [148, 0, 211], - deeppink: [255, 20, 147], - deepskyblue: [0, 191, 255], - dimgray: [105, 105, 105], - dimgrey: [105, 105, 105], - dodgerblue: [30, 144, 255], - firebrick: [178, 34, 34], - floralwhite: [255, 250, 240], - forestgreen: [34, 139, 34], - fuchsia: [255, 0, 255], - gainsboro: [220, 220, 220], - ghostwhite: [248, 248, 255], - gold: [255, 215, 0], - goldenrod: [218, 165, 32], - gray: [128, 128, 128], - grey: [128, 128, 128], - green: [0, 128, 0], - greenyellow: [173, 255, 47], - honeydew: [240, 255, 240], - hotpink: [255, 105, 180], - indianred: [205, 92, 92], - indigo: [75, 0, 130], - ivory: [255, 255, 240], - khaki: [240, 230, 140], - lavender: [230, 230, 250], - lavenderblush: [255, 240, 245], - lawngreen: [124, 252, 0], - lemonchiffon: [255, 250, 205], - lightblue: [173, 216, 230], - lightcoral: [240, 128, 128], - lightcyan: [224, 255, 255], - lightgoldenrodyellow: [250, 250, 210], - lightgray: [211, 211, 211], - lightgreen: [144, 238, 144], - lightgrey: [211, 211, 211], - lightpink: [255, 182, 193], - lightsalmon: [255, 160, 122], - lightseagreen: [32, 178, 170], - lightskyblue: [135, 206, 250], - lightslategray: [119, 136, 153], - lightslategrey: [119, 136, 153], - lightsteelblue: [176, 196, 222], - lightyellow: [255, 255, 224], - lime: [0, 255, 0], - limegreen: [50, 205, 50], - linen: [250, 240, 230], - magenta: [255, 0, 255], - maroon: [128, 0, 0], - mediumaquamarine: [102, 205, 170], - mediumblue: [0, 0, 205], - mediumorchid: [186, 85, 211], - mediumpurple: [147, 112, 219], - mediumseagreen: [60, 179, 113], - mediumslateblue: [123, 104, 238], - mediumspringgreen: [0, 250, 154], - mediumturquoise: [72, 209, 204], - mediumvioletred: [199, 21, 133], - midnightblue: [25, 25, 112], - mintcream: [245, 255, 250], - mistyrose: [255, 228, 225], - moccasin: [255, 228, 181], - navajowhite: [255, 222, 173], - navy: [0, 0, 128], - oldlace: [253, 245, 230], - olive: [128, 128, 0], - olivedrab: [107, 142, 35], - orange: [255, 165, 0], - orangered: [255, 69, 0], - orchid: [218, 112, 214], - palegoldenrod: [238, 232, 170], - palegreen: [152, 251, 152], - paleturquoise: [175, 238, 238], - palevioletred: [219, 112, 147], - papayawhip: [255, 239, 213], - peachpuff: [255, 218, 185], - peru: [205, 133, 63], - pink: [255, 192, 203], - plum: [221, 160, 221], - powderblue: [176, 224, 230], - purple: [128, 0, 128], - red: [255, 0, 0], - rosybrown: [188, 143, 143], - royalblue: [65, 105, 225], - saddlebrown: [139, 69, 19], - salmon: [250, 128, 114], - sandybrown: [244, 164, 96], - seagreen: [46, 139, 87], - seashell: [255, 245, 238], - sienna: [160, 82, 45], - silver: [192, 192, 192], - skyblue: [135, 206, 235], - slateblue: [106, 90, 205], - slategray: [112, 128, 144], - slategrey: [112, 128, 144], - snow: [255, 250, 250], - springgreen: [0, 255, 127], - steelblue: [70, 130, 180], - tan: [210, 180, 140], - teal: [0, 128, 128], - thistle: [216, 191, 216], - tomato: [255, 99, 71], - turquoise: [64, 224, 208], - violet: [238, 130, 238], - wheat: [245, 222, 179], - white: [255, 255, 255], - whitesmoke: [245, 245, 245], - yellow: [255, 255, 0], - yellowgreen: [154, 205, 50] -}; - -let cx; -let cy; -let px; -let py; -let sx; -let sy; -cx = cy = px = py = sx = sy = 0; - -// parseDataPath copy pasted from svgo -// https://github.com/svg/svgo/blob/e4918ccdd1a2b5831defe0f00c1286744b479448/lib/path.js - -/** - * @typedef {'M' | 'm' | 'Z' | 'z' | 'L' | 'l' | 'H' | 'h' | 'V' | 'v' | 'C' | 'c' | 'S' | 's' | 'Q' | 'q' | 'T' | 't' | 'A' | 'a'} PathDataCommand - */ - -/** - * @typedef {Object} PathDataItem - * @property {PathDataCommand} command - * @property {number[]} args - */ - -const argsCountPerCommand = { - M: 2, - m: 2, - Z: 0, - z: 0, - L: 2, - l: 2, - H: 1, - h: 1, - V: 1, - v: 1, - C: 6, - c: 6, - S: 4, - s: 4, - Q: 4, - q: 4, - T: 2, - t: 2, - A: 7, - a: 7 -}; - -/** - * @type {(c: string) => c is PathDataCommand} - */ -const isCommand = c => { - return c in argsCountPerCommand; -}; - -/** - * @type {(c: string) => boolean} - */ -const isWsp = c => { - const codePoint = c.codePointAt(0); - return codePoint === 0x20 || codePoint === 0x9 || codePoint === 0xd || codePoint === 0xa; -}; - -/** - * @type {(c: string) => boolean} - */ -const isDigit = c => { - const codePoint = c.codePointAt(0); - if (codePoint == null) { - return false; - } - return 48 <= codePoint && codePoint <= 57; -}; - -/** - * @typedef {'none' | 'sign' | 'whole' | 'decimal_point' | 'decimal' | 'e' | 'exponent_sign' | 'exponent'} ReadNumberState - */ - -/** - * @type {(string: string, cursor: number) => [number, number | null]} - */ -const readNumber = (string, cursor) => { - let i = cursor; - let value = ''; - let state = /** @type {ReadNumberState} */'none'; - for (; i < string.length; i += 1) { - const c = string[i]; - if (c === '+' || c === '-') { - if (state === 'none') { - state = 'sign'; - value += c; - continue; - } - if (state === 'e') { - state = 'exponent_sign'; - value += c; - continue; - } - } - if (isDigit(c)) { - if (state === 'none' || state === 'sign' || state === 'whole') { - state = 'whole'; - value += c; - continue; - } - if (state === 'decimal_point' || state === 'decimal') { - state = 'decimal'; - value += c; - continue; - } - if (state === 'e' || state === 'exponent_sign' || state === 'exponent') { - state = 'exponent'; - value += c; - continue; - } - } - if (c === '.') { - if (state === 'none' || state === 'sign' || state === 'whole') { - state = 'decimal_point'; - value += c; - continue; - } - } - if (c === 'E' || c === 'e') { - if (state === 'whole' || state === 'decimal_point' || state === 'decimal') { - state = 'e'; - value += c; - continue; - } - } - break; - } - const number = Number.parseFloat(value); - if (Number.isNaN(number)) { - return [cursor, null]; - } - // step back to delegate iteration to parent loop - return [i - 1, number]; -}; - -/** - * @type {(string: string) => Array} - */ -const parsePathData = string => { - /** - * @type {Array} - */ - const pathData = []; - /** - * @type {null | PathDataCommand} - */ - let command = null; - let args = /** @type {number[]} */[]; - let argsCount = 0; - let canHaveComma = false; - let hadComma = false; - for (let i = 0; i < string.length; i += 1) { - const c = string.charAt(i); - if (isWsp(c)) { - continue; - } - // allow comma only between arguments - if (canHaveComma && c === ',') { - if (hadComma) { - break; - } - hadComma = true; - continue; - } - if (isCommand(c)) { - if (hadComma) { - return pathData; - } - if (command == null) { - // moveto should be leading command - if (c !== 'M' && c !== 'm') { - return pathData; - } - } else { - // stop if previous command arguments are not flushed - if (args.length !== 0) { - return pathData; - } - } - command = c; - args = []; - argsCount = argsCountPerCommand[command]; - canHaveComma = false; - // flush command without arguments - if (argsCount === 0) { - pathData.push({ - command, - args - }); - } - continue; - } - // avoid parsing arguments if no command detected - if (command == null) { - return pathData; - } - // read next argument - let newCursor = i; - let number = null; - if (command === 'A' || command === 'a') { - const position = args.length; - if (position === 0 || position === 1) { - // allow only positive number without sign as first two arguments - if (c !== '+' && c !== '-') { - [newCursor, number] = readNumber(string, i); - } - } - if (position === 2 || position === 5 || position === 6) { - [newCursor, number] = readNumber(string, i); - } - if (position === 3 || position === 4) { - // read flags - if (c === '0') { - number = 0; - } - if (c === '1') { - number = 1; - } - } - } else { - [newCursor, number] = readNumber(string, i); - } - if (number == null) { - return pathData; - } - args.push(number); - canHaveComma = true; - hadComma = false; - i = newCursor; - // flush arguments when necessary count is reached - if (args.length === argsCount) { - pathData.push({ - command, - args - }); - // subsequent moveto coordinates are threated as implicit lineto commands - if (command === 'M') { - command = 'L'; - } - if (command === 'm') { - command = 'l'; - } - args = []; - } - } - return pathData; -}; -const apply = function (commands, doc) { - // current point, control point, and subpath starting point - cx = cy = px = py = sx = sy = 0; - - // run the commands - for (let i = 0; i < commands.length; i++) { - const { - command, - args - } = commands[i]; - if (typeof runners[command] === 'function') { - runners[command](doc, args); - } - } -}; -const runners = { - M(doc, a) { - cx = a[0]; - cy = a[1]; - px = py = null; - sx = cx; - sy = cy; - return doc.moveTo(cx, cy); - }, - m(doc, a) { - cx += a[0]; - cy += a[1]; - px = py = null; - sx = cx; - sy = cy; - return doc.moveTo(cx, cy); - }, - C(doc, a) { - cx = a[4]; - cy = a[5]; - px = a[2]; - py = a[3]; - return doc.bezierCurveTo(...a); - }, - c(doc, a) { - doc.bezierCurveTo(a[0] + cx, a[1] + cy, a[2] + cx, a[3] + cy, a[4] + cx, a[5] + cy); - px = cx + a[2]; - py = cy + a[3]; - cx += a[4]; - return cy += a[5]; - }, - S(doc, a) { - if (px === null) { - px = cx; - py = cy; - } - doc.bezierCurveTo(cx - (px - cx), cy - (py - cy), a[0], a[1], a[2], a[3]); - px = a[0]; - py = a[1]; - cx = a[2]; - return cy = a[3]; - }, - s(doc, a) { - if (px === null) { - px = cx; - py = cy; - } - doc.bezierCurveTo(cx - (px - cx), cy - (py - cy), cx + a[0], cy + a[1], cx + a[2], cy + a[3]); - px = cx + a[0]; - py = cy + a[1]; - cx += a[2]; - return cy += a[3]; - }, - Q(doc, a) { - px = a[0]; - py = a[1]; - cx = a[2]; - cy = a[3]; - return doc.quadraticCurveTo(a[0], a[1], cx, cy); - }, - q(doc, a) { - doc.quadraticCurveTo(a[0] + cx, a[1] + cy, a[2] + cx, a[3] + cy); - px = cx + a[0]; - py = cy + a[1]; - cx += a[2]; - return cy += a[3]; - }, - T(doc, a) { - if (px === null) { - px = cx; - py = cy; - } else { - px = cx - (px - cx); - py = cy - (py - cy); - } - doc.quadraticCurveTo(px, py, a[0], a[1]); - cx = a[0]; - return cy = a[1]; - }, - t(doc, a) { - if (px === null) { - px = cx; - py = cy; - } else { - px = cx - (px - cx); - py = cy - (py - cy); - } - doc.quadraticCurveTo(px, py, cx + a[0], cy + a[1]); - cx += a[0]; - return cy += a[1]; - }, - A(doc, a) { - solveArc(doc, cx, cy, a); - cx = a[5]; - return cy = a[6]; - }, - a(doc, a) { - a[5] += cx; - a[6] += cy; - solveArc(doc, cx, cy, a); - cx = a[5]; - return cy = a[6]; - }, - L(doc, a) { - cx = a[0]; - cy = a[1]; - px = py = null; - return doc.lineTo(cx, cy); - }, - l(doc, a) { - cx += a[0]; - cy += a[1]; - px = py = null; - return doc.lineTo(cx, cy); - }, - H(doc, a) { - cx = a[0]; - px = py = null; - return doc.lineTo(cx, cy); - }, - h(doc, a) { - cx += a[0]; - px = py = null; - return doc.lineTo(cx, cy); - }, - V(doc, a) { - cy = a[0]; - px = py = null; - return doc.lineTo(cx, cy); - }, - v(doc, a) { - cy += a[0]; - px = py = null; - return doc.lineTo(cx, cy); - }, - Z(doc) { - doc.closePath(); - cx = sx; - return cy = sy; - }, - z(doc) { - doc.closePath(); - cx = sx; - return cy = sy; - } -}; -const solveArc = function (doc, x, y, coords) { - const [rx, ry, rot, large, sweep, ex, ey] = coords; - const segs = arcToSegments(ex, ey, rx, ry, large, sweep, rot, x, y); - for (let seg of segs) { - const bez = segmentToBezier(...seg); - doc.bezierCurveTo(...bez); - } -}; - -// from Inkscape svgtopdf, thanks! -const arcToSegments = function (x, y, rx, ry, large, sweep, rotateX, ox, oy) { - const th = rotateX * (Math.PI / 180); - const sin_th = Math.sin(th); - const cos_th = Math.cos(th); - rx = Math.abs(rx); - ry = Math.abs(ry); - px = cos_th * (ox - x) * 0.5 + sin_th * (oy - y) * 0.5; - py = cos_th * (oy - y) * 0.5 - sin_th * (ox - x) * 0.5; - let pl = px * px / (rx * rx) + py * py / (ry * ry); - if (pl > 1) { - pl = Math.sqrt(pl); - rx *= pl; - ry *= pl; - } - const a00 = cos_th / rx; - const a01 = sin_th / rx; - const a10 = -sin_th / ry; - const a11 = cos_th / ry; - const x0 = a00 * ox + a01 * oy; - const y0 = a10 * ox + a11 * oy; - const x1 = a00 * x + a01 * y; - const y1 = a10 * x + a11 * y; - const d = (x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0); - let sfactor_sq = 1 / d - 0.25; - if (sfactor_sq < 0) { - sfactor_sq = 0; - } - let sfactor = Math.sqrt(sfactor_sq); - if (sweep === large) { - sfactor = -sfactor; - } - const xc = 0.5 * (x0 + x1) - sfactor * (y1 - y0); - const yc = 0.5 * (y0 + y1) + sfactor * (x1 - x0); - const th0 = Math.atan2(y0 - yc, x0 - xc); - const th1 = Math.atan2(y1 - yc, x1 - xc); - let th_arc = th1 - th0; - if (th_arc < 0 && sweep === 1) { - th_arc += 2 * Math.PI; - } else if (th_arc > 0 && sweep === 0) { - th_arc -= 2 * Math.PI; - } - const segments = Math.ceil(Math.abs(th_arc / (Math.PI * 0.5 + 0.001))); - const result = []; - for (let i = 0; i < segments; i++) { - const th2 = th0 + i * th_arc / segments; - const th3 = th0 + (i + 1) * th_arc / segments; - result[i] = [xc, yc, th2, th3, rx, ry, sin_th, cos_th]; - } - return result; -}; -const segmentToBezier = function (cx, cy, th0, th1, rx, ry, sin_th, cos_th) { - const a00 = cos_th * rx; - const a01 = -sin_th * ry; - const a10 = sin_th * rx; - const a11 = cos_th * ry; - const th_half = 0.5 * (th1 - th0); - const t = 8 / 3 * Math.sin(th_half * 0.5) * Math.sin(th_half * 0.5) / Math.sin(th_half); - const x1 = cx + Math.cos(th0) - t * Math.sin(th0); - const y1 = cy + Math.sin(th0) + t * Math.cos(th0); - const x3 = cx + Math.cos(th1); - const y3 = cy + Math.sin(th1); - const x2 = x3 + t * Math.sin(th1); - const y2 = y3 - t * Math.cos(th1); - return [a00 * x1 + a01 * y1, a10 * x1 + a11 * y1, a00 * x2 + a01 * y2, a10 * x2 + a11 * y2, a00 * x3 + a01 * y3, a10 * x3 + a11 * y3]; -}; -class SVGPath { - static apply(doc, path) { - const commands = parsePathData(path); - apply(commands, doc); - } -} - -const { - number: number$1 -} = PDFObject; - -// This constant is used to approximate a symmetrical arc using a cubic -// Bezier curve. -const KAPPA = 4.0 * ((Math.sqrt(2) - 1.0) / 3.0); -var VectorMixin = { - initVector() { - this._ctm = [1, 0, 0, 1, 0, 0]; // current transformation matrix - return this._ctmStack = []; - }, - save() { - this._ctmStack.push(this._ctm.slice()); - // TODO: save/restore colorspace and styles so not setting it unnessesarily all the time? - return this.addContent('q'); - }, - restore() { - this._ctm = this._ctmStack.pop() || [1, 0, 0, 1, 0, 0]; - return this.addContent('Q'); - }, - closePath() { - return this.addContent('h'); - }, - lineWidth(w) { - return this.addContent(`${number$1(w)} w`); - }, - _CAP_STYLES: { - BUTT: 0, - ROUND: 1, - SQUARE: 2 - }, - lineCap(c) { - if (typeof c === 'string') { - c = this._CAP_STYLES[c.toUpperCase()]; - } - return this.addContent(`${c} J`); - }, - _JOIN_STYLES: { - MITER: 0, - ROUND: 1, - BEVEL: 2 - }, - lineJoin(j) { - if (typeof j === 'string') { - j = this._JOIN_STYLES[j.toUpperCase()]; - } - return this.addContent(`${j} j`); - }, - miterLimit(m) { - return this.addContent(`${number$1(m)} M`); - }, - dash(length, options) { - if (options === void 0) { - options = {}; - } - const originalLength = length; - if (!Array.isArray(length)) { - length = [length, options.space || length]; - } - const valid = length.every(x => Number.isFinite(x) && x > 0); - if (!valid) { - throw new Error(`dash(${JSON.stringify(originalLength)}, ${JSON.stringify(options)}) invalid, lengths must be numeric and greater than zero`); - } - length = length.map(number$1).join(' '); - return this.addContent(`[${length}] ${number$1(options.phase || 0)} d`); - }, - undash() { - return this.addContent('[] 0 d'); - }, - moveTo(x, y) { - return this.addContent(`${number$1(x)} ${number$1(y)} m`); - }, - lineTo(x, y) { - return this.addContent(`${number$1(x)} ${number$1(y)} l`); - }, - bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y) { - return this.addContent(`${number$1(cp1x)} ${number$1(cp1y)} ${number$1(cp2x)} ${number$1(cp2y)} ${number$1(x)} ${number$1(y)} c`); - }, - quadraticCurveTo(cpx, cpy, x, y) { - return this.addContent(`${number$1(cpx)} ${number$1(cpy)} ${number$1(x)} ${number$1(y)} v`); - }, - rect(x, y, w, h) { - return this.addContent(`${number$1(x)} ${number$1(y)} ${number$1(w)} ${number$1(h)} re`); - }, - roundedRect(x, y, w, h, r) { - if (r == null) { - r = 0; - } - r = Math.min(r, 0.5 * w, 0.5 * h); - - // amount to inset control points from corners (see `ellipse`) - const c = r * (1.0 - KAPPA); - this.moveTo(x + r, y); - this.lineTo(x + w - r, y); - this.bezierCurveTo(x + w - c, y, x + w, y + c, x + w, y + r); - this.lineTo(x + w, y + h - r); - this.bezierCurveTo(x + w, y + h - c, x + w - c, y + h, x + w - r, y + h); - this.lineTo(x + r, y + h); - this.bezierCurveTo(x + c, y + h, x, y + h - c, x, y + h - r); - this.lineTo(x, y + r); - this.bezierCurveTo(x, y + c, x + c, y, x + r, y); - return this.closePath(); - }, - ellipse(x, y, r1, r2) { - // based on http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas/2173084#2173084 - if (r2 == null) { - r2 = r1; - } - x -= r1; - y -= r2; - const ox = r1 * KAPPA; - const oy = r2 * KAPPA; - const xe = x + r1 * 2; - const ye = y + r2 * 2; - const xm = x + r1; - const ym = y + r2; - this.moveTo(x, ym); - this.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); - this.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); - this.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); - this.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); - return this.closePath(); - }, - circle(x, y, radius) { - return this.ellipse(x, y, radius); - }, - arc(x, y, radius, startAngle, endAngle, anticlockwise) { - if (anticlockwise == null) { - anticlockwise = false; - } - const TWO_PI = 2.0 * Math.PI; - const HALF_PI = 0.5 * Math.PI; - let deltaAng = endAngle - startAngle; - if (Math.abs(deltaAng) > TWO_PI) { - // draw only full circle if more than that is specified - deltaAng = TWO_PI; - } else if (deltaAng !== 0 && anticlockwise !== deltaAng < 0) { - // necessary to flip direction of rendering - const dir = anticlockwise ? -1 : 1; - deltaAng = dir * TWO_PI + deltaAng; - } - const numSegs = Math.ceil(Math.abs(deltaAng) / HALF_PI); - const segAng = deltaAng / numSegs; - const handleLen = segAng / HALF_PI * KAPPA * radius; - let curAng = startAngle; - - // component distances between anchor point and control point - let deltaCx = -Math.sin(curAng) * handleLen; - let deltaCy = Math.cos(curAng) * handleLen; - - // anchor point - let ax = x + Math.cos(curAng) * radius; - let ay = y + Math.sin(curAng) * radius; - - // calculate and render segments - this.moveTo(ax, ay); - for (let segIdx = 0; segIdx < numSegs; segIdx++) { - // starting control point - const cp1x = ax + deltaCx; - const cp1y = ay + deltaCy; - - // step angle - curAng += segAng; - - // next anchor point - ax = x + Math.cos(curAng) * radius; - ay = y + Math.sin(curAng) * radius; - - // next control point delta - deltaCx = -Math.sin(curAng) * handleLen; - deltaCy = Math.cos(curAng) * handleLen; - - // ending control point - const cp2x = ax - deltaCx; - const cp2y = ay - deltaCy; - - // render segment - this.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, ax, ay); - } - return this; - }, - polygon() { - for (var _len = arguments.length, points = new Array(_len), _key = 0; _key < _len; _key++) { - points[_key] = arguments[_key]; - } - this.moveTo(...(points.shift() || [])); - for (let point of points) { - this.lineTo(...(point || [])); - } - return this.closePath(); - }, - path(path) { - SVGPath.apply(this, path); - return this; - }, - _windingRule(rule) { - if (/even-?odd/.test(rule)) { - return '*'; - } - return ''; - }, - fill(color, rule) { - if (/(even-?odd)|(non-?zero)/.test(color)) { - rule = color; - color = null; - } - if (color) { - this.fillColor(color); - } - return this.addContent(`f${this._windingRule(rule)}`); - }, - stroke(color) { - if (color) { - this.strokeColor(color); - } - return this.addContent('S'); - }, - fillAndStroke(fillColor, strokeColor, rule) { - if (strokeColor == null) { - strokeColor = fillColor; - } - const isFillRule = /(even-?odd)|(non-?zero)/; - if (isFillRule.test(fillColor)) { - rule = fillColor; - fillColor = null; - } - if (isFillRule.test(strokeColor)) { - rule = strokeColor; - strokeColor = fillColor; - } - if (fillColor) { - this.fillColor(fillColor); - this.strokeColor(strokeColor); - } - return this.addContent(`B${this._windingRule(rule)}`); - }, - clip(rule) { - return this.addContent(`W${this._windingRule(rule)} n`); - }, - transform(m11, m12, m21, m22, dx, dy) { - // keep track of the current transformation matrix - if (m11 === 1 && m12 === 0 && m21 === 0 && m22 === 1 && dx === 0 && dy === 0) { - // Ignore identity transforms - return this; - } - const m = this._ctm; - const [m0, m1, m2, m3, m4, m5] = m; - m[0] = m0 * m11 + m2 * m12; - m[1] = m1 * m11 + m3 * m12; - m[2] = m0 * m21 + m2 * m22; - m[3] = m1 * m21 + m3 * m22; - m[4] = m0 * dx + m2 * dy + m4; - m[5] = m1 * dx + m3 * dy + m5; - const values = [m11, m12, m21, m22, dx, dy].map(v => number$1(v)).join(' '); - return this.addContent(`${values} cm`); - }, - translate(x, y) { - return this.transform(1, 0, 0, 1, x, y); - }, - rotate(angle, options) { - if (options === void 0) { - options = {}; - } - let y; - const rad = angle * Math.PI / 180; - const cos = Math.cos(rad); - const sin = Math.sin(rad); - let x = y = 0; - if (options.origin != null) { - [x, y] = options.origin; - const x1 = x * cos - y * sin; - const y1 = x * sin + y * cos; - x -= x1; - y -= y1; - } - return this.transform(cos, sin, -sin, cos, x, y); - }, - scale(xFactor, yFactor, options) { - if (options === void 0) { - options = {}; - } - let y; - if (yFactor == null) { - yFactor = xFactor; - } - if (typeof yFactor === 'object') { - options = yFactor; - yFactor = xFactor; - } - let x = y = 0; - if (options.origin != null) { - [x, y] = options.origin; - x -= xFactor * x; - y -= yFactor * y; - } - return this.transform(xFactor, 0, 0, yFactor, x, y); - } -}; - -const range = (left, right, inclusive) => { - let range = []; - let end = right + 1 ; - for (let i = left; i < end ; i++ ) { - range.push(i); - } - return range; -}; - -const WIN_ANSI_MAP = { - 402: 131, - 8211: 150, - 8212: 151, - 8216: 145, - 8217: 146, - 8218: 130, - 8220: 147, - 8221: 148, - 8222: 132, - 8224: 134, - 8225: 135, - 8226: 149, - 8230: 133, - 8364: 128, - 8240: 137, - 8249: 139, - 8250: 155, - 710: 136, - 8482: 153, - 338: 140, - 339: 156, - 732: 152, - 352: 138, - 353: 154, - 376: 159, - 381: 142, - 382: 158 -}; -const characters = `\ -.notdef .notdef .notdef .notdef -.notdef .notdef .notdef .notdef -.notdef .notdef .notdef .notdef -.notdef .notdef .notdef .notdef -.notdef .notdef .notdef .notdef -.notdef .notdef .notdef .notdef -.notdef .notdef .notdef .notdef -.notdef .notdef .notdef .notdef - -space exclam quotedbl numbersign -dollar percent ampersand quotesingle -parenleft parenright asterisk plus -comma hyphen period slash -zero one two three -four five six seven -eight nine colon semicolon -less equal greater question - -at A B C -D E F G -H I J K -L M N O -P Q R S -T U V W -X Y Z bracketleft -backslash bracketright asciicircum underscore - -grave a b c -d e f g -h i j k -l m n o -p q r s -t u v w -x y z braceleft -bar braceright asciitilde .notdef - -Euro .notdef quotesinglbase florin -quotedblbase ellipsis dagger daggerdbl -circumflex perthousand Scaron guilsinglleft -OE .notdef Zcaron .notdef -.notdef quoteleft quoteright quotedblleft -quotedblright bullet endash emdash -tilde trademark scaron guilsinglright -oe .notdef zcaron ydieresis - -space exclamdown cent sterling -currency yen brokenbar section -dieresis copyright ordfeminine guillemotleft -logicalnot softhyphen registered macron -degree plusminus twosuperior threesuperior -acute mu paragraph periodcentered -cedilla onesuperior ordmasculine guillemotright -onequarter onehalf threequarters questiondown - -Agrave Aacute Acircumflex Atilde -Adieresis Aring AE Ccedilla -Egrave Eacute Ecircumflex Edieresis -Igrave Iacute Icircumflex Idieresis -Eth Ntilde Ograve Oacute -Ocircumflex Otilde Odieresis multiply -Oslash Ugrave Uacute Ucircumflex -Udieresis Yacute Thorn germandbls - -agrave aacute acircumflex atilde -adieresis aring ae ccedilla -egrave eacute ecircumflex edieresis -igrave iacute icircumflex idieresis -eth ntilde ograve oacute -ocircumflex otilde odieresis divide -oslash ugrave uacute ucircumflex -udieresis yacute thorn ydieresis\ -`.split(/\s+/); -function parse(contents) { - const obj = { - attributes: {}, - glyphWidths: {}, - kernPairs: {} - }; - let section = ''; - for (let line of contents.split('\n')) { - var match; - var a; - if (match = line.match(/^Start(\w+)/)) { - section = match[1]; - continue; - } else if (match = line.match(/^End(\w+)/)) { - section = ''; - continue; - } - switch (section) { - case 'FontMetrics': - match = line.match(/(^\w+)\s+(.*)/); - var key = match[1]; - var value = match[2]; - if (a = obj.attributes[key]) { - if (!Array.isArray(a)) { - a = obj.attributes[key] = [a]; - } - a.push(value); - } else { - obj.attributes[key] = value; - } - break; - case 'CharMetrics': - if (!/^CH?\s/.test(line)) { - continue; - } - var name = line.match(/\bN\s+(\.?\w+)\s*;/)[1]; - obj.glyphWidths[name] = +line.match(/\bWX\s+(\d+)\s*;/)[1]; - break; - case 'KernPairs': - match = line.match(/^KPX\s+(\.?\w+)\s+(\.?\w+)\s+(-?\d+)/); - if (match) { - obj.kernPairs[match[1] + match[2]] = parseInt(match[3]); - } - break; - } - } - return obj; -} -class AFMFont { - static open(filename) { - return new AFMFont(fs.readFileSync(filename, 'utf8')); - } - static fromJson(json) { - return new AFMFont(json); - } - constructor(contents) { - if (typeof contents === 'string') { - this.contents = contents; - this.parse(); - } else { - this.attributes = contents.attributes; - this.glyphWidths = contents.glyphWidths; - this.kernPairs = contents.kernPairs; - } - this.charWidths = range(0, 255).map(i => this.glyphWidths[characters[i]]); - this.bbox = Array.from(this.attributes.FontBBox.split(/\s+/)).map(e => +e); - this.ascender = +(this.attributes.Ascender || 0); - this.descender = +(this.attributes.Descender || 0); - this.xHeight = +(this.attributes.XHeight || 0); - this.capHeight = +(this.attributes.CapHeight || 0); - this.lineGap = this.bbox[3] - this.bbox[1] - (this.ascender - this.descender); - } - parse() { - const parsed = parse(this.contents); - this.attributes = parsed.attributes; - this.glyphWidths = parsed.glyphWidths; - this.kernPairs = parsed.kernPairs; - } - encodeText(text) { - const res = []; - for (let i = 0, end = text.length, asc = 0 <= end; asc ? i < end : i > end; asc ? i++ : i--) { - let char = text.charCodeAt(i); - char = WIN_ANSI_MAP[char] || char; - res.push(char.toString(16)); - } - return res; - } - glyphsForString(string) { - const glyphs = []; - for (let i = 0, end = string.length, asc = 0 <= end; asc ? i < end : i > end; asc ? i++ : i--) { - const charCode = string.charCodeAt(i); - glyphs.push(this.characterToGlyph(charCode)); - } - return glyphs; - } - characterToGlyph(character) { - return characters[WIN_ANSI_MAP[character] || character] || '.notdef'; - } - widthOfGlyph(glyph) { - return this.glyphWidths[glyph] || 0; - } - getKernPair(left, right) { - return this.kernPairs[left + right] || 0; - } - advancesForGlyphs(glyphs) { - const advances = []; - for (let index = 0; index < glyphs.length; index++) { - const left = glyphs[index]; - const right = glyphs[index + 1]; - advances.push(this.widthOfGlyph(left) + this.getKernPair(left, right)); - } - return advances; - } -} - -var attributes = [ - { - Comment: [ - "Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.", - "Creation Date: Thu May 1 12:43:52 1997", - "UniqueID 43052", - "VMusage 37169 48194" - ], - FontName: "Helvetica-Bold", - FullName: "Helvetica Bold", - FamilyName: "Helvetica", - Weight: "Bold", - ItalicAngle: "0", - IsFixedPitch: "false", - CharacterSet: "ExtendedRoman", - FontBBox: "-170 -228 1003 962 ", - UnderlinePosition: "-100", - UnderlineThickness: "50", - Version: "002.000", - Notice: "Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries.", - EncodingScheme: "AdobeStandardEncoding", - CapHeight: "718", - XHeight: "532", - Ascender: "718", - Descender: "-207", - StdHW: "118", - StdVW: "140" - }, - { - Comment: [ - "Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.", - "Creation Date: Thu May 1 12:45:12 1997", - "UniqueID 43053", - "VMusage 14482 68586" - ], - FontName: "Helvetica-BoldOblique", - FullName: "Helvetica Bold Oblique", - FamilyName: "Helvetica", - Weight: "Bold", - ItalicAngle: "-12", - IsFixedPitch: "false", - CharacterSet: "ExtendedRoman", - FontBBox: "-174 -228 1114 962", - UnderlinePosition: "-100", - UnderlineThickness: "50", - Version: "002.000", - Notice: "Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries.", - EncodingScheme: "AdobeStandardEncoding", - CapHeight: "718", - XHeight: "532", - Ascender: "718", - Descender: "-207", - StdHW: "118", - StdVW: "140" - }, - { - Comment: [ - "Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.", - "Creation Date: Thu May 1 12:44:31 1997", - "UniqueID 43055", - "VMusage 14960 69346" - ], - FontName: "Helvetica-Oblique", - FullName: "Helvetica Oblique", - FamilyName: "Helvetica", - Weight: "Medium", - ItalicAngle: "-12", - IsFixedPitch: "false", - CharacterSet: "ExtendedRoman", - FontBBox: "-170 -225 1116 931 ", - UnderlinePosition: "-100", - UnderlineThickness: "50", - Version: "002.000", - Notice: "Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries.", - EncodingScheme: "AdobeStandardEncoding", - CapHeight: "718", - XHeight: "523", - Ascender: "718", - Descender: "-207", - StdHW: "76", - StdVW: "88" - }, - { - Comment: [ - "Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.", - "Creation Date: Thu May 1 12:38:23 1997", - "UniqueID 43054", - "VMusage 37069 48094" - ], - FontName: "Helvetica", - FullName: "Helvetica", - FamilyName: "Helvetica", - Weight: "Medium", - ItalicAngle: "0", - IsFixedPitch: "false", - CharacterSet: "ExtendedRoman", - FontBBox: "-166 -225 1000 931 ", - UnderlinePosition: "-100", - UnderlineThickness: "50", - Version: "002.000", - Notice: "Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries.", - EncodingScheme: "AdobeStandardEncoding", - CapHeight: "718", - XHeight: "523", - Ascender: "718", - Descender: "-207", - StdHW: "76", - StdVW: "88" - }, - { - Comment: [ - "Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.", - "Creation Date: Thu May 1 12:52:56 1997", - "UniqueID 43065", - "VMusage 41636 52661" - ], - FontName: "Times-Bold", - FullName: "Times Bold", - FamilyName: "Times", - Weight: "Bold", - ItalicAngle: "0", - IsFixedPitch: "false", - CharacterSet: "ExtendedRoman", - FontBBox: "-168 -218 1000 935 ", - UnderlinePosition: "-100", - UnderlineThickness: "50", - Version: "002.000", - Notice: "Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries.", - EncodingScheme: "AdobeStandardEncoding", - CapHeight: "676", - XHeight: "461", - Ascender: "683", - Descender: "-217", - StdHW: "44", - StdVW: "139" - }, - { - Comment: [ - "Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.", - "Creation Date: Thu May 1 13:04:06 1997", - "UniqueID 43066", - "VMusage 45874 56899" - ], - FontName: "Times-BoldItalic", - FullName: "Times Bold Italic", - FamilyName: "Times", - Weight: "Bold", - ItalicAngle: "-15", - IsFixedPitch: "false", - CharacterSet: "ExtendedRoman", - FontBBox: "-200 -218 996 921", - UnderlinePosition: "-100", - UnderlineThickness: "50", - Version: "002.000", - Notice: "Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries.", - EncodingScheme: "AdobeStandardEncoding", - CapHeight: "669", - XHeight: "462", - Ascender: "683", - Descender: "-217", - StdHW: "42", - StdVW: "121" - }, - { - Comment: [ - "Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.", - "Creation Date: Thu May 1 12:56:55 1997", - "UniqueID 43067", - "VMusage 47727 58752" - ], - FontName: "Times-Italic", - FullName: "Times Italic", - FamilyName: "Times", - Weight: "Medium", - ItalicAngle: "-15.5", - IsFixedPitch: "false", - CharacterSet: "ExtendedRoman", - FontBBox: "-169 -217 1010 883 ", - UnderlinePosition: "-100", - UnderlineThickness: "50", - Version: "002.000", - Notice: "Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries.", - EncodingScheme: "AdobeStandardEncoding", - CapHeight: "653", - XHeight: "441", - Ascender: "683", - Descender: "-217", - StdHW: "32", - StdVW: "76" - }, - { - Comment: [ - "Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.", - "Creation Date: Thu May 1 12:49:17 1997", - "UniqueID 43068", - "VMusage 43909 54934" - ], - FontName: "Times-Roman", - FullName: "Times Roman", - FamilyName: "Times", - Weight: "Roman", - ItalicAngle: "0", - IsFixedPitch: "false", - CharacterSet: "ExtendedRoman", - FontBBox: "-168 -218 1000 898 ", - UnderlinePosition: "-100", - UnderlineThickness: "50", - Version: "002.000", - Notice: "Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries.", - EncodingScheme: "AdobeStandardEncoding", - CapHeight: "662", - XHeight: "450", - Ascender: "683", - Descender: "-217", - StdHW: "28", - StdVW: "84" - }, - { - Comment: [ - "Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.", - "Creation Date: Mon Jun 23 16:28:00 1997", - "UniqueID 43048", - "VMusage 41139 52164" - ], - FontName: "Courier-Bold", - FullName: "Courier Bold", - FamilyName: "Courier", - Weight: "Bold", - ItalicAngle: "0", - IsFixedPitch: "true", - CharacterSet: "ExtendedRoman", - FontBBox: "-113 -250 749 801 ", - UnderlinePosition: "-100", - UnderlineThickness: "50", - Version: "003.000", - Notice: "Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.", - EncodingScheme: "AdobeStandardEncoding", - CapHeight: "562", - XHeight: "439", - Ascender: "629", - Descender: "-157", - StdHW: "84", - StdVW: "106" - }, - { - Comment: [ - "Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.", - "Creation Date: Mon Jun 23 16:28:46 1997", - "UniqueID 43049", - "VMusage 17529 79244" - ], - FontName: "Courier-BoldOblique", - FullName: "Courier Bold Oblique", - FamilyName: "Courier", - Weight: "Bold", - ItalicAngle: "-12", - IsFixedPitch: "true", - CharacterSet: "ExtendedRoman", - FontBBox: "-57 -250 869 801", - UnderlinePosition: "-100", - UnderlineThickness: "50", - Version: "003.000", - Notice: "Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.", - EncodingScheme: "AdobeStandardEncoding", - CapHeight: "562", - XHeight: "439", - Ascender: "629", - Descender: "-157", - StdHW: "84", - StdVW: "106" - }, - { - Comment: [ - "Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.", - "Creation Date: Thu May 1 17:37:52 1997", - "UniqueID 43051", - "VMusage 16248 75829" - ], - FontName: "Courier-Oblique", - FullName: "Courier Oblique", - FamilyName: "Courier", - Weight: "Medium", - ItalicAngle: "-12", - IsFixedPitch: "true", - CharacterSet: "ExtendedRoman", - FontBBox: "-27 -250 849 805 ", - UnderlinePosition: "-100", - UnderlineThickness: "50", - Version: "003.000", - Notice: "Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.", - EncodingScheme: "AdobeStandardEncoding", - CapHeight: "562", - XHeight: "426", - Ascender: "629", - Descender: "-157", - StdHW: "51", - StdVW: "51" - }, - { - Comment: [ - "Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.", - "Creation Date: Thu May 1 17:27:09 1997", - "UniqueID 43050", - "VMusage 39754 50779" - ], - FontName: "Courier", - FullName: "Courier", - FamilyName: "Courier", - Weight: "Medium", - ItalicAngle: "0", - IsFixedPitch: "true", - CharacterSet: "ExtendedRoman", - FontBBox: "-23 -250 715 805 ", - UnderlinePosition: "-100", - UnderlineThickness: "50", - Version: "003.000", - Notice: "Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.", - EncodingScheme: "AdobeStandardEncoding", - CapHeight: "562", - XHeight: "426", - Ascender: "629", - Descender: "-157", - StdHW: "51", - StdVW: "51" - } -]; -var glyphWidths = { - space: [ - 278, - 278, - 278, - 278, - 250, - 250, - 250, - 250, - 600, - 600, - 600, - 600 - ], - exclam: [ - 333, - 333, - 278, - 278, - 333, - 389, - 333, - 333, - 600, - 600, - 600, - 600 - ], - quotedbl: [ - 474, - 474, - 355, - 355, - 555, - 555, - 420, - 408, - 600, - 600, - 600, - 600 - ], - numbersign: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - dollar: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - percent: [ - 889, - 889, - 889, - 889, - 1000, - 833, - 833, - 833, - 600, - 600, - 600, - 600 - ], - ampersand: [ - 722, - 722, - 667, - 667, - 833, - 778, - 778, - 778, - 600, - 600, - 600, - 600 - ], - quoteright: [ - 278, - 278, - 222, - 222, - 333, - 333, - 333, - 333, - 600, - 600, - 600, - 600 - ], - parenleft: [ - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 600, - 600, - 600, - 600 - ], - parenright: [ - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 600, - 600, - 600, - 600 - ], - asterisk: [ - 389, - 389, - 389, - 389, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - plus: [ - 584, - 584, - 584, - 584, - 570, - 570, - 675, - 564, - 600, - 600, - 600, - 600 - ], - comma: [ - 278, - 278, - 278, - 278, - 250, - 250, - 250, - 250, - 600, - 600, - 600, - 600 - ], - hyphen: [ - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 600, - 600, - 600, - 600 - ], - period: [ - 278, - 278, - 278, - 278, - 250, - 250, - 250, - 250, - 600, - 600, - 600, - 600 - ], - slash: [ - 278, - 278, - 278, - 278, - 278, - 278, - 278, - 278, - 600, - 600, - 600, - 600 - ], - zero: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - one: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - two: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - three: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - four: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - five: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - six: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - seven: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - eight: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - nine: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - colon: [ - 333, - 333, - 278, - 278, - 333, - 333, - 333, - 278, - 600, - 600, - 600, - 600 - ], - semicolon: [ - 333, - 333, - 278, - 278, - 333, - 333, - 333, - 278, - 600, - 600, - 600, - 600 - ], - less: [ - 584, - 584, - 584, - 584, - 570, - 570, - 675, - 564, - 600, - 600, - 600, - 600 - ], - equal: [ - 584, - 584, - 584, - 584, - 570, - 570, - 675, - 564, - 600, - 600, - 600, - 600 - ], - greater: [ - 584, - 584, - 584, - 584, - 570, - 570, - 675, - 564, - 600, - 600, - 600, - 600 - ], - question: [ - 611, - 611, - 556, - 556, - 500, - 500, - 500, - 444, - 600, - 600, - 600, - 600 - ], - at: [ - 975, - 975, - 1015, - 1015, - 930, - 832, - 920, - 921, - 600, - 600, - 600, - 600 - ], - A: [ - 722, - 722, - 667, - 667, - 722, - 667, - 611, - 722, - 600, - 600, - 600, - 600 - ], - B: [ - 722, - 722, - 667, - 667, - 667, - 667, - 611, - 667, - 600, - 600, - 600, - 600 - ], - C: [ - 722, - 722, - 722, - 722, - 722, - 667, - 667, - 667, - 600, - 600, - 600, - 600 - ], - D: [ - 722, - 722, - 722, - 722, - 722, - 722, - 722, - 722, - 600, - 600, - 600, - 600 - ], - E: [ - 667, - 667, - 667, - 667, - 667, - 667, - 611, - 611, - 600, - 600, - 600, - 600 - ], - F: [ - 611, - 611, - 611, - 611, - 611, - 667, - 611, - 556, - 600, - 600, - 600, - 600 - ], - G: [ - 778, - 778, - 778, - 778, - 778, - 722, - 722, - 722, - 600, - 600, - 600, - 600 - ], - H: [ - 722, - 722, - 722, - 722, - 778, - 778, - 722, - 722, - 600, - 600, - 600, - 600 - ], - I: [ - 278, - 278, - 278, - 278, - 389, - 389, - 333, - 333, - 600, - 600, - 600, - 600 - ], - J: [ - 556, - 556, - 500, - 500, - 500, - 500, - 444, - 389, - 600, - 600, - 600, - 600 - ], - K: [ - 722, - 722, - 667, - 667, - 778, - 667, - 667, - 722, - 600, - 600, - 600, - 600 - ], - L: [ - 611, - 611, - 556, - 556, - 667, - 611, - 556, - 611, - 600, - 600, - 600, - 600 - ], - M: [ - 833, - 833, - 833, - 833, - 944, - 889, - 833, - 889, - 600, - 600, - 600, - 600 - ], - N: [ - 722, - 722, - 722, - 722, - 722, - 722, - 667, - 722, - 600, - 600, - 600, - 600 - ], - O: [ - 778, - 778, - 778, - 778, - 778, - 722, - 722, - 722, - 600, - 600, - 600, - 600 - ], - P: [ - 667, - 667, - 667, - 667, - 611, - 611, - 611, - 556, - 600, - 600, - 600, - 600 - ], - Q: [ - 778, - 778, - 778, - 778, - 778, - 722, - 722, - 722, - 600, - 600, - 600, - 600 - ], - R: [ - 722, - 722, - 722, - 722, - 722, - 667, - 611, - 667, - 600, - 600, - 600, - 600 - ], - S: [ - 667, - 667, - 667, - 667, - 556, - 556, - 500, - 556, - 600, - 600, - 600, - 600 - ], - T: [ - 611, - 611, - 611, - 611, - 667, - 611, - 556, - 611, - 600, - 600, - 600, - 600 - ], - U: [ - 722, - 722, - 722, - 722, - 722, - 722, - 722, - 722, - 600, - 600, - 600, - 600 - ], - V: [ - 667, - 667, - 667, - 667, - 722, - 667, - 611, - 722, - 600, - 600, - 600, - 600 - ], - W: [ - 944, - 944, - 944, - 944, - 1000, - 889, - 833, - 944, - 600, - 600, - 600, - 600 - ], - X: [ - 667, - 667, - 667, - 667, - 722, - 667, - 611, - 722, - 600, - 600, - 600, - 600 - ], - Y: [ - 667, - 667, - 667, - 667, - 722, - 611, - 556, - 722, - 600, - 600, - 600, - 600 - ], - Z: [ - 611, - 611, - 611, - 611, - 667, - 611, - 556, - 611, - 600, - 600, - 600, - 600 - ], - bracketleft: [ - 333, - 333, - 278, - 278, - 333, - 333, - 389, - 333, - 600, - 600, - 600, - 600 - ], - backslash: [ - 278, - 278, - 278, - 278, - 278, - 278, - 278, - 278, - 600, - 600, - 600, - 600 - ], - bracketright: [ - 333, - 333, - 278, - 278, - 333, - 333, - 389, - 333, - 600, - 600, - 600, - 600 - ], - asciicircum: [ - 584, - 584, - 469, - 469, - 581, - 570, - 422, - 469, - 600, - 600, - 600, - 600 - ], - underscore: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - quoteleft: [ - 278, - 278, - 222, - 222, - 333, - 333, - 333, - 333, - 600, - 600, - 600, - 600 - ], - a: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 444, - 600, - 600, - 600, - 600 - ], - b: [ - 611, - 611, - 556, - 556, - 556, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - c: [ - 556, - 556, - 500, - 500, - 444, - 444, - 444, - 444, - 600, - 600, - 600, - 600 - ], - d: [ - 611, - 611, - 556, - 556, - 556, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - e: [ - 556, - 556, - 556, - 556, - 444, - 444, - 444, - 444, - 600, - 600, - 600, - 600 - ], - f: [ - 333, - 333, - 278, - 278, - 333, - 333, - 278, - 333, - 600, - 600, - 600, - 600 - ], - g: [ - 611, - 611, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - h: [ - 611, - 611, - 556, - 556, - 556, - 556, - 500, - 500, - 600, - 600, - 600, - 600 - ], - i: [ - 278, - 278, - 222, - 222, - 278, - 278, - 278, - 278, - 600, - 600, - 600, - 600 - ], - j: [ - 278, - 278, - 222, - 222, - 333, - 278, - 278, - 278, - 600, - 600, - 600, - 600 - ], - k: [ - 556, - 556, - 500, - 500, - 556, - 500, - 444, - 500, - 600, - 600, - 600, - 600 - ], - l: [ - 278, - 278, - 222, - 222, - 278, - 278, - 278, - 278, - 600, - 600, - 600, - 600 - ], - m: [ - 889, - 889, - 833, - 833, - 833, - 778, - 722, - 778, - 600, - 600, - 600, - 600 - ], - n: [ - 611, - 611, - 556, - 556, - 556, - 556, - 500, - 500, - 600, - 600, - 600, - 600 - ], - o: [ - 611, - 611, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - p: [ - 611, - 611, - 556, - 556, - 556, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - q: [ - 611, - 611, - 556, - 556, - 556, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - r: [ - 389, - 389, - 333, - 333, - 444, - 389, - 389, - 333, - 600, - 600, - 600, - 600 - ], - s: [ - 556, - 556, - 500, - 500, - 389, - 389, - 389, - 389, - 600, - 600, - 600, - 600 - ], - t: [ - 333, - 333, - 278, - 278, - 333, - 278, - 278, - 278, - 600, - 600, - 600, - 600 - ], - u: [ - 611, - 611, - 556, - 556, - 556, - 556, - 500, - 500, - 600, - 600, - 600, - 600 - ], - v: [ - 556, - 556, - 500, - 500, - 500, - 444, - 444, - 500, - 600, - 600, - 600, - 600 - ], - w: [ - 778, - 778, - 722, - 722, - 722, - 667, - 667, - 722, - 600, - 600, - 600, - 600 - ], - x: [ - 556, - 556, - 500, - 500, - 500, - 500, - 444, - 500, - 600, - 600, - 600, - 600 - ], - y: [ - 556, - 556, - 500, - 500, - 500, - 444, - 444, - 500, - 600, - 600, - 600, - 600 - ], - z: [ - 500, - 500, - 500, - 500, - 444, - 389, - 389, - 444, - 600, - 600, - 600, - 600 - ], - braceleft: [ - 389, - 389, - 334, - 334, - 394, - 348, - 400, - 480, - 600, - 600, - 600, - 600 - ], - bar: [ - 280, - 280, - 260, - 260, - 220, - 220, - 275, - 200, - 600, - 600, - 600, - 600 - ], - braceright: [ - 389, - 389, - 334, - 334, - 394, - 348, - 400, - 480, - 600, - 600, - 600, - 600 - ], - asciitilde: [ - 584, - 584, - 584, - 584, - 520, - 570, - 541, - 541, - 600, - 600, - 600, - 600 - ], - exclamdown: [ - 333, - 333, - 333, - 333, - 333, - 389, - 389, - 333, - 600, - 600, - 600, - 600 - ], - cent: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - sterling: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - fraction: [ - 167, - 167, - 167, - 167, - 167, - 167, - 167, - 167, - 600, - 600, - 600, - 600 - ], - yen: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - florin: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - section: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - currency: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - quotesingle: [ - 238, - 238, - 191, - 191, - 278, - 278, - 214, - 180, - 600, - 600, - 600, - 600 - ], - quotedblleft: [ - 500, - 500, - 333, - 333, - 500, - 500, - 556, - 444, - 600, - 600, - 600, - 600 - ], - guillemotleft: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - guilsinglleft: [ - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 600, - 600, - 600, - 600 - ], - guilsinglright: [ - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 600, - 600, - 600, - 600 - ], - fi: [ - 611, - 611, - 500, - 500, - 556, - 556, - 500, - 556, - 600, - 600, - 600, - 600 - ], - fl: [ - 611, - 611, - 500, - 500, - 556, - 556, - 500, - 556, - 600, - 600, - 600, - 600 - ], - endash: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - dagger: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - daggerdbl: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - periodcentered: [ - 278, - 278, - 278, - 278, - 250, - 250, - 250, - 250, - 600, - 600, - 600, - 600 - ], - paragraph: [ - 556, - 556, - 537, - 537, - 540, - 500, - 523, - 453, - 600, - 600, - 600, - 600 - ], - bullet: [ - 350, - 350, - 350, - 350, - 350, - 350, - 350, - 350, - 600, - 600, - 600, - 600 - ], - quotesinglbase: [ - 278, - 278, - 222, - 222, - 333, - 333, - 333, - 333, - 600, - 600, - 600, - 600 - ], - quotedblbase: [ - 500, - 500, - 333, - 333, - 500, - 500, - 556, - 444, - 600, - 600, - 600, - 600 - ], - quotedblright: [ - 500, - 500, - 333, - 333, - 500, - 500, - 556, - 444, - 600, - 600, - 600, - 600 - ], - guillemotright: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - ellipsis: [ - 1000, - 1000, - 1000, - 1000, - 1000, - 1000, - 889, - 1000, - 600, - 600, - 600, - 600 - ], - perthousand: [ - 1000, - 1000, - 1000, - 1000, - 1000, - 1000, - 1000, - 1000, - 600, - 600, - 600, - 600 - ], - questiondown: [ - 611, - 611, - 611, - 611, - 500, - 500, - 500, - 444, - 600, - 600, - 600, - 600 - ], - grave: [ - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 600, - 600, - 600, - 600 - ], - acute: [ - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 600, - 600, - 600, - 600 - ], - circumflex: [ - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 600, - 600, - 600, - 600 - ], - tilde: [ - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 600, - 600, - 600, - 600 - ], - macron: [ - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 600, - 600, - 600, - 600 - ], - breve: [ - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 600, - 600, - 600, - 600 - ], - dotaccent: [ - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 600, - 600, - 600, - 600 - ], - dieresis: [ - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 600, - 600, - 600, - 600 - ], - ring: [ - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 600, - 600, - 600, - 600 - ], - cedilla: [ - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 600, - 600, - 600, - 600 - ], - hungarumlaut: [ - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 600, - 600, - 600, - 600 - ], - ogonek: [ - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 600, - 600, - 600, - 600 - ], - caron: [ - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 333, - 600, - 600, - 600, - 600 - ], - emdash: [ - 1000, - 1000, - 1000, - 1000, - 1000, - 1000, - 889, - 1000, - 600, - 600, - 600, - 600 - ], - AE: [ - 1000, - 1000, - 1000, - 1000, - 1000, - 944, - 889, - 889, - 600, - 600, - 600, - 600 - ], - ordfeminine: [ - 370, - 370, - 370, - 370, - 300, - 266, - 276, - 276, - 600, - 600, - 600, - 600 - ], - Lslash: [ - 611, - 611, - 556, - 556, - 667, - 611, - 556, - 611, - 600, - 600, - 600, - 600 - ], - Oslash: [ - 778, - 778, - 778, - 778, - 778, - 722, - 722, - 722, - 600, - 600, - 600, - 600 - ], - OE: [ - 1000, - 1000, - 1000, - 1000, - 1000, - 944, - 944, - 889, - 600, - 600, - 600, - 600 - ], - ordmasculine: [ - 365, - 365, - 365, - 365, - 330, - 300, - 310, - 310, - 600, - 600, - 600, - 600 - ], - ae: [ - 889, - 889, - 889, - 889, - 722, - 722, - 667, - 667, - 600, - 600, - 600, - 600 - ], - dotlessi: [ - 278, - 278, - 278, - 278, - 278, - 278, - 278, - 278, - 600, - 600, - 600, - 600 - ], - lslash: [ - 278, - 278, - 222, - 222, - 278, - 278, - 278, - 278, - 600, - 600, - 600, - 600 - ], - oslash: [ - 611, - 611, - 611, - 611, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - oe: [ - 944, - 944, - 944, - 944, - 722, - 722, - 667, - 722, - 600, - 600, - 600, - 600 - ], - germandbls: [ - 611, - 611, - 611, - 611, - 556, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - Idieresis: [ - 278, - 278, - 278, - 278, - 389, - 389, - 333, - 333, - 600, - 600, - 600, - 600 - ], - eacute: [ - 556, - 556, - 556, - 556, - 444, - 444, - 444, - 444, - 600, - 600, - 600, - 600 - ], - abreve: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 444, - 600, - 600, - 600, - 600 - ], - uhungarumlaut: [ - 611, - 611, - 556, - 556, - 556, - 556, - 500, - 500, - 600, - 600, - 600, - 600 - ], - ecaron: [ - 556, - 556, - 556, - 556, - 444, - 444, - 444, - 444, - 600, - 600, - 600, - 600 - ], - Ydieresis: [ - 667, - 667, - 667, - 667, - 722, - 611, - 556, - 722, - 600, - 600, - 600, - 600 - ], - divide: [ - 584, - 584, - 584, - 584, - 570, - 570, - 675, - 564, - 600, - 600, - 600, - 600 - ], - Yacute: [ - 667, - 667, - 667, - 667, - 722, - 611, - 556, - 722, - 600, - 600, - 600, - 600 - ], - Acircumflex: [ - 722, - 722, - 667, - 667, - 722, - 667, - 611, - 722, - 600, - 600, - 600, - 600 - ], - aacute: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 444, - 600, - 600, - 600, - 600 - ], - Ucircumflex: [ - 722, - 722, - 722, - 722, - 722, - 722, - 722, - 722, - 600, - 600, - 600, - 600 - ], - yacute: [ - 556, - 556, - 500, - 500, - 500, - 444, - 444, - 500, - 600, - 600, - 600, - 600 - ], - scommaaccent: [ - 556, - 556, - 500, - 500, - 389, - 389, - 389, - 389, - 600, - 600, - 600, - 600 - ], - ecircumflex: [ - 556, - 556, - 556, - 556, - 444, - 444, - 444, - 444, - 600, - 600, - 600, - 600 - ], - Uring: [ - 722, - 722, - 722, - 722, - 722, - 722, - 722, - 722, - 600, - 600, - 600, - 600 - ], - Udieresis: [ - 722, - 722, - 722, - 722, - 722, - 722, - 722, - 722, - 600, - 600, - 600, - 600 - ], - aogonek: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 444, - 600, - 600, - 600, - 600 - ], - Uacute: [ - 722, - 722, - 722, - 722, - 722, - 722, - 722, - 722, - 600, - 600, - 600, - 600 - ], - uogonek: [ - 611, - 611, - 556, - 556, - 556, - 556, - 500, - 500, - 600, - 600, - 600, - 600 - ], - Edieresis: [ - 667, - 667, - 667, - 667, - 667, - 667, - 611, - 611, - 600, - 600, - 600, - 600 - ], - Dcroat: [ - 722, - 722, - 722, - 722, - 722, - 722, - 722, - 722, - 600, - 600, - 600, - 600 - ], - commaaccent: [ - 250, - 250, - 250, - 250, - 250, - 250, - 250, - 250, - 600, - 600, - 600, - 600 - ], - copyright: [ - 737, - 737, - 737, - 737, - 747, - 747, - 760, - 760, - 600, - 600, - 600, - 600 - ], - Emacron: [ - 667, - 667, - 667, - 667, - 667, - 667, - 611, - 611, - 600, - 600, - 600, - 600 - ], - ccaron: [ - 556, - 556, - 500, - 500, - 444, - 444, - 444, - 444, - 600, - 600, - 600, - 600 - ], - aring: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 444, - 600, - 600, - 600, - 600 - ], - Ncommaaccent: [ - 722, - 722, - 722, - 722, - 722, - 722, - 667, - 722, - 600, - 600, - 600, - 600 - ], - lacute: [ - 278, - 278, - 222, - 222, - 278, - 278, - 278, - 278, - 600, - 600, - 600, - 600 - ], - agrave: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 444, - 600, - 600, - 600, - 600 - ], - Tcommaaccent: [ - 611, - 611, - 611, - 611, - 667, - 611, - 556, - 611, - 600, - 600, - 600, - 600 - ], - Cacute: [ - 722, - 722, - 722, - 722, - 722, - 667, - 667, - 667, - 600, - 600, - 600, - 600 - ], - atilde: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 444, - 600, - 600, - 600, - 600 - ], - Edotaccent: [ - 667, - 667, - 667, - 667, - 667, - 667, - 611, - 611, - 600, - 600, - 600, - 600 - ], - scaron: [ - 556, - 556, - 500, - 500, - 389, - 389, - 389, - 389, - 600, - 600, - 600, - 600 - ], - scedilla: [ - 556, - 556, - 500, - 500, - 389, - 389, - 389, - 389, - 600, - 600, - 600, - 600 - ], - iacute: [ - 278, - 278, - 278, - 278, - 278, - 278, - 278, - 278, - 600, - 600, - 600, - 600 - ], - lozenge: [ - 494, - 494, - 471, - 471, - 494, - 494, - 471, - 471, - 600, - 600, - 600, - 600 - ], - Rcaron: [ - 722, - 722, - 722, - 722, - 722, - 667, - 611, - 667, - 600, - 600, - 600, - 600 - ], - Gcommaaccent: [ - 778, - 778, - 778, - 778, - 778, - 722, - 722, - 722, - 600, - 600, - 600, - 600 - ], - ucircumflex: [ - 611, - 611, - 556, - 556, - 556, - 556, - 500, - 500, - 600, - 600, - 600, - 600 - ], - acircumflex: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 444, - 600, - 600, - 600, - 600 - ], - Amacron: [ - 722, - 722, - 667, - 667, - 722, - 667, - 611, - 722, - 600, - 600, - 600, - 600 - ], - rcaron: [ - 389, - 389, - 333, - 333, - 444, - 389, - 389, - 333, - 600, - 600, - 600, - 600 - ], - ccedilla: [ - 556, - 556, - 500, - 500, - 444, - 444, - 444, - 444, - 600, - 600, - 600, - 600 - ], - Zdotaccent: [ - 611, - 611, - 611, - 611, - 667, - 611, - 556, - 611, - 600, - 600, - 600, - 600 - ], - Thorn: [ - 667, - 667, - 667, - 667, - 611, - 611, - 611, - 556, - 600, - 600, - 600, - 600 - ], - Omacron: [ - 778, - 778, - 778, - 778, - 778, - 722, - 722, - 722, - 600, - 600, - 600, - 600 - ], - Racute: [ - 722, - 722, - 722, - 722, - 722, - 667, - 611, - 667, - 600, - 600, - 600, - 600 - ], - Sacute: [ - 667, - 667, - 667, - 667, - 556, - 556, - 500, - 556, - 600, - 600, - 600, - 600 - ], - dcaron: [ - 743, - 743, - 643, - 643, - 672, - 608, - 544, - 588, - 600, - 600, - 600, - 600 - ], - Umacron: [ - 722, - 722, - 722, - 722, - 722, - 722, - 722, - 722, - 600, - 600, - 600, - 600 - ], - uring: [ - 611, - 611, - 556, - 556, - 556, - 556, - 500, - 500, - 600, - 600, - 600, - 600 - ], - threesuperior: [ - 333, - 333, - 333, - 333, - 300, - 300, - 300, - 300, - 600, - 600, - 600, - 600 - ], - Ograve: [ - 778, - 778, - 778, - 778, - 778, - 722, - 722, - 722, - 600, - 600, - 600, - 600 - ], - Agrave: [ - 722, - 722, - 667, - 667, - 722, - 667, - 611, - 722, - 600, - 600, - 600, - 600 - ], - Abreve: [ - 722, - 722, - 667, - 667, - 722, - 667, - 611, - 722, - 600, - 600, - 600, - 600 - ], - multiply: [ - 584, - 584, - 584, - 584, - 570, - 570, - 675, - 564, - 600, - 600, - 600, - 600 - ], - uacute: [ - 611, - 611, - 556, - 556, - 556, - 556, - 500, - 500, - 600, - 600, - 600, - 600 - ], - Tcaron: [ - 611, - 611, - 611, - 611, - 667, - 611, - 556, - 611, - 600, - 600, - 600, - 600 - ], - partialdiff: [ - 494, - 494, - 476, - 476, - 494, - 494, - 476, - 476, - 600, - 600, - 600, - 600 - ], - ydieresis: [ - 556, - 556, - 500, - 500, - 500, - 444, - 444, - 500, - 600, - 600, - 600, - 600 - ], - Nacute: [ - 722, - 722, - 722, - 722, - 722, - 722, - 667, - 722, - 600, - 600, - 600, - 600 - ], - icircumflex: [ - 278, - 278, - 278, - 278, - 278, - 278, - 278, - 278, - 600, - 600, - 600, - 600 - ], - Ecircumflex: [ - 667, - 667, - 667, - 667, - 667, - 667, - 611, - 611, - 600, - 600, - 600, - 600 - ], - adieresis: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 444, - 600, - 600, - 600, - 600 - ], - edieresis: [ - 556, - 556, - 556, - 556, - 444, - 444, - 444, - 444, - 600, - 600, - 600, - 600 - ], - cacute: [ - 556, - 556, - 500, - 500, - 444, - 444, - 444, - 444, - 600, - 600, - 600, - 600 - ], - nacute: [ - 611, - 611, - 556, - 556, - 556, - 556, - 500, - 500, - 600, - 600, - 600, - 600 - ], - umacron: [ - 611, - 611, - 556, - 556, - 556, - 556, - 500, - 500, - 600, - 600, - 600, - 600 - ], - Ncaron: [ - 722, - 722, - 722, - 722, - 722, - 722, - 667, - 722, - 600, - 600, - 600, - 600 - ], - Iacute: [ - 278, - 278, - 278, - 278, - 389, - 389, - 333, - 333, - 600, - 600, - 600, - 600 - ], - plusminus: [ - 584, - 584, - 584, - 584, - 570, - 570, - 675, - 564, - 600, - 600, - 600, - 600 - ], - brokenbar: [ - 280, - 280, - 260, - 260, - 220, - 220, - 275, - 200, - 600, - 600, - 600, - 600 - ], - registered: [ - 737, - 737, - 737, - 737, - 747, - 747, - 760, - 760, - 600, - 600, - 600, - 600 - ], - Gbreve: [ - 778, - 778, - 778, - 778, - 778, - 722, - 722, - 722, - 600, - 600, - 600, - 600 - ], - Idotaccent: [ - 278, - 278, - 278, - 278, - 389, - 389, - 333, - 333, - 600, - 600, - 600, - 600 - ], - summation: [ - 600, - 600, - 600, - 600, - 600, - 600, - 600, - 600, - 600, - 600, - 600, - 600 - ], - Egrave: [ - 667, - 667, - 667, - 667, - 667, - 667, - 611, - 611, - 600, - 600, - 600, - 600 - ], - racute: [ - 389, - 389, - 333, - 333, - 444, - 389, - 389, - 333, - 600, - 600, - 600, - 600 - ], - omacron: [ - 611, - 611, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - Zacute: [ - 611, - 611, - 611, - 611, - 667, - 611, - 556, - 611, - 600, - 600, - 600, - 600 - ], - Zcaron: [ - 611, - 611, - 611, - 611, - 667, - 611, - 556, - 611, - 600, - 600, - 600, - 600 - ], - greaterequal: [ - 549, - 549, - 549, - 549, - 549, - 549, - 549, - 549, - 600, - 600, - 600, - 600 - ], - Eth: [ - 722, - 722, - 722, - 722, - 722, - 722, - 722, - 722, - 600, - 600, - 600, - 600 - ], - Ccedilla: [ - 722, - 722, - 722, - 722, - 722, - 667, - 667, - 667, - 600, - 600, - 600, - 600 - ], - lcommaaccent: [ - 278, - 278, - 222, - 222, - 278, - 278, - 278, - 278, - 600, - 600, - 600, - 600 - ], - tcaron: [ - 389, - 389, - 317, - 317, - 416, - 366, - 300, - 326, - 600, - 600, - 600, - 600 - ], - eogonek: [ - 556, - 556, - 556, - 556, - 444, - 444, - 444, - 444, - 600, - 600, - 600, - 600 - ], - Uogonek: [ - 722, - 722, - 722, - 722, - 722, - 722, - 722, - 722, - 600, - 600, - 600, - 600 - ], - Aacute: [ - 722, - 722, - 667, - 667, - 722, - 667, - 611, - 722, - 600, - 600, - 600, - 600 - ], - Adieresis: [ - 722, - 722, - 667, - 667, - 722, - 667, - 611, - 722, - 600, - 600, - 600, - 600 - ], - egrave: [ - 556, - 556, - 556, - 556, - 444, - 444, - 444, - 444, - 600, - 600, - 600, - 600 - ], - zacute: [ - 500, - 500, - 500, - 500, - 444, - 389, - 389, - 444, - 600, - 600, - 600, - 600 - ], - iogonek: [ - 278, - 278, - 222, - 222, - 278, - 278, - 278, - 278, - 600, - 600, - 600, - 600 - ], - Oacute: [ - 778, - 778, - 778, - 778, - 778, - 722, - 722, - 722, - 600, - 600, - 600, - 600 - ], - oacute: [ - 611, - 611, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - amacron: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 444, - 600, - 600, - 600, - 600 - ], - sacute: [ - 556, - 556, - 500, - 500, - 389, - 389, - 389, - 389, - 600, - 600, - 600, - 600 - ], - idieresis: [ - 278, - 278, - 278, - 278, - 278, - 278, - 278, - 278, - 600, - 600, - 600, - 600 - ], - Ocircumflex: [ - 778, - 778, - 778, - 778, - 778, - 722, - 722, - 722, - 600, - 600, - 600, - 600 - ], - Ugrave: [ - 722, - 722, - 722, - 722, - 722, - 722, - 722, - 722, - 600, - 600, - 600, - 600 - ], - Delta: [ - 612, - 612, - 612, - 612, - 612, - 612, - 612, - 612, - 600, - 600, - 600, - 600 - ], - thorn: [ - 611, - 611, - 556, - 556, - 556, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - twosuperior: [ - 333, - 333, - 333, - 333, - 300, - 300, - 300, - 300, - 600, - 600, - 600, - 600 - ], - Odieresis: [ - 778, - 778, - 778, - 778, - 778, - 722, - 722, - 722, - 600, - 600, - 600, - 600 - ], - mu: [ - 611, - 611, - 556, - 556, - 556, - 576, - 500, - 500, - 600, - 600, - 600, - 600 - ], - igrave: [ - 278, - 278, - 278, - 278, - 278, - 278, - 278, - 278, - 600, - 600, - 600, - 600 - ], - ohungarumlaut: [ - 611, - 611, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - Eogonek: [ - 667, - 667, - 667, - 667, - 667, - 667, - 611, - 611, - 600, - 600, - 600, - 600 - ], - dcroat: [ - 611, - 611, - 556, - 556, - 556, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - threequarters: [ - 834, - 834, - 834, - 834, - 750, - 750, - 750, - 750, - 600, - 600, - 600, - 600 - ], - Scedilla: [ - 667, - 667, - 667, - 667, - 556, - 556, - 500, - 556, - 600, - 600, - 600, - 600 - ], - lcaron: [ - 400, - 400, - 299, - 299, - 394, - 382, - 300, - 344, - 600, - 600, - 600, - 600 - ], - Kcommaaccent: [ - 722, - 722, - 667, - 667, - 778, - 667, - 667, - 722, - 600, - 600, - 600, - 600 - ], - Lacute: [ - 611, - 611, - 556, - 556, - 667, - 611, - 556, - 611, - 600, - 600, - 600, - 600 - ], - trademark: [ - 1000, - 1000, - 1000, - 1000, - 1000, - 1000, - 980, - 980, - 600, - 600, - 600, - 600 - ], - edotaccent: [ - 556, - 556, - 556, - 556, - 444, - 444, - 444, - 444, - 600, - 600, - 600, - 600 - ], - Igrave: [ - 278, - 278, - 278, - 278, - 389, - 389, - 333, - 333, - 600, - 600, - 600, - 600 - ], - Imacron: [ - 278, - 278, - 278, - 278, - 389, - 389, - 333, - 333, - 600, - 600, - 600, - 600 - ], - Lcaron: [ - 611, - 611, - 556, - 556, - 667, - 611, - 611, - 611, - 600, - 600, - 600, - 600 - ], - onehalf: [ - 834, - 834, - 834, - 834, - 750, - 750, - 750, - 750, - 600, - 600, - 600, - 600 - ], - lessequal: [ - 549, - 549, - 549, - 549, - 549, - 549, - 549, - 549, - 600, - 600, - 600, - 600 - ], - ocircumflex: [ - 611, - 611, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - ntilde: [ - 611, - 611, - 556, - 556, - 556, - 556, - 500, - 500, - 600, - 600, - 600, - 600 - ], - Uhungarumlaut: [ - 722, - 722, - 722, - 722, - 722, - 722, - 722, - 722, - 600, - 600, - 600, - 600 - ], - Eacute: [ - 667, - 667, - 667, - 667, - 667, - 667, - 611, - 611, - 600, - 600, - 600, - 600 - ], - emacron: [ - 556, - 556, - 556, - 556, - 444, - 444, - 444, - 444, - 600, - 600, - 600, - 600 - ], - gbreve: [ - 611, - 611, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - onequarter: [ - 834, - 834, - 834, - 834, - 750, - 750, - 750, - 750, - 600, - 600, - 600, - 600 - ], - Scaron: [ - 667, - 667, - 667, - 667, - 556, - 556, - 500, - 556, - 600, - 600, - 600, - 600 - ], - Scommaaccent: [ - 667, - 667, - 667, - 667, - 556, - 556, - 500, - 556, - 600, - 600, - 600, - 600 - ], - Ohungarumlaut: [ - 778, - 778, - 778, - 778, - 778, - 722, - 722, - 722, - 600, - 600, - 600, - 600 - ], - degree: [ - 400, - 400, - 400, - 400, - 400, - 400, - 400, - 400, - 600, - 600, - 600, - 600 - ], - ograve: [ - 611, - 611, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - Ccaron: [ - 722, - 722, - 722, - 722, - 722, - 667, - 667, - 667, - 600, - 600, - 600, - 600 - ], - ugrave: [ - 611, - 611, - 556, - 556, - 556, - 556, - 500, - 500, - 600, - 600, - 600, - 600 - ], - radical: [ - 549, - 549, - 453, - 453, - 549, - 549, - 453, - 453, - 600, - 600, - 600, - 600 - ], - Dcaron: [ - 722, - 722, - 722, - 722, - 722, - 722, - 722, - 722, - 600, - 600, - 600, - 600 - ], - rcommaaccent: [ - 389, - 389, - 333, - 333, - 444, - 389, - 389, - 333, - 600, - 600, - 600, - 600 - ], - Ntilde: [ - 722, - 722, - 722, - 722, - 722, - 722, - 667, - 722, - 600, - 600, - 600, - 600 - ], - otilde: [ - 611, - 611, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - Rcommaaccent: [ - 722, - 722, - 722, - 722, - 722, - 667, - 611, - 667, - 600, - 600, - 600, - 600 - ], - Lcommaaccent: [ - 611, - 611, - 556, - 556, - 667, - 611, - 556, - 611, - 600, - 600, - 600, - 600 - ], - Atilde: [ - 722, - 722, - 667, - 667, - 722, - 667, - 611, - 722, - 600, - 600, - 600, - 600 - ], - Aogonek: [ - 722, - 722, - 667, - 667, - 722, - 667, - 611, - 722, - 600, - 600, - 600, - 600 - ], - Aring: [ - 722, - 722, - 667, - 667, - 722, - 667, - 611, - 722, - 600, - 600, - 600, - 600 - ], - Otilde: [ - 778, - 778, - 778, - 778, - 778, - 722, - 722, - 722, - 600, - 600, - 600, - 600 - ], - zdotaccent: [ - 500, - 500, - 500, - 500, - 444, - 389, - 389, - 444, - 600, - 600, - 600, - 600 - ], - Ecaron: [ - 667, - 667, - 667, - 667, - 667, - 667, - 611, - 611, - 600, - 600, - 600, - 600 - ], - Iogonek: [ - 278, - 278, - 278, - 278, - 389, - 389, - 333, - 333, - 600, - 600, - 600, - 600 - ], - kcommaaccent: [ - 556, - 556, - 500, - 500, - 556, - 500, - 444, - 500, - 600, - 600, - 600, - 600 - ], - minus: [ - 584, - 584, - 584, - 584, - 570, - 606, - 675, - 564, - 600, - 600, - 600, - 600 - ], - Icircumflex: [ - 278, - 278, - 278, - 278, - 389, - 389, - 333, - 333, - 600, - 600, - 600, - 600 - ], - ncaron: [ - 611, - 611, - 556, - 556, - 556, - 556, - 500, - 500, - 600, - 600, - 600, - 600 - ], - tcommaaccent: [ - 333, - 333, - 278, - 278, - 333, - 278, - 278, - 278, - 600, - 600, - 600, - 600 - ], - logicalnot: [ - 584, - 584, - 584, - 584, - 570, - 606, - 675, - 564, - 600, - 600, - 600, - 600 - ], - odieresis: [ - 611, - 611, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - udieresis: [ - 611, - 611, - 556, - 556, - 556, - 556, - 500, - 500, - 600, - 600, - 600, - 600 - ], - notequal: [ - 549, - 549, - 549, - 549, - 549, - 549, - 549, - 549, - 600, - 600, - 600, - 600 - ], - gcommaaccent: [ - 611, - 611, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - eth: [ - 611, - 611, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ], - zcaron: [ - 500, - 500, - 500, - 500, - 444, - 389, - 389, - 444, - 600, - 600, - 600, - 600 - ], - ncommaaccent: [ - 611, - 611, - 556, - 556, - 556, - 556, - 500, - 500, - 600, - 600, - 600, - 600 - ], - onesuperior: [ - 333, - 333, - 333, - 333, - 300, - 300, - 300, - 300, - 600, - 600, - 600, - 600 - ], - imacron: [ - 278, - 278, - 278, - 278, - 278, - 278, - 278, - 278, - 600, - 600, - 600, - 600 - ], - Euro: [ - 556, - 556, - 556, - 556, - 500, - 500, - 500, - 500, - 600, - 600, - 600, - 600 - ] -}; -var kernPairs = { - AC: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - ACacute: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - ACcaron: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - ACcedilla: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AG: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AGbreve: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AGcommaaccent: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AO: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AOacute: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AOcircumflex: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AOdieresis: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AOgrave: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AOhungarumlaut: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AOmacron: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AOslash: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AOtilde: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AQ: [ - -40, - -40, - -30, - -30, - -45, - -55, - -40, - -55 - ], - AT: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - ATcaron: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - ATcommaaccent: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - AU: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AUacute: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AUcircumflex: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AUdieresis: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AUgrave: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AUhungarumlaut: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AUmacron: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AUogonek: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AUring: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AV: [ - -80, - -80, - -70, - -70, - -145, - -95, - -105, - -135 - ], - AW: [ - -60, - -60, - -50, - -50, - -130, - -100, - -95, - -90 - ], - AY: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - AYacute: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - AYdieresis: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - Au: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Auacute: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Aucircumflex: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Audieresis: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Augrave: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Auhungarumlaut: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Aumacron: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Auogonek: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Auring: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Av: [ - -40, - -40, - -40, - -40, - -100, - -74, - -55, - -74 - ], - Aw: [ - -30, - -30, - -40, - -40, - -90, - -74, - -55, - -92 - ], - Ay: [ - -30, - -30, - -40, - -40, - -74, - -74, - -55, - -92 - ], - Ayacute: [ - -30, - -30, - -40, - -40, - -74, - -74, - -55, - -92 - ], - Aydieresis: [ - -30, - -30, - -40, - -40, - -74, - -74, - -55, - -92 - ], - AacuteC: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AacuteCacute: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AacuteCcaron: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AacuteCcedilla: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AacuteG: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AacuteGbreve: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AacuteGcommaaccent: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AacuteO: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AacuteOacute: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AacuteOcircumflex: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AacuteOdieresis: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AacuteOgrave: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AacuteOhungarumlaut: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AacuteOmacron: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AacuteOslash: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AacuteOtilde: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AacuteQ: [ - -40, - -40, - -30, - -30, - -45, - -55, - -40, - -55 - ], - AacuteT: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - AacuteTcaron: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - AacuteTcommaaccent: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - AacuteU: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AacuteUacute: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AacuteUcircumflex: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AacuteUdieresis: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AacuteUgrave: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AacuteUhungarumlaut: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AacuteUmacron: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AacuteUogonek: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AacuteUring: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AacuteV: [ - -80, - -80, - -70, - -70, - -145, - -95, - -105, - -135 - ], - AacuteW: [ - -60, - -60, - -50, - -50, - -130, - -100, - -95, - -90 - ], - AacuteY: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - AacuteYacute: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - AacuteYdieresis: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - Aacuteu: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Aacuteuacute: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Aacuteucircumflex: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Aacuteudieresis: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Aacuteugrave: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Aacuteuhungarumlaut: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Aacuteumacron: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Aacuteuogonek: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Aacuteuring: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Aacutev: [ - -40, - -40, - -40, - -40, - -100, - -74, - -55, - -74 - ], - Aacutew: [ - -30, - -30, - -40, - -40, - -90, - -74, - -55, - -92 - ], - Aacutey: [ - -30, - -30, - -40, - -40, - -74, - -74, - -55, - -92 - ], - Aacuteyacute: [ - -30, - -30, - -40, - -40, - -74, - -74, - -55, - -92 - ], - Aacuteydieresis: [ - -30, - -30, - -40, - -40, - -74, - -74, - -55, - -92 - ], - AbreveC: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AbreveCacute: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AbreveCcaron: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AbreveCcedilla: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AbreveG: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AbreveGbreve: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AbreveGcommaaccent: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AbreveO: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AbreveOacute: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AbreveOcircumflex: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AbreveOdieresis: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AbreveOgrave: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AbreveOhungarumlaut: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AbreveOmacron: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AbreveOslash: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AbreveOtilde: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AbreveQ: [ - -40, - -40, - -30, - -30, - -45, - -55, - -40, - -55 - ], - AbreveT: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - AbreveTcaron: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - AbreveTcommaaccent: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - AbreveU: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AbreveUacute: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AbreveUcircumflex: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AbreveUdieresis: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AbreveUgrave: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AbreveUhungarumlaut: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AbreveUmacron: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AbreveUogonek: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AbreveUring: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AbreveV: [ - -80, - -80, - -70, - -70, - -145, - -95, - -105, - -135 - ], - AbreveW: [ - -60, - -60, - -50, - -50, - -130, - -100, - -95, - -90 - ], - AbreveY: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - AbreveYacute: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - AbreveYdieresis: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - Abreveu: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Abreveuacute: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Abreveucircumflex: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Abreveudieresis: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Abreveugrave: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Abreveuhungarumlaut: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Abreveumacron: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Abreveuogonek: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Abreveuring: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Abrevev: [ - -40, - -40, - -40, - -40, - -100, - -74, - -55, - -74 - ], - Abrevew: [ - -30, - -30, - -40, - -40, - -90, - -74, - -55, - -92 - ], - Abrevey: [ - -30, - -30, - -40, - -40, - -74, - -74, - -55, - -92 - ], - Abreveyacute: [ - -30, - -30, - -40, - -40, - -74, - -74, - -55, - -92 - ], - Abreveydieresis: [ - -30, - -30, - -40, - -40, - -74, - -74, - -55, - -92 - ], - AcircumflexC: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AcircumflexCacute: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AcircumflexCcaron: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AcircumflexCcedilla: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AcircumflexG: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AcircumflexGbreve: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AcircumflexGcommaaccent: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AcircumflexO: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AcircumflexOacute: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AcircumflexOcircumflex: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AcircumflexOdieresis: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AcircumflexOgrave: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AcircumflexOhungarumlaut: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AcircumflexOmacron: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AcircumflexOslash: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AcircumflexOtilde: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AcircumflexQ: [ - -40, - -40, - -30, - -30, - -45, - -55, - -40, - -55 - ], - AcircumflexT: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - AcircumflexTcaron: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - AcircumflexTcommaaccent: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - AcircumflexU: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AcircumflexUacute: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AcircumflexUcircumflex: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AcircumflexUdieresis: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AcircumflexUgrave: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AcircumflexUhungarumlaut: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AcircumflexUmacron: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AcircumflexUogonek: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AcircumflexUring: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AcircumflexV: [ - -80, - -80, - -70, - -70, - -145, - -95, - -105, - -135 - ], - AcircumflexW: [ - -60, - -60, - -50, - -50, - -130, - -100, - -95, - -90 - ], - AcircumflexY: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - AcircumflexYacute: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - AcircumflexYdieresis: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - Acircumflexu: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Acircumflexuacute: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Acircumflexucircumflex: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Acircumflexudieresis: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Acircumflexugrave: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Acircumflexuhungarumlaut: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Acircumflexumacron: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Acircumflexuogonek: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Acircumflexuring: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Acircumflexv: [ - -40, - -40, - -40, - -40, - -100, - -74, - -55, - -74 - ], - Acircumflexw: [ - -30, - -30, - -40, - -40, - -90, - -74, - -55, - -92 - ], - Acircumflexy: [ - -30, - -30, - -40, - -40, - -74, - -74, - -55, - -92 - ], - Acircumflexyacute: [ - -30, - -30, - -40, - -40, - -74, - -74, - -55, - -92 - ], - Acircumflexydieresis: [ - -30, - -30, - -40, - -40, - -74, - -74, - -55, - -92 - ], - AdieresisC: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AdieresisCacute: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AdieresisCcaron: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AdieresisCcedilla: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AdieresisG: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AdieresisGbreve: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AdieresisGcommaaccent: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AdieresisO: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AdieresisOacute: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AdieresisOcircumflex: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AdieresisOdieresis: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AdieresisOgrave: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AdieresisOhungarumlaut: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AdieresisOmacron: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AdieresisOslash: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AdieresisOtilde: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AdieresisQ: [ - -40, - -40, - -30, - -30, - -45, - -55, - -40, - -55 - ], - AdieresisT: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - AdieresisTcaron: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - AdieresisTcommaaccent: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - AdieresisU: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AdieresisUacute: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AdieresisUcircumflex: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AdieresisUdieresis: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AdieresisUgrave: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AdieresisUhungarumlaut: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AdieresisUmacron: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AdieresisUogonek: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AdieresisUring: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AdieresisV: [ - -80, - -80, - -70, - -70, - -145, - -95, - -105, - -135 - ], - AdieresisW: [ - -60, - -60, - -50, - -50, - -130, - -100, - -95, - -90 - ], - AdieresisY: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - AdieresisYacute: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - AdieresisYdieresis: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - Adieresisu: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Adieresisuacute: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Adieresisucircumflex: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Adieresisudieresis: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Adieresisugrave: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Adieresisuhungarumlaut: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Adieresisumacron: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Adieresisuogonek: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Adieresisuring: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Adieresisv: [ - -40, - -40, - -40, - -40, - -100, - -74, - -55, - -74 - ], - Adieresisw: [ - -30, - -30, - -40, - -40, - -90, - -74, - -55, - -92 - ], - Adieresisy: [ - -30, - -30, - -40, - -40, - -74, - -74, - -55, - -92 - ], - Adieresisyacute: [ - -30, - -30, - -40, - -40, - -74, - -74, - -55, - -92 - ], - Adieresisydieresis: [ - -30, - -30, - -40, - -40, - -74, - -74, - -55, - -92 - ], - AgraveC: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AgraveCacute: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AgraveCcaron: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AgraveCcedilla: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AgraveG: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AgraveGbreve: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AgraveGcommaaccent: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AgraveO: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AgraveOacute: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AgraveOcircumflex: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AgraveOdieresis: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AgraveOgrave: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AgraveOhungarumlaut: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AgraveOmacron: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AgraveOslash: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AgraveOtilde: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AgraveQ: [ - -40, - -40, - -30, - -30, - -45, - -55, - -40, - -55 - ], - AgraveT: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - AgraveTcaron: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - AgraveTcommaaccent: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - AgraveU: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AgraveUacute: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AgraveUcircumflex: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AgraveUdieresis: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AgraveUgrave: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AgraveUhungarumlaut: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AgraveUmacron: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AgraveUogonek: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AgraveUring: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AgraveV: [ - -80, - -80, - -70, - -70, - -145, - -95, - -105, - -135 - ], - AgraveW: [ - -60, - -60, - -50, - -50, - -130, - -100, - -95, - -90 - ], - AgraveY: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - AgraveYacute: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - AgraveYdieresis: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - Agraveu: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Agraveuacute: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Agraveucircumflex: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Agraveudieresis: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Agraveugrave: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Agraveuhungarumlaut: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Agraveumacron: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Agraveuogonek: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Agraveuring: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Agravev: [ - -40, - -40, - -40, - -40, - -100, - -74, - -55, - -74 - ], - Agravew: [ - -30, - -30, - -40, - -40, - -90, - -74, - -55, - -92 - ], - Agravey: [ - -30, - -30, - -40, - -40, - -74, - -74, - -55, - -92 - ], - Agraveyacute: [ - -30, - -30, - -40, - -40, - -74, - -74, - -55, - -92 - ], - Agraveydieresis: [ - -30, - -30, - -40, - -40, - -74, - -74, - -55, - -92 - ], - AmacronC: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AmacronCacute: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AmacronCcaron: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AmacronCcedilla: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AmacronG: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AmacronGbreve: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AmacronGcommaaccent: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AmacronO: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AmacronOacute: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AmacronOcircumflex: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AmacronOdieresis: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AmacronOgrave: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AmacronOhungarumlaut: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AmacronOmacron: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AmacronOslash: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AmacronOtilde: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AmacronQ: [ - -40, - -40, - -30, - -30, - -45, - -55, - -40, - -55 - ], - AmacronT: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - AmacronTcaron: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - AmacronTcommaaccent: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - AmacronU: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AmacronUacute: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AmacronUcircumflex: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AmacronUdieresis: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AmacronUgrave: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AmacronUhungarumlaut: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AmacronUmacron: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AmacronUogonek: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AmacronUring: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AmacronV: [ - -80, - -80, - -70, - -70, - -145, - -95, - -105, - -135 - ], - AmacronW: [ - -60, - -60, - -50, - -50, - -130, - -100, - -95, - -90 - ], - AmacronY: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - AmacronYacute: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - AmacronYdieresis: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - Amacronu: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Amacronuacute: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Amacronucircumflex: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Amacronudieresis: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Amacronugrave: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Amacronuhungarumlaut: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Amacronumacron: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Amacronuogonek: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Amacronuring: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Amacronv: [ - -40, - -40, - -40, - -40, - -100, - -74, - -55, - -74 - ], - Amacronw: [ - -30, - -30, - -40, - -40, - -90, - -74, - -55, - -92 - ], - Amacrony: [ - -30, - -30, - -40, - -40, - -74, - -74, - -55, - -92 - ], - Amacronyacute: [ - -30, - -30, - -40, - -40, - -74, - -74, - -55, - -92 - ], - Amacronydieresis: [ - -30, - -30, - -40, - -40, - -74, - -74, - -55, - -92 - ], - AogonekC: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AogonekCacute: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AogonekCcaron: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AogonekCcedilla: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AogonekG: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AogonekGbreve: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AogonekGcommaaccent: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AogonekO: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AogonekOacute: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AogonekOcircumflex: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AogonekOdieresis: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AogonekOgrave: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AogonekOhungarumlaut: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AogonekOmacron: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AogonekOslash: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AogonekOtilde: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AogonekQ: [ - -40, - -40, - -30, - -30, - -45, - -55, - -40, - -55 - ], - AogonekT: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - AogonekTcaron: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - AogonekTcommaaccent: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - AogonekU: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AogonekUacute: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AogonekUcircumflex: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AogonekUdieresis: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AogonekUgrave: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AogonekUhungarumlaut: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AogonekUmacron: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AogonekUogonek: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AogonekUring: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AogonekV: [ - -80, - -80, - -70, - -70, - -145, - -95, - -105, - -135 - ], - AogonekW: [ - -60, - -60, - -50, - -50, - -130, - -100, - -95, - -90 - ], - AogonekY: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - AogonekYacute: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - AogonekYdieresis: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - Aogoneku: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Aogonekuacute: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Aogonekucircumflex: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Aogonekudieresis: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Aogonekugrave: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Aogonekuhungarumlaut: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Aogonekumacron: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Aogonekuogonek: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Aogonekuring: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Aogonekv: [ - -40, - -40, - -40, - -40, - -100, - -74, - -55, - -74 - ], - Aogonekw: [ - -30, - -30, - -40, - -40, - -90, - -74, - -55, - -52 - ], - Aogoneky: [ - -30, - -30, - -40, - -40, - -34, - -34, - -55, - -52 - ], - Aogonekyacute: [ - -30, - -30, - -40, - -40, - -34, - -34, - -55, - -52 - ], - Aogonekydieresis: [ - -30, - -30, - -40, - -40, - -34, - -34, - -55, - -52 - ], - AringC: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AringCacute: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AringCcaron: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AringCcedilla: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AringG: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AringGbreve: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AringGcommaaccent: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AringO: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AringOacute: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AringOcircumflex: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AringOdieresis: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AringOgrave: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AringOhungarumlaut: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AringOmacron: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AringOslash: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AringOtilde: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AringQ: [ - -40, - -40, - -30, - -30, - -45, - -55, - -40, - -55 - ], - AringT: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - AringTcaron: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - AringTcommaaccent: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - AringU: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AringUacute: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AringUcircumflex: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AringUdieresis: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AringUgrave: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AringUhungarumlaut: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AringUmacron: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AringUogonek: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AringUring: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AringV: [ - -80, - -80, - -70, - -70, - -145, - -95, - -105, - -135 - ], - AringW: [ - -60, - -60, - -50, - -50, - -130, - -100, - -95, - -90 - ], - AringY: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - AringYacute: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - AringYdieresis: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - Aringu: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Aringuacute: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Aringucircumflex: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Aringudieresis: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Aringugrave: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Aringuhungarumlaut: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Aringumacron: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Aringuogonek: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Aringuring: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Aringv: [ - -40, - -40, - -40, - -40, - -100, - -74, - -55, - -74 - ], - Aringw: [ - -30, - -30, - -40, - -40, - -90, - -74, - -55, - -92 - ], - Aringy: [ - -30, - -30, - -40, - -40, - -74, - -74, - -55, - -92 - ], - Aringyacute: [ - -30, - -30, - -40, - -40, - -74, - -74, - -55, - -92 - ], - Aringydieresis: [ - -30, - -30, - -40, - -40, - -74, - -74, - -55, - -92 - ], - AtildeC: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AtildeCacute: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AtildeCcaron: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AtildeCcedilla: [ - -40, - -40, - -30, - -30, - -55, - -65, - -30, - -40 - ], - AtildeG: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AtildeGbreve: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AtildeGcommaaccent: [ - -50, - -50, - -30, - -30, - -55, - -60, - -35, - -40 - ], - AtildeO: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AtildeOacute: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AtildeOcircumflex: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AtildeOdieresis: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AtildeOgrave: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AtildeOhungarumlaut: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AtildeOmacron: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AtildeOslash: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AtildeOtilde: [ - -40, - -40, - -30, - -30, - -45, - -50, - -40, - -55 - ], - AtildeQ: [ - -40, - -40, - -30, - -30, - -45, - -55, - -40, - -55 - ], - AtildeT: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - AtildeTcaron: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - AtildeTcommaaccent: [ - -90, - -90, - -120, - -120, - -95, - -55, - -37, - -111 - ], - AtildeU: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AtildeUacute: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AtildeUcircumflex: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AtildeUdieresis: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AtildeUgrave: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AtildeUhungarumlaut: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AtildeUmacron: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AtildeUogonek: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AtildeUring: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -55 - ], - AtildeV: [ - -80, - -80, - -70, - -70, - -145, - -95, - -105, - -135 - ], - AtildeW: [ - -60, - -60, - -50, - -50, - -130, - -100, - -95, - -90 - ], - AtildeY: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - AtildeYacute: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - AtildeYdieresis: [ - -110, - -110, - -100, - -100, - -100, - -70, - -55, - -105 - ], - Atildeu: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Atildeuacute: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Atildeucircumflex: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Atildeudieresis: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Atildeugrave: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Atildeuhungarumlaut: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Atildeumacron: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Atildeuogonek: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Atildeuring: [ - -30, - -30, - -30, - -30, - -50, - -30, - -20 - ], - Atildev: [ - -40, - -40, - -40, - -40, - -100, - -74, - -55, - -74 - ], - Atildew: [ - -30, - -30, - -40, - -40, - -90, - -74, - -55, - -92 - ], - Atildey: [ - -30, - -30, - -40, - -40, - -74, - -74, - -55, - -92 - ], - Atildeyacute: [ - -30, - -30, - -40, - -40, - -74, - -74, - -55, - -92 - ], - Atildeydieresis: [ - -30, - -30, - -40, - -40, - -74, - -74, - -55, - -92 - ], - BA: [ - -30, - -30, - 0, - 0, - -30, - -25, - -25, - -35 - ], - BAacute: [ - -30, - -30, - 0, - 0, - -30, - -25, - -25, - -35 - ], - BAbreve: [ - -30, - -30, - 0, - 0, - -30, - -25, - -25, - -35 - ], - BAcircumflex: [ - -30, - -30, - 0, - 0, - -30, - -25, - -25, - -35 - ], - BAdieresis: [ - -30, - -30, - 0, - 0, - -30, - -25, - -25, - -35 - ], - BAgrave: [ - -30, - -30, - 0, - 0, - -30, - -25, - -25, - -35 - ], - BAmacron: [ - -30, - -30, - 0, - 0, - -30, - -25, - -25, - -35 - ], - BAogonek: [ - -30, - -30, - 0, - 0, - -30, - -25, - -25, - -35 - ], - BAring: [ - -30, - -30, - 0, - 0, - -30, - -25, - -25, - -35 - ], - BAtilde: [ - -30, - -30, - 0, - 0, - -30, - -25, - -25, - -35 - ], - BU: [ - -10, - -10, - -10, - -10, - -10, - -10, - -10, - -10 - ], - BUacute: [ - -10, - -10, - -10, - -10, - -10, - -10, - -10, - -10 - ], - BUcircumflex: [ - -10, - -10, - -10, - -10, - -10, - -10, - -10, - -10 - ], - BUdieresis: [ - -10, - -10, - -10, - -10, - -10, - -10, - -10, - -10 - ], - BUgrave: [ - -10, - -10, - -10, - -10, - -10, - -10, - -10, - -10 - ], - BUhungarumlaut: [ - -10, - -10, - -10, - -10, - -10, - -10, - -10, - -10 - ], - BUmacron: [ - -10, - -10, - -10, - -10, - -10, - -10, - -10, - -10 - ], - BUogonek: [ - -10, - -10, - -10, - -10, - -10, - -10, - -10, - -10 - ], - BUring: [ - -10, - -10, - -10, - -10, - -10, - -10, - -10, - -10 - ], - DA: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DAacute: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DAbreve: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DAcircumflex: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DAdieresis: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DAgrave: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DAmacron: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DAogonek: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DAring: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DAtilde: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DV: [ - -40, - -40, - -70, - -70, - -40, - -50, - -40, - -40 - ], - DW: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -30 - ], - DY: [ - -70, - -70, - -90, - -90, - -40, - -50, - -40, - -55 - ], - DYacute: [ - -70, - -70, - -90, - -90, - -40, - -50, - -40, - -55 - ], - DYdieresis: [ - -70, - -70, - -90, - -90, - -40, - -50, - -40, - -55 - ], - Dcomma: [ - -30, - -30, - -70, - -70 - ], - Dperiod: [ - -30, - -30, - -70, - -70, - -20 - ], - DcaronA: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DcaronAacute: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DcaronAbreve: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DcaronAcircumflex: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DcaronAdieresis: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DcaronAgrave: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DcaronAmacron: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DcaronAogonek: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DcaronAring: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DcaronAtilde: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DcaronV: [ - -40, - -40, - -70, - -70, - -40, - -50, - -40, - -40 - ], - DcaronW: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -30 - ], - DcaronY: [ - -70, - -70, - -90, - -90, - -40, - -50, - -40, - -55 - ], - DcaronYacute: [ - -70, - -70, - -90, - -90, - -40, - -50, - -40, - -55 - ], - DcaronYdieresis: [ - -70, - -70, - -90, - -90, - -40, - -50, - -40, - -55 - ], - Dcaroncomma: [ - -30, - -30, - -70, - -70 - ], - Dcaronperiod: [ - -30, - -30, - -70, - -70, - -20 - ], - DcroatA: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DcroatAacute: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DcroatAbreve: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DcroatAcircumflex: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DcroatAdieresis: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DcroatAgrave: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DcroatAmacron: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DcroatAogonek: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DcroatAring: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DcroatAtilde: [ - -40, - -40, - -40, - -40, - -35, - -25, - -35, - -40 - ], - DcroatV: [ - -40, - -40, - -70, - -70, - -40, - -50, - -40, - -40 - ], - DcroatW: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -30 - ], - DcroatY: [ - -70, - -70, - -90, - -90, - -40, - -50, - -40, - -55 - ], - DcroatYacute: [ - -70, - -70, - -90, - -90, - -40, - -50, - -40, - -55 - ], - DcroatYdieresis: [ - -70, - -70, - -90, - -90, - -40, - -50, - -40, - -55 - ], - Dcroatcomma: [ - -30, - -30, - -70, - -70 - ], - Dcroatperiod: [ - -30, - -30, - -70, - -70, - -20 - ], - FA: [ - -80, - -80, - -80, - -80, - -90, - -100, - -115, - -74 - ], - FAacute: [ - -80, - -80, - -80, - -80, - -90, - -100, - -115, - -74 - ], - FAbreve: [ - -80, - -80, - -80, - -80, - -90, - -100, - -115, - -74 - ], - FAcircumflex: [ - -80, - -80, - -80, - -80, - -90, - -100, - -115, - -74 - ], - FAdieresis: [ - -80, - -80, - -80, - -80, - -90, - -100, - -115, - -74 - ], - FAgrave: [ - -80, - -80, - -80, - -80, - -90, - -100, - -115, - -74 - ], - FAmacron: [ - -80, - -80, - -80, - -80, - -90, - -100, - -115, - -74 - ], - FAogonek: [ - -80, - -80, - -80, - -80, - -90, - -100, - -115, - -74 - ], - FAring: [ - -80, - -80, - -80, - -80, - -90, - -100, - -115, - -74 - ], - FAtilde: [ - -80, - -80, - -80, - -80, - -90, - -100, - -115, - -74 - ], - Fa: [ - -20, - -20, - -50, - -50, - -25, - -95, - -75, - -15 - ], - Faacute: [ - -20, - -20, - -50, - -50, - -25, - -95, - -75, - -15 - ], - Fabreve: [ - -20, - -20, - -50, - -50, - -25, - -95, - -75, - -15 - ], - Facircumflex: [ - -20, - -20, - -50, - -50, - -25, - -95, - -75, - -15 - ], - Fadieresis: [ - -20, - -20, - -50, - -50, - -25, - -95, - -75, - -15 - ], - Fagrave: [ - -20, - -20, - -50, - -50, - -25, - -95, - -75, - -15 - ], - Famacron: [ - -20, - -20, - -50, - -50, - -25, - -95, - -75, - -15 - ], - Faogonek: [ - -20, - -20, - -50, - -50, - -25, - -95, - -75, - -15 - ], - Faring: [ - -20, - -20, - -50, - -50, - -25, - -95, - -75, - -15 - ], - Fatilde: [ - -20, - -20, - -50, - -50, - -25, - -95, - -75, - -15 - ], - Fcomma: [ - -100, - -100, - -150, - -150, - -92, - -129, - -135, - -80 - ], - Fperiod: [ - -100, - -100, - -150, - -150, - -110, - -129, - -135, - -80 - ], - JA: [ - -20, - -20, - -20, - -20, - -30, - -25, - -40, - -60 - ], - JAacute: [ - -20, - -20, - -20, - -20, - -30, - -25, - -40, - -60 - ], - JAbreve: [ - -20, - -20, - -20, - -20, - -30, - -25, - -40, - -60 - ], - JAcircumflex: [ - -20, - -20, - -20, - -20, - -30, - -25, - -40, - -60 - ], - JAdieresis: [ - -20, - -20, - -20, - -20, - -30, - -25, - -40, - -60 - ], - JAgrave: [ - -20, - -20, - -20, - -20, - -30, - -25, - -40, - -60 - ], - JAmacron: [ - -20, - -20, - -20, - -20, - -30, - -25, - -40, - -60 - ], - JAogonek: [ - -20, - -20, - -20, - -20, - -30, - -25, - -40, - -60 - ], - JAring: [ - -20, - -20, - -20, - -20, - -30, - -25, - -40, - -60 - ], - JAtilde: [ - -20, - -20, - -20, - -20, - -30, - -25, - -40, - -60 - ], - Jcomma: [ - -20, - -20, - -30, - -30, - 0, - -10, - -25 - ], - Jperiod: [ - -20, - -20, - -30, - -30, - -20, - -10, - -25 - ], - Ju: [ - -20, - -20, - -20, - -20, - -15, - -40, - -35 - ], - Juacute: [ - -20, - -20, - -20, - -20, - -15, - -40, - -35 - ], - Jucircumflex: [ - -20, - -20, - -20, - -20, - -15, - -40, - -35 - ], - Judieresis: [ - -20, - -20, - -20, - -20, - -15, - -40, - -35 - ], - Jugrave: [ - -20, - -20, - -20, - -20, - -15, - -40, - -35 - ], - Juhungarumlaut: [ - -20, - -20, - -20, - -20, - -15, - -40, - -35 - ], - Jumacron: [ - -20, - -20, - -20, - -20, - -15, - -40, - -35 - ], - Juogonek: [ - -20, - -20, - -20, - -20, - -15, - -40, - -35 - ], - Juring: [ - -20, - -20, - -20, - -20, - -15, - -40, - -35 - ], - KO: [ - -30, - -30, - -50, - -50, - -30, - -30, - -50, - -30 - ], - KOacute: [ - -30, - -30, - -50, - -50, - -30, - -30, - -50, - -30 - ], - KOcircumflex: [ - -30, - -30, - -50, - -50, - -30, - -30, - -50, - -30 - ], - KOdieresis: [ - -30, - -30, - -50, - -50, - -30, - -30, - -50, - -30 - ], - KOgrave: [ - -30, - -30, - -50, - -50, - -30, - -30, - -50, - -30 - ], - KOhungarumlaut: [ - -30, - -30, - -50, - -50, - -30, - -30, - -50, - -30 - ], - KOmacron: [ - -30, - -30, - -50, - -50, - -30, - -30, - -50, - -30 - ], - KOslash: [ - -30, - -30, - -50, - -50, - -30, - -30, - -50, - -30 - ], - KOtilde: [ - -30, - -30, - -50, - -50, - -30, - -30, - -50, - -30 - ], - Ke: [ - -15, - -15, - -40, - -40, - -25, - -25, - -35, - -25 - ], - Keacute: [ - -15, - -15, - -40, - -40, - -25, - -25, - -35, - -25 - ], - Kecaron: [ - -15, - -15, - -40, - -40, - -25, - -25, - -35, - -25 - ], - Kecircumflex: [ - -15, - -15, - -40, - -40, - -25, - -25, - -35, - -25 - ], - Kedieresis: [ - -15, - -15, - -40, - -40, - -25, - -25, - -35, - -25 - ], - Kedotaccent: [ - -15, - -15, - -40, - -40, - -25, - -25, - -35, - -25 - ], - Kegrave: [ - -15, - -15, - -40, - -40, - -25, - -25, - -35, - -25 - ], - Kemacron: [ - -15, - -15, - -40, - -40, - -25, - -25, - -35, - -25 - ], - Keogonek: [ - -15, - -15, - -40, - -40, - -25, - -25, - -35, - -25 - ], - Ko: [ - -35, - -35, - -40, - -40, - -25, - -25, - -40, - -35 - ], - Koacute: [ - -35, - -35, - -40, - -40, - -25, - -25, - -40, - -35 - ], - Kocircumflex: [ - -35, - -35, - -40, - -40, - -25, - -25, - -40, - -35 - ], - Kodieresis: [ - -35, - -35, - -40, - -40, - -25, - -25, - -40, - -35 - ], - Kograve: [ - -35, - -35, - -40, - -40, - -25, - -25, - -40, - -35 - ], - Kohungarumlaut: [ - -35, - -35, - -40, - -40, - -25, - -25, - -40, - -35 - ], - Komacron: [ - -35, - -35, - -40, - -40, - -25, - -25, - -40, - -35 - ], - Koslash: [ - -35, - -35, - -40, - -40, - -25, - -25, - -40, - -35 - ], - Kotilde: [ - -35, - -35, - -40, - -40, - -25, - -25, - -40, - -35 - ], - Ku: [ - -30, - -30, - -30, - -30, - -15, - -20, - -40, - -15 - ], - Kuacute: [ - -30, - -30, - -30, - -30, - -15, - -20, - -40, - -15 - ], - Kucircumflex: [ - -30, - -30, - -30, - -30, - -15, - -20, - -40, - -15 - ], - Kudieresis: [ - -30, - -30, - -30, - -30, - -15, - -20, - -40, - -15 - ], - Kugrave: [ - -30, - -30, - -30, - -30, - -15, - -20, - -40, - -15 - ], - Kuhungarumlaut: [ - -30, - -30, - -30, - -30, - -15, - -20, - -40, - -15 - ], - Kumacron: [ - -30, - -30, - -30, - -30, - -15, - -20, - -40, - -15 - ], - Kuogonek: [ - -30, - -30, - -30, - -30, - -15, - -20, - -40, - -15 - ], - Kuring: [ - -30, - -30, - -30, - -30, - -15, - -20, - -40, - -15 - ], - Ky: [ - -40, - -40, - -50, - -50, - -45, - -20, - -40, - -25 - ], - Kyacute: [ - -40, - -40, - -50, - -50, - -45, - -20, - -40, - -25 - ], - Kydieresis: [ - -40, - -40, - -50, - -50, - -45, - -20, - -40, - -25 - ], - KcommaaccentO: [ - -30, - -30, - -50, - -50, - -30, - -30, - -50, - -30 - ], - KcommaaccentOacute: [ - -30, - -30, - -50, - -50, - -30, - -30, - -50, - -30 - ], - KcommaaccentOcircumflex: [ - -30, - -30, - -50, - -50, - -30, - -30, - -50, - -30 - ], - KcommaaccentOdieresis: [ - -30, - -30, - -50, - -50, - -30, - -30, - -50, - -30 - ], - KcommaaccentOgrave: [ - -30, - -30, - -50, - -50, - -30, - -30, - -50, - -30 - ], - KcommaaccentOhungarumlaut: [ - -30, - -30, - -50, - -50, - -30, - -30, - -50, - -30 - ], - KcommaaccentOmacron: [ - -30, - -30, - -50, - -50, - -30, - -30, - -50, - -30 - ], - KcommaaccentOslash: [ - -30, - -30, - -50, - -50, - -30, - -30, - -50, - -30 - ], - KcommaaccentOtilde: [ - -30, - -30, - -50, - -50, - -30, - -30, - -50, - -30 - ], - Kcommaaccente: [ - -15, - -15, - -40, - -40, - -25, - -25, - -35, - -25 - ], - Kcommaaccenteacute: [ - -15, - -15, - -40, - -40, - -25, - -25, - -35, - -25 - ], - Kcommaaccentecaron: [ - -15, - -15, - -40, - -40, - -25, - -25, - -35, - -25 - ], - Kcommaaccentecircumflex: [ - -15, - -15, - -40, - -40, - -25, - -25, - -35, - -25 - ], - Kcommaaccentedieresis: [ - -15, - -15, - -40, - -40, - -25, - -25, - -35, - -25 - ], - Kcommaaccentedotaccent: [ - -15, - -15, - -40, - -40, - -25, - -25, - -35, - -25 - ], - Kcommaaccentegrave: [ - -15, - -15, - -40, - -40, - -25, - -25, - -35, - -25 - ], - Kcommaaccentemacron: [ - -15, - -15, - -40, - -40, - -25, - -25, - -35, - -25 - ], - Kcommaaccenteogonek: [ - -15, - -15, - -40, - -40, - -25, - -25, - -35, - -25 - ], - Kcommaaccento: [ - -35, - -35, - -40, - -40, - -25, - -25, - -40, - -35 - ], - Kcommaaccentoacute: [ - -35, - -35, - -40, - -40, - -25, - -25, - -40, - -35 - ], - Kcommaaccentocircumflex: [ - -35, - -35, - -40, - -40, - -25, - -25, - -40, - -35 - ], - Kcommaaccentodieresis: [ - -35, - -35, - -40, - -40, - -25, - -25, - -40, - -35 - ], - Kcommaaccentograve: [ - -35, - -35, - -40, - -40, - -25, - -25, - -40, - -35 - ], - Kcommaaccentohungarumlaut: [ - -35, - -35, - -40, - -40, - -25, - -25, - -40, - -35 - ], - Kcommaaccentomacron: [ - -35, - -35, - -40, - -40, - -25, - -25, - -40, - -35 - ], - Kcommaaccentoslash: [ - -35, - -35, - -40, - -40, - -25, - -25, - -40, - -35 - ], - Kcommaaccentotilde: [ - -35, - -35, - -40, - -40, - -25, - -25, - -40, - -35 - ], - Kcommaaccentu: [ - -30, - -30, - -30, - -30, - -15, - -20, - -40, - -15 - ], - Kcommaaccentuacute: [ - -30, - -30, - -30, - -30, - -15, - -20, - -40, - -15 - ], - Kcommaaccentucircumflex: [ - -30, - -30, - -30, - -30, - -15, - -20, - -40, - -15 - ], - Kcommaaccentudieresis: [ - -30, - -30, - -30, - -30, - -15, - -20, - -40, - -15 - ], - Kcommaaccentugrave: [ - -30, - -30, - -30, - -30, - -15, - -20, - -40, - -15 - ], - Kcommaaccentuhungarumlaut: [ - -30, - -30, - -30, - -30, - -15, - -20, - -40, - -15 - ], - Kcommaaccentumacron: [ - -30, - -30, - -30, - -30, - -15, - -20, - -40, - -15 - ], - Kcommaaccentuogonek: [ - -30, - -30, - -30, - -30, - -15, - -20, - -40, - -15 - ], - Kcommaaccenturing: [ - -30, - -30, - -30, - -30, - -15, - -20, - -40, - -15 - ], - Kcommaaccenty: [ - -40, - -40, - -50, - -50, - -45, - -20, - -40, - -25 - ], - Kcommaaccentyacute: [ - -40, - -40, - -50, - -50, - -45, - -20, - -40, - -25 - ], - Kcommaaccentydieresis: [ - -40, - -40, - -50, - -50, - -45, - -20, - -40, - -25 - ], - LT: [ - -90, - -90, - -110, - -110, - -92, - -18, - -20, - -92 - ], - LTcaron: [ - -90, - -90, - -110, - -110, - -92, - -18, - -20, - -92 - ], - LTcommaaccent: [ - -90, - -90, - -110, - -110, - -92, - -18, - -20, - -92 - ], - LV: [ - -110, - -110, - -110, - -110, - -92, - -37, - -55, - -100 - ], - LW: [ - -80, - -80, - -70, - -70, - -92, - -37, - -55, - -74 - ], - LY: [ - -120, - -120, - -140, - -140, - -92, - -37, - -20, - -100 - ], - LYacute: [ - -120, - -120, - -140, - -140, - -92, - -37, - -20, - -100 - ], - LYdieresis: [ - -120, - -120, - -140, - -140, - -92, - -37, - -20, - -100 - ], - Lquotedblright: [ - -140, - -140, - -140, - -140, - -20 - ], - Lquoteright: [ - -140, - -140, - -160, - -160, - -110, - -55, - -37, - -92 - ], - Ly: [ - -30, - -30, - -30, - -30, - -55, - -37, - -30, - -55 - ], - Lyacute: [ - -30, - -30, - -30, - -30, - -55, - -37, - -30, - -55 - ], - Lydieresis: [ - -30, - -30, - -30, - -30, - -55, - -37, - -30, - -55 - ], - LacuteT: [ - -90, - -90, - -110, - -110, - -92, - -18, - -20, - -92 - ], - LacuteTcaron: [ - -90, - -90, - -110, - -110, - -92, - -18, - -20, - -92 - ], - LacuteTcommaaccent: [ - -90, - -90, - -110, - -110, - -92, - -18, - -20, - -92 - ], - LacuteV: [ - -110, - -110, - -110, - -110, - -92, - -37, - -55, - -100 - ], - LacuteW: [ - -80, - -80, - -70, - -70, - -92, - -37, - -55, - -74 - ], - LacuteY: [ - -120, - -120, - -140, - -140, - -92, - -37, - -20, - -100 - ], - LacuteYacute: [ - -120, - -120, - -140, - -140, - -92, - -37, - -20, - -100 - ], - LacuteYdieresis: [ - -120, - -120, - -140, - -140, - -92, - -37, - -20, - -100 - ], - Lacutequotedblright: [ - -140, - -140, - -140, - -140, - -20 - ], - Lacutequoteright: [ - -140, - -140, - -160, - -160, - -110, - -55, - -37, - -92 - ], - Lacutey: [ - -30, - -30, - -30, - -30, - -55, - -37, - -30, - -55 - ], - Lacuteyacute: [ - -30, - -30, - -30, - -30, - -55, - -37, - -30, - -55 - ], - Lacuteydieresis: [ - -30, - -30, - -30, - -30, - -55, - -37, - -30, - -55 - ], - LcommaaccentT: [ - -90, - -90, - -110, - -110, - -92, - -18, - -20, - -92 - ], - LcommaaccentTcaron: [ - -90, - -90, - -110, - -110, - -92, - -18, - -20, - -92 - ], - LcommaaccentTcommaaccent: [ - -90, - -90, - -110, - -110, - -92, - -18, - -20, - -92 - ], - LcommaaccentV: [ - -110, - -110, - -110, - -110, - -92, - -37, - -55, - -100 - ], - LcommaaccentW: [ - -80, - -80, - -70, - -70, - -92, - -37, - -55, - -74 - ], - LcommaaccentY: [ - -120, - -120, - -140, - -140, - -92, - -37, - -20, - -100 - ], - LcommaaccentYacute: [ - -120, - -120, - -140, - -140, - -92, - -37, - -20, - -100 - ], - LcommaaccentYdieresis: [ - -120, - -120, - -140, - -140, - -92, - -37, - -20, - -100 - ], - Lcommaaccentquotedblright: [ - -140, - -140, - -140, - -140, - -20 - ], - Lcommaaccentquoteright: [ - -140, - -140, - -160, - -160, - -110, - -55, - -37, - -92 - ], - Lcommaaccenty: [ - -30, - -30, - -30, - -30, - -55, - -37, - -30, - -55 - ], - Lcommaaccentyacute: [ - -30, - -30, - -30, - -30, - -55, - -37, - -30, - -55 - ], - Lcommaaccentydieresis: [ - -30, - -30, - -30, - -30, - -55, - -37, - -30, - -55 - ], - LslashT: [ - -90, - -90, - -110, - -110, - -92, - -18, - -20, - -92 - ], - LslashTcaron: [ - -90, - -90, - -110, - -110, - -92, - -18, - -20, - -92 - ], - LslashTcommaaccent: [ - -90, - -90, - -110, - -110, - -92, - -18, - -20, - -92 - ], - LslashV: [ - -110, - -110, - -110, - -110, - -92, - -37, - -55, - -100 - ], - LslashW: [ - -80, - -80, - -70, - -70, - -92, - -37, - -55, - -74 - ], - LslashY: [ - -120, - -120, - -140, - -140, - -92, - -37, - -20, - -100 - ], - LslashYacute: [ - -120, - -120, - -140, - -140, - -92, - -37, - -20, - -100 - ], - LslashYdieresis: [ - -120, - -120, - -140, - -140, - -92, - -37, - -20, - -100 - ], - Lslashquotedblright: [ - -140, - -140, - -140, - -140, - -20 - ], - Lslashquoteright: [ - -140, - -140, - -160, - -160, - -110, - -55, - -37, - -92 - ], - Lslashy: [ - -30, - -30, - -30, - -30, - -55, - -37, - -30, - -55 - ], - Lslashyacute: [ - -30, - -30, - -30, - -30, - -55, - -37, - -30, - -55 - ], - Lslashydieresis: [ - -30, - -30, - -30, - -30, - -55, - -37, - -30, - -55 - ], - OA: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OAacute: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OAbreve: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OAcircumflex: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OAdieresis: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OAgrave: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OAmacron: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OAogonek: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OAring: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OAtilde: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OT: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -40 - ], - OTcaron: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -40 - ], - OTcommaaccent: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -40 - ], - OV: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -50 - ], - OW: [ - -50, - -50, - -30, - -30, - -50, - -50, - -50, - -35 - ], - OX: [ - -50, - -50, - -60, - -60, - -40, - -40, - -40, - -40 - ], - OY: [ - -70, - -70, - -70, - -70, - -50, - -50, - -50, - -50 - ], - OYacute: [ - -70, - -70, - -70, - -70, - -50, - -50, - -50, - -50 - ], - OYdieresis: [ - -70, - -70, - -70, - -70, - -50, - -50, - -50, - -50 - ], - Ocomma: [ - -40, - -40, - -40, - -40 - ], - Operiod: [ - -40, - -40, - -40, - -40 - ], - OacuteA: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OacuteAacute: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OacuteAbreve: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OacuteAcircumflex: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OacuteAdieresis: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OacuteAgrave: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OacuteAmacron: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OacuteAogonek: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OacuteAring: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OacuteAtilde: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OacuteT: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -40 - ], - OacuteTcaron: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -40 - ], - OacuteTcommaaccent: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -40 - ], - OacuteV: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -50 - ], - OacuteW: [ - -50, - -50, - -30, - -30, - -50, - -50, - -50, - -35 - ], - OacuteX: [ - -50, - -50, - -60, - -60, - -40, - -40, - -40, - -40 - ], - OacuteY: [ - -70, - -70, - -70, - -70, - -50, - -50, - -50, - -50 - ], - OacuteYacute: [ - -70, - -70, - -70, - -70, - -50, - -50, - -50, - -50 - ], - OacuteYdieresis: [ - -70, - -70, - -70, - -70, - -50, - -50, - -50, - -50 - ], - Oacutecomma: [ - -40, - -40, - -40, - -40 - ], - Oacuteperiod: [ - -40, - -40, - -40, - -40 - ], - OcircumflexA: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OcircumflexAacute: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OcircumflexAbreve: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OcircumflexAcircumflex: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OcircumflexAdieresis: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OcircumflexAgrave: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OcircumflexAmacron: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OcircumflexAogonek: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OcircumflexAring: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OcircumflexAtilde: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OcircumflexT: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -40 - ], - OcircumflexTcaron: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -40 - ], - OcircumflexTcommaaccent: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -40 - ], - OcircumflexV: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -50 - ], - OcircumflexW: [ - -50, - -50, - -30, - -30, - -50, - -50, - -50, - -35 - ], - OcircumflexX: [ - -50, - -50, - -60, - -60, - -40, - -40, - -40, - -40 - ], - OcircumflexY: [ - -70, - -70, - -70, - -70, - -50, - -50, - -50, - -50 - ], - OcircumflexYacute: [ - -70, - -70, - -70, - -70, - -50, - -50, - -50, - -50 - ], - OcircumflexYdieresis: [ - -70, - -70, - -70, - -70, - -50, - -50, - -50, - -50 - ], - Ocircumflexcomma: [ - -40, - -40, - -40, - -40 - ], - Ocircumflexperiod: [ - -40, - -40, - -40, - -40 - ], - OdieresisA: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OdieresisAacute: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OdieresisAbreve: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OdieresisAcircumflex: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OdieresisAdieresis: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OdieresisAgrave: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OdieresisAmacron: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OdieresisAogonek: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OdieresisAring: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OdieresisAtilde: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OdieresisT: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -40 - ], - OdieresisTcaron: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -40 - ], - OdieresisTcommaaccent: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -40 - ], - OdieresisV: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -50 - ], - OdieresisW: [ - -50, - -50, - -30, - -30, - -50, - -50, - -50, - -35 - ], - OdieresisX: [ - -50, - -50, - -60, - -60, - -40, - -40, - -40, - -40 - ], - OdieresisY: [ - -70, - -70, - -70, - -70, - -50, - -50, - -50, - -50 - ], - OdieresisYacute: [ - -70, - -70, - -70, - -70, - -50, - -50, - -50, - -50 - ], - OdieresisYdieresis: [ - -70, - -70, - -70, - -70, - -50, - -50, - -50, - -50 - ], - Odieresiscomma: [ - -40, - -40, - -40, - -40 - ], - Odieresisperiod: [ - -40, - -40, - -40, - -40 - ], - OgraveA: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OgraveAacute: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OgraveAbreve: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OgraveAcircumflex: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OgraveAdieresis: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OgraveAgrave: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OgraveAmacron: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OgraveAogonek: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OgraveAring: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OgraveAtilde: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OgraveT: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -40 - ], - OgraveTcaron: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -40 - ], - OgraveTcommaaccent: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -40 - ], - OgraveV: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -50 - ], - OgraveW: [ - -50, - -50, - -30, - -30, - -50, - -50, - -50, - -35 - ], - OgraveX: [ - -50, - -50, - -60, - -60, - -40, - -40, - -40, - -40 - ], - OgraveY: [ - -70, - -70, - -70, - -70, - -50, - -50, - -50, - -50 - ], - OgraveYacute: [ - -70, - -70, - -70, - -70, - -50, - -50, - -50, - -50 - ], - OgraveYdieresis: [ - -70, - -70, - -70, - -70, - -50, - -50, - -50, - -50 - ], - Ogravecomma: [ - -40, - -40, - -40, - -40 - ], - Ograveperiod: [ - -40, - -40, - -40, - -40 - ], - OhungarumlautA: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OhungarumlautAacute: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OhungarumlautAbreve: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OhungarumlautAcircumflex: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OhungarumlautAdieresis: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OhungarumlautAgrave: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OhungarumlautAmacron: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OhungarumlautAogonek: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OhungarumlautAring: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OhungarumlautAtilde: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OhungarumlautT: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -40 - ], - OhungarumlautTcaron: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -40 - ], - OhungarumlautTcommaaccent: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -40 - ], - OhungarumlautV: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -50 - ], - OhungarumlautW: [ - -50, - -50, - -30, - -30, - -50, - -50, - -50, - -35 - ], - OhungarumlautX: [ - -50, - -50, - -60, - -60, - -40, - -40, - -40, - -40 - ], - OhungarumlautY: [ - -70, - -70, - -70, - -70, - -50, - -50, - -50, - -50 - ], - OhungarumlautYacute: [ - -70, - -70, - -70, - -70, - -50, - -50, - -50, - -50 - ], - OhungarumlautYdieresis: [ - -70, - -70, - -70, - -70, - -50, - -50, - -50, - -50 - ], - Ohungarumlautcomma: [ - -40, - -40, - -40, - -40 - ], - Ohungarumlautperiod: [ - -40, - -40, - -40, - -40 - ], - OmacronA: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OmacronAacute: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OmacronAbreve: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OmacronAcircumflex: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OmacronAdieresis: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OmacronAgrave: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OmacronAmacron: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OmacronAogonek: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OmacronAring: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OmacronAtilde: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OmacronT: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -40 - ], - OmacronTcaron: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -40 - ], - OmacronTcommaaccent: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -40 - ], - OmacronV: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -50 - ], - OmacronW: [ - -50, - -50, - -30, - -30, - -50, - -50, - -50, - -35 - ], - OmacronX: [ - -50, - -50, - -60, - -60, - -40, - -40, - -40, - -40 - ], - OmacronY: [ - -70, - -70, - -70, - -70, - -50, - -50, - -50, - -50 - ], - OmacronYacute: [ - -70, - -70, - -70, - -70, - -50, - -50, - -50, - -50 - ], - OmacronYdieresis: [ - -70, - -70, - -70, - -70, - -50, - -50, - -50, - -50 - ], - Omacroncomma: [ - -40, - -40, - -40, - -40 - ], - Omacronperiod: [ - -40, - -40, - -40, - -40 - ], - OslashA: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OslashAacute: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OslashAbreve: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OslashAcircumflex: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OslashAdieresis: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OslashAgrave: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OslashAmacron: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OslashAogonek: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OslashAring: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OslashAtilde: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OslashT: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -40 - ], - OslashTcaron: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -40 - ], - OslashTcommaaccent: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -40 - ], - OslashV: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -50 - ], - OslashW: [ - -50, - -50, - -30, - -30, - -50, - -50, - -50, - -35 - ], - OslashX: [ - -50, - -50, - -60, - -60, - -40, - -40, - -40, - -40 - ], - OslashY: [ - -70, - -70, - -70, - -70, - -50, - -50, - -50, - -50 - ], - OslashYacute: [ - -70, - -70, - -70, - -70, - -50, - -50, - -50, - -50 - ], - OslashYdieresis: [ - -70, - -70, - -70, - -70, - -50, - -50, - -50, - -50 - ], - Oslashcomma: [ - -40, - -40, - -40, - -40 - ], - Oslashperiod: [ - -40, - -40, - -40, - -40 - ], - OtildeA: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OtildeAacute: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OtildeAbreve: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OtildeAcircumflex: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OtildeAdieresis: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OtildeAgrave: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OtildeAmacron: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OtildeAogonek: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OtildeAring: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OtildeAtilde: [ - -50, - -50, - -20, - -20, - -40, - -40, - -55, - -35 - ], - OtildeT: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -40 - ], - OtildeTcaron: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -40 - ], - OtildeTcommaaccent: [ - -40, - -40, - -40, - -40, - -40, - -40, - -40, - -40 - ], - OtildeV: [ - -50, - -50, - -50, - -50, - -50, - -50, - -50, - -50 - ], - OtildeW: [ - -50, - -50, - -30, - -30, - -50, - -50, - -50, - -35 - ], - OtildeX: [ - -50, - -50, - -60, - -60, - -40, - -40, - -40, - -40 - ], - OtildeY: [ - -70, - -70, - -70, - -70, - -50, - -50, - -50, - -50 - ], - OtildeYacute: [ - -70, - -70, - -70, - -70, - -50, - -50, - -50, - -50 - ], - OtildeYdieresis: [ - -70, - -70, - -70, - -70, - -50, - -50, - -50, - -50 - ], - Otildecomma: [ - -40, - -40, - -40, - -40 - ], - Otildeperiod: [ - -40, - -40, - -40, - -40 - ], - PA: [ - -100, - -100, - -120, - -120, - -74, - -85, - -90, - -92 - ], - PAacute: [ - -100, - -100, - -120, - -120, - -74, - -85, - -90, - -92 - ], - PAbreve: [ - -100, - -100, - -120, - -120, - -74, - -85, - -90, - -92 - ], - PAcircumflex: [ - -100, - -100, - -120, - -120, - -74, - -85, - -90, - -92 - ], - PAdieresis: [ - -100, - -100, - -120, - -120, - -74, - -85, - -90, - -92 - ], - PAgrave: [ - -100, - -100, - -120, - -120, - -74, - -85, - -90, - -92 - ], - PAmacron: [ - -100, - -100, - -120, - -120, - -74, - -85, - -90, - -92 - ], - PAogonek: [ - -100, - -100, - -120, - -120, - -74, - -85, - -90, - -92 - ], - PAring: [ - -100, - -100, - -120, - -120, - -74, - -85, - -90, - -92 - ], - PAtilde: [ - -100, - -100, - -120, - -120, - -74, - -85, - -90, - -92 - ], - Pa: [ - -30, - -30, - -40, - -40, - -10, - -40, - -80, - -15 - ], - Paacute: [ - -30, - -30, - -40, - -40, - -10, - -40, - -80, - -15 - ], - Pabreve: [ - -30, - -30, - -40, - -40, - -10, - -40, - -80, - -15 - ], - Pacircumflex: [ - -30, - -30, - -40, - -40, - -10, - -40, - -80, - -15 - ], - Padieresis: [ - -30, - -30, - -40, - -40, - -10, - -40, - -80, - -15 - ], - Pagrave: [ - -30, - -30, - -40, - -40, - -10, - -40, - -80, - -15 - ], - Pamacron: [ - -30, - -30, - -40, - -40, - -10, - -40, - -80, - -15 - ], - Paogonek: [ - -30, - -30, - -40, - -40, - -10, - -40, - -80, - -15 - ], - Paring: [ - -30, - -30, - -40, - -40, - -10, - -40, - -80, - -15 - ], - Patilde: [ - -30, - -30, - -40, - -40, - -10, - -40, - -80, - -15 - ], - Pcomma: [ - -120, - -120, - -180, - -180, - -92, - -129, - -135, - -111 - ], - Pe: [ - -30, - -30, - -50, - -50, - -20, - -50, - -80 - ], - Peacute: [ - -30, - -30, - -50, - -50, - -20, - -50, - -80 - ], - Pecaron: [ - -30, - -30, - -50, - -50, - -20, - -50, - -80 - ], - Pecircumflex: [ - -30, - -30, - -50, - -50, - -20, - -50, - -80 - ], - Pedieresis: [ - -30, - -30, - -50, - -50, - -20, - -50, - -80 - ], - Pedotaccent: [ - -30, - -30, - -50, - -50, - -20, - -50, - -80 - ], - Pegrave: [ - -30, - -30, - -50, - -50, - -20, - -50, - -80 - ], - Pemacron: [ - -30, - -30, - -50, - -50, - -20, - -50, - -80 - ], - Peogonek: [ - -30, - -30, - -50, - -50, - -20, - -50, - -80 - ], - Po: [ - -40, - -40, - -50, - -50, - -20, - -55, - -80 - ], - Poacute: [ - -40, - -40, - -50, - -50, - -20, - -55, - -80 - ], - Pocircumflex: [ - -40, - -40, - -50, - -50, - -20, - -55, - -80 - ], - Podieresis: [ - -40, - -40, - -50, - -50, - -20, - -55, - -80 - ], - Pograve: [ - -40, - -40, - -50, - -50, - -20, - -55, - -80 - ], - Pohungarumlaut: [ - -40, - -40, - -50, - -50, - -20, - -55, - -80 - ], - Pomacron: [ - -40, - -40, - -50, - -50, - -20, - -55, - -80 - ], - Poslash: [ - -40, - -40, - -50, - -50, - -20, - -55, - -80 - ], - Potilde: [ - -40, - -40, - -50, - -50, - -20, - -55, - -80 - ], - Pperiod: [ - -120, - -120, - -180, - -180, - -110, - -129, - -135, - -111 - ], - QU: [ - -10, - -10, - -10, - -10, - -10, - -10, - -10, - -10 - ], - QUacute: [ - -10, - -10, - -10, - -10, - -10, - -10, - -10, - -10 - ], - QUcircumflex: [ - -10, - -10, - -10, - -10, - -10, - -10, - -10, - -10 - ], - QUdieresis: [ - -10, - -10, - -10, - -10, - -10, - -10, - -10, - -10 - ], - QUgrave: [ - -10, - -10, - -10, - -10, - -10, - -10, - -10, - -10 - ], - QUhungarumlaut: [ - -10, - -10, - -10, - -10, - -10, - -10, - -10, - -10 - ], - QUmacron: [ - -10, - -10, - -10, - -10, - -10, - -10, - -10, - -10 - ], - QUogonek: [ - -10, - -10, - -10, - -10, - -10, - -10, - -10, - -10 - ], - QUring: [ - -10, - -10, - -10, - -10, - -10, - -10, - -10, - -10 - ], - Qcomma: [ - 20, - 20 - ], - Qperiod: [ - 20, - 20, - 0, - 0, - -20 - ], - RO: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - ROacute: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - ROcircumflex: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - ROdieresis: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - ROgrave: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - ROhungarumlaut: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - ROmacron: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - ROslash: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - ROtilde: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - RT: [ - -20, - -20, - -30, - -30, - -40, - -30, - 0, - -60 - ], - RTcaron: [ - -20, - -20, - -30, - -30, - -40, - -30, - 0, - -60 - ], - RTcommaaccent: [ - -20, - -20, - -30, - -30, - -40, - -30, - 0, - -60 - ], - RU: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RUacute: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RUcircumflex: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RUdieresis: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RUgrave: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RUhungarumlaut: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RUmacron: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RUogonek: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RUring: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RV: [ - -50, - -50, - -50, - -50, - -55, - -18, - -18, - -80 - ], - RW: [ - -40, - -40, - -30, - -30, - -35, - -18, - -18, - -55 - ], - RY: [ - -50, - -50, - -50, - -50, - -35, - -18, - -18, - -65 - ], - RYacute: [ - -50, - -50, - -50, - -50, - -35, - -18, - -18, - -65 - ], - RYdieresis: [ - -50, - -50, - -50, - -50, - -35, - -18, - -18, - -65 - ], - RacuteO: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - RacuteOacute: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - RacuteOcircumflex: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - RacuteOdieresis: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - RacuteOgrave: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - RacuteOhungarumlaut: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - RacuteOmacron: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - RacuteOslash: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - RacuteOtilde: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - RacuteT: [ - -20, - -20, - -30, - -30, - -40, - -30, - 0, - -60 - ], - RacuteTcaron: [ - -20, - -20, - -30, - -30, - -40, - -30, - 0, - -60 - ], - RacuteTcommaaccent: [ - -20, - -20, - -30, - -30, - -40, - -30, - 0, - -60 - ], - RacuteU: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RacuteUacute: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RacuteUcircumflex: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RacuteUdieresis: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RacuteUgrave: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RacuteUhungarumlaut: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RacuteUmacron: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RacuteUogonek: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RacuteUring: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RacuteV: [ - -50, - -50, - -50, - -50, - -55, - -18, - -18, - -80 - ], - RacuteW: [ - -40, - -40, - -30, - -30, - -35, - -18, - -18, - -55 - ], - RacuteY: [ - -50, - -50, - -50, - -50, - -35, - -18, - -18, - -65 - ], - RacuteYacute: [ - -50, - -50, - -50, - -50, - -35, - -18, - -18, - -65 - ], - RacuteYdieresis: [ - -50, - -50, - -50, - -50, - -35, - -18, - -18, - -65 - ], - RcaronO: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - RcaronOacute: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - RcaronOcircumflex: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - RcaronOdieresis: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - RcaronOgrave: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - RcaronOhungarumlaut: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - RcaronOmacron: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - RcaronOslash: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - RcaronOtilde: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - RcaronT: [ - -20, - -20, - -30, - -30, - -40, - -30, - 0, - -60 - ], - RcaronTcaron: [ - -20, - -20, - -30, - -30, - -40, - -30, - 0, - -60 - ], - RcaronTcommaaccent: [ - -20, - -20, - -30, - -30, - -40, - -30, - 0, - -60 - ], - RcaronU: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RcaronUacute: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RcaronUcircumflex: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RcaronUdieresis: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RcaronUgrave: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RcaronUhungarumlaut: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RcaronUmacron: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RcaronUogonek: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RcaronUring: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RcaronV: [ - -50, - -50, - -50, - -50, - -55, - -18, - -18, - -80 - ], - RcaronW: [ - -40, - -40, - -30, - -30, - -35, - -18, - -18, - -55 - ], - RcaronY: [ - -50, - -50, - -50, - -50, - -35, - -18, - -18, - -65 - ], - RcaronYacute: [ - -50, - -50, - -50, - -50, - -35, - -18, - -18, - -65 - ], - RcaronYdieresis: [ - -50, - -50, - -50, - -50, - -35, - -18, - -18, - -65 - ], - RcommaaccentO: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - RcommaaccentOacute: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - RcommaaccentOcircumflex: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - RcommaaccentOdieresis: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - RcommaaccentOgrave: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - RcommaaccentOhungarumlaut: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - RcommaaccentOmacron: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - RcommaaccentOslash: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - RcommaaccentOtilde: [ - -20, - -20, - -20, - -20, - -30, - -40, - -40, - -40 - ], - RcommaaccentT: [ - -20, - -20, - -30, - -30, - -40, - -30, - 0, - -60 - ], - RcommaaccentTcaron: [ - -20, - -20, - -30, - -30, - -40, - -30, - 0, - -60 - ], - RcommaaccentTcommaaccent: [ - -20, - -20, - -30, - -30, - -40, - -30, - 0, - -60 - ], - RcommaaccentU: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RcommaaccentUacute: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RcommaaccentUcircumflex: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RcommaaccentUdieresis: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RcommaaccentUgrave: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RcommaaccentUhungarumlaut: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RcommaaccentUmacron: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RcommaaccentUogonek: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RcommaaccentUring: [ - -20, - -20, - -40, - -40, - -30, - -40, - -40, - -40 - ], - RcommaaccentV: [ - -50, - -50, - -50, - -50, - -55, - -18, - -18, - -80 - ], - RcommaaccentW: [ - -40, - -40, - -30, - -30, - -35, - -18, - -18, - -55 - ], - RcommaaccentY: [ - -50, - -50, - -50, - -50, - -35, - -18, - -18, - -65 - ], - RcommaaccentYacute: [ - -50, - -50, - -50, - -50, - -35, - -18, - -18, - -65 - ], - RcommaaccentYdieresis: [ - -50, - -50, - -50, - -50, - -35, - -18, - -18, - -65 - ], - TA: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TAacute: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TAbreve: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TAcircumflex: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TAdieresis: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TAgrave: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TAmacron: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TAogonek: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TAring: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TAtilde: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TO: [ - -40, - -40, - -40, - -40, - -18, - -18, - -18, - -18 - ], - TOacute: [ - -40, - -40, - -40, - -40, - -18, - -18, - -18, - -18 - ], - TOcircumflex: [ - -40, - -40, - -40, - -40, - -18, - -18, - -18, - -18 - ], - TOdieresis: [ - -40, - -40, - -40, - -40, - -18, - -18, - -18, - -18 - ], - TOgrave: [ - -40, - -40, - -40, - -40, - -18, - -18, - -18, - -18 - ], - TOhungarumlaut: [ - -40, - -40, - -40, - -40, - -18, - -18, - -18, - -18 - ], - TOmacron: [ - -40, - -40, - -40, - -40, - -18, - -18, - -18, - -18 - ], - TOslash: [ - -40, - -40, - -40, - -40, - -18, - -18, - -18, - -18 - ], - TOtilde: [ - -40, - -40, - -40, - -40, - -18, - -18, - -18, - -18 - ], - Ta: [ - -80, - -80, - -120, - -120, - -92, - -92, - -92, - -80 - ], - Taacute: [ - -80, - -80, - -120, - -120, - -92, - -92, - -92, - -80 - ], - Tabreve: [ - -80, - -80, - -60, - -60, - -52, - -92, - -92, - -80 - ], - Tacircumflex: [ - -80, - -80, - -120, - -120, - -52, - -92, - -92, - -80 - ], - Tadieresis: [ - -80, - -80, - -120, - -120, - -52, - -92, - -92, - -40 - ], - Tagrave: [ - -80, - -80, - -120, - -120, - -52, - -92, - -92, - -40 - ], - Tamacron: [ - -80, - -80, - -60, - -60, - -52, - -92, - -92, - -40 - ], - Taogonek: [ - -80, - -80, - -120, - -120, - -92, - -92, - -92, - -80 - ], - Taring: [ - -80, - -80, - -120, - -120, - -92, - -92, - -92, - -80 - ], - Tatilde: [ - -80, - -80, - -60, - -60, - -52, - -92, - -92, - -40 - ], - Tcolon: [ - -40, - -40, - -20, - -20, - -74, - -74, - -55, - -50 - ], - Tcomma: [ - -80, - -80, - -120, - -120, - -74, - -92, - -74, - -74 - ], - Te: [ - -60, - -60, - -120, - -120, - -92, - -92, - -92, - -70 - ], - Teacute: [ - -60, - -60, - -120, - -120, - -92, - -92, - -92, - -70 - ], - Tecaron: [ - -60, - -60, - -120, - -120, - -92, - -92, - -92, - -70 - ], - Tecircumflex: [ - -60, - -60, - -120, - -120, - -92, - -92, - -52, - -70 - ], - Tedieresis: [ - -60, - -60, - -120, - -120, - -52, - -52, - -52, - -30 - ], - Tedotaccent: [ - -60, - -60, - -120, - -120, - -92, - -92, - -92, - -70 - ], - Tegrave: [ - -60, - -60, - -60, - -60, - -52, - -52, - -52, - -70 - ], - Temacron: [ - -60, - -60, - -60, - -60, - -52, - -52, - -52, - -30 - ], - Teogonek: [ - -60, - -60, - -120, - -120, - -92, - -92, - -92, - -70 - ], - Thyphen: [ - -120, - -120, - -140, - -140, - -92, - -92, - -74, - -92 - ], - To: [ - -80, - -80, - -120, - -120, - -92, - -95, - -92, - -80 - ], - Toacute: [ - -80, - -80, - -120, - -120, - -92, - -95, - -92, - -80 - ], - Tocircumflex: [ - -80, - -80, - -120, - -120, - -92, - -95, - -92, - -80 - ], - Todieresis: [ - -80, - -80, - -120, - -120, - -92, - -95, - -92, - -80 - ], - Tograve: [ - -80, - -80, - -120, - -120, - -92, - -95, - -92, - -80 - ], - Tohungarumlaut: [ - -80, - -80, - -120, - -120, - -92, - -95, - -92, - -80 - ], - Tomacron: [ - -80, - -80, - -60, - -60, - -92, - -95, - -92, - -80 - ], - Toslash: [ - -80, - -80, - -120, - -120, - -92, - -95, - -92, - -80 - ], - Totilde: [ - -80, - -80, - -60, - -60, - -92, - -95, - -92, - -80 - ], - Tperiod: [ - -80, - -80, - -120, - -120, - -90, - -92, - -74, - -74 - ], - Tr: [ - -80, - -80, - -120, - -120, - -74, - -37, - -55, - -35 - ], - Tracute: [ - -80, - -80, - -120, - -120, - -74, - -37, - -55, - -35 - ], - Trcommaaccent: [ - -80, - -80, - -120, - -120, - -74, - -37, - -55, - -35 - ], - Tsemicolon: [ - -40, - -40, - -20, - -20, - -74, - -74, - -65, - -55 - ], - Tu: [ - -90, - -90, - -120, - -120, - -92, - -37, - -55, - -45 - ], - Tuacute: [ - -90, - -90, - -120, - -120, - -92, - -37, - -55, - -45 - ], - Tucircumflex: [ - -90, - -90, - -120, - -120, - -92, - -37, - -55, - -45 - ], - Tudieresis: [ - -90, - -90, - -120, - -120, - -92, - -37, - -55, - -45 - ], - Tugrave: [ - -90, - -90, - -120, - -120, - -92, - -37, - -55, - -45 - ], - Tuhungarumlaut: [ - -90, - -90, - -120, - -120, - -92, - -37, - -55, - -45 - ], - Tumacron: [ - -90, - -90, - -60, - -60, - -92, - -37, - -55, - -45 - ], - Tuogonek: [ - -90, - -90, - -120, - -120, - -92, - -37, - -55, - -45 - ], - Turing: [ - -90, - -90, - -120, - -120, - -92, - -37, - -55, - -45 - ], - Tw: [ - -60, - -60, - -120, - -120, - -74, - -37, - -74, - -80 - ], - Ty: [ - -60, - -60, - -120, - -120, - -34, - -37, - -74, - -80 - ], - Tyacute: [ - -60, - -60, - -120, - -120, - -34, - -37, - -74, - -80 - ], - Tydieresis: [ - -60, - -60, - -60, - -60, - -34, - -37, - -34, - -80 - ], - TcaronA: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TcaronAacute: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TcaronAbreve: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TcaronAcircumflex: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TcaronAdieresis: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TcaronAgrave: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TcaronAmacron: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TcaronAogonek: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TcaronAring: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TcaronAtilde: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TcaronO: [ - -40, - -40, - -40, - -40, - -18, - -18, - -18, - -18 - ], - TcaronOacute: [ - -40, - -40, - -40, - -40, - -18, - -18, - -18, - -18 - ], - TcaronOcircumflex: [ - -40, - -40, - -40, - -40, - -18, - -18, - -18, - -18 - ], - TcaronOdieresis: [ - -40, - -40, - -40, - -40, - -18, - -18, - -18, - -18 - ], - TcaronOgrave: [ - -40, - -40, - -40, - -40, - -18, - -18, - -18, - -18 - ], - TcaronOhungarumlaut: [ - -40, - -40, - -40, - -40, - -18, - -18, - -18, - -18 - ], - TcaronOmacron: [ - -40, - -40, - -40, - -40, - -18, - -18, - -18, - -18 - ], - TcaronOslash: [ - -40, - -40, - -40, - -40, - -18, - -18, - -18, - -18 - ], - TcaronOtilde: [ - -40, - -40, - -40, - -40, - -18, - -18, - -18, - -18 - ], - Tcarona: [ - -80, - -80, - -120, - -120, - -92, - -92, - -92, - -80 - ], - Tcaronaacute: [ - -80, - -80, - -120, - -120, - -92, - -92, - -92, - -80 - ], - Tcaronabreve: [ - -80, - -80, - -60, - -60, - -52, - -92, - -92, - -80 - ], - Tcaronacircumflex: [ - -80, - -80, - -120, - -120, - -52, - -92, - -92, - -80 - ], - Tcaronadieresis: [ - -80, - -80, - -120, - -120, - -52, - -92, - -92, - -40 - ], - Tcaronagrave: [ - -80, - -80, - -120, - -120, - -52, - -92, - -92, - -40 - ], - Tcaronamacron: [ - -80, - -80, - -60, - -60, - -52, - -92, - -92, - -40 - ], - Tcaronaogonek: [ - -80, - -80, - -120, - -120, - -92, - -92, - -92, - -80 - ], - Tcaronaring: [ - -80, - -80, - -120, - -120, - -92, - -92, - -92, - -80 - ], - Tcaronatilde: [ - -80, - -80, - -60, - -60, - -52, - -92, - -92, - -40 - ], - Tcaroncolon: [ - -40, - -40, - -20, - -20, - -74, - -74, - -55, - -50 - ], - Tcaroncomma: [ - -80, - -80, - -120, - -120, - -74, - -92, - -74, - -74 - ], - Tcarone: [ - -60, - -60, - -120, - -120, - -92, - -92, - -92, - -70 - ], - Tcaroneacute: [ - -60, - -60, - -120, - -120, - -92, - -92, - -92, - -70 - ], - Tcaronecaron: [ - -60, - -60, - -120, - -120, - -92, - -92, - -92, - -70 - ], - Tcaronecircumflex: [ - -60, - -60, - -120, - -120, - -92, - -92, - -52, - -30 - ], - Tcaronedieresis: [ - -60, - -60, - -120, - -120, - -52, - -52, - -52, - -30 - ], - Tcaronedotaccent: [ - -60, - -60, - -120, - -120, - -92, - -92, - -92, - -70 - ], - Tcaronegrave: [ - -60, - -60, - -60, - -60, - -52, - -52, - -52, - -70 - ], - Tcaronemacron: [ - -60, - -60, - -60, - -60, - -52, - -52, - -52, - -30 - ], - Tcaroneogonek: [ - -60, - -60, - -120, - -120, - -92, - -92, - -92, - -70 - ], - Tcaronhyphen: [ - -120, - -120, - -140, - -140, - -92, - -92, - -74, - -92 - ], - Tcarono: [ - -80, - -80, - -120, - -120, - -92, - -95, - -92, - -80 - ], - Tcaronoacute: [ - -80, - -80, - -120, - -120, - -92, - -95, - -92, - -80 - ], - Tcaronocircumflex: [ - -80, - -80, - -120, - -120, - -92, - -95, - -92, - -80 - ], - Tcaronodieresis: [ - -80, - -80, - -120, - -120, - -92, - -95, - -92, - -80 - ], - Tcaronograve: [ - -80, - -80, - -120, - -120, - -92, - -95, - -92, - -80 - ], - Tcaronohungarumlaut: [ - -80, - -80, - -120, - -120, - -92, - -95, - -92, - -80 - ], - Tcaronomacron: [ - -80, - -80, - -60, - -60, - -92, - -95, - -92, - -80 - ], - Tcaronoslash: [ - -80, - -80, - -120, - -120, - -92, - -95, - -92, - -80 - ], - Tcaronotilde: [ - -80, - -80, - -60, - -60, - -92, - -95, - -92, - -80 - ], - Tcaronperiod: [ - -80, - -80, - -120, - -120, - -90, - -92, - -74, - -74 - ], - Tcaronr: [ - -80, - -80, - -120, - -120, - -74, - -37, - -55, - -35 - ], - Tcaronracute: [ - -80, - -80, - -120, - -120, - -74, - -37, - -55, - -35 - ], - Tcaronrcommaaccent: [ - -80, - -80, - -120, - -120, - -74, - -37, - -55, - -35 - ], - Tcaronsemicolon: [ - -40, - -40, - -20, - -20, - -74, - -74, - -65, - -55 - ], - Tcaronu: [ - -90, - -90, - -120, - -120, - -92, - -37, - -55, - -45 - ], - Tcaronuacute: [ - -90, - -90, - -120, - -120, - -92, - -37, - -55, - -45 - ], - Tcaronucircumflex: [ - -90, - -90, - -120, - -120, - -92, - -37, - -55, - -45 - ], - Tcaronudieresis: [ - -90, - -90, - -120, - -120, - -92, - -37, - -55, - -45 - ], - Tcaronugrave: [ - -90, - -90, - -120, - -120, - -92, - -37, - -55, - -45 - ], - Tcaronuhungarumlaut: [ - -90, - -90, - -120, - -120, - -92, - -37, - -55, - -45 - ], - Tcaronumacron: [ - -90, - -90, - -60, - -60, - -92, - -37, - -55, - -45 - ], - Tcaronuogonek: [ - -90, - -90, - -120, - -120, - -92, - -37, - -55, - -45 - ], - Tcaronuring: [ - -90, - -90, - -120, - -120, - -92, - -37, - -55, - -45 - ], - Tcaronw: [ - -60, - -60, - -120, - -120, - -74, - -37, - -74, - -80 - ], - Tcarony: [ - -60, - -60, - -120, - -120, - -34, - -37, - -74, - -80 - ], - Tcaronyacute: [ - -60, - -60, - -120, - -120, - -34, - -37, - -74, - -80 - ], - Tcaronydieresis: [ - -60, - -60, - -60, - -60, - -34, - -37, - -34, - -80 - ], - TcommaaccentA: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TcommaaccentAacute: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TcommaaccentAbreve: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TcommaaccentAcircumflex: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TcommaaccentAdieresis: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TcommaaccentAgrave: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TcommaaccentAmacron: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TcommaaccentAogonek: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TcommaaccentAring: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TcommaaccentAtilde: [ - -90, - -90, - -120, - -120, - -90, - -55, - -50, - -93 - ], - TcommaaccentO: [ - -40, - -40, - -40, - -40, - -18, - -18, - -18, - -18 - ], - TcommaaccentOacute: [ - -40, - -40, - -40, - -40, - -18, - -18, - -18, - -18 - ], - TcommaaccentOcircumflex: [ - -40, - -40, - -40, - -40, - -18, - -18, - -18, - -18 - ], - TcommaaccentOdieresis: [ - -40, - -40, - -40, - -40, - -18, - -18, - -18, - -18 - ], - TcommaaccentOgrave: [ - -40, - -40, - -40, - -40, - -18, - -18, - -18, - -18 - ], - TcommaaccentOhungarumlaut: [ - -40, - -40, - -40, - -40, - -18, - -18, - -18, - -18 - ], - TcommaaccentOmacron: [ - -40, - -40, - -40, - -40, - -18, - -18, - -18, - -18 - ], - TcommaaccentOslash: [ - -40, - -40, - -40, - -40, - -18, - -18, - -18, - -18 - ], - TcommaaccentOtilde: [ - -40, - -40, - -40, - -40, - -18, - -18, - -18, - -18 - ], - Tcommaaccenta: [ - -80, - -80, - -120, - -120, - -92, - -92, - -92, - -80 - ], - Tcommaaccentaacute: [ - -80, - -80, - -120, - -120, - -92, - -92, - -92, - -80 - ], - Tcommaaccentabreve: [ - -80, - -80, - -60, - -60, - -52, - -92, - -92, - -80 - ], - Tcommaaccentacircumflex: [ - -80, - -80, - -120, - -120, - -52, - -92, - -92, - -80 - ], - Tcommaaccentadieresis: [ - -80, - -80, - -120, - -120, - -52, - -92, - -92, - -40 - ], - Tcommaaccentagrave: [ - -80, - -80, - -120, - -120, - -52, - -92, - -92, - -40 - ], - Tcommaaccentamacron: [ - -80, - -80, - -60, - -60, - -52, - -92, - -92, - -40 - ], - Tcommaaccentaogonek: [ - -80, - -80, - -120, - -120, - -92, - -92, - -92, - -80 - ], - Tcommaaccentaring: [ - -80, - -80, - -120, - -120, - -92, - -92, - -92, - -80 - ], - Tcommaaccentatilde: [ - -80, - -80, - -60, - -60, - -52, - -92, - -92, - -40 - ], - Tcommaaccentcolon: [ - -40, - -40, - -20, - -20, - -74, - -74, - -55, - -50 - ], - Tcommaaccentcomma: [ - -80, - -80, - -120, - -120, - -74, - -92, - -74, - -74 - ], - Tcommaaccente: [ - -60, - -60, - -120, - -120, - -92, - -92, - -92, - -70 - ], - Tcommaaccenteacute: [ - -60, - -60, - -120, - -120, - -92, - -92, - -92, - -70 - ], - Tcommaaccentecaron: [ - -60, - -60, - -120, - -120, - -92, - -92, - -92, - -70 - ], - Tcommaaccentecircumflex: [ - -60, - -60, - -120, - -120, - -92, - -92, - -52, - -30 - ], - Tcommaaccentedieresis: [ - -60, - -60, - -120, - -120, - -52, - -52, - -52, - -30 - ], - Tcommaaccentedotaccent: [ - -60, - -60, - -120, - -120, - -92, - -92, - -92, - -70 - ], - Tcommaaccentegrave: [ - -60, - -60, - -60, - -60, - -52, - -52, - -52, - -30 - ], - Tcommaaccentemacron: [ - -60, - -60, - -60, - -60, - -52, - -52, - -52, - -70 - ], - Tcommaaccenteogonek: [ - -60, - -60, - -120, - -120, - -92, - -92, - -92, - -70 - ], - Tcommaaccenthyphen: [ - -120, - -120, - -140, - -140, - -92, - -92, - -74, - -92 - ], - Tcommaaccento: [ - -80, - -80, - -120, - -120, - -92, - -95, - -92, - -80 - ], - Tcommaaccentoacute: [ - -80, - -80, - -120, - -120, - -92, - -95, - -92, - -80 - ], - Tcommaaccentocircumflex: [ - -80, - -80, - -120, - -120, - -92, - -95, - -92, - -80 - ], - Tcommaaccentodieresis: [ - -80, - -80, - -120, - -120, - -92, - -95, - -92, - -80 - ], - Tcommaaccentograve: [ - -80, - -80, - -120, - -120, - -92, - -95, - -92, - -80 - ], - Tcommaaccentohungarumlaut: [ - -80, - -80, - -120, - -120, - -92, - -95, - -92, - -80 - ], - Tcommaaccentomacron: [ - -80, - -80, - -60, - -60, - -92, - -95, - -92, - -80 - ], - Tcommaaccentoslash: [ - -80, - -80, - -120, - -120, - -92, - -95, - -92, - -80 - ], - Tcommaaccentotilde: [ - -80, - -80, - -60, - -60, - -92, - -95, - -92, - -80 - ], - Tcommaaccentperiod: [ - -80, - -80, - -120, - -120, - -90, - -92, - -74, - -74 - ], - Tcommaaccentr: [ - -80, - -80, - -120, - -120, - -74, - -37, - -55, - -35 - ], - Tcommaaccentracute: [ - -80, - -80, - -120, - -120, - -74, - -37, - -55, - -35 - ], - Tcommaaccentrcommaaccent: [ - -80, - -80, - -120, - -120, - -74, - -37, - -55, - -35 - ], - Tcommaaccentsemicolon: [ - -40, - -40, - -20, - -20, - -74, - -74, - -65, - -55 - ], - Tcommaaccentu: [ - -90, - -90, - -120, - -120, - -92, - -37, - -55, - -45 - ], - Tcommaaccentuacute: [ - -90, - -90, - -120, - -120, - -92, - -37, - -55, - -45 - ], - Tcommaaccentucircumflex: [ - -90, - -90, - -120, - -120, - -92, - -37, - -55, - -45 - ], - Tcommaaccentudieresis: [ - -90, - -90, - -120, - -120, - -92, - -37, - -55, - -45 - ], - Tcommaaccentugrave: [ - -90, - -90, - -120, - -120, - -92, - -37, - -55, - -45 - ], - Tcommaaccentuhungarumlaut: [ - -90, - -90, - -120, - -120, - -92, - -37, - -55, - -45 - ], - Tcommaaccentumacron: [ - -90, - -90, - -60, - -60, - -92, - -37, - -55, - -45 - ], - Tcommaaccentuogonek: [ - -90, - -90, - -120, - -120, - -92, - -37, - -55, - -45 - ], - Tcommaaccenturing: [ - -90, - -90, - -120, - -120, - -92, - -37, - -55, - -45 - ], - Tcommaaccentw: [ - -60, - -60, - -120, - -120, - -74, - -37, - -74, - -80 - ], - Tcommaaccenty: [ - -60, - -60, - -120, - -120, - -34, - -37, - -74, - -80 - ], - Tcommaaccentyacute: [ - -60, - -60, - -120, - -120, - -34, - -37, - -74, - -80 - ], - Tcommaaccentydieresis: [ - -60, - -60, - -60, - -60, - -34, - -37, - -34, - -80 - ], - UA: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UAacute: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UAbreve: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UAcircumflex: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UAdieresis: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UAgrave: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UAmacron: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UAogonek: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UAring: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UAtilde: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - Ucomma: [ - -30, - -30, - -40, - -40, - -50, - 0, - -25 - ], - Uperiod: [ - -30, - -30, - -40, - -40, - -50, - 0, - -25 - ], - UacuteA: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UacuteAacute: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UacuteAbreve: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UacuteAcircumflex: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UacuteAdieresis: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UacuteAgrave: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UacuteAmacron: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UacuteAogonek: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UacuteAring: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UacuteAtilde: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - Uacutecomma: [ - -30, - -30, - -40, - -40, - -50, - 0, - -25 - ], - Uacuteperiod: [ - -30, - -30, - -40, - -40, - -50, - 0, - -25 - ], - UcircumflexA: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UcircumflexAacute: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UcircumflexAbreve: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UcircumflexAcircumflex: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UcircumflexAdieresis: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UcircumflexAgrave: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UcircumflexAmacron: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UcircumflexAogonek: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UcircumflexAring: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UcircumflexAtilde: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - Ucircumflexcomma: [ - -30, - -30, - -40, - -40, - -50, - 0, - -25 - ], - Ucircumflexperiod: [ - -30, - -30, - -40, - -40, - -50, - 0, - -25 - ], - UdieresisA: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UdieresisAacute: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UdieresisAbreve: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UdieresisAcircumflex: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UdieresisAdieresis: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UdieresisAgrave: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UdieresisAmacron: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UdieresisAogonek: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UdieresisAring: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UdieresisAtilde: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - Udieresiscomma: [ - -30, - -30, - -40, - -40, - -50, - 0, - -25 - ], - Udieresisperiod: [ - -30, - -30, - -40, - -40, - -50, - 0, - -25 - ], - UgraveA: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UgraveAacute: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UgraveAbreve: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UgraveAcircumflex: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UgraveAdieresis: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UgraveAgrave: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UgraveAmacron: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UgraveAogonek: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UgraveAring: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UgraveAtilde: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - Ugravecomma: [ - -30, - -30, - -40, - -40, - -50, - 0, - -25 - ], - Ugraveperiod: [ - -30, - -30, - -40, - -40, - -50, - 0, - -25 - ], - UhungarumlautA: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UhungarumlautAacute: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UhungarumlautAbreve: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UhungarumlautAcircumflex: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UhungarumlautAdieresis: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UhungarumlautAgrave: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UhungarumlautAmacron: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UhungarumlautAogonek: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UhungarumlautAring: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UhungarumlautAtilde: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - Uhungarumlautcomma: [ - -30, - -30, - -40, - -40, - -50, - 0, - -25 - ], - Uhungarumlautperiod: [ - -30, - -30, - -40, - -40, - -50, - 0, - -25 - ], - UmacronA: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UmacronAacute: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UmacronAbreve: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UmacronAcircumflex: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UmacronAdieresis: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UmacronAgrave: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UmacronAmacron: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UmacronAogonek: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UmacronAring: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UmacronAtilde: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - Umacroncomma: [ - -30, - -30, - -40, - -40, - -50, - 0, - -25 - ], - Umacronperiod: [ - -30, - -30, - -40, - -40, - -50, - 0, - -25 - ], - UogonekA: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UogonekAacute: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UogonekAbreve: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UogonekAcircumflex: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UogonekAdieresis: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UogonekAgrave: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UogonekAmacron: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UogonekAogonek: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UogonekAring: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UogonekAtilde: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - Uogonekcomma: [ - -30, - -30, - -40, - -40, - -50, - 0, - -25 - ], - Uogonekperiod: [ - -30, - -30, - -40, - -40, - -50, - 0, - -25 - ], - UringA: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UringAacute: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UringAbreve: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UringAcircumflex: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UringAdieresis: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UringAgrave: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UringAmacron: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UringAogonek: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UringAring: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - UringAtilde: [ - -50, - -50, - -40, - -40, - -60, - -45, - -40, - -40 - ], - Uringcomma: [ - -30, - -30, - -40, - -40, - -50, - 0, - -25 - ], - Uringperiod: [ - -30, - -30, - -40, - -40, - -50, - 0, - -25 - ], - VA: [ - -80, - -80, - -80, - -80, - -135, - -85, - -60, - -135 - ], - VAacute: [ - -80, - -80, - -80, - -80, - -135, - -85, - -60, - -135 - ], - VAbreve: [ - -80, - -80, - -80, - -80, - -135, - -85, - -60, - -135 - ], - VAcircumflex: [ - -80, - -80, - -80, - -80, - -135, - -85, - -60, - -135 - ], - VAdieresis: [ - -80, - -80, - -80, - -80, - -135, - -85, - -60, - -135 - ], - VAgrave: [ - -80, - -80, - -80, - -80, - -135, - -85, - -60, - -135 - ], - VAmacron: [ - -80, - -80, - -80, - -80, - -135, - -85, - -60, - -135 - ], - VAogonek: [ - -80, - -80, - -80, - -80, - -135, - -85, - -60, - -135 - ], - VAring: [ - -80, - -80, - -80, - -80, - -135, - -85, - -60, - -135 - ], - VAtilde: [ - -80, - -80, - -80, - -80, - -135, - -85, - -60, - -135 - ], - VG: [ - -50, - -50, - -40, - -40, - -30, - -10, - 0, - -15 - ], - VGbreve: [ - -50, - -50, - -40, - -40, - -30, - -10, - 0, - -15 - ], - VGcommaaccent: [ - -50, - -50, - -40, - -40, - -30, - -10, - 0, - -15 - ], - VO: [ - -50, - -50, - -40, - -40, - -45, - -30, - -30, - -40 - ], - VOacute: [ - -50, - -50, - -40, - -40, - -45, - -30, - -30, - -40 - ], - VOcircumflex: [ - -50, - -50, - -40, - -40, - -45, - -30, - -30, - -40 - ], - VOdieresis: [ - -50, - -50, - -40, - -40, - -45, - -30, - -30, - -40 - ], - VOgrave: [ - -50, - -50, - -40, - -40, - -45, - -30, - -30, - -40 - ], - VOhungarumlaut: [ - -50, - -50, - -40, - -40, - -45, - -30, - -30, - -40 - ], - VOmacron: [ - -50, - -50, - -40, - -40, - -45, - -30, - -30, - -40 - ], - VOslash: [ - -50, - -50, - -40, - -40, - -45, - -30, - -30, - -40 - ], - VOtilde: [ - -50, - -50, - -40, - -40, - -45, - -30, - -30, - -40 - ], - Va: [ - -60, - -60, - -70, - -70, - -92, - -111, - -111, - -111 - ], - Vaacute: [ - -60, - -60, - -70, - -70, - -92, - -111, - -111, - -111 - ], - Vabreve: [ - -60, - -60, - -70, - -70, - -92, - -111, - -111, - -111 - ], - Vacircumflex: [ - -60, - -60, - -70, - -70, - -92, - -111, - -111, - -71 - ], - Vadieresis: [ - -60, - -60, - -70, - -70, - -92, - -111, - -111, - -71 - ], - Vagrave: [ - -60, - -60, - -70, - -70, - -92, - -111, - -111, - -71 - ], - Vamacron: [ - -60, - -60, - -70, - -70, - -92, - -111, - -111, - -71 - ], - Vaogonek: [ - -60, - -60, - -70, - -70, - -92, - -111, - -111, - -111 - ], - Varing: [ - -60, - -60, - -70, - -70, - -92, - -111, - -111, - -111 - ], - Vatilde: [ - -60, - -60, - -70, - -70, - -92, - -111, - -111, - -71 - ], - Vcolon: [ - -40, - -40, - -40, - -40, - -92, - -74, - -65, - -74 - ], - Vcomma: [ - -120, - -120, - -125, - -125, - -129, - -129, - -129, - -129 - ], - Ve: [ - -50, - -50, - -80, - -80, - -100, - -111, - -111, - -111 - ], - Veacute: [ - -50, - -50, - -80, - -80, - -100, - -111, - -111, - -111 - ], - Vecaron: [ - -50, - -50, - -80, - -80, - -100, - -111, - -111, - -71 - ], - Vecircumflex: [ - -50, - -50, - -80, - -80, - -100, - -111, - -111, - -71 - ], - Vedieresis: [ - -50, - -50, - -80, - -80, - -100, - -71, - -71, - -71 - ], - Vedotaccent: [ - -50, - -50, - -80, - -80, - -100, - -111, - -111, - -111 - ], - Vegrave: [ - -50, - -50, - -80, - -80, - -100, - -71, - -71, - -71 - ], - Vemacron: [ - -50, - -50, - -80, - -80, - -100, - -71, - -71, - -71 - ], - Veogonek: [ - -50, - -50, - -80, - -80, - -100, - -111, - -111, - -111 - ], - Vhyphen: [ - -80, - -80, - -80, - -80, - -74, - -70, - -55, - -100 - ], - Vo: [ - -90, - -90, - -80, - -80, - -100, - -111, - -111, - -129 - ], - Voacute: [ - -90, - -90, - -80, - -80, - -100, - -111, - -111, - -129 - ], - Vocircumflex: [ - -90, - -90, - -80, - -80, - -100, - -111, - -111, - -129 - ], - Vodieresis: [ - -90, - -90, - -80, - -80, - -100, - -111, - -111, - -89 - ], - Vograve: [ - -90, - -90, - -80, - -80, - -100, - -111, - -111, - -89 - ], - Vohungarumlaut: [ - -90, - -90, - -80, - -80, - -100, - -111, - -111, - -129 - ], - Vomacron: [ - -90, - -90, - -80, - -80, - -100, - -111, - -111, - -89 - ], - Voslash: [ - -90, - -90, - -80, - -80, - -100, - -111, - -111, - -129 - ], - Votilde: [ - -90, - -90, - -80, - -80, - -100, - -111, - -111, - -89 - ], - Vperiod: [ - -120, - -120, - -125, - -125, - -145, - -129, - -129, - -129 - ], - Vsemicolon: [ - -40, - -40, - -40, - -40, - -92, - -74, - -74, - -74 - ], - Vu: [ - -60, - -60, - -70, - -70, - -92, - -55, - -74, - -75 - ], - Vuacute: [ - -60, - -60, - -70, - -70, - -92, - -55, - -74, - -75 - ], - Vucircumflex: [ - -60, - -60, - -70, - -70, - -92, - -55, - -74, - -75 - ], - Vudieresis: [ - -60, - -60, - -70, - -70, - -92, - -55, - -74, - -75 - ], - Vugrave: [ - -60, - -60, - -70, - -70, - -92, - -55, - -74, - -75 - ], - Vuhungarumlaut: [ - -60, - -60, - -70, - -70, - -92, - -55, - -74, - -75 - ], - Vumacron: [ - -60, - -60, - -70, - -70, - -92, - -55, - -74, - -75 - ], - Vuogonek: [ - -60, - -60, - -70, - -70, - -92, - -55, - -74, - -75 - ], - Vuring: [ - -60, - -60, - -70, - -70, - -92, - -55, - -74, - -75 - ], - WA: [ - -60, - -60, - -50, - -50, - -120, - -74, - -60, - -120 - ], - WAacute: [ - -60, - -60, - -50, - -50, - -120, - -74, - -60, - -120 - ], - WAbreve: [ - -60, - -60, - -50, - -50, - -120, - -74, - -60, - -120 - ], - WAcircumflex: [ - -60, - -60, - -50, - -50, - -120, - -74, - -60, - -120 - ], - WAdieresis: [ - -60, - -60, - -50, - -50, - -120, - -74, - -60, - -120 - ], - WAgrave: [ - -60, - -60, - -50, - -50, - -120, - -74, - -60, - -120 - ], - WAmacron: [ - -60, - -60, - -50, - -50, - -120, - -74, - -60, - -120 - ], - WAogonek: [ - -60, - -60, - -50, - -50, - -120, - -74, - -60, - -120 - ], - WAring: [ - -60, - -60, - -50, - -50, - -120, - -74, - -60, - -120 - ], - WAtilde: [ - -60, - -60, - -50, - -50, - -120, - -74, - -60, - -120 - ], - WO: [ - -20, - -20, - -20, - -20, - -10, - -15, - -25, - -10 - ], - WOacute: [ - -20, - -20, - -20, - -20, - -10, - -15, - -25, - -10 - ], - WOcircumflex: [ - -20, - -20, - -20, - -20, - -10, - -15, - -25, - -10 - ], - WOdieresis: [ - -20, - -20, - -20, - -20, - -10, - -15, - -25, - -10 - ], - WOgrave: [ - -20, - -20, - -20, - -20, - -10, - -15, - -25, - -10 - ], - WOhungarumlaut: [ - -20, - -20, - -20, - -20, - -10, - -15, - -25, - -10 - ], - WOmacron: [ - -20, - -20, - -20, - -20, - -10, - -15, - -25, - -10 - ], - WOslash: [ - -20, - -20, - -20, - -20, - -10, - -15, - -25, - -10 - ], - WOtilde: [ - -20, - -20, - -20, - -20, - -10, - -15, - -25, - -10 - ], - Wa: [ - -40, - -40, - -40, - -40, - -65, - -85, - -92, - -80 - ], - Waacute: [ - -40, - -40, - -40, - -40, - -65, - -85, - -92, - -80 - ], - Wabreve: [ - -40, - -40, - -40, - -40, - -65, - -85, - -92, - -80 - ], - Wacircumflex: [ - -40, - -40, - -40, - -40, - -65, - -85, - -92, - -80 - ], - Wadieresis: [ - -40, - -40, - -40, - -40, - -65, - -85, - -92, - -80 - ], - Wagrave: [ - -40, - -40, - -40, - -40, - -65, - -85, - -92, - -80 - ], - Wamacron: [ - -40, - -40, - -40, - -40, - -65, - -85, - -92, - -80 - ], - Waogonek: [ - -40, - -40, - -40, - -40, - -65, - -85, - -92, - -80 - ], - Waring: [ - -40, - -40, - -40, - -40, - -65, - -85, - -92, - -80 - ], - Watilde: [ - -40, - -40, - -40, - -40, - -65, - -85, - -92, - -80 - ], - Wcolon: [ - -10, - -10, - 0, - 0, - -55, - -55, - -65, - -37 - ], - Wcomma: [ - -80, - -80, - -80, - -80, - -92, - -74, - -92, - -92 - ], - We: [ - -35, - -35, - -30, - -30, - -65, - -90, - -92, - -80 - ], - Weacute: [ - -35, - -35, - -30, - -30, - -65, - -90, - -92, - -80 - ], - Wecaron: [ - -35, - -35, - -30, - -30, - -65, - -90, - -92, - -80 - ], - Wecircumflex: [ - -35, - -35, - -30, - -30, - -65, - -90, - -92, - -80 - ], - Wedieresis: [ - -35, - -35, - -30, - -30, - -65, - -50, - -52, - -40 - ], - Wedotaccent: [ - -35, - -35, - -30, - -30, - -65, - -90, - -92, - -80 - ], - Wegrave: [ - -35, - -35, - -30, - -30, - -65, - -50, - -52, - -40 - ], - Wemacron: [ - -35, - -35, - -30, - -30, - -65, - -50, - -52, - -40 - ], - Weogonek: [ - -35, - -35, - -30, - -30, - -65, - -90, - -92, - -80 - ], - Whyphen: [ - -40, - -40, - -40, - -40, - -37, - -50, - -37, - -65 - ], - Wo: [ - -60, - -60, - -30, - -30, - -75, - -80, - -92, - -80 - ], - Woacute: [ - -60, - -60, - -30, - -30, - -75, - -80, - -92, - -80 - ], - Wocircumflex: [ - -60, - -60, - -30, - -30, - -75, - -80, - -92, - -80 - ], - Wodieresis: [ - -60, - -60, - -30, - -30, - -75, - -80, - -92, - -80 - ], - Wograve: [ - -60, - -60, - -30, - -30, - -75, - -80, - -92, - -80 - ], - Wohungarumlaut: [ - -60, - -60, - -30, - -30, - -75, - -80, - -92, - -80 - ], - Womacron: [ - -60, - -60, - -30, - -30, - -75, - -80, - -92, - -80 - ], - Woslash: [ - -60, - -60, - -30, - -30, - -75, - -80, - -92, - -80 - ], - Wotilde: [ - -60, - -60, - -30, - -30, - -75, - -80, - -92, - -80 - ], - Wperiod: [ - -80, - -80, - -80, - -80, - -92, - -74, - -92, - -92 - ], - Wsemicolon: [ - -10, - -10, - 0, - 0, - -55, - -55, - -65, - -37 - ], - Wu: [ - -45, - -45, - -30, - -30, - -50, - -55, - -55, - -50 - ], - Wuacute: [ - -45, - -45, - -30, - -30, - -50, - -55, - -55, - -50 - ], - Wucircumflex: [ - -45, - -45, - -30, - -30, - -50, - -55, - -55, - -50 - ], - Wudieresis: [ - -45, - -45, - -30, - -30, - -50, - -55, - -55, - -50 - ], - Wugrave: [ - -45, - -45, - -30, - -30, - -50, - -55, - -55, - -50 - ], - Wuhungarumlaut: [ - -45, - -45, - -30, - -30, - -50, - -55, - -55, - -50 - ], - Wumacron: [ - -45, - -45, - -30, - -30, - -50, - -55, - -55, - -50 - ], - Wuogonek: [ - -45, - -45, - -30, - -30, - -50, - -55, - -55, - -50 - ], - Wuring: [ - -45, - -45, - -30, - -30, - -50, - -55, - -55, - -50 - ], - Wy: [ - -20, - -20, - -20, - -20, - -60, - -55, - -70, - -73 - ], - Wyacute: [ - -20, - -20, - -20, - -20, - -60, - -55, - -70, - -73 - ], - Wydieresis: [ - -20, - -20, - -20, - -20, - -60, - -55, - -70, - -73 - ], - YA: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YAacute: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YAbreve: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YAcircumflex: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YAdieresis: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YAgrave: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YAmacron: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YAogonek: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YAring: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YAtilde: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YO: [ - -70, - -70, - -85, - -85, - -35, - -25, - -15, - -30 - ], - YOacute: [ - -70, - -70, - -85, - -85, - -35, - -25, - -15, - -30 - ], - YOcircumflex: [ - -70, - -70, - -85, - -85, - -35, - -25, - -15, - -30 - ], - YOdieresis: [ - -70, - -70, - -85, - -85, - -35, - -25, - -15, - -30 - ], - YOgrave: [ - -70, - -70, - -85, - -85, - -35, - -25, - -15, - -30 - ], - YOhungarumlaut: [ - -70, - -70, - -85, - -85, - -35, - -25, - -15, - -30 - ], - YOmacron: [ - -70, - -70, - -85, - -85, - -35, - -25, - -15, - -30 - ], - YOslash: [ - -70, - -70, - -85, - -85, - -35, - -25, - -15, - -30 - ], - YOtilde: [ - -70, - -70, - -85, - -85, - -35, - -25, - -15, - -30 - ], - Ya: [ - -90, - -90, - -140, - -140, - -85, - -92, - -92, - -100 - ], - Yaacute: [ - -90, - -90, - -140, - -140, - -85, - -92, - -92, - -100 - ], - Yabreve: [ - -90, - -90, - -70, - -70, - -85, - -92, - -92, - -100 - ], - Yacircumflex: [ - -90, - -90, - -140, - -140, - -85, - -92, - -92, - -100 - ], - Yadieresis: [ - -90, - -90, - -140, - -140, - -85, - -92, - -92, - -60 - ], - Yagrave: [ - -90, - -90, - -140, - -140, - -85, - -92, - -92, - -60 - ], - Yamacron: [ - -90, - -90, - -70, - -70, - -85, - -92, - -92, - -60 - ], - Yaogonek: [ - -90, - -90, - -140, - -140, - -85, - -92, - -92, - -100 - ], - Yaring: [ - -90, - -90, - -140, - -140, - -85, - -92, - -92, - -100 - ], - Yatilde: [ - -90, - -90, - -140, - -140, - -85, - -92, - -92, - -60 - ], - Ycolon: [ - -50, - -50, - -60, - -60, - -92, - -92, - -65, - -92 - ], - Ycomma: [ - -100, - -100, - -140, - -140, - -92, - -92, - -92, - -129 - ], - Ye: [ - -80, - -80, - -140, - -140, - -111, - -111, - -92, - -100 - ], - Yeacute: [ - -80, - -80, - -140, - -140, - -111, - -111, - -92, - -100 - ], - Yecaron: [ - -80, - -80, - -140, - -140, - -111, - -111, - -92, - -100 - ], - Yecircumflex: [ - -80, - -80, - -140, - -140, - -111, - -71, - -92, - -100 - ], - Yedieresis: [ - -80, - -80, - -140, - -140, - -71, - -71, - -52, - -60 - ], - Yedotaccent: [ - -80, - -80, - -140, - -140, - -111, - -111, - -92, - -100 - ], - Yegrave: [ - -80, - -80, - -140, - -140, - -71, - -71, - -52, - -60 - ], - Yemacron: [ - -80, - -80, - -70, - -70, - -71, - -71, - -52, - -60 - ], - Yeogonek: [ - -80, - -80, - -140, - -140, - -111, - -111, - -92, - -100 - ], - Yo: [ - -100, - -100, - -140, - -140, - -111, - -111, - -92, - -110 - ], - Yoacute: [ - -100, - -100, - -140, - -140, - -111, - -111, - -92, - -110 - ], - Yocircumflex: [ - -100, - -100, - -140, - -140, - -111, - -111, - -92, - -110 - ], - Yodieresis: [ - -100, - -100, - -140, - -140, - -111, - -111, - -92, - -70 - ], - Yograve: [ - -100, - -100, - -140, - -140, - -111, - -111, - -92, - -70 - ], - Yohungarumlaut: [ - -100, - -100, - -140, - -140, - -111, - -111, - -92, - -110 - ], - Yomacron: [ - -100, - -100, - -140, - -140, - -111, - -111, - -92, - -70 - ], - Yoslash: [ - -100, - -100, - -140, - -140, - -111, - -111, - -92, - -110 - ], - Yotilde: [ - -100, - -100, - -140, - -140, - -111, - -111, - -92, - -70 - ], - Yperiod: [ - -100, - -100, - -140, - -140, - -92, - -74, - -92, - -129 - ], - Ysemicolon: [ - -50, - -50, - -60, - -60, - -92, - -92, - -65, - -92 - ], - Yu: [ - -100, - -100, - -110, - -110, - -92, - -92, - -92, - -111 - ], - Yuacute: [ - -100, - -100, - -110, - -110, - -92, - -92, - -92, - -111 - ], - Yucircumflex: [ - -100, - -100, - -110, - -110, - -92, - -92, - -92, - -111 - ], - Yudieresis: [ - -100, - -100, - -110, - -110, - -92, - -92, - -92, - -71 - ], - Yugrave: [ - -100, - -100, - -110, - -110, - -92, - -92, - -92, - -71 - ], - Yuhungarumlaut: [ - -100, - -100, - -110, - -110, - -92, - -92, - -92, - -111 - ], - Yumacron: [ - -100, - -100, - -110, - -110, - -92, - -92, - -92, - -71 - ], - Yuogonek: [ - -100, - -100, - -110, - -110, - -92, - -92, - -92, - -111 - ], - Yuring: [ - -100, - -100, - -110, - -110, - -92, - -92, - -92, - -111 - ], - YacuteA: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YacuteAacute: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YacuteAbreve: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YacuteAcircumflex: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YacuteAdieresis: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YacuteAgrave: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YacuteAmacron: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YacuteAogonek: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YacuteAring: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YacuteAtilde: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YacuteO: [ - -70, - -70, - -85, - -85, - -35, - -25, - -15, - -30 - ], - YacuteOacute: [ - -70, - -70, - -85, - -85, - -35, - -25, - -15, - -30 - ], - YacuteOcircumflex: [ - -70, - -70, - -85, - -85, - -35, - -25, - -15, - -30 - ], - YacuteOdieresis: [ - -70, - -70, - -85, - -85, - -35, - -25, - -15, - -30 - ], - YacuteOgrave: [ - -70, - -70, - -85, - -85, - -35, - -25, - -15, - -30 - ], - YacuteOhungarumlaut: [ - -70, - -70, - -85, - -85, - -35, - -25, - -15, - -30 - ], - YacuteOmacron: [ - -70, - -70, - -85, - -85, - -35, - -25, - -15, - -30 - ], - YacuteOslash: [ - -70, - -70, - -85, - -85, - -35, - -25, - -15, - -30 - ], - YacuteOtilde: [ - -70, - -70, - -85, - -85, - -35, - -25, - -15, - -30 - ], - Yacutea: [ - -90, - -90, - -140, - -140, - -85, - -92, - -92, - -100 - ], - Yacuteaacute: [ - -90, - -90, - -140, - -140, - -85, - -92, - -92, - -100 - ], - Yacuteabreve: [ - -90, - -90, - -70, - -70, - -85, - -92, - -92, - -100 - ], - Yacuteacircumflex: [ - -90, - -90, - -140, - -140, - -85, - -92, - -92, - -100 - ], - Yacuteadieresis: [ - -90, - -90, - -140, - -140, - -85, - -92, - -92, - -60 - ], - Yacuteagrave: [ - -90, - -90, - -140, - -140, - -85, - -92, - -92, - -60 - ], - Yacuteamacron: [ - -90, - -90, - -70, - -70, - -85, - -92, - -92, - -60 - ], - Yacuteaogonek: [ - -90, - -90, - -140, - -140, - -85, - -92, - -92, - -100 - ], - Yacutearing: [ - -90, - -90, - -140, - -140, - -85, - -92, - -92, - -100 - ], - Yacuteatilde: [ - -90, - -90, - -70, - -70, - -85, - -92, - -92, - -60 - ], - Yacutecolon: [ - -50, - -50, - -60, - -60, - -92, - -92, - -65, - -92 - ], - Yacutecomma: [ - -100, - -100, - -140, - -140, - -92, - -92, - -92, - -129 - ], - Yacutee: [ - -80, - -80, - -140, - -140, - -111, - -111, - -92, - -100 - ], - Yacuteeacute: [ - -80, - -80, - -140, - -140, - -111, - -111, - -92, - -100 - ], - Yacuteecaron: [ - -80, - -80, - -140, - -140, - -111, - -111, - -92, - -100 - ], - Yacuteecircumflex: [ - -80, - -80, - -140, - -140, - -111, - -71, - -92, - -100 - ], - Yacuteedieresis: [ - -80, - -80, - -140, - -140, - -71, - -71, - -52, - -60 - ], - Yacuteedotaccent: [ - -80, - -80, - -140, - -140, - -111, - -111, - -92, - -100 - ], - Yacuteegrave: [ - -80, - -80, - -140, - -140, - -71, - -71, - -52, - -60 - ], - Yacuteemacron: [ - -80, - -80, - -70, - -70, - -71, - -71, - -52, - -60 - ], - Yacuteeogonek: [ - -80, - -80, - -140, - -140, - -111, - -111, - -92, - -100 - ], - Yacuteo: [ - -100, - -100, - -140, - -140, - -111, - -111, - -92, - -110 - ], - Yacuteoacute: [ - -100, - -100, - -140, - -140, - -111, - -111, - -92, - -110 - ], - Yacuteocircumflex: [ - -100, - -100, - -140, - -140, - -111, - -111, - -92, - -110 - ], - Yacuteodieresis: [ - -100, - -100, - -140, - -140, - -111, - -111, - -92, - -70 - ], - Yacuteograve: [ - -100, - -100, - -140, - -140, - -111, - -111, - -92, - -70 - ], - Yacuteohungarumlaut: [ - -100, - -100, - -140, - -140, - -111, - -111, - -92, - -110 - ], - Yacuteomacron: [ - -100, - -100, - -70, - -70, - -111, - -111, - -92, - -70 - ], - Yacuteoslash: [ - -100, - -100, - -140, - -140, - -111, - -111, - -92, - -110 - ], - Yacuteotilde: [ - -100, - -100, - -140, - -140, - -111, - -111, - -92, - -70 - ], - Yacuteperiod: [ - -100, - -100, - -140, - -140, - -92, - -74, - -92, - -129 - ], - Yacutesemicolon: [ - -50, - -50, - -60, - -60, - -92, - -92, - -65, - -92 - ], - Yacuteu: [ - -100, - -100, - -110, - -110, - -92, - -92, - -92, - -111 - ], - Yacuteuacute: [ - -100, - -100, - -110, - -110, - -92, - -92, - -92, - -111 - ], - Yacuteucircumflex: [ - -100, - -100, - -110, - -110, - -92, - -92, - -92, - -111 - ], - Yacuteudieresis: [ - -100, - -100, - -110, - -110, - -92, - -92, - -92, - -71 - ], - Yacuteugrave: [ - -100, - -100, - -110, - -110, - -92, - -92, - -92, - -71 - ], - Yacuteuhungarumlaut: [ - -100, - -100, - -110, - -110, - -92, - -92, - -92, - -111 - ], - Yacuteumacron: [ - -100, - -100, - -110, - -110, - -92, - -92, - -92, - -71 - ], - Yacuteuogonek: [ - -100, - -100, - -110, - -110, - -92, - -92, - -92, - -111 - ], - Yacuteuring: [ - -100, - -100, - -110, - -110, - -92, - -92, - -92, - -111 - ], - YdieresisA: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YdieresisAacute: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YdieresisAbreve: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YdieresisAcircumflex: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YdieresisAdieresis: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YdieresisAgrave: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YdieresisAmacron: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YdieresisAogonek: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YdieresisAring: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YdieresisAtilde: [ - -110, - -110, - -110, - -110, - -110, - -74, - -50, - -120 - ], - YdieresisO: [ - -70, - -70, - -85, - -85, - -35, - -25, - -15, - -30 - ], - YdieresisOacute: [ - -70, - -70, - -85, - -85, - -35, - -25, - -15, - -30 - ], - YdieresisOcircumflex: [ - -70, - -70, - -85, - -85, - -35, - -25, - -15, - -30 - ], - YdieresisOdieresis: [ - -70, - -70, - -85, - -85, - -35, - -25, - -15, - -30 - ], - YdieresisOgrave: [ - -70, - -70, - -85, - -85, - -35, - -25, - -15, - -30 - ], - YdieresisOhungarumlaut: [ - -70, - -70, - -85, - -85, - -35, - -25, - -15, - -30 - ], - YdieresisOmacron: [ - -70, - -70, - -85, - -85, - -35, - -25, - -15, - -30 - ], - YdieresisOslash: [ - -70, - -70, - -85, - -85, - -35, - -25, - -15, - -30 - ], - YdieresisOtilde: [ - -70, - -70, - -85, - -85, - -35, - -25, - -15, - -30 - ], - Ydieresisa: [ - -90, - -90, - -140, - -140, - -85, - -92, - -92, - -100 - ], - Ydieresisaacute: [ - -90, - -90, - -140, - -140, - -85, - -92, - -92, - -100 - ], - Ydieresisabreve: [ - -90, - -90, - -70, - -70, - -85, - -92, - -92, - -100 - ], - Ydieresisacircumflex: [ - -90, - -90, - -140, - -140, - -85, - -92, - -92, - -100 - ], - Ydieresisadieresis: [ - -90, - -90, - -140, - -140, - -85, - -92, - -92, - -60 - ], - Ydieresisagrave: [ - -90, - -90, - -140, - -140, - -85, - -92, - -92, - -60 - ], - Ydieresisamacron: [ - -90, - -90, - -70, - -70, - -85, - -92, - -92, - -60 - ], - Ydieresisaogonek: [ - -90, - -90, - -140, - -140, - -85, - -92, - -92, - -100 - ], - Ydieresisaring: [ - -90, - -90, - -140, - -140, - -85, - -92, - -92, - -100 - ], - Ydieresisatilde: [ - -90, - -90, - -70, - -70, - -85, - -92, - -92, - -100 - ], - Ydieresiscolon: [ - -50, - -50, - -60, - -60, - -92, - -92, - -65, - -92 - ], - Ydieresiscomma: [ - -100, - -100, - -140, - -140, - -92, - -92, - -92, - -129 - ], - Ydieresise: [ - -80, - -80, - -140, - -140, - -111, - -111, - -92, - -100 - ], - Ydieresiseacute: [ - -80, - -80, - -140, - -140, - -111, - -111, - -92, - -100 - ], - Ydieresisecaron: [ - -80, - -80, - -140, - -140, - -111, - -111, - -92, - -100 - ], - Ydieresisecircumflex: [ - -80, - -80, - -140, - -140, - -111, - -71, - -92, - -100 - ], - Ydieresisedieresis: [ - -80, - -80, - -140, - -140, - -71, - -71, - -52, - -60 - ], - Ydieresisedotaccent: [ - -80, - -80, - -140, - -140, - -111, - -111, - -92, - -100 - ], - Ydieresisegrave: [ - -80, - -80, - -140, - -140, - -71, - -71, - -52, - -60 - ], - Ydieresisemacron: [ - -80, - -80, - -70, - -70, - -71, - -71, - -52, - -60 - ], - Ydieresiseogonek: [ - -80, - -80, - -140, - -140, - -111, - -111, - -92, - -100 - ], - Ydieresiso: [ - -100, - -100, - -140, - -140, - -111, - -111, - -92, - -110 - ], - Ydieresisoacute: [ - -100, - -100, - -140, - -140, - -111, - -111, - -92, - -110 - ], - Ydieresisocircumflex: [ - -100, - -100, - -140, - -140, - -111, - -111, - -92, - -110 - ], - Ydieresisodieresis: [ - -100, - -100, - -140, - -140, - -111, - -111, - -92, - -70 - ], - Ydieresisograve: [ - -100, - -100, - -140, - -140, - -111, - -111, - -92, - -70 - ], - Ydieresisohungarumlaut: [ - -100, - -100, - -140, - -140, - -111, - -111, - -92, - -110 - ], - Ydieresisomacron: [ - -100, - -100, - -140, - -140, - -111, - -111, - -92, - -70 - ], - Ydieresisoslash: [ - -100, - -100, - -140, - -140, - -111, - -111, - -92, - -110 - ], - Ydieresisotilde: [ - -100, - -100, - -140, - -140, - -111, - -111, - -92, - -70 - ], - Ydieresisperiod: [ - -100, - -100, - -140, - -140, - -92, - -74, - -92, - -129 - ], - Ydieresissemicolon: [ - -50, - -50, - -60, - -60, - -92, - -92, - -65, - -92 - ], - Ydieresisu: [ - -100, - -100, - -110, - -110, - -92, - -92, - -92, - -111 - ], - Ydieresisuacute: [ - -100, - -100, - -110, - -110, - -92, - -92, - -92, - -111 - ], - Ydieresisucircumflex: [ - -100, - -100, - -110, - -110, - -92, - -92, - -92, - -111 - ], - Ydieresisudieresis: [ - -100, - -100, - -110, - -110, - -92, - -92, - -92, - -71 - ], - Ydieresisugrave: [ - -100, - -100, - -110, - -110, - -92, - -92, - -92, - -71 - ], - Ydieresisuhungarumlaut: [ - -100, - -100, - -110, - -110, - -92, - -92, - -92, - -111 - ], - Ydieresisumacron: [ - -100, - -100, - -110, - -110, - -92, - -92, - -92, - -71 - ], - Ydieresisuogonek: [ - -100, - -100, - -110, - -110, - -92, - -92, - -92, - -111 - ], - Ydieresisuring: [ - -100, - -100, - -110, - -110, - -92, - -92, - -92, - -111 - ], - ag: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - agbreve: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - agcommaaccent: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - av: [ - -15, - -15, - -20, - -20, - -25, - 0, - 0, - -20 - ], - aw: [ - -15, - -15, - -20, - -20, - 0, - 0, - 0, - -15 - ], - ay: [ - -20, - -20, - -30, - -30 - ], - ayacute: [ - -20, - -20, - -30, - -30 - ], - aydieresis: [ - -20, - -20, - -30, - -30 - ], - aacuteg: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - aacutegbreve: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - aacutegcommaaccent: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - aacutev: [ - -15, - -15, - -20, - -20, - -25, - 0, - 0, - -20 - ], - aacutew: [ - -15, - -15, - -20, - -20, - 0, - 0, - 0, - -15 - ], - aacutey: [ - -20, - -20, - -30, - -30 - ], - aacuteyacute: [ - -20, - -20, - -30, - -30 - ], - aacuteydieresis: [ - -20, - -20, - -30, - -30 - ], - abreveg: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - abrevegbreve: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - abrevegcommaaccent: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - abrevev: [ - -15, - -15, - -20, - -20, - -25, - 0, - 0, - -20 - ], - abrevew: [ - -15, - -15, - -20, - -20, - 0, - 0, - 0, - -15 - ], - abrevey: [ - -20, - -20, - -30, - -30 - ], - abreveyacute: [ - -20, - -20, - -30, - -30 - ], - abreveydieresis: [ - -20, - -20, - -30, - -30 - ], - acircumflexg: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - acircumflexgbreve: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - acircumflexgcommaaccent: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - acircumflexv: [ - -15, - -15, - -20, - -20, - -25, - 0, - 0, - -20 - ], - acircumflexw: [ - -15, - -15, - -20, - -20, - 0, - 0, - 0, - -15 - ], - acircumflexy: [ - -20, - -20, - -30, - -30 - ], - acircumflexyacute: [ - -20, - -20, - -30, - -30 - ], - acircumflexydieresis: [ - -20, - -20, - -30, - -30 - ], - adieresisg: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - adieresisgbreve: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - adieresisgcommaaccent: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - adieresisv: [ - -15, - -15, - -20, - -20, - -25, - 0, - 0, - -20 - ], - adieresisw: [ - -15, - -15, - -20, - -20, - 0, - 0, - 0, - -15 - ], - adieresisy: [ - -20, - -20, - -30, - -30 - ], - adieresisyacute: [ - -20, - -20, - -30, - -30 - ], - adieresisydieresis: [ - -20, - -20, - -30, - -30 - ], - agraveg: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - agravegbreve: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - agravegcommaaccent: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - agravev: [ - -15, - -15, - -20, - -20, - -25, - 0, - 0, - -20 - ], - agravew: [ - -15, - -15, - -20, - -20, - 0, - 0, - 0, - -15 - ], - agravey: [ - -20, - -20, - -30, - -30 - ], - agraveyacute: [ - -20, - -20, - -30, - -30 - ], - agraveydieresis: [ - -20, - -20, - -30, - -30 - ], - amacrong: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - amacrongbreve: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - amacrongcommaaccent: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - amacronv: [ - -15, - -15, - -20, - -20, - -25, - 0, - 0, - -20 - ], - amacronw: [ - -15, - -15, - -20, - -20, - 0, - 0, - 0, - -15 - ], - amacrony: [ - -20, - -20, - -30, - -30 - ], - amacronyacute: [ - -20, - -20, - -30, - -30 - ], - amacronydieresis: [ - -20, - -20, - -30, - -30 - ], - aogonekg: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - aogonekgbreve: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - aogonekgcommaaccent: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - aogonekv: [ - -15, - -15, - -20, - -20, - -25, - 0, - 0, - -20 - ], - aogonekw: [ - -15, - -15, - -20, - -20, - 0, - 0, - 0, - -15 - ], - aogoneky: [ - -20, - -20, - -30, - -30 - ], - aogonekyacute: [ - -20, - -20, - -30, - -30 - ], - aogonekydieresis: [ - -20, - -20, - -30, - -30 - ], - aringg: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - aringgbreve: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - aringgcommaaccent: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - aringv: [ - -15, - -15, - -20, - -20, - -25, - 0, - 0, - -20 - ], - aringw: [ - -15, - -15, - -20, - -20, - 0, - 0, - 0, - -15 - ], - aringy: [ - -20, - -20, - -30, - -30 - ], - aringyacute: [ - -20, - -20, - -30, - -30 - ], - aringydieresis: [ - -20, - -20, - -30, - -30 - ], - atildeg: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - atildegbreve: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - atildegcommaaccent: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - atildev: [ - -15, - -15, - -20, - -20, - -25, - 0, - 0, - -20 - ], - atildew: [ - -15, - -15, - -20, - -20, - 0, - 0, - 0, - -15 - ], - atildey: [ - -20, - -20, - -30, - -30 - ], - atildeyacute: [ - -20, - -20, - -30, - -30 - ], - atildeydieresis: [ - -20, - -20, - -30, - -30 - ], - bl: [ - -10, - -10, - -20, - -20 - ], - blacute: [ - -10, - -10, - -20, - -20 - ], - blcommaaccent: [ - -10, - -10, - -20, - -20 - ], - blslash: [ - -10, - -10, - -20, - -20 - ], - bu: [ - -20, - -20, - -20, - -20, - -20, - -20, - -20, - -20 - ], - buacute: [ - -20, - -20, - -20, - -20, - -20, - -20, - -20, - -20 - ], - bucircumflex: [ - -20, - -20, - -20, - -20, - -20, - -20, - -20, - -20 - ], - budieresis: [ - -20, - -20, - -20, - -20, - -20, - -20, - -20, - -20 - ], - bugrave: [ - -20, - -20, - -20, - -20, - -20, - -20, - -20, - -20 - ], - buhungarumlaut: [ - -20, - -20, - -20, - -20, - -20, - -20, - -20, - -20 - ], - bumacron: [ - -20, - -20, - -20, - -20, - -20, - -20, - -20, - -20 - ], - buogonek: [ - -20, - -20, - -20, - -20, - -20, - -20, - -20, - -20 - ], - buring: [ - -20, - -20, - -20, - -20, - -20, - -20, - -20, - -20 - ], - bv: [ - -20, - -20, - -20, - -20, - -15, - 0, - 0, - -15 - ], - by: [ - -20, - -20, - -20, - -20 - ], - byacute: [ - -20, - -20, - -20, - -20 - ], - bydieresis: [ - -20, - -20, - -20, - -20 - ], - ch: [ - -10, - -10, - 0, - 0, - 0, - -10, - -15 - ], - ck: [ - -20, - -20, - -20, - -20, - 0, - -10, - -20 - ], - ckcommaaccent: [ - -20, - -20, - -20, - -20, - 0, - -10, - -20 - ], - cl: [ - -20, - -20 - ], - clacute: [ - -20, - -20 - ], - clcommaaccent: [ - -20, - -20 - ], - clslash: [ - -20, - -20 - ], - cy: [ - -10, - -10, - 0, - 0, - 0, - 0, - 0, - -15 - ], - cyacute: [ - -10, - -10, - 0, - 0, - 0, - 0, - 0, - -15 - ], - cydieresis: [ - -10, - -10, - 0, - 0, - 0, - 0, - 0, - -15 - ], - cacuteh: [ - -10, - -10, - 0, - 0, - 0, - -10, - -15 - ], - cacutek: [ - -20, - -20, - -20, - -20, - 0, - -10, - -20 - ], - cacutekcommaaccent: [ - -20, - -20, - -20, - -20, - 0, - -10, - -20 - ], - cacutel: [ - -20, - -20 - ], - cacutelacute: [ - -20, - -20 - ], - cacutelcommaaccent: [ - -20, - -20 - ], - cacutelslash: [ - -20, - -20 - ], - cacutey: [ - -10, - -10, - 0, - 0, - 0, - 0, - 0, - -15 - ], - cacuteyacute: [ - -10, - -10, - 0, - 0, - 0, - 0, - 0, - -15 - ], - cacuteydieresis: [ - -10, - -10, - 0, - 0, - 0, - 0, - 0, - -15 - ], - ccaronh: [ - -10, - -10, - 0, - 0, - 0, - -10, - -15 - ], - ccaronk: [ - -20, - -20, - -20, - -20, - 0, - -10, - -20 - ], - ccaronkcommaaccent: [ - -20, - -20, - -20, - -20, - 0, - -10, - -20 - ], - ccaronl: [ - -20, - -20 - ], - ccaronlacute: [ - -20, - -20 - ], - ccaronlcommaaccent: [ - -20, - -20 - ], - ccaronlslash: [ - -20, - -20 - ], - ccarony: [ - -10, - -10, - 0, - 0, - 0, - 0, - 0, - -15 - ], - ccaronyacute: [ - -10, - -10, - 0, - 0, - 0, - 0, - 0, - -15 - ], - ccaronydieresis: [ - -10, - -10, - 0, - 0, - 0, - 0, - 0, - -15 - ], - ccedillah: [ - -10, - -10, - 0, - 0, - 0, - -10, - -15 - ], - ccedillak: [ - -20, - -20, - -20, - -20, - 0, - -10, - -20 - ], - ccedillakcommaaccent: [ - -20, - -20, - -20, - -20, - 0, - -10, - -20 - ], - ccedillal: [ - -20, - -20 - ], - ccedillalacute: [ - -20, - -20 - ], - ccedillalcommaaccent: [ - -20, - -20 - ], - ccedillalslash: [ - -20, - -20 - ], - ccedillay: [ - -10, - -10, - 0, - 0, - 0, - 0, - 0, - -15 - ], - ccedillayacute: [ - -10, - -10, - 0, - 0, - 0, - 0, - 0, - -15 - ], - ccedillaydieresis: [ - -10, - -10, - 0, - 0, - 0, - 0, - 0, - -15 - ], - colonspace: [ - -40, - -40, - -50, - -50 - ], - commaquotedblright: [ - -120, - -120, - -100, - -100, - -45, - -95, - -140, - -70 - ], - commaquoteright: [ - -120, - -120, - -100, - -100, - -55, - -95, - -140, - -70 - ], - commaspace: [ - -40, - -40 - ], - dd: [ - -10, - -10 - ], - ddcroat: [ - -10, - -10 - ], - dv: [ - -15, - -15 - ], - dw: [ - -15, - -15, - 0, - 0, - -15 - ], - dy: [ - -15, - -15 - ], - dyacute: [ - -15, - -15 - ], - dydieresis: [ - -15, - -15 - ], - dcroatd: [ - -10, - -10 - ], - dcroatdcroat: [ - -10, - -10 - ], - dcroatv: [ - -15, - -15 - ], - dcroatw: [ - -15, - -15, - 0, - 0, - -15 - ], - dcroaty: [ - -15, - -15 - ], - dcroatyacute: [ - -15, - -15 - ], - dcroatydieresis: [ - -15, - -15 - ], - ecomma: [ - 10, - 10, - -15, - -15, - 0, - 0, - -10 - ], - eperiod: [ - 20, - 20, - -15, - -15, - 0, - 0, - -15 - ], - ev: [ - -15, - -15, - -30, - -30, - -15, - 0, - -15, - -25 - ], - ew: [ - -15, - -15, - -20, - -20, - 0, - 0, - -15, - -25 - ], - ex: [ - -15, - -15, - -30, - -30, - 0, - 0, - -20, - -15 - ], - ey: [ - -15, - -15, - -20, - -20, - 0, - 0, - -30, - -15 - ], - eyacute: [ - -15, - -15, - -20, - -20, - 0, - 0, - -30, - -15 - ], - eydieresis: [ - -15, - -15, - -20, - -20, - 0, - 0, - -30, - -15 - ], - eacutecomma: [ - 10, - 10, - -15, - -15, - 0, - 0, - -10 - ], - eacuteperiod: [ - 20, - 20, - -15, - -15, - 0, - 0, - -15 - ], - eacutev: [ - -15, - -15, - -30, - -30, - -15, - 0, - -15, - -25 - ], - eacutew: [ - -15, - -15, - -20, - -20, - 0, - 0, - -15, - -25 - ], - eacutex: [ - -15, - -15, - -30, - -30, - 0, - 0, - -20, - -15 - ], - eacutey: [ - -15, - -15, - -20, - -20, - 0, - 0, - -30, - -15 - ], - eacuteyacute: [ - -15, - -15, - -20, - -20, - 0, - 0, - -30, - -15 - ], - eacuteydieresis: [ - -15, - -15, - -20, - -20, - 0, - 0, - -30, - -15 - ], - ecaroncomma: [ - 10, - 10, - -15, - -15, - 0, - 0, - -10 - ], - ecaronperiod: [ - 20, - 20, - -15, - -15, - 0, - 0, - -15 - ], - ecaronv: [ - -15, - -15, - -30, - -30, - -15, - 0, - -15, - -25 - ], - ecaronw: [ - -15, - -15, - -20, - -20, - 0, - 0, - -15, - -25 - ], - ecaronx: [ - -15, - -15, - -30, - -30, - 0, - 0, - -20, - -15 - ], - ecarony: [ - -15, - -15, - -20, - -20, - 0, - 0, - -30, - -15 - ], - ecaronyacute: [ - -15, - -15, - -20, - -20, - 0, - 0, - -30, - -15 - ], - ecaronydieresis: [ - -15, - -15, - -20, - -20, - 0, - 0, - -30, - -15 - ], - ecircumflexcomma: [ - 10, - 10, - -15, - -15, - 0, - 0, - -10 - ], - ecircumflexperiod: [ - 20, - 20, - -15, - -15, - 0, - 0, - -15 - ], - ecircumflexv: [ - -15, - -15, - -30, - -30, - -15, - 0, - -15, - -25 - ], - ecircumflexw: [ - -15, - -15, - -20, - -20, - 0, - 0, - -15, - -25 - ], - ecircumflexx: [ - -15, - -15, - -30, - -30, - 0, - 0, - -20, - -15 - ], - ecircumflexy: [ - -15, - -15, - -20, - -20, - 0, - 0, - -30, - -15 - ], - ecircumflexyacute: [ - -15, - -15, - -20, - -20, - 0, - 0, - -30, - -15 - ], - ecircumflexydieresis: [ - -15, - -15, - -20, - -20, - 0, - 0, - -30, - -15 - ], - edieresiscomma: [ - 10, - 10, - -15, - -15, - 0, - 0, - -10 - ], - edieresisperiod: [ - 20, - 20, - -15, - -15, - 0, - 0, - -15 - ], - edieresisv: [ - -15, - -15, - -30, - -30, - -15, - 0, - -15, - -25 - ], - edieresisw: [ - -15, - -15, - -20, - -20, - 0, - 0, - -15, - -25 - ], - edieresisx: [ - -15, - -15, - -30, - -30, - 0, - 0, - -20, - -15 - ], - edieresisy: [ - -15, - -15, - -20, - -20, - 0, - 0, - -30, - -15 - ], - edieresisyacute: [ - -15, - -15, - -20, - -20, - 0, - 0, - -30, - -15 - ], - edieresisydieresis: [ - -15, - -15, - -20, - -20, - 0, - 0, - -30, - -15 - ], - edotaccentcomma: [ - 10, - 10, - -15, - -15, - 0, - 0, - -10 - ], - edotaccentperiod: [ - 20, - 20, - -15, - -15, - 0, - 0, - -15 - ], - edotaccentv: [ - -15, - -15, - -30, - -30, - -15, - 0, - -15, - -25 - ], - edotaccentw: [ - -15, - -15, - -20, - -20, - 0, - 0, - -15, - -25 - ], - edotaccentx: [ - -15, - -15, - -30, - -30, - 0, - 0, - -20, - -15 - ], - edotaccenty: [ - -15, - -15, - -20, - -20, - 0, - 0, - -30, - -15 - ], - edotaccentyacute: [ - -15, - -15, - -20, - -20, - 0, - 0, - -30, - -15 - ], - edotaccentydieresis: [ - -15, - -15, - -20, - -20, - 0, - 0, - -30, - -15 - ], - egravecomma: [ - 10, - 10, - -15, - -15, - 0, - 0, - -10 - ], - egraveperiod: [ - 20, - 20, - -15, - -15, - 0, - 0, - -15 - ], - egravev: [ - -15, - -15, - -30, - -30, - -15, - 0, - -15, - -25 - ], - egravew: [ - -15, - -15, - -20, - -20, - 0, - 0, - -15, - -25 - ], - egravex: [ - -15, - -15, - -30, - -30, - 0, - 0, - -20, - -15 - ], - egravey: [ - -15, - -15, - -20, - -20, - 0, - 0, - -30, - -15 - ], - egraveyacute: [ - -15, - -15, - -20, - -20, - 0, - 0, - -30, - -15 - ], - egraveydieresis: [ - -15, - -15, - -20, - -20, - 0, - 0, - -30, - -15 - ], - emacroncomma: [ - 10, - 10, - -15, - -15, - 0, - 0, - -10 - ], - emacronperiod: [ - 20, - 20, - -15, - -15, - 0, - 0, - -15 - ], - emacronv: [ - -15, - -15, - -30, - -30, - -15, - 0, - -15, - -25 - ], - emacronw: [ - -15, - -15, - -20, - -20, - 0, - 0, - -15, - -25 - ], - emacronx: [ - -15, - -15, - -30, - -30, - 0, - 0, - -20, - -15 - ], - emacrony: [ - -15, - -15, - -20, - -20, - 0, - 0, - -30, - -15 - ], - emacronyacute: [ - -15, - -15, - -20, - -20, - 0, - 0, - -30, - -15 - ], - emacronydieresis: [ - -15, - -15, - -20, - -20, - 0, - 0, - -30, - -15 - ], - eogonekcomma: [ - 10, - 10, - -15, - -15, - 0, - 0, - -10 - ], - eogonekperiod: [ - 20, - 20, - -15, - -15, - 0, - 0, - -15 - ], - eogonekv: [ - -15, - -15, - -30, - -30, - -15, - 0, - -15, - -25 - ], - eogonekw: [ - -15, - -15, - -20, - -20, - 0, - 0, - -15, - -25 - ], - eogonekx: [ - -15, - -15, - -30, - -30, - 0, - 0, - -20, - -15 - ], - eogoneky: [ - -15, - -15, - -20, - -20, - 0, - 0, - -30, - -15 - ], - eogonekyacute: [ - -15, - -15, - -20, - -20, - 0, - 0, - -30, - -15 - ], - eogonekydieresis: [ - -15, - -15, - -20, - -20, - 0, - 0, - -30, - -15 - ], - fcomma: [ - -10, - -10, - -30, - -30, - -15, - -10, - -10 - ], - fe: [ - -10, - -10, - -30, - -30, - 0, - -10 - ], - feacute: [ - -10, - -10, - -30, - -30, - 0, - -10 - ], - fecaron: [ - -10, - -10, - -30, - -30 - ], - fecircumflex: [ - -10, - -10, - -30, - -30 - ], - fedieresis: [ - -10, - -10, - -30, - -30 - ], - fedotaccent: [ - -10, - -10, - -30, - -30, - 0, - -10 - ], - fegrave: [ - -10, - -10, - -30, - -30 - ], - femacron: [ - -10, - -10, - -30, - -30 - ], - feogonek: [ - -10, - -10, - -30, - -30, - 0, - -10 - ], - fo: [ - -20, - -20, - -30, - -30, - -25, - -10 - ], - foacute: [ - -20, - -20, - -30, - -30, - -25, - -10 - ], - focircumflex: [ - -20, - -20, - -30, - -30, - -25, - -10 - ], - fodieresis: [ - -20, - -20, - -30, - -30, - -25 - ], - fograve: [ - -20, - -20, - -30, - -30, - -25, - -10 - ], - fohungarumlaut: [ - -20, - -20, - -30, - -30, - -25, - -10 - ], - fomacron: [ - -20, - -20, - -30, - -30, - -25 - ], - foslash: [ - -20, - -20, - -30, - -30, - -25, - -10 - ], - fotilde: [ - -20, - -20, - -30, - -30, - -25, - -10 - ], - fperiod: [ - -10, - -10, - -30, - -30, - -15, - -10, - -15 - ], - fquotedblright: [ - 30, - 30, - 60, - 60, - 50 - ], - fquoteright: [ - 30, - 30, - 50, - 50, - 55, - 55, - 92, - 55 - ], - ge: [ - 10, - 10, - 0, - 0, - 0, - 0, - -10 - ], - geacute: [ - 10, - 10, - 0, - 0, - 0, - 0, - -10 - ], - gecaron: [ - 10, - 10, - 0, - 0, - 0, - 0, - -10 - ], - gecircumflex: [ - 10, - 10, - 0, - 0, - 0, - 0, - -10 - ], - gedieresis: [ - 10, - 10, - 0, - 0, - 0, - 0, - -10 - ], - gedotaccent: [ - 10, - 10, - 0, - 0, - 0, - 0, - -10 - ], - gegrave: [ - 10, - 10, - 0, - 0, - 0, - 0, - -10 - ], - gemacron: [ - 10, - 10, - 0, - 0, - 0, - 0, - -10 - ], - geogonek: [ - 10, - 10, - 0, - 0, - 0, - 0, - -10 - ], - gg: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - ggbreve: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - ggcommaaccent: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - gbrevee: [ - 10, - 10, - 0, - 0, - 0, - 0, - -10 - ], - gbreveeacute: [ - 10, - 10, - 0, - 0, - 0, - 0, - -10 - ], - gbreveecaron: [ - 10, - 10, - 0, - 0, - 0, - 0, - -10 - ], - gbreveecircumflex: [ - 10, - 10, - 0, - 0, - 0, - 0, - -10 - ], - gbreveedieresis: [ - 10, - 10, - 0, - 0, - 0, - 0, - -10 - ], - gbreveedotaccent: [ - 10, - 10, - 0, - 0, - 0, - 0, - -10 - ], - gbreveegrave: [ - 10, - 10, - 0, - 0, - 0, - 0, - -10 - ], - gbreveemacron: [ - 10, - 10, - 0, - 0, - 0, - 0, - -10 - ], - gbreveeogonek: [ - 10, - 10, - 0, - 0, - 0, - 0, - -10 - ], - gbreveg: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - gbrevegbreve: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - gbrevegcommaaccent: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - gcommaaccente: [ - 10, - 10, - 0, - 0, - 0, - 0, - -10 - ], - gcommaaccenteacute: [ - 10, - 10, - 0, - 0, - 0, - 0, - -10 - ], - gcommaaccentecaron: [ - 10, - 10, - 0, - 0, - 0, - 0, - -10 - ], - gcommaaccentecircumflex: [ - 10, - 10, - 0, - 0, - 0, - 0, - -10 - ], - gcommaaccentedieresis: [ - 10, - 10, - 0, - 0, - 0, - 0, - -10 - ], - gcommaaccentedotaccent: [ - 10, - 10, - 0, - 0, - 0, - 0, - -10 - ], - gcommaaccentegrave: [ - 10, - 10, - 0, - 0, - 0, - 0, - -10 - ], - gcommaaccentemacron: [ - 10, - 10, - 0, - 0, - 0, - 0, - -10 - ], - gcommaaccenteogonek: [ - 10, - 10, - 0, - 0, - 0, - 0, - -10 - ], - gcommaaccentg: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - gcommaaccentgbreve: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - gcommaaccentgcommaaccent: [ - -10, - -10, - 0, - 0, - 0, - 0, - -10 - ], - hy: [ - -20, - -20, - -30, - -30, - -15, - 0, - 0, - -5 - ], - hyacute: [ - -20, - -20, - -30, - -30, - -15, - 0, - 0, - -5 - ], - hydieresis: [ - -20, - -20, - -30, - -30, - -15, - 0, - 0, - -5 - ], - ko: [ - -15, - -15, - -20, - -20, - -15, - -10, - -10, - -10 - ], - koacute: [ - -15, - -15, - -20, - -20, - -15, - -10, - -10, - -10 - ], - kocircumflex: [ - -15, - -15, - -20, - -20, - -15, - -10, - -10, - -10 - ], - kodieresis: [ - -15, - -15, - -20, - -20, - -15, - -10, - -10, - -10 - ], - kograve: [ - -15, - -15, - -20, - -20, - -15, - -10, - -10, - -10 - ], - kohungarumlaut: [ - -15, - -15, - -20, - -20, - -15, - -10, - -10, - -10 - ], - komacron: [ - -15, - -15, - -20, - -20, - -15, - -10, - -10, - -10 - ], - koslash: [ - -15, - -15, - -20, - -20, - -15, - -10, - -10, - -10 - ], - kotilde: [ - -15, - -15, - -20, - -20, - -15, - -10, - -10, - -10 - ], - kcommaaccento: [ - -15, - -15, - -20, - -20, - -15, - -10, - -10, - -10 - ], - kcommaaccentoacute: [ - -15, - -15, - -20, - -20, - -15, - -10, - -10, - -10 - ], - kcommaaccentocircumflex: [ - -15, - -15, - -20, - -20, - -15, - -10, - -10, - -10 - ], - kcommaaccentodieresis: [ - -15, - -15, - -20, - -20, - -15, - -10, - -10, - -10 - ], - kcommaaccentograve: [ - -15, - -15, - -20, - -20, - -15, - -10, - -10, - -10 - ], - kcommaaccentohungarumlaut: [ - -15, - -15, - -20, - -20, - -15, - -10, - -10, - -10 - ], - kcommaaccentomacron: [ - -15, - -15, - -20, - -20, - -15, - -10, - -10, - -10 - ], - kcommaaccentoslash: [ - -15, - -15, - -20, - -20, - -15, - -10, - -10, - -10 - ], - kcommaaccentotilde: [ - -15, - -15, - -20, - -20, - -15, - -10, - -10, - -10 - ], - lw: [ - -15, - -15, - 0, - 0, - 0, - 0, - 0, - -10 - ], - ly: [ - -15, - -15 - ], - lyacute: [ - -15, - -15 - ], - lydieresis: [ - -15, - -15 - ], - lacutew: [ - -15, - -15, - 0, - 0, - 0, - 0, - 0, - -10 - ], - lacutey: [ - -15, - -15 - ], - lacuteyacute: [ - -15, - -15 - ], - lacuteydieresis: [ - -15, - -15 - ], - lcommaaccentw: [ - -15, - -15, - 0, - 0, - 0, - 0, - 0, - -10 - ], - lcommaaccenty: [ - -15, - -15 - ], - lcommaaccentyacute: [ - -15, - -15 - ], - lcommaaccentydieresis: [ - -15, - -15 - ], - lslashw: [ - -15, - -15, - 0, - 0, - 0, - 0, - 0, - -10 - ], - lslashy: [ - -15, - -15 - ], - lslashyacute: [ - -15, - -15 - ], - lslashydieresis: [ - -15, - -15 - ], - mu: [ - -20, - -20, - -10, - -10 - ], - muacute: [ - -20, - -20, - -10, - -10 - ], - mucircumflex: [ - -20, - -20, - -10, - -10 - ], - mudieresis: [ - -20, - -20, - -10, - -10 - ], - mugrave: [ - -20, - -20, - -10, - -10 - ], - muhungarumlaut: [ - -20, - -20, - -10, - -10 - ], - mumacron: [ - -20, - -20, - -10, - -10 - ], - muogonek: [ - -20, - -20, - -10, - -10 - ], - muring: [ - -20, - -20, - -10, - -10 - ], - my: [ - -30, - -30, - -15, - -15 - ], - myacute: [ - -30, - -30, - -15, - -15 - ], - mydieresis: [ - -30, - -30, - -15, - -15 - ], - nu: [ - -10, - -10, - -10, - -10 - ], - nuacute: [ - -10, - -10, - -10, - -10 - ], - nucircumflex: [ - -10, - -10, - -10, - -10 - ], - nudieresis: [ - -10, - -10, - -10, - -10 - ], - nugrave: [ - -10, - -10, - -10, - -10 - ], - nuhungarumlaut: [ - -10, - -10, - -10, - -10 - ], - numacron: [ - -10, - -10, - -10, - -10 - ], - nuogonek: [ - -10, - -10, - -10, - -10 - ], - nuring: [ - -10, - -10, - -10, - -10 - ], - nv: [ - -40, - -40, - -20, - -20, - -40, - -40, - -40, - -40 - ], - ny: [ - -20, - -20, - -15, - -15, - 0, - 0, - 0, - -15 - ], - nyacute: [ - -20, - -20, - -15, - -15, - 0, - 0, - 0, - -15 - ], - nydieresis: [ - -20, - -20, - -15, - -15, - 0, - 0, - 0, - -15 - ], - nacuteu: [ - -10, - -10, - -10, - -10 - ], - nacuteuacute: [ - -10, - -10, - -10, - -10 - ], - nacuteucircumflex: [ - -10, - -10, - -10, - -10 - ], - nacuteudieresis: [ - -10, - -10, - -10, - -10 - ], - nacuteugrave: [ - -10, - -10, - -10, - -10 - ], - nacuteuhungarumlaut: [ - -10, - -10, - -10, - -10 - ], - nacuteumacron: [ - -10, - -10, - -10, - -10 - ], - nacuteuogonek: [ - -10, - -10, - -10, - -10 - ], - nacuteuring: [ - -10, - -10, - -10, - -10 - ], - nacutev: [ - -40, - -40, - -20, - -20, - -40, - -40, - -40, - -40 - ], - nacutey: [ - -20, - -20, - -15, - -15, - 0, - 0, - 0, - -15 - ], - nacuteyacute: [ - -20, - -20, - -15, - -15, - 0, - 0, - 0, - -15 - ], - nacuteydieresis: [ - -20, - -20, - -15, - -15, - 0, - 0, - 0, - -15 - ], - ncaronu: [ - -10, - -10, - -10, - -10 - ], - ncaronuacute: [ - -10, - -10, - -10, - -10 - ], - ncaronucircumflex: [ - -10, - -10, - -10, - -10 - ], - ncaronudieresis: [ - -10, - -10, - -10, - -10 - ], - ncaronugrave: [ - -10, - -10, - -10, - -10 - ], - ncaronuhungarumlaut: [ - -10, - -10, - -10, - -10 - ], - ncaronumacron: [ - -10, - -10, - -10, - -10 - ], - ncaronuogonek: [ - -10, - -10, - -10, - -10 - ], - ncaronuring: [ - -10, - -10, - -10, - -10 - ], - ncaronv: [ - -40, - -40, - -20, - -20, - -40, - -40, - -40, - -40 - ], - ncarony: [ - -20, - -20, - -15, - -15, - 0, - 0, - 0, - -15 - ], - ncaronyacute: [ - -20, - -20, - -15, - -15, - 0, - 0, - 0, - -15 - ], - ncaronydieresis: [ - -20, - -20, - -15, - -15, - 0, - 0, - 0, - -15 - ], - ncommaaccentu: [ - -10, - -10, - -10, - -10 - ], - ncommaaccentuacute: [ - -10, - -10, - -10, - -10 - ], - ncommaaccentucircumflex: [ - -10, - -10, - -10, - -10 - ], - ncommaaccentudieresis: [ - -10, - -10, - -10, - -10 - ], - ncommaaccentugrave: [ - -10, - -10, - -10, - -10 - ], - ncommaaccentuhungarumlaut: [ - -10, - -10, - -10, - -10 - ], - ncommaaccentumacron: [ - -10, - -10, - -10, - -10 - ], - ncommaaccentuogonek: [ - -10, - -10, - -10, - -10 - ], - ncommaaccenturing: [ - -10, - -10, - -10, - -10 - ], - ncommaaccentv: [ - -40, - -40, - -20, - -20, - -40, - -40, - -40, - -40 - ], - ncommaaccenty: [ - -20, - -20, - -15, - -15, - 0, - 0, - 0, - -15 - ], - ncommaaccentyacute: [ - -20, - -20, - -15, - -15, - 0, - 0, - 0, - -15 - ], - ncommaaccentydieresis: [ - -20, - -20, - -15, - -15, - 0, - 0, - 0, - -15 - ], - ntildeu: [ - -10, - -10, - -10, - -10 - ], - ntildeuacute: [ - -10, - -10, - -10, - -10 - ], - ntildeucircumflex: [ - -10, - -10, - -10, - -10 - ], - ntildeudieresis: [ - -10, - -10, - -10, - -10 - ], - ntildeugrave: [ - -10, - -10, - -10, - -10 - ], - ntildeuhungarumlaut: [ - -10, - -10, - -10, - -10 - ], - ntildeumacron: [ - -10, - -10, - -10, - -10 - ], - ntildeuogonek: [ - -10, - -10, - -10, - -10 - ], - ntildeuring: [ - -10, - -10, - -10, - -10 - ], - ntildev: [ - -40, - -40, - -20, - -20, - -40, - -40, - -40, - -40 - ], - ntildey: [ - -20, - -20, - -15, - -15, - 0, - 0, - 0, - -15 - ], - ntildeyacute: [ - -20, - -20, - -15, - -15, - 0, - 0, - 0, - -15 - ], - ntildeydieresis: [ - -20, - -20, - -15, - -15, - 0, - 0, - 0, - -15 - ], - ov: [ - -20, - -20, - -15, - -15, - -10, - -15, - -10, - -15 - ], - ow: [ - -15, - -15, - -15, - -15, - -10, - -25, - 0, - -25 - ], - ox: [ - -30, - -30, - -30, - -30, - 0, - -10 - ], - oy: [ - -20, - -20, - -30, - -30, - 0, - -10, - 0, - -10 - ], - oyacute: [ - -20, - -20, - -30, - -30, - 0, - -10, - 0, - -10 - ], - oydieresis: [ - -20, - -20, - -30, - -30, - 0, - -10, - 0, - -10 - ], - oacutev: [ - -20, - -20, - -15, - -15, - -10, - -15, - -10, - -15 - ], - oacutew: [ - -15, - -15, - -15, - -15, - -10, - -25, - 0, - -25 - ], - oacutex: [ - -30, - -30, - -30, - -30, - 0, - -10 - ], - oacutey: [ - -20, - -20, - -30, - -30, - 0, - -10, - 0, - -10 - ], - oacuteyacute: [ - -20, - -20, - -30, - -30, - 0, - -10, - 0, - -10 - ], - oacuteydieresis: [ - -20, - -20, - -30, - -30, - 0, - -10, - 0, - -10 - ], - ocircumflexv: [ - -20, - -20, - -15, - -15, - -10, - -15, - -10, - -15 - ], - ocircumflexw: [ - -15, - -15, - -15, - -15, - -10, - -25, - 0, - -25 - ], - ocircumflexx: [ - -30, - -30, - -30, - -30, - 0, - -10 - ], - ocircumflexy: [ - -20, - -20, - -30, - -30, - 0, - -10, - 0, - -10 - ], - ocircumflexyacute: [ - -20, - -20, - -30, - -30, - 0, - -10, - 0, - -10 - ], - ocircumflexydieresis: [ - -20, - -20, - -30, - -30, - 0, - -10, - 0, - -10 - ], - odieresisv: [ - -20, - -20, - -15, - -15, - -10, - -15, - -10, - -15 - ], - odieresisw: [ - -15, - -15, - -15, - -15, - -10, - -25, - 0, - -25 - ], - odieresisx: [ - -30, - -30, - -30, - -30, - 0, - -10 - ], - odieresisy: [ - -20, - -20, - -30, - -30, - 0, - -10, - 0, - -10 - ], - odieresisyacute: [ - -20, - -20, - -30, - -30, - 0, - -10, - 0, - -10 - ], - odieresisydieresis: [ - -20, - -20, - -30, - -30, - 0, - -10, - 0, - -10 - ], - ogravev: [ - -20, - -20, - -15, - -15, - -10, - -15, - -10, - -15 - ], - ogravew: [ - -15, - -15, - -15, - -15, - -10, - -25, - 0, - -25 - ], - ogravex: [ - -30, - -30, - -30, - -30, - 0, - -10 - ], - ogravey: [ - -20, - -20, - -30, - -30, - 0, - -10, - 0, - -10 - ], - ograveyacute: [ - -20, - -20, - -30, - -30, - 0, - -10, - 0, - -10 - ], - ograveydieresis: [ - -20, - -20, - -30, - -30, - 0, - -10, - 0, - -10 - ], - ohungarumlautv: [ - -20, - -20, - -15, - -15, - -10, - -15, - -10, - -15 - ], - ohungarumlautw: [ - -15, - -15, - -15, - -15, - -10, - -25, - 0, - -25 - ], - ohungarumlautx: [ - -30, - -30, - -30, - -30, - 0, - -10 - ], - ohungarumlauty: [ - -20, - -20, - -30, - -30, - 0, - -10, - 0, - -10 - ], - ohungarumlautyacute: [ - -20, - -20, - -30, - -30, - 0, - -10, - 0, - -10 - ], - ohungarumlautydieresis: [ - -20, - -20, - -30, - -30, - 0, - -10, - 0, - -10 - ], - omacronv: [ - -20, - -20, - -15, - -15, - -10, - -15, - -10, - -15 - ], - omacronw: [ - -15, - -15, - -15, - -15, - -10, - -25, - 0, - -25 - ], - omacronx: [ - -30, - -30, - -30, - -30, - 0, - -10 - ], - omacrony: [ - -20, - -20, - -30, - -30, - 0, - -10, - 0, - -10 - ], - omacronyacute: [ - -20, - -20, - -30, - -30, - 0, - -10, - 0, - -10 - ], - omacronydieresis: [ - -20, - -20, - -30, - -30, - 0, - -10, - 0, - -10 - ], - oslashv: [ - -20, - -20, - -70, - -70, - -10, - -15, - -10, - -15 - ], - oslashw: [ - -15, - -15, - -70, - -70, - -10, - -25, - 0, - -25 - ], - oslashx: [ - -30, - -30, - -85, - -85, - 0, - -10 - ], - oslashy: [ - -20, - -20, - -70, - -70, - 0, - -10, - 0, - -10 - ], - oslashyacute: [ - -20, - -20, - -70, - -70, - 0, - -10, - 0, - -10 - ], - oslashydieresis: [ - -20, - -20, - -70, - -70, - 0, - -10, - 0, - -10 - ], - otildev: [ - -20, - -20, - -15, - -15, - -10, - -15, - -10, - -15 - ], - otildew: [ - -15, - -15, - -15, - -15, - -10, - -25, - 0, - -25 - ], - otildex: [ - -30, - -30, - -30, - -30, - 0, - -10 - ], - otildey: [ - -20, - -20, - -30, - -30, - 0, - -10, - 0, - -10 - ], - otildeyacute: [ - -20, - -20, - -30, - -30, - 0, - -10, - 0, - -10 - ], - otildeydieresis: [ - -20, - -20, - -30, - -30, - 0, - -10, - 0, - -10 - ], - py: [ - -15, - -15, - -30, - -30, - 0, - 0, - 0, - -10 - ], - pyacute: [ - -15, - -15, - -30, - -30, - 0, - 0, - 0, - -10 - ], - pydieresis: [ - -15, - -15, - -30, - -30, - 0, - 0, - 0, - -10 - ], - periodquotedblright: [ - -120, - -120, - -100, - -100, - -55, - -95, - -140, - -70 - ], - periodquoteright: [ - -120, - -120, - -100, - -100, - -55, - -95, - -140, - -70 - ], - periodspace: [ - -40, - -40, - -60, - -60 - ], - quotedblrightspace: [ - -80, - -80, - -40, - -40 - ], - quoteleftquoteleft: [ - -46, - -46, - -57, - -57, - -63, - -74, - -111, - -74 - ], - quoterightd: [ - -80, - -80, - -50, - -50, - -20, - -15, - -25, - -50 - ], - quoterightdcroat: [ - -80, - -80, - -50, - -50, - -20, - -15, - -25, - -50 - ], - quoterightl: [ - -20, - -20, - 0, - 0, - 0, - 0, - 0, - -10 - ], - quoterightlacute: [ - -20, - -20, - 0, - 0, - 0, - 0, - 0, - -10 - ], - quoterightlcommaaccent: [ - -20, - -20, - 0, - 0, - 0, - 0, - 0, - -10 - ], - quoterightlslash: [ - -20, - -20, - 0, - 0, - 0, - 0, - 0, - -10 - ], - quoterightquoteright: [ - -46, - -46, - -57, - -57, - -63, - -74, - -111, - -74 - ], - quoterightr: [ - -40, - -40, - -50, - -50, - -20, - -15, - -25, - -50 - ], - quoterightracute: [ - -40, - -40, - -50, - -50, - -20, - -15, - -25, - -50 - ], - quoterightrcaron: [ - -40, - -40, - -50, - -50, - -20, - -15, - -25, - -50 - ], - quoterightrcommaaccent: [ - -40, - -40, - -50, - -50, - -20, - -15, - -25, - -50 - ], - quoterights: [ - -60, - -60, - -50, - -50, - -37, - -74, - -40, - -55 - ], - quoterightsacute: [ - -60, - -60, - -50, - -50, - -37, - -74, - -40, - -55 - ], - quoterightscaron: [ - -60, - -60, - -50, - -50, - -37, - -74, - -40, - -55 - ], - quoterightscedilla: [ - -60, - -60, - -50, - -50, - -37, - -74, - -40, - -55 - ], - quoterightscommaaccent: [ - -60, - -60, - -50, - -50, - -37, - -74, - -40, - -55 - ], - quoterightspace: [ - -80, - -80, - -70, - -70, - -74, - -74, - -111, - -74 - ], - quoterightv: [ - -20, - -20, - 0, - 0, - -20, - -15, - -10, - -50 - ], - rc: [ - -20, - -20, - 0, - 0, - -18, - 0, - -37 - ], - rcacute: [ - -20, - -20, - 0, - 0, - -18, - 0, - -37 - ], - rccaron: [ - -20, - -20, - 0, - 0, - -18, - 0, - -37 - ], - rccedilla: [ - -20, - -20, - 0, - 0, - -18, - 0, - -37 - ], - rcomma: [ - -60, - -60, - -50, - -50, - -92, - -65, - -111, - -40 - ], - rd: [ - -20, - -20, - 0, - 0, - 0, - 0, - -37 - ], - rdcroat: [ - -20, - -20, - 0, - 0, - 0, - 0, - -37 - ], - rg: [ - -15, - -15, - 0, - 0, - -10, - 0, - -37, - -18 - ], - rgbreve: [ - -15, - -15, - 0, - 0, - -10, - 0, - -37, - -18 - ], - rgcommaaccent: [ - -15, - -15, - 0, - 0, - -10, - 0, - -37, - -18 - ], - rhyphen: [ - -20, - -20, - 0, - 0, - -37, - 0, - -20, - -20 - ], - ro: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - roacute: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - rocircumflex: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - rodieresis: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - rograve: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - rohungarumlaut: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - romacron: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - roslash: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - rotilde: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - rperiod: [ - -60, - -60, - -50, - -50, - -100, - -65, - -111, - -55 - ], - rq: [ - -20, - -20, - 0, - 0, - -18, - 0, - -37 - ], - rs: [ - -15, - -15, - 0, - 0, - 0, - 0, - -10 - ], - rsacute: [ - -15, - -15, - 0, - 0, - 0, - 0, - -10 - ], - rscaron: [ - -15, - -15, - 0, - 0, - 0, - 0, - -10 - ], - rscedilla: [ - -15, - -15, - 0, - 0, - 0, - 0, - -10 - ], - rscommaaccent: [ - -15, - -15, - 0, - 0, - 0, - 0, - -10 - ], - rt: [ - 20, - 20, - 40, - 40 - ], - rtcommaaccent: [ - 20, - 20, - 40, - 40 - ], - rv: [ - 10, - 10, - 30, - 30, - -10 - ], - ry: [ - 10, - 10, - 30, - 30 - ], - ryacute: [ - 10, - 10, - 30, - 30 - ], - rydieresis: [ - 10, - 10, - 30, - 30 - ], - racutec: [ - -20, - -20, - 0, - 0, - -18, - 0, - -37 - ], - racutecacute: [ - -20, - -20, - 0, - 0, - -18, - 0, - -37 - ], - racuteccaron: [ - -20, - -20, - 0, - 0, - -18, - 0, - -37 - ], - racuteccedilla: [ - -20, - -20, - 0, - 0, - -18, - 0, - -37 - ], - racutecomma: [ - -60, - -60, - -50, - -50, - -92, - -65, - -111, - -40 - ], - racuted: [ - -20, - -20, - 0, - 0, - 0, - 0, - -37 - ], - racutedcroat: [ - -20, - -20, - 0, - 0, - 0, - 0, - -37 - ], - racuteg: [ - -15, - -15, - 0, - 0, - -10, - 0, - -37, - -18 - ], - racutegbreve: [ - -15, - -15, - 0, - 0, - -10, - 0, - -37, - -18 - ], - racutegcommaaccent: [ - -15, - -15, - 0, - 0, - -10, - 0, - -37, - -18 - ], - racutehyphen: [ - -20, - -20, - 0, - 0, - -37, - 0, - -20, - -20 - ], - racuteo: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - racuteoacute: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - racuteocircumflex: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - racuteodieresis: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - racuteograve: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - racuteohungarumlaut: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - racuteomacron: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - racuteoslash: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - racuteotilde: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - racuteperiod: [ - -60, - -60, - -50, - -50, - -100, - -65, - -111, - -55 - ], - racuteq: [ - -20, - -20, - 0, - 0, - -18, - 0, - -37 - ], - racutes: [ - -15, - -15, - 0, - 0, - 0, - 0, - -10 - ], - racutesacute: [ - -15, - -15, - 0, - 0, - 0, - 0, - -10 - ], - racutescaron: [ - -15, - -15, - 0, - 0, - 0, - 0, - -10 - ], - racutescedilla: [ - -15, - -15, - 0, - 0, - 0, - 0, - -10 - ], - racutescommaaccent: [ - -15, - -15, - 0, - 0, - 0, - 0, - -10 - ], - racutet: [ - 20, - 20, - 40, - 40 - ], - racutetcommaaccent: [ - 20, - 20, - 40, - 40 - ], - racutev: [ - 10, - 10, - 30, - 30, - -10 - ], - racutey: [ - 10, - 10, - 30, - 30 - ], - racuteyacute: [ - 10, - 10, - 30, - 30 - ], - racuteydieresis: [ - 10, - 10, - 30, - 30 - ], - rcaronc: [ - -20, - -20, - 0, - 0, - -18, - 0, - -37 - ], - rcaroncacute: [ - -20, - -20, - 0, - 0, - -18, - 0, - -37 - ], - rcaronccaron: [ - -20, - -20, - 0, - 0, - -18, - 0, - -37 - ], - rcaronccedilla: [ - -20, - -20, - 0, - 0, - -18, - 0, - -37 - ], - rcaroncomma: [ - -60, - -60, - -50, - -50, - -92, - -65, - -111, - -40 - ], - rcarond: [ - -20, - -20, - 0, - 0, - 0, - 0, - -37 - ], - rcarondcroat: [ - -20, - -20, - 0, - 0, - 0, - 0, - -37 - ], - rcarong: [ - -15, - -15, - 0, - 0, - -10, - 0, - -37, - -18 - ], - rcarongbreve: [ - -15, - -15, - 0, - 0, - -10, - 0, - -37, - -18 - ], - rcarongcommaaccent: [ - -15, - -15, - 0, - 0, - -10, - 0, - -37, - -18 - ], - rcaronhyphen: [ - -20, - -20, - 0, - 0, - -37, - 0, - -20, - -20 - ], - rcarono: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - rcaronoacute: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - rcaronocircumflex: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - rcaronodieresis: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - rcaronograve: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - rcaronohungarumlaut: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - rcaronomacron: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - rcaronoslash: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - rcaronotilde: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - rcaronperiod: [ - -60, - -60, - -50, - -50, - -100, - -65, - -111, - -55 - ], - rcaronq: [ - -20, - -20, - 0, - 0, - -18, - 0, - -37 - ], - rcarons: [ - -15, - -15, - 0, - 0, - 0, - 0, - -10 - ], - rcaronsacute: [ - -15, - -15, - 0, - 0, - 0, - 0, - -10 - ], - rcaronscaron: [ - -15, - -15, - 0, - 0, - 0, - 0, - -10 - ], - rcaronscedilla: [ - -15, - -15, - 0, - 0, - 0, - 0, - -10 - ], - rcaronscommaaccent: [ - -15, - -15, - 0, - 0, - 0, - 0, - -10 - ], - rcaront: [ - 20, - 20, - 40, - 40 - ], - rcarontcommaaccent: [ - 20, - 20, - 40, - 40 - ], - rcaronv: [ - 10, - 10, - 30, - 30, - -10 - ], - rcarony: [ - 10, - 10, - 30, - 30 - ], - rcaronyacute: [ - 10, - 10, - 30, - 30 - ], - rcaronydieresis: [ - 10, - 10, - 30, - 30 - ], - rcommaaccentc: [ - -20, - -20, - 0, - 0, - -18, - 0, - -37 - ], - rcommaaccentcacute: [ - -20, - -20, - 0, - 0, - -18, - 0, - -37 - ], - rcommaaccentccaron: [ - -20, - -20, - 0, - 0, - -18, - 0, - -37 - ], - rcommaaccentccedilla: [ - -20, - -20, - 0, - 0, - -18, - 0, - -37 - ], - rcommaaccentcomma: [ - -60, - -60, - -50, - -50, - -92, - -65, - -111, - -40 - ], - rcommaaccentd: [ - -20, - -20, - 0, - 0, - 0, - 0, - -37 - ], - rcommaaccentdcroat: [ - -20, - -20, - 0, - 0, - 0, - 0, - -37 - ], - rcommaaccentg: [ - -15, - -15, - 0, - 0, - -10, - 0, - -37, - -18 - ], - rcommaaccentgbreve: [ - -15, - -15, - 0, - 0, - -10, - 0, - -37, - -18 - ], - rcommaaccentgcommaaccent: [ - -15, - -15, - 0, - 0, - -10, - 0, - -37, - -18 - ], - rcommaaccenthyphen: [ - -20, - -20, - 0, - 0, - -37, - 0, - -20, - -20 - ], - rcommaaccento: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - rcommaaccentoacute: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - rcommaaccentocircumflex: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - rcommaaccentodieresis: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - rcommaaccentograve: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - rcommaaccentohungarumlaut: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - rcommaaccentomacron: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - rcommaaccentoslash: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - rcommaaccentotilde: [ - -20, - -20, - 0, - 0, - -18, - 0, - -45 - ], - rcommaaccentperiod: [ - -60, - -60, - -50, - -50, - -100, - -65, - -111, - -55 - ], - rcommaaccentq: [ - -20, - -20, - 0, - 0, - -18, - 0, - -37 - ], - rcommaaccents: [ - -15, - -15, - 0, - 0, - 0, - 0, - -10 - ], - rcommaaccentsacute: [ - -15, - -15, - 0, - 0, - 0, - 0, - -10 - ], - rcommaaccentscaron: [ - -15, - -15, - 0, - 0, - 0, - 0, - -10 - ], - rcommaaccentscedilla: [ - -15, - -15, - 0, - 0, - 0, - 0, - -10 - ], - rcommaaccentscommaaccent: [ - -15, - -15, - 0, - 0, - 0, - 0, - -10 - ], - rcommaaccentt: [ - 20, - 20, - 40, - 40 - ], - rcommaaccenttcommaaccent: [ - 20, - 20, - 40, - 40 - ], - rcommaaccentv: [ - 10, - 10, - 30, - 30, - -10 - ], - rcommaaccenty: [ - 10, - 10, - 30, - 30 - ], - rcommaaccentyacute: [ - 10, - 10, - 30, - 30 - ], - rcommaaccentydieresis: [ - 10, - 10, - 30, - 30 - ], - sw: [ - -15, - -15, - -30, - -30 - ], - sacutew: [ - -15, - -15, - -30, - -30 - ], - scaronw: [ - -15, - -15, - -30, - -30 - ], - scedillaw: [ - -15, - -15, - -30, - -30 - ], - scommaaccentw: [ - -15, - -15, - -30, - -30 - ], - semicolonspace: [ - -40, - -40, - -50, - -50 - ], - spaceT: [ - -100, - -100, - -50, - -50, - -30, - 0, - -18, - -18 - ], - spaceTcaron: [ - -100, - -100, - -50, - -50, - -30, - 0, - -18, - -18 - ], - spaceTcommaaccent: [ - -100, - -100, - -50, - -50, - -30, - 0, - -18, - -18 - ], - spaceV: [ - -80, - -80, - -50, - -50, - -45, - -70, - -35, - -50 - ], - spaceW: [ - -80, - -80, - -40, - -40, - -30, - -70, - -40, - -30 - ], - spaceY: [ - -120, - -120, - -90, - -90, - -55, - -70, - -75, - -90 - ], - spaceYacute: [ - -120, - -120, - -90, - -90, - -55, - -70, - -75, - -90 - ], - spaceYdieresis: [ - -120, - -120, - -90, - -90, - -55, - -70, - -75, - -90 - ], - spacequotedblleft: [ - -80, - -80, - -30, - -30 - ], - spacequoteleft: [ - -60, - -60, - -60, - -60 - ], - va: [ - -20, - -20, - -25, - -25, - -10, - 0, - 0, - -25 - ], - vaacute: [ - -20, - -20, - -25, - -25, - -10, - 0, - 0, - -25 - ], - vabreve: [ - -20, - -20, - -25, - -25, - -10, - 0, - 0, - -25 - ], - vacircumflex: [ - -20, - -20, - -25, - -25, - -10, - 0, - 0, - -25 - ], - vadieresis: [ - -20, - -20, - -25, - -25, - -10, - 0, - 0, - -25 - ], - vagrave: [ - -20, - -20, - -25, - -25, - -10, - 0, - 0, - -25 - ], - vamacron: [ - -20, - -20, - -25, - -25, - -10, - 0, - 0, - -25 - ], - vaogonek: [ - -20, - -20, - -25, - -25, - -10, - 0, - 0, - -25 - ], - varing: [ - -20, - -20, - -25, - -25, - -10, - 0, - 0, - -25 - ], - vatilde: [ - -20, - -20, - -25, - -25, - -10, - 0, - 0, - -25 - ], - vcomma: [ - -80, - -80, - -80, - -80, - -55, - -37, - -74, - -65 - ], - vo: [ - -30, - -30, - -25, - -25, - -10, - -15, - 0, - -20 - ], - voacute: [ - -30, - -30, - -25, - -25, - -10, - -15, - 0, - -20 - ], - vocircumflex: [ - -30, - -30, - -25, - -25, - -10, - -15, - 0, - -20 - ], - vodieresis: [ - -30, - -30, - -25, - -25, - -10, - -15, - 0, - -20 - ], - vograve: [ - -30, - -30, - -25, - -25, - -10, - -15, - 0, - -20 - ], - vohungarumlaut: [ - -30, - -30, - -25, - -25, - -10, - -15, - 0, - -20 - ], - vomacron: [ - -30, - -30, - -25, - -25, - -10, - -15, - 0, - -20 - ], - voslash: [ - -30, - -30, - -25, - -25, - -10, - -15, - 0, - -20 - ], - votilde: [ - -30, - -30, - -25, - -25, - -10, - -15, - 0, - -20 - ], - vperiod: [ - -80, - -80, - -80, - -80, - -70, - -37, - -74, - -65 - ], - wcomma: [ - -40, - -40, - -60, - -60, - -55, - -37, - -74, - -65 - ], - wo: [ - -20, - -20, - -10, - -10, - -10, - -15, - 0, - -10 - ], - woacute: [ - -20, - -20, - -10, - -10, - -10, - -15, - 0, - -10 - ], - wocircumflex: [ - -20, - -20, - -10, - -10, - -10, - -15, - 0, - -10 - ], - wodieresis: [ - -20, - -20, - -10, - -10, - -10, - -15, - 0, - -10 - ], - wograve: [ - -20, - -20, - -10, - -10, - -10, - -15, - 0, - -10 - ], - wohungarumlaut: [ - -20, - -20, - -10, - -10, - -10, - -15, - 0, - -10 - ], - womacron: [ - -20, - -20, - -10, - -10, - -10, - -15, - 0, - -10 - ], - woslash: [ - -20, - -20, - -10, - -10, - -10, - -15, - 0, - -10 - ], - wotilde: [ - -20, - -20, - -10, - -10, - -10, - -15, - 0, - -10 - ], - wperiod: [ - -40, - -40, - -60, - -60, - -70, - -37, - -74, - -65 - ], - xe: [ - -10, - -10, - -30, - -30, - 0, - -10, - 0, - -15 - ], - xeacute: [ - -10, - -10, - -30, - -30, - 0, - -10, - 0, - -15 - ], - xecaron: [ - -10, - -10, - -30, - -30, - 0, - -10, - 0, - -15 - ], - xecircumflex: [ - -10, - -10, - -30, - -30, - 0, - -10, - 0, - -15 - ], - xedieresis: [ - -10, - -10, - -30, - -30, - 0, - -10, - 0, - -15 - ], - xedotaccent: [ - -10, - -10, - -30, - -30, - 0, - -10, - 0, - -15 - ], - xegrave: [ - -10, - -10, - -30, - -30, - 0, - -10, - 0, - -15 - ], - xemacron: [ - -10, - -10, - -30, - -30, - 0, - -10, - 0, - -15 - ], - xeogonek: [ - -10, - -10, - -30, - -30, - 0, - -10, - 0, - -15 - ], - ya: [ - -30, - -30, - -20, - -20 - ], - yaacute: [ - -30, - -30, - -20, - -20 - ], - yabreve: [ - -30, - -30, - -20, - -20 - ], - yacircumflex: [ - -30, - -30, - -20, - -20 - ], - yadieresis: [ - -30, - -30, - -20, - -20 - ], - yagrave: [ - -30, - -30, - -20, - -20 - ], - yamacron: [ - -30, - -30, - -20, - -20 - ], - yaogonek: [ - -30, - -30, - -20, - -20 - ], - yaring: [ - -30, - -30, - -20, - -20 - ], - yatilde: [ - -30, - -30, - -20, - -20 - ], - ycomma: [ - -80, - -80, - -100, - -100, - -55, - -37, - -55, - -65 - ], - ye: [ - -10, - -10, - -20, - -20, - -10 - ], - yeacute: [ - -10, - -10, - -20, - -20, - -10 - ], - yecaron: [ - -10, - -10, - -20, - -20, - -10 - ], - yecircumflex: [ - -10, - -10, - -20, - -20, - -10 - ], - yedieresis: [ - -10, - -10, - -20, - -20, - -10 - ], - yedotaccent: [ - -10, - -10, - -20, - -20, - -10 - ], - yegrave: [ - -10, - -10, - -20, - -20, - -10 - ], - yemacron: [ - -10, - -10, - -20, - -20, - -10 - ], - yeogonek: [ - -10, - -10, - -20, - -20, - -10 - ], - yo: [ - -25, - -25, - -20, - -20, - -25 - ], - yoacute: [ - -25, - -25, - -20, - -20, - -25 - ], - yocircumflex: [ - -25, - -25, - -20, - -20, - -25 - ], - yodieresis: [ - -25, - -25, - -20, - -20, - -25 - ], - yograve: [ - -25, - -25, - -20, - -20, - -25 - ], - yohungarumlaut: [ - -25, - -25, - -20, - -20, - -25 - ], - yomacron: [ - -25, - -25, - -20, - -20, - -25 - ], - yoslash: [ - -25, - -25, - -20, - -20, - -25 - ], - yotilde: [ - -25, - -25, - -20, - -20, - -25 - ], - yperiod: [ - -80, - -80, - -100, - -100, - -70, - -37, - -55, - -65 - ], - yacutea: [ - -30, - -30, - -20, - -20 - ], - yacuteaacute: [ - -30, - -30, - -20, - -20 - ], - yacuteabreve: [ - -30, - -30, - -20, - -20 - ], - yacuteacircumflex: [ - -30, - -30, - -20, - -20 - ], - yacuteadieresis: [ - -30, - -30, - -20, - -20 - ], - yacuteagrave: [ - -30, - -30, - -20, - -20 - ], - yacuteamacron: [ - -30, - -30, - -20, - -20 - ], - yacuteaogonek: [ - -30, - -30, - -20, - -20 - ], - yacutearing: [ - -30, - -30, - -20, - -20 - ], - yacuteatilde: [ - -30, - -30, - -20, - -20 - ], - yacutecomma: [ - -80, - -80, - -100, - -100, - -55, - -37, - -55, - -65 - ], - yacutee: [ - -10, - -10, - -20, - -20, - -10 - ], - yacuteeacute: [ - -10, - -10, - -20, - -20, - -10 - ], - yacuteecaron: [ - -10, - -10, - -20, - -20, - -10 - ], - yacuteecircumflex: [ - -10, - -10, - -20, - -20, - -10 - ], - yacuteedieresis: [ - -10, - -10, - -20, - -20, - -10 - ], - yacuteedotaccent: [ - -10, - -10, - -20, - -20, - -10 - ], - yacuteegrave: [ - -10, - -10, - -20, - -20, - -10 - ], - yacuteemacron: [ - -10, - -10, - -20, - -20, - -10 - ], - yacuteeogonek: [ - -10, - -10, - -20, - -20, - -10 - ], - yacuteo: [ - -25, - -25, - -20, - -20, - -25 - ], - yacuteoacute: [ - -25, - -25, - -20, - -20, - -25 - ], - yacuteocircumflex: [ - -25, - -25, - -20, - -20, - -25 - ], - yacuteodieresis: [ - -25, - -25, - -20, - -20, - -25 - ], - yacuteograve: [ - -25, - -25, - -20, - -20, - -25 - ], - yacuteohungarumlaut: [ - -25, - -25, - -20, - -20, - -25 - ], - yacuteomacron: [ - -25, - -25, - -20, - -20, - -25 - ], - yacuteoslash: [ - -25, - -25, - -20, - -20, - -25 - ], - yacuteotilde: [ - -25, - -25, - -20, - -20, - -25 - ], - yacuteperiod: [ - -80, - -80, - -100, - -100, - -70, - -37, - -55, - -65 - ], - ydieresisa: [ - -30, - -30, - -20, - -20 - ], - ydieresisaacute: [ - -30, - -30, - -20, - -20 - ], - ydieresisabreve: [ - -30, - -30, - -20, - -20 - ], - ydieresisacircumflex: [ - -30, - -30, - -20, - -20 - ], - ydieresisadieresis: [ - -30, - -30, - -20, - -20 - ], - ydieresisagrave: [ - -30, - -30, - -20, - -20 - ], - ydieresisamacron: [ - -30, - -30, - -20, - -20 - ], - ydieresisaogonek: [ - -30, - -30, - -20, - -20 - ], - ydieresisaring: [ - -30, - -30, - -20, - -20 - ], - ydieresisatilde: [ - -30, - -30, - -20, - -20 - ], - ydieresiscomma: [ - -80, - -80, - -100, - -100, - -55, - -37, - -55, - -65 - ], - ydieresise: [ - -10, - -10, - -20, - -20, - -10 - ], - ydieresiseacute: [ - -10, - -10, - -20, - -20, - -10 - ], - ydieresisecaron: [ - -10, - -10, - -20, - -20, - -10 - ], - ydieresisecircumflex: [ - -10, - -10, - -20, - -20, - -10 - ], - ydieresisedieresis: [ - -10, - -10, - -20, - -20, - -10 - ], - ydieresisedotaccent: [ - -10, - -10, - -20, - -20, - -10 - ], - ydieresisegrave: [ - -10, - -10, - -20, - -20, - -10 - ], - ydieresisemacron: [ - -10, - -10, - -20, - -20, - -10 - ], - ydieresiseogonek: [ - -10, - -10, - -20, - -20, - -10 - ], - ydieresiso: [ - -25, - -25, - -20, - -20, - -25 - ], - ydieresisoacute: [ - -25, - -25, - -20, - -20, - -25 - ], - ydieresisocircumflex: [ - -25, - -25, - -20, - -20, - -25 - ], - ydieresisodieresis: [ - -25, - -25, - -20, - -20, - -25 - ], - ydieresisograve: [ - -25, - -25, - -20, - -20, - -25 - ], - ydieresisohungarumlaut: [ - -25, - -25, - -20, - -20, - -25 - ], - ydieresisomacron: [ - -25, - -25, - -20, - -20, - -25 - ], - ydieresisoslash: [ - -25, - -25, - -20, - -20, - -25 - ], - ydieresisotilde: [ - -25, - -25, - -20, - -20, - -25 - ], - ydieresisperiod: [ - -80, - -80, - -100, - -100, - -70, - -37, - -55, - -65 - ], - ze: [ - 10, - 10, - -15, - -15 - ], - zeacute: [ - 10, - 10, - -15, - -15 - ], - zecaron: [ - 10, - 10, - -15, - -15 - ], - zecircumflex: [ - 10, - 10, - -15, - -15 - ], - zedieresis: [ - 10, - 10, - -15, - -15 - ], - zedotaccent: [ - 10, - 10, - -15, - -15 - ], - zegrave: [ - 10, - 10, - -15, - -15 - ], - zemacron: [ - 10, - 10, - -15, - -15 - ], - zeogonek: [ - 10, - 10, - -15, - -15 - ], - zacutee: [ - 10, - 10, - -15, - -15 - ], - zacuteeacute: [ - 10, - 10, - -15, - -15 - ], - zacuteecaron: [ - 10, - 10, - -15, - -15 - ], - zacuteecircumflex: [ - 10, - 10, - -15, - -15 - ], - zacuteedieresis: [ - 10, - 10, - -15, - -15 - ], - zacuteedotaccent: [ - 10, - 10, - -15, - -15 - ], - zacuteegrave: [ - 10, - 10, - -15, - -15 - ], - zacuteemacron: [ - 10, - 10, - -15, - -15 - ], - zacuteeogonek: [ - 10, - 10, - -15, - -15 - ], - zcarone: [ - 10, - 10, - -15, - -15 - ], - zcaroneacute: [ - 10, - 10, - -15, - -15 - ], - zcaronecaron: [ - 10, - 10, - -15, - -15 - ], - zcaronecircumflex: [ - 10, - 10, - -15, - -15 - ], - zcaronedieresis: [ - 10, - 10, - -15, - -15 - ], - zcaronedotaccent: [ - 10, - 10, - -15, - -15 - ], - zcaronegrave: [ - 10, - 10, - -15, - -15 - ], - zcaronemacron: [ - 10, - 10, - -15, - -15 - ], - zcaroneogonek: [ - 10, - 10, - -15, - -15 - ], - zdotaccente: [ - 10, - 10, - -15, - -15 - ], - zdotaccenteacute: [ - 10, - 10, - -15, - -15 - ], - zdotaccentecaron: [ - 10, - 10, - -15, - -15 - ], - zdotaccentecircumflex: [ - 10, - 10, - -15, - -15 - ], - zdotaccentedieresis: [ - 10, - 10, - -15, - -15 - ], - zdotaccentedotaccent: [ - 10, - 10, - -15, - -15 - ], - zdotaccentegrave: [ - 10, - 10, - -15, - -15 - ], - zdotaccentemacron: [ - 10, - 10, - -15, - -15 - ], - zdotaccenteogonek: [ - 10, - 10, - -15, - -15 - ], - Bcomma: [ - 0, - 0, - -20, - -20 - ], - Bperiod: [ - 0, - 0, - -20, - -20 - ], - Ccomma: [ - 0, - 0, - -30, - -30 - ], - Cperiod: [ - 0, - 0, - -30, - -30 - ], - Cacutecomma: [ - 0, - 0, - -30, - -30 - ], - Cacuteperiod: [ - 0, - 0, - -30, - -30 - ], - Ccaroncomma: [ - 0, - 0, - -30, - -30 - ], - Ccaronperiod: [ - 0, - 0, - -30, - -30 - ], - Ccedillacomma: [ - 0, - 0, - -30, - -30 - ], - Ccedillaperiod: [ - 0, - 0, - -30, - -30 - ], - Fe: [ - 0, - 0, - -30, - -30, - -25, - -100, - -75 - ], - Feacute: [ - 0, - 0, - -30, - -30, - -25, - -100, - -75 - ], - Fecaron: [ - 0, - 0, - -30, - -30, - -25, - -100, - -75 - ], - Fecircumflex: [ - 0, - 0, - -30, - -30, - -25, - -100, - -75 - ], - Fedieresis: [ - 0, - 0, - -30, - -30, - -25, - -100, - -75 - ], - Fedotaccent: [ - 0, - 0, - -30, - -30, - -25, - -100, - -75 - ], - Fegrave: [ - 0, - 0, - -30, - -30, - -25, - -100, - -75 - ], - Femacron: [ - 0, - 0, - -30, - -30, - -25, - -100, - -75 - ], - Feogonek: [ - 0, - 0, - -30, - -30, - -25, - -100, - -75 - ], - Fo: [ - 0, - 0, - -30, - -30, - -25, - -70, - -105, - -15 - ], - Foacute: [ - 0, - 0, - -30, - -30, - -25, - -70, - -105, - -15 - ], - Focircumflex: [ - 0, - 0, - -30, - -30, - -25, - -70, - -105, - -15 - ], - Fodieresis: [ - 0, - 0, - -30, - -30, - -25, - -70, - -105, - -15 - ], - Fograve: [ - 0, - 0, - -30, - -30, - -25, - -70, - -105, - -15 - ], - Fohungarumlaut: [ - 0, - 0, - -30, - -30, - -25, - -70, - -105, - -15 - ], - Fomacron: [ - 0, - 0, - -30, - -30, - -25, - -70, - -105, - -15 - ], - Foslash: [ - 0, - 0, - -30, - -30, - -25, - -70, - -105, - -15 - ], - Fotilde: [ - 0, - 0, - -30, - -30, - -25, - -70, - -105, - -15 - ], - Fr: [ - 0, - 0, - -45, - -45, - 0, - -50, - -55 - ], - Fracute: [ - 0, - 0, - -45, - -45, - 0, - -50, - -55 - ], - Frcaron: [ - 0, - 0, - -45, - -45, - 0, - -50, - -55 - ], - Frcommaaccent: [ - 0, - 0, - -45, - -45, - 0, - -50, - -55 - ], - Ja: [ - 0, - 0, - -20, - -20, - -15, - -40, - -35 - ], - Jaacute: [ - 0, - 0, - -20, - -20, - -15, - -40, - -35 - ], - Jabreve: [ - 0, - 0, - -20, - -20, - -15, - -40, - -35 - ], - Jacircumflex: [ - 0, - 0, - -20, - -20, - -15, - -40, - -35 - ], - Jadieresis: [ - 0, - 0, - -20, - -20, - -15, - -40, - -35 - ], - Jagrave: [ - 0, - 0, - -20, - -20, - -15, - -40, - -35 - ], - Jamacron: [ - 0, - 0, - -20, - -20, - -15, - -40, - -35 - ], - Jaogonek: [ - 0, - 0, - -20, - -20, - -15, - -40, - -35 - ], - Jaring: [ - 0, - 0, - -20, - -20, - -15, - -40, - -35 - ], - Jatilde: [ - 0, - 0, - -20, - -20, - -15, - -40, - -35 - ], - LcaronT: [ - 0, - 0, - -110, - -110 - ], - LcaronTcaron: [ - 0, - 0, - -110, - -110 - ], - LcaronTcommaaccent: [ - 0, - 0, - -110, - -110 - ], - LcaronV: [ - 0, - 0, - -110, - -110 - ], - LcaronW: [ - 0, - 0, - -70, - -70 - ], - LcaronY: [ - 0, - 0, - -140, - -140 - ], - LcaronYacute: [ - 0, - 0, - -140, - -140 - ], - LcaronYdieresis: [ - 0, - 0, - -140, - -140 - ], - Lcaronquotedblright: [ - 0, - 0, - -140, - -140 - ], - Lcaronquoteright: [ - 0, - 0, - -160, - -160, - 0, - 0, - 0, - -92 - ], - Lcarony: [ - 0, - 0, - -30, - -30, - 0, - 0, - 0, - -55 - ], - Lcaronyacute: [ - 0, - 0, - -30, - -30, - 0, - 0, - 0, - -55 - ], - Lcaronydieresis: [ - 0, - 0, - -30, - -30, - 0, - 0, - 0, - -55 - ], - Scomma: [ - 0, - 0, - -20, - -20 - ], - Speriod: [ - 0, - 0, - -20, - -20 - ], - Sacutecomma: [ - 0, - 0, - -20, - -20 - ], - Sacuteperiod: [ - 0, - 0, - -20, - -20 - ], - Scaroncomma: [ - 0, - 0, - -20, - -20 - ], - Scaronperiod: [ - 0, - 0, - -20, - -20 - ], - Scedillacomma: [ - 0, - 0, - -20, - -20 - ], - Scedillaperiod: [ - 0, - 0, - -20, - -20 - ], - Scommaaccentcomma: [ - 0, - 0, - -20, - -20 - ], - Scommaaccentperiod: [ - 0, - 0, - -20, - -20 - ], - Trcaron: [ - 0, - 0, - -120, - -120, - -74, - -37, - -55, - -35 - ], - Tcaronrcaron: [ - 0, - 0, - -120, - -120, - -74, - -37, - -55, - -35 - ], - Tcommaaccentrcaron: [ - 0, - 0, - -120, - -120, - -74, - -37, - -55, - -35 - ], - Yhyphen: [ - 0, - 0, - -140, - -140, - -92, - -92, - -74, - -111 - ], - Yi: [ - 0, - 0, - -20, - -20, - -37, - -55, - -74, - -55 - ], - Yiacute: [ - 0, - 0, - -20, - -20, - -37, - -55, - -74, - -55 - ], - Yiogonek: [ - 0, - 0, - -20, - -20, - -37, - -55, - -74, - -55 - ], - Yacutehyphen: [ - 0, - 0, - -140, - -140, - -92, - -92, - -74, - -111 - ], - Yacutei: [ - 0, - 0, - -20, - -20, - -37, - -55, - -74, - -55 - ], - Yacuteiacute: [ - 0, - 0, - -20, - -20, - -37, - -55, - -74, - -55 - ], - Yacuteiogonek: [ - 0, - 0, - -20, - -20, - -37, - -55, - -74, - -55 - ], - Ydieresishyphen: [ - 0, - 0, - -140, - -140, - -92, - -92, - -74, - -111 - ], - Ydieresisi: [ - 0, - 0, - -20, - -20, - -37, - -55, - -74, - -55 - ], - Ydieresisiacute: [ - 0, - 0, - -20, - -20, - -37, - -55, - -74, - -55 - ], - Ydieresisiogonek: [ - 0, - 0, - -20, - -20, - -37, - -55, - -74, - -55 - ], - bb: [ - 0, - 0, - -10, - -10, - -10, - -10 - ], - bcomma: [ - 0, - 0, - -40, - -40 - ], - bperiod: [ - 0, - 0, - -40, - -40, - -40, - -40, - -40, - -40 - ], - ccomma: [ - 0, - 0, - -15, - -15 - ], - cacutecomma: [ - 0, - 0, - -15, - -15 - ], - ccaroncomma: [ - 0, - 0, - -15, - -15 - ], - ccedillacomma: [ - 0, - 0, - -15, - -15 - ], - fa: [ - 0, - 0, - -30, - -30, - 0, - 0, - 0, - -10 - ], - faacute: [ - 0, - 0, - -30, - -30, - 0, - 0, - 0, - -10 - ], - fabreve: [ - 0, - 0, - -30, - -30, - 0, - 0, - 0, - -10 - ], - facircumflex: [ - 0, - 0, - -30, - -30, - 0, - 0, - 0, - -10 - ], - fadieresis: [ - 0, - 0, - -30, - -30, - 0, - 0, - 0, - -10 - ], - fagrave: [ - 0, - 0, - -30, - -30, - 0, - 0, - 0, - -10 - ], - famacron: [ - 0, - 0, - -30, - -30, - 0, - 0, - 0, - -10 - ], - faogonek: [ - 0, - 0, - -30, - -30, - 0, - 0, - 0, - -10 - ], - faring: [ - 0, - 0, - -30, - -30, - 0, - 0, - 0, - -10 - ], - fatilde: [ - 0, - 0, - -30, - -30, - 0, - 0, - 0, - -10 - ], - fdotlessi: [ - 0, - 0, - -28, - -28, - -35, - -30, - -60, - -50 - ], - gr: [ - 0, - 0, - -10, - -10 - ], - gracute: [ - 0, - 0, - -10, - -10 - ], - grcaron: [ - 0, - 0, - -10, - -10 - ], - grcommaaccent: [ - 0, - 0, - -10, - -10 - ], - gbrever: [ - 0, - 0, - -10, - -10 - ], - gbreveracute: [ - 0, - 0, - -10, - -10 - ], - gbrevercaron: [ - 0, - 0, - -10, - -10 - ], - gbrevercommaaccent: [ - 0, - 0, - -10, - -10 - ], - gcommaaccentr: [ - 0, - 0, - -10, - -10 - ], - gcommaaccentracute: [ - 0, - 0, - -10, - -10 - ], - gcommaaccentrcaron: [ - 0, - 0, - -10, - -10 - ], - gcommaaccentrcommaaccent: [ - 0, - 0, - -10, - -10 - ], - ke: [ - 0, - 0, - -20, - -20, - -10, - -30, - -10, - -10 - ], - keacute: [ - 0, - 0, - -20, - -20, - -10, - -30, - -10, - -10 - ], - kecaron: [ - 0, - 0, - -20, - -20, - -10, - -30, - -10, - -10 - ], - kecircumflex: [ - 0, - 0, - -20, - -20, - -10, - -30, - -10, - -10 - ], - kedieresis: [ - 0, - 0, - -20, - -20, - -10, - -30, - -10, - -10 - ], - kedotaccent: [ - 0, - 0, - -20, - -20, - -10, - -30, - -10, - -10 - ], - kegrave: [ - 0, - 0, - -20, - -20, - -10, - -30, - -10, - -10 - ], - kemacron: [ - 0, - 0, - -20, - -20, - -10, - -30, - -10, - -10 - ], - keogonek: [ - 0, - 0, - -20, - -20, - -10, - -30, - -10, - -10 - ], - kcommaaccente: [ - 0, - 0, - -20, - -20, - -10, - -30, - -10, - -10 - ], - kcommaaccenteacute: [ - 0, - 0, - -20, - -20, - -10, - -30, - -10, - -10 - ], - kcommaaccentecaron: [ - 0, - 0, - -20, - -20, - -10, - -30, - -10, - -10 - ], - kcommaaccentecircumflex: [ - 0, - 0, - -20, - -20, - -10, - -30, - -10, - -10 - ], - kcommaaccentedieresis: [ - 0, - 0, - -20, - -20, - -10, - -30, - -10, - -10 - ], - kcommaaccentedotaccent: [ - 0, - 0, - -20, - -20, - -10, - -30, - -10, - -10 - ], - kcommaaccentegrave: [ - 0, - 0, - -20, - -20, - -10, - -30, - -10, - -10 - ], - kcommaaccentemacron: [ - 0, - 0, - -20, - -20, - -10, - -30, - -10, - -10 - ], - kcommaaccenteogonek: [ - 0, - 0, - -20, - -20, - -10, - -30, - -10, - -10 - ], - ocomma: [ - 0, - 0, - -40, - -40 - ], - operiod: [ - 0, - 0, - -40, - -40 - ], - oacutecomma: [ - 0, - 0, - -40, - -40 - ], - oacuteperiod: [ - 0, - 0, - -40, - -40 - ], - ocircumflexcomma: [ - 0, - 0, - -40, - -40 - ], - ocircumflexperiod: [ - 0, - 0, - -40, - -40 - ], - odieresiscomma: [ - 0, - 0, - -40, - -40 - ], - odieresisperiod: [ - 0, - 0, - -40, - -40 - ], - ogravecomma: [ - 0, - 0, - -40, - -40 - ], - ograveperiod: [ - 0, - 0, - -40, - -40 - ], - ohungarumlautcomma: [ - 0, - 0, - -40, - -40 - ], - ohungarumlautperiod: [ - 0, - 0, - -40, - -40 - ], - omacroncomma: [ - 0, - 0, - -40, - -40 - ], - omacronperiod: [ - 0, - 0, - -40, - -40 - ], - oslasha: [ - 0, - 0, - -55, - -55 - ], - oslashaacute: [ - 0, - 0, - -55, - -55 - ], - oslashabreve: [ - 0, - 0, - -55, - -55 - ], - oslashacircumflex: [ - 0, - 0, - -55, - -55 - ], - oslashadieresis: [ - 0, - 0, - -55, - -55 - ], - oslashagrave: [ - 0, - 0, - -55, - -55 - ], - oslashamacron: [ - 0, - 0, - -55, - -55 - ], - oslashaogonek: [ - 0, - 0, - -55, - -55 - ], - oslasharing: [ - 0, - 0, - -55, - -55 - ], - oslashatilde: [ - 0, - 0, - -55, - -55 - ], - oslashb: [ - 0, - 0, - -55, - -55 - ], - oslashc: [ - 0, - 0, - -55, - -55 - ], - oslashcacute: [ - 0, - 0, - -55, - -55 - ], - oslashccaron: [ - 0, - 0, - -55, - -55 - ], - oslashccedilla: [ - 0, - 0, - -55, - -55 - ], - oslashcomma: [ - 0, - 0, - -95, - -95 - ], - oslashd: [ - 0, - 0, - -55, - -55 - ], - oslashdcroat: [ - 0, - 0, - -55, - -55 - ], - oslashe: [ - 0, - 0, - -55, - -55 - ], - oslasheacute: [ - 0, - 0, - -55, - -55 - ], - oslashecaron: [ - 0, - 0, - -55, - -55 - ], - oslashecircumflex: [ - 0, - 0, - -55, - -55 - ], - oslashedieresis: [ - 0, - 0, - -55, - -55 - ], - oslashedotaccent: [ - 0, - 0, - -55, - -55 - ], - oslashegrave: [ - 0, - 0, - -55, - -55 - ], - oslashemacron: [ - 0, - 0, - -55, - -55 - ], - oslasheogonek: [ - 0, - 0, - -55, - -55 - ], - oslashf: [ - 0, - 0, - -55, - -55 - ], - oslashg: [ - 0, - 0, - -55, - -55, - 0, - 0, - -10 - ], - oslashgbreve: [ - 0, - 0, - -55, - -55, - 0, - 0, - -10 - ], - oslashgcommaaccent: [ - 0, - 0, - -55, - -55, - 0, - 0, - -10 - ], - oslashh: [ - 0, - 0, - -55, - -55 - ], - oslashi: [ - 0, - 0, - -55, - -55 - ], - oslashiacute: [ - 0, - 0, - -55, - -55 - ], - oslashicircumflex: [ - 0, - 0, - -55, - -55 - ], - oslashidieresis: [ - 0, - 0, - -55, - -55 - ], - oslashigrave: [ - 0, - 0, - -55, - -55 - ], - oslashimacron: [ - 0, - 0, - -55, - -55 - ], - oslashiogonek: [ - 0, - 0, - -55, - -55 - ], - oslashj: [ - 0, - 0, - -55, - -55 - ], - oslashk: [ - 0, - 0, - -55, - -55 - ], - oslashkcommaaccent: [ - 0, - 0, - -55, - -55 - ], - oslashl: [ - 0, - 0, - -55, - -55 - ], - oslashlacute: [ - 0, - 0, - -55, - -55 - ], - oslashlcommaaccent: [ - 0, - 0, - -55, - -55 - ], - oslashlslash: [ - 0, - 0, - -55, - -55 - ], - oslashm: [ - 0, - 0, - -55, - -55 - ], - oslashn: [ - 0, - 0, - -55, - -55 - ], - oslashnacute: [ - 0, - 0, - -55, - -55 - ], - oslashncaron: [ - 0, - 0, - -55, - -55 - ], - oslashncommaaccent: [ - 0, - 0, - -55, - -55 - ], - oslashntilde: [ - 0, - 0, - -55, - -55 - ], - oslasho: [ - 0, - 0, - -55, - -55 - ], - oslashoacute: [ - 0, - 0, - -55, - -55 - ], - oslashocircumflex: [ - 0, - 0, - -55, - -55 - ], - oslashodieresis: [ - 0, - 0, - -55, - -55 - ], - oslashograve: [ - 0, - 0, - -55, - -55 - ], - oslashohungarumlaut: [ - 0, - 0, - -55, - -55 - ], - oslashomacron: [ - 0, - 0, - -55, - -55 - ], - oslashoslash: [ - 0, - 0, - -55, - -55 - ], - oslashotilde: [ - 0, - 0, - -55, - -55 - ], - oslashp: [ - 0, - 0, - -55, - -55 - ], - oslashperiod: [ - 0, - 0, - -95, - -95 - ], - oslashq: [ - 0, - 0, - -55, - -55 - ], - oslashr: [ - 0, - 0, - -55, - -55 - ], - oslashracute: [ - 0, - 0, - -55, - -55 - ], - oslashrcaron: [ - 0, - 0, - -55, - -55 - ], - oslashrcommaaccent: [ - 0, - 0, - -55, - -55 - ], - oslashs: [ - 0, - 0, - -55, - -55 - ], - oslashsacute: [ - 0, - 0, - -55, - -55 - ], - oslashscaron: [ - 0, - 0, - -55, - -55 - ], - oslashscedilla: [ - 0, - 0, - -55, - -55 - ], - oslashscommaaccent: [ - 0, - 0, - -55, - -55 - ], - oslasht: [ - 0, - 0, - -55, - -55 - ], - oslashtcommaaccent: [ - 0, - 0, - -55, - -55 - ], - oslashu: [ - 0, - 0, - -55, - -55 - ], - oslashuacute: [ - 0, - 0, - -55, - -55 - ], - oslashucircumflex: [ - 0, - 0, - -55, - -55 - ], - oslashudieresis: [ - 0, - 0, - -55, - -55 - ], - oslashugrave: [ - 0, - 0, - -55, - -55 - ], - oslashuhungarumlaut: [ - 0, - 0, - -55, - -55 - ], - oslashumacron: [ - 0, - 0, - -55, - -55 - ], - oslashuogonek: [ - 0, - 0, - -55, - -55 - ], - oslashuring: [ - 0, - 0, - -55, - -55 - ], - oslashz: [ - 0, - 0, - -55, - -55 - ], - oslashzacute: [ - 0, - 0, - -55, - -55 - ], - oslashzcaron: [ - 0, - 0, - -55, - -55 - ], - oslashzdotaccent: [ - 0, - 0, - -55, - -55 - ], - otildecomma: [ - 0, - 0, - -40, - -40 - ], - otildeperiod: [ - 0, - 0, - -40, - -40 - ], - pcomma: [ - 0, - 0, - -35, - -35 - ], - pperiod: [ - 0, - 0, - -35, - -35 - ], - ra: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - raacute: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - rabreve: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - racircumflex: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - radieresis: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - ragrave: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - ramacron: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - raogonek: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - raring: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - ratilde: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - rcolon: [ - 0, - 0, - 30, - 30 - ], - ri: [ - 0, - 0, - 15, - 15 - ], - riacute: [ - 0, - 0, - 15, - 15 - ], - ricircumflex: [ - 0, - 0, - 15, - 15 - ], - ridieresis: [ - 0, - 0, - 15, - 15 - ], - rigrave: [ - 0, - 0, - 15, - 15 - ], - rimacron: [ - 0, - 0, - 15, - 15 - ], - riogonek: [ - 0, - 0, - 15, - 15 - ], - rk: [ - 0, - 0, - 15, - 15 - ], - rkcommaaccent: [ - 0, - 0, - 15, - 15 - ], - rl: [ - 0, - 0, - 15, - 15 - ], - rlacute: [ - 0, - 0, - 15, - 15 - ], - rlcommaaccent: [ - 0, - 0, - 15, - 15 - ], - rlslash: [ - 0, - 0, - 15, - 15 - ], - rm: [ - 0, - 0, - 25, - 25 - ], - rn: [ - 0, - 0, - 25, - 25, - -15 - ], - rnacute: [ - 0, - 0, - 25, - 25, - -15 - ], - rncaron: [ - 0, - 0, - 25, - 25, - -15 - ], - rncommaaccent: [ - 0, - 0, - 25, - 25, - -15 - ], - rntilde: [ - 0, - 0, - 25, - 25, - -15 - ], - rp: [ - 0, - 0, - 30, - 30, - -10 - ], - rsemicolon: [ - 0, - 0, - 30, - 30 - ], - ru: [ - 0, - 0, - 15, - 15 - ], - ruacute: [ - 0, - 0, - 15, - 15 - ], - rucircumflex: [ - 0, - 0, - 15, - 15 - ], - rudieresis: [ - 0, - 0, - 15, - 15 - ], - rugrave: [ - 0, - 0, - 15, - 15 - ], - ruhungarumlaut: [ - 0, - 0, - 15, - 15 - ], - rumacron: [ - 0, - 0, - 15, - 15 - ], - ruogonek: [ - 0, - 0, - 15, - 15 - ], - ruring: [ - 0, - 0, - 15, - 15 - ], - racutea: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - racuteaacute: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - racuteabreve: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - racuteacircumflex: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - racuteadieresis: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - racuteagrave: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - racuteamacron: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - racuteaogonek: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - racutearing: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - racuteatilde: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - racutecolon: [ - 0, - 0, - 30, - 30 - ], - racutei: [ - 0, - 0, - 15, - 15 - ], - racuteiacute: [ - 0, - 0, - 15, - 15 - ], - racuteicircumflex: [ - 0, - 0, - 15, - 15 - ], - racuteidieresis: [ - 0, - 0, - 15, - 15 - ], - racuteigrave: [ - 0, - 0, - 15, - 15 - ], - racuteimacron: [ - 0, - 0, - 15, - 15 - ], - racuteiogonek: [ - 0, - 0, - 15, - 15 - ], - racutek: [ - 0, - 0, - 15, - 15 - ], - racutekcommaaccent: [ - 0, - 0, - 15, - 15 - ], - racutel: [ - 0, - 0, - 15, - 15 - ], - racutelacute: [ - 0, - 0, - 15, - 15 - ], - racutelcommaaccent: [ - 0, - 0, - 15, - 15 - ], - racutelslash: [ - 0, - 0, - 15, - 15 - ], - racutem: [ - 0, - 0, - 25, - 25 - ], - racuten: [ - 0, - 0, - 25, - 25, - -15 - ], - racutenacute: [ - 0, - 0, - 25, - 25, - -15 - ], - racutencaron: [ - 0, - 0, - 25, - 25, - -15 - ], - racutencommaaccent: [ - 0, - 0, - 25, - 25, - -15 - ], - racutentilde: [ - 0, - 0, - 25, - 25, - -15 - ], - racutep: [ - 0, - 0, - 30, - 30, - -10 - ], - racutesemicolon: [ - 0, - 0, - 30, - 30 - ], - racuteu: [ - 0, - 0, - 15, - 15 - ], - racuteuacute: [ - 0, - 0, - 15, - 15 - ], - racuteucircumflex: [ - 0, - 0, - 15, - 15 - ], - racuteudieresis: [ - 0, - 0, - 15, - 15 - ], - racuteugrave: [ - 0, - 0, - 15, - 15 - ], - racuteuhungarumlaut: [ - 0, - 0, - 15, - 15 - ], - racuteumacron: [ - 0, - 0, - 15, - 15 - ], - racuteuogonek: [ - 0, - 0, - 15, - 15 - ], - racuteuring: [ - 0, - 0, - 15, - 15 - ], - rcarona: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - rcaronaacute: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - rcaronabreve: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - rcaronacircumflex: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - rcaronadieresis: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - rcaronagrave: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - rcaronamacron: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - rcaronaogonek: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - rcaronaring: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - rcaronatilde: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - rcaroncolon: [ - 0, - 0, - 30, - 30 - ], - rcaroni: [ - 0, - 0, - 15, - 15 - ], - rcaroniacute: [ - 0, - 0, - 15, - 15 - ], - rcaronicircumflex: [ - 0, - 0, - 15, - 15 - ], - rcaronidieresis: [ - 0, - 0, - 15, - 15 - ], - rcaronigrave: [ - 0, - 0, - 15, - 15 - ], - rcaronimacron: [ - 0, - 0, - 15, - 15 - ], - rcaroniogonek: [ - 0, - 0, - 15, - 15 - ], - rcaronk: [ - 0, - 0, - 15, - 15 - ], - rcaronkcommaaccent: [ - 0, - 0, - 15, - 15 - ], - rcaronl: [ - 0, - 0, - 15, - 15 - ], - rcaronlacute: [ - 0, - 0, - 15, - 15 - ], - rcaronlcommaaccent: [ - 0, - 0, - 15, - 15 - ], - rcaronlslash: [ - 0, - 0, - 15, - 15 - ], - rcaronm: [ - 0, - 0, - 25, - 25 - ], - rcaronn: [ - 0, - 0, - 25, - 25, - -15 - ], - rcaronnacute: [ - 0, - 0, - 25, - 25, - -15 - ], - rcaronncaron: [ - 0, - 0, - 25, - 25, - -15 - ], - rcaronncommaaccent: [ - 0, - 0, - 25, - 25, - -15 - ], - rcaronntilde: [ - 0, - 0, - 25, - 25, - -15 - ], - rcaronp: [ - 0, - 0, - 30, - 30, - -10 - ], - rcaronsemicolon: [ - 0, - 0, - 30, - 30 - ], - rcaronu: [ - 0, - 0, - 15, - 15 - ], - rcaronuacute: [ - 0, - 0, - 15, - 15 - ], - rcaronucircumflex: [ - 0, - 0, - 15, - 15 - ], - rcaronudieresis: [ - 0, - 0, - 15, - 15 - ], - rcaronugrave: [ - 0, - 0, - 15, - 15 - ], - rcaronuhungarumlaut: [ - 0, - 0, - 15, - 15 - ], - rcaronumacron: [ - 0, - 0, - 15, - 15 - ], - rcaronuogonek: [ - 0, - 0, - 15, - 15 - ], - rcaronuring: [ - 0, - 0, - 15, - 15 - ], - rcommaaccenta: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - rcommaaccentaacute: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - rcommaaccentabreve: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - rcommaaccentacircumflex: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - rcommaaccentadieresis: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - rcommaaccentagrave: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - rcommaaccentamacron: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - rcommaaccentaogonek: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - rcommaaccentaring: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - rcommaaccentatilde: [ - 0, - 0, - -10, - -10, - 0, - 0, - -15 - ], - rcommaaccentcolon: [ - 0, - 0, - 30, - 30 - ], - rcommaaccenti: [ - 0, - 0, - 15, - 15 - ], - rcommaaccentiacute: [ - 0, - 0, - 15, - 15 - ], - rcommaaccenticircumflex: [ - 0, - 0, - 15, - 15 - ], - rcommaaccentidieresis: [ - 0, - 0, - 15, - 15 - ], - rcommaaccentigrave: [ - 0, - 0, - 15, - 15 - ], - rcommaaccentimacron: [ - 0, - 0, - 15, - 15 - ], - rcommaaccentiogonek: [ - 0, - 0, - 15, - 15 - ], - rcommaaccentk: [ - 0, - 0, - 15, - 15 - ], - rcommaaccentkcommaaccent: [ - 0, - 0, - 15, - 15 - ], - rcommaaccentl: [ - 0, - 0, - 15, - 15 - ], - rcommaaccentlacute: [ - 0, - 0, - 15, - 15 - ], - rcommaaccentlcommaaccent: [ - 0, - 0, - 15, - 15 - ], - rcommaaccentlslash: [ - 0, - 0, - 15, - 15 - ], - rcommaaccentm: [ - 0, - 0, - 25, - 25 - ], - rcommaaccentn: [ - 0, - 0, - 25, - 25, - -15 - ], - rcommaaccentnacute: [ - 0, - 0, - 25, - 25, - -15 - ], - rcommaaccentncaron: [ - 0, - 0, - 25, - 25, - -15 - ], - rcommaaccentncommaaccent: [ - 0, - 0, - 25, - 25, - -15 - ], - rcommaaccentntilde: [ - 0, - 0, - 25, - 25, - -15 - ], - rcommaaccentp: [ - 0, - 0, - 30, - 30, - -10 - ], - rcommaaccentsemicolon: [ - 0, - 0, - 30, - 30 - ], - rcommaaccentu: [ - 0, - 0, - 15, - 15 - ], - rcommaaccentuacute: [ - 0, - 0, - 15, - 15 - ], - rcommaaccentucircumflex: [ - 0, - 0, - 15, - 15 - ], - rcommaaccentudieresis: [ - 0, - 0, - 15, - 15 - ], - rcommaaccentugrave: [ - 0, - 0, - 15, - 15 - ], - rcommaaccentuhungarumlaut: [ - 0, - 0, - 15, - 15 - ], - rcommaaccentumacron: [ - 0, - 0, - 15, - 15 - ], - rcommaaccentuogonek: [ - 0, - 0, - 15, - 15 - ], - rcommaaccenturing: [ - 0, - 0, - 15, - 15 - ], - scomma: [ - 0, - 0, - -15, - -15 - ], - speriod: [ - 0, - 0, - -15, - -15 - ], - sacutecomma: [ - 0, - 0, - -15, - -15 - ], - sacuteperiod: [ - 0, - 0, - -15, - -15 - ], - scaroncomma: [ - 0, - 0, - -15, - -15 - ], - scaronperiod: [ - 0, - 0, - -15, - -15 - ], - scedillacomma: [ - 0, - 0, - -15, - -15 - ], - scedillaperiod: [ - 0, - 0, - -15, - -15 - ], - scommaaccentcomma: [ - 0, - 0, - -15, - -15 - ], - scommaaccentperiod: [ - 0, - 0, - -15, - -15 - ], - ve: [ - 0, - 0, - -25, - -25, - -10, - -15, - 0, - -15 - ], - veacute: [ - 0, - 0, - -25, - -25, - -10, - -15, - 0, - -15 - ], - vecaron: [ - 0, - 0, - -25, - -25, - -10, - -15, - 0, - -15 - ], - vecircumflex: [ - 0, - 0, - -25, - -25, - -10, - -15, - 0, - -15 - ], - vedieresis: [ - 0, - 0, - -25, - -25, - -10, - -15, - 0, - -15 - ], - vedotaccent: [ - 0, - 0, - -25, - -25, - -10, - -15, - 0, - -15 - ], - vegrave: [ - 0, - 0, - -25, - -25, - -10, - -15, - 0, - -15 - ], - vemacron: [ - 0, - 0, - -25, - -25, - -10, - -15, - 0, - -15 - ], - veogonek: [ - 0, - 0, - -25, - -25, - -10, - -15, - 0, - -15 - ], - wa: [ - 0, - 0, - -15, - -15, - 0, - -10, - 0, - -10 - ], - waacute: [ - 0, - 0, - -15, - -15, - 0, - -10, - 0, - -10 - ], - wabreve: [ - 0, - 0, - -15, - -15, - 0, - -10, - 0, - -10 - ], - wacircumflex: [ - 0, - 0, - -15, - -15, - 0, - -10, - 0, - -10 - ], - wadieresis: [ - 0, - 0, - -15, - -15, - 0, - -10, - 0, - -10 - ], - wagrave: [ - 0, - 0, - -15, - -15, - 0, - -10, - 0, - -10 - ], - wamacron: [ - 0, - 0, - -15, - -15, - 0, - -10, - 0, - -10 - ], - waogonek: [ - 0, - 0, - -15, - -15, - 0, - -10, - 0, - -10 - ], - waring: [ - 0, - 0, - -15, - -15, - 0, - -10, - 0, - -10 - ], - watilde: [ - 0, - 0, - -15, - -15, - 0, - -10, - 0, - -10 - ], - we: [ - 0, - 0, - -10, - -10, - 0, - -10 - ], - weacute: [ - 0, - 0, - -10, - -10, - 0, - -10 - ], - wecaron: [ - 0, - 0, - -10, - -10, - 0, - -10 - ], - wecircumflex: [ - 0, - 0, - -10, - -10, - 0, - -10 - ], - wedieresis: [ - 0, - 0, - -10, - -10, - 0, - -10 - ], - wedotaccent: [ - 0, - 0, - -10, - -10, - 0, - -10 - ], - wegrave: [ - 0, - 0, - -10, - -10, - 0, - -10 - ], - wemacron: [ - 0, - 0, - -10, - -10, - 0, - -10 - ], - weogonek: [ - 0, - 0, - -10, - -10, - 0, - -10 - ], - zo: [ - 0, - 0, - -15, - -15 - ], - zoacute: [ - 0, - 0, - -15, - -15 - ], - zocircumflex: [ - 0, - 0, - -15, - -15 - ], - zodieresis: [ - 0, - 0, - -15, - -15 - ], - zograve: [ - 0, - 0, - -15, - -15 - ], - zohungarumlaut: [ - 0, - 0, - -15, - -15 - ], - zomacron: [ - 0, - 0, - -15, - -15 - ], - zoslash: [ - 0, - 0, - -15, - -15 - ], - zotilde: [ - 0, - 0, - -15, - -15 - ], - zacuteo: [ - 0, - 0, - -15, - -15 - ], - zacuteoacute: [ - 0, - 0, - -15, - -15 - ], - zacuteocircumflex: [ - 0, - 0, - -15, - -15 - ], - zacuteodieresis: [ - 0, - 0, - -15, - -15 - ], - zacuteograve: [ - 0, - 0, - -15, - -15 - ], - zacuteohungarumlaut: [ - 0, - 0, - -15, - -15 - ], - zacuteomacron: [ - 0, - 0, - -15, - -15 - ], - zacuteoslash: [ - 0, - 0, - -15, - -15 - ], - zacuteotilde: [ - 0, - 0, - -15, - -15 - ], - zcarono: [ - 0, - 0, - -15, - -15 - ], - zcaronoacute: [ - 0, - 0, - -15, - -15 - ], - zcaronocircumflex: [ - 0, - 0, - -15, - -15 - ], - zcaronodieresis: [ - 0, - 0, - -15, - -15 - ], - zcaronograve: [ - 0, - 0, - -15, - -15 - ], - zcaronohungarumlaut: [ - 0, - 0, - -15, - -15 - ], - zcaronomacron: [ - 0, - 0, - -15, - -15 - ], - zcaronoslash: [ - 0, - 0, - -15, - -15 - ], - zcaronotilde: [ - 0, - 0, - -15, - -15 - ], - zdotaccento: [ - 0, - 0, - -15, - -15 - ], - zdotaccentoacute: [ - 0, - 0, - -15, - -15 - ], - zdotaccentocircumflex: [ - 0, - 0, - -15, - -15 - ], - zdotaccentodieresis: [ - 0, - 0, - -15, - -15 - ], - zdotaccentograve: [ - 0, - 0, - -15, - -15 - ], - zdotaccentohungarumlaut: [ - 0, - 0, - -15, - -15 - ], - zdotaccentomacron: [ - 0, - 0, - -15, - -15 - ], - zdotaccentoslash: [ - 0, - 0, - -15, - -15 - ], - zdotaccentotilde: [ - 0, - 0, - -15, - -15 - ], - Ap: [ - 0, - 0, - 0, - 0, - -25 - ], - Aquoteright: [ - 0, - 0, - 0, - 0, - -74, - -74, - -37, - -111 - ], - Aacutep: [ - 0, - 0, - 0, - 0, - -25 - ], - Aacutequoteright: [ - 0, - 0, - 0, - 0, - -74, - -74, - -37, - -111 - ], - Abrevep: [ - 0, - 0, - 0, - 0, - -25 - ], - Abrevequoteright: [ - 0, - 0, - 0, - 0, - -74, - -74, - -37, - -111 - ], - Acircumflexp: [ - 0, - 0, - 0, - 0, - -25 - ], - Acircumflexquoteright: [ - 0, - 0, - 0, - 0, - -74, - -74, - -37, - -111 - ], - Adieresisp: [ - 0, - 0, - 0, - 0, - -25 - ], - Adieresisquoteright: [ - 0, - 0, - 0, - 0, - -74, - -74, - -37, - -111 - ], - Agravep: [ - 0, - 0, - 0, - 0, - -25 - ], - Agravequoteright: [ - 0, - 0, - 0, - 0, - -74, - -74, - -37, - -111 - ], - Amacronp: [ - 0, - 0, - 0, - 0, - -25 - ], - Amacronquoteright: [ - 0, - 0, - 0, - 0, - -74, - -74, - -37, - -111 - ], - Aogonekp: [ - 0, - 0, - 0, - 0, - -25 - ], - Aogonekquoteright: [ - 0, - 0, - 0, - 0, - -74, - -74, - -37, - -111 - ], - Aringp: [ - 0, - 0, - 0, - 0, - -25 - ], - Aringquoteright: [ - 0, - 0, - 0, - 0, - -74, - -74, - -37, - -111 - ], - Atildep: [ - 0, - 0, - 0, - 0, - -25 - ], - Atildequoteright: [ - 0, - 0, - 0, - 0, - -74, - -74, - -37, - -111 - ], - Je: [ - 0, - 0, - 0, - 0, - -15, - -40, - -25 - ], - Jeacute: [ - 0, - 0, - 0, - 0, - -15, - -40, - -25 - ], - Jecaron: [ - 0, - 0, - 0, - 0, - -15, - -40, - -25 - ], - Jecircumflex: [ - 0, - 0, - 0, - 0, - -15, - -40, - -25 - ], - Jedieresis: [ - 0, - 0, - 0, - 0, - -15, - -40, - -25 - ], - Jedotaccent: [ - 0, - 0, - 0, - 0, - -15, - -40, - -25 - ], - Jegrave: [ - 0, - 0, - 0, - 0, - -15, - -40, - -25 - ], - Jemacron: [ - 0, - 0, - 0, - 0, - -15, - -40, - -25 - ], - Jeogonek: [ - 0, - 0, - 0, - 0, - -15, - -40, - -25 - ], - Jo: [ - 0, - 0, - 0, - 0, - -15, - -40, - -25 - ], - Joacute: [ - 0, - 0, - 0, - 0, - -15, - -40, - -25 - ], - Jocircumflex: [ - 0, - 0, - 0, - 0, - -15, - -40, - -25 - ], - Jodieresis: [ - 0, - 0, - 0, - 0, - -15, - -40, - -25 - ], - Jograve: [ - 0, - 0, - 0, - 0, - -15, - -40, - -25 - ], - Johungarumlaut: [ - 0, - 0, - 0, - 0, - -15, - -40, - -25 - ], - Jomacron: [ - 0, - 0, - 0, - 0, - -15, - -40, - -25 - ], - Joslash: [ - 0, - 0, - 0, - 0, - -15, - -40, - -25 - ], - Jotilde: [ - 0, - 0, - 0, - 0, - -15, - -40, - -25 - ], - NA: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NAacute: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NAbreve: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NAcircumflex: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NAdieresis: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NAgrave: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NAmacron: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NAogonek: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NAring: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NAtilde: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NacuteA: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NacuteAacute: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NacuteAbreve: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NacuteAcircumflex: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NacuteAdieresis: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NacuteAgrave: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NacuteAmacron: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NacuteAogonek: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NacuteAring: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NacuteAtilde: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NcaronA: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NcaronAacute: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NcaronAbreve: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NcaronAcircumflex: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NcaronAdieresis: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NcaronAgrave: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NcaronAmacron: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NcaronAogonek: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NcaronAring: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NcaronAtilde: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NcommaaccentA: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NcommaaccentAacute: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NcommaaccentAbreve: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NcommaaccentAcircumflex: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NcommaaccentAdieresis: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NcommaaccentAgrave: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NcommaaccentAmacron: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NcommaaccentAogonek: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NcommaaccentAring: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NcommaaccentAtilde: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NtildeA: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NtildeAacute: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NtildeAbreve: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NtildeAcircumflex: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NtildeAdieresis: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NtildeAgrave: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NtildeAmacron: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NtildeAogonek: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NtildeAring: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - NtildeAtilde: [ - 0, - 0, - 0, - 0, - -20, - -30, - -27, - -35 - ], - Ti: [ - 0, - 0, - 0, - 0, - -18, - -37, - -55, - -35 - ], - Tiacute: [ - 0, - 0, - 0, - 0, - -18, - -37, - -55, - -35 - ], - Tiogonek: [ - 0, - 0, - 0, - 0, - -18, - -37, - -55, - -35 - ], - Tcaroni: [ - 0, - 0, - 0, - 0, - -18, - -37, - -55, - -35 - ], - Tcaroniacute: [ - 0, - 0, - 0, - 0, - -18, - -37, - -55, - -35 - ], - Tcaroniogonek: [ - 0, - 0, - 0, - 0, - -18, - -37, - -55, - -35 - ], - Tcommaaccenti: [ - 0, - 0, - 0, - 0, - -18, - -37, - -55, - -35 - ], - Tcommaaccentiacute: [ - 0, - 0, - 0, - 0, - -18, - -37, - -55, - -35 - ], - Tcommaaccentiogonek: [ - 0, - 0, - 0, - 0, - -18, - -37, - -55, - -35 - ], - Vi: [ - 0, - 0, - 0, - 0, - -37, - -55, - -74, - -60 - ], - Viacute: [ - 0, - 0, - 0, - 0, - -37, - -55, - -74, - -60 - ], - Vicircumflex: [ - 0, - 0, - 0, - 0, - -37, - 0, - -34, - -20 - ], - Vidieresis: [ - 0, - 0, - 0, - 0, - -37, - 0, - -34, - -20 - ], - Vigrave: [ - 0, - 0, - 0, - 0, - -37, - 0, - -34, - -20 - ], - Vimacron: [ - 0, - 0, - 0, - 0, - -37, - 0, - -34, - -20 - ], - Viogonek: [ - 0, - 0, - 0, - 0, - -37, - -55, - -74, - -60 - ], - Wi: [ - 0, - 0, - 0, - 0, - -18, - -37, - -55, - -40 - ], - Wiacute: [ - 0, - 0, - 0, - 0, - -18, - -37, - -55, - -40 - ], - Wiogonek: [ - 0, - 0, - 0, - 0, - -18, - -37, - -55, - -40 - ], - fi: [ - 0, - 0, - 0, - 0, - -25, - 0, - -20, - -20 - ], - gperiod: [ - 0, - 0, - 0, - 0, - -15, - 0, - -15 - ], - gbreveperiod: [ - 0, - 0, - 0, - 0, - -15, - 0, - -15 - ], - gcommaaccentperiod: [ - 0, - 0, - 0, - 0, - -15, - 0, - -15 - ], - iv: [ - 0, - 0, - 0, - 0, - -10, - 0, - 0, - -25 - ], - iacutev: [ - 0, - 0, - 0, - 0, - -10, - 0, - 0, - -25 - ], - icircumflexv: [ - 0, - 0, - 0, - 0, - -10, - 0, - 0, - -25 - ], - idieresisv: [ - 0, - 0, - 0, - 0, - -10, - 0, - 0, - -25 - ], - igravev: [ - 0, - 0, - 0, - 0, - -10, - 0, - 0, - -25 - ], - imacronv: [ - 0, - 0, - 0, - 0, - -10, - 0, - 0, - -25 - ], - iogonekv: [ - 0, - 0, - 0, - 0, - -10, - 0, - 0, - -25 - ], - ky: [ - 0, - 0, - 0, - 0, - -15, - 0, - -10, - -15 - ], - kyacute: [ - 0, - 0, - 0, - 0, - -15, - 0, - -10, - -15 - ], - kydieresis: [ - 0, - 0, - 0, - 0, - -15, - 0, - -10, - -15 - ], - kcommaaccenty: [ - 0, - 0, - 0, - 0, - -15, - 0, - -10, - -15 - ], - kcommaaccentyacute: [ - 0, - 0, - 0, - 0, - -15, - 0, - -10, - -15 - ], - kcommaaccentydieresis: [ - 0, - 0, - 0, - 0, - -15, - 0, - -10, - -15 - ], - quotedblleftA: [ - 0, - 0, - 0, - 0, - -10, - 0, - 0, - -80 - ], - quotedblleftAacute: [ - 0, - 0, - 0, - 0, - -10, - 0, - 0, - -80 - ], - quotedblleftAbreve: [ - 0, - 0, - 0, - 0, - -10, - 0, - 0, - -80 - ], - quotedblleftAcircumflex: [ - 0, - 0, - 0, - 0, - -10, - 0, - 0, - -80 - ], - quotedblleftAdieresis: [ - 0, - 0, - 0, - 0, - -10, - 0, - 0, - -80 - ], - quotedblleftAgrave: [ - 0, - 0, - 0, - 0, - -10, - 0, - 0, - -80 - ], - quotedblleftAmacron: [ - 0, - 0, - 0, - 0, - -10, - 0, - 0, - -80 - ], - quotedblleftAogonek: [ - 0, - 0, - 0, - 0, - -10, - 0, - 0, - -80 - ], - quotedblleftAring: [ - 0, - 0, - 0, - 0, - -10, - 0, - 0, - -80 - ], - quotedblleftAtilde: [ - 0, - 0, - 0, - 0, - -10, - 0, - 0, - -80 - ], - quoteleftA: [ - 0, - 0, - 0, - 0, - -10, - 0, - 0, - -80 - ], - quoteleftAacute: [ - 0, - 0, - 0, - 0, - -10, - 0, - 0, - -80 - ], - quoteleftAbreve: [ - 0, - 0, - 0, - 0, - -10, - 0, - 0, - -80 - ], - quoteleftAcircumflex: [ - 0, - 0, - 0, - 0, - -10, - 0, - 0, - -80 - ], - quoteleftAdieresis: [ - 0, - 0, - 0, - 0, - -10, - 0, - 0, - -80 - ], - quoteleftAgrave: [ - 0, - 0, - 0, - 0, - -10, - 0, - 0, - -80 - ], - quoteleftAmacron: [ - 0, - 0, - 0, - 0, - -10, - 0, - 0, - -80 - ], - quoteleftAogonek: [ - 0, - 0, - 0, - 0, - -10, - 0, - 0, - -80 - ], - quoteleftAring: [ - 0, - 0, - 0, - 0, - -10, - 0, - 0, - -80 - ], - quoteleftAtilde: [ - 0, - 0, - 0, - 0, - -10, - 0, - 0, - -80 - ], - re: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - reacute: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - recaron: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - recircumflex: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - redieresis: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - redotaccent: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - regrave: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - remacron: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - reogonek: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - racutee: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - racuteeacute: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - racuteecaron: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - racuteecircumflex: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - racuteedieresis: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - racuteedotaccent: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - racuteegrave: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - racuteemacron: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - racuteeogonek: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - rcarone: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - rcaroneacute: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - rcaronecaron: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - rcaronecircumflex: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - rcaronedieresis: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - rcaronedotaccent: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - rcaronegrave: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - rcaronemacron: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - rcaroneogonek: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - rcommaaccente: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - rcommaaccenteacute: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - rcommaaccentecaron: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - rcommaaccentecircumflex: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - rcommaaccentedieresis: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - rcommaaccentedotaccent: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - rcommaaccentegrave: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - rcommaaccentemacron: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - rcommaaccenteogonek: [ - 0, - 0, - 0, - 0, - -18, - 0, - -37 - ], - spaceA: [ - 0, - 0, - 0, - 0, - -55, - -37, - -18, - -55 - ], - spaceAacute: [ - 0, - 0, - 0, - 0, - -55, - -37, - -18, - -55 - ], - spaceAbreve: [ - 0, - 0, - 0, - 0, - -55, - -37, - -18, - -55 - ], - spaceAcircumflex: [ - 0, - 0, - 0, - 0, - -55, - -37, - -18, - -55 - ], - spaceAdieresis: [ - 0, - 0, - 0, - 0, - -55, - -37, - -18, - -55 - ], - spaceAgrave: [ - 0, - 0, - 0, - 0, - -55, - -37, - -18, - -55 - ], - spaceAmacron: [ - 0, - 0, - 0, - 0, - -55, - -37, - -18, - -55 - ], - spaceAogonek: [ - 0, - 0, - 0, - 0, - -55, - -37, - -18, - -55 - ], - spaceAring: [ - 0, - 0, - 0, - 0, - -55, - -37, - -18, - -55 - ], - spaceAtilde: [ - 0, - 0, - 0, - 0, - -55, - -37, - -18, - -55 - ], - Fi: [ - 0, - 0, - 0, - 0, - 0, - -40, - -45 - ], - Fiacute: [ - 0, - 0, - 0, - 0, - 0, - -40, - -45 - ], - Ficircumflex: [ - 0, - 0, - 0, - 0, - 0, - -40, - -45 - ], - Fidieresis: [ - 0, - 0, - 0, - 0, - 0, - -40, - -45 - ], - Figrave: [ - 0, - 0, - 0, - 0, - 0, - -40, - -45 - ], - Fimacron: [ - 0, - 0, - 0, - 0, - 0, - -40, - -45 - ], - Fiogonek: [ - 0, - 0, - 0, - 0, - 0, - -40, - -45 - ], - eb: [ - 0, - 0, - 0, - 0, - 0, - -10 - ], - eacuteb: [ - 0, - 0, - 0, - 0, - 0, - -10 - ], - ecaronb: [ - 0, - 0, - 0, - 0, - 0, - -10 - ], - ecircumflexb: [ - 0, - 0, - 0, - 0, - 0, - -10 - ], - edieresisb: [ - 0, - 0, - 0, - 0, - 0, - -10 - ], - edotaccentb: [ - 0, - 0, - 0, - 0, - 0, - -10 - ], - egraveb: [ - 0, - 0, - 0, - 0, - 0, - -10 - ], - emacronb: [ - 0, - 0, - 0, - 0, - 0, - -10 - ], - eogonekb: [ - 0, - 0, - 0, - 0, - 0, - -10 - ], - ff: [ - 0, - 0, - 0, - 0, - 0, - -18, - -18, - -25 - ], - quoterightt: [ - 0, - 0, - 0, - 0, - 0, - -37, - -30, - -18 - ], - quoterighttcommaaccent: [ - 0, - 0, - 0, - 0, - 0, - -37, - -30, - -18 - ], - Yicircumflex: [ - 0, - 0, - 0, - 0, - 0, - 0, - -34 - ], - Yidieresis: [ - 0, - 0, - 0, - 0, - 0, - 0, - -34 - ], - Yigrave: [ - 0, - 0, - 0, - 0, - 0, - 0, - -34 - ], - Yimacron: [ - 0, - 0, - 0, - 0, - 0, - 0, - -34 - ], - Yacuteicircumflex: [ - 0, - 0, - 0, - 0, - 0, - 0, - -34 - ], - Yacuteidieresis: [ - 0, - 0, - 0, - 0, - 0, - 0, - -34 - ], - Yacuteigrave: [ - 0, - 0, - 0, - 0, - 0, - 0, - -34 - ], - Yacuteimacron: [ - 0, - 0, - 0, - 0, - 0, - 0, - -34 - ], - Ydieresisicircumflex: [ - 0, - 0, - 0, - 0, - 0, - 0, - -34 - ], - Ydieresisidieresis: [ - 0, - 0, - 0, - 0, - 0, - 0, - -34 - ], - Ydieresisigrave: [ - 0, - 0, - 0, - 0, - 0, - 0, - -34 - ], - Ydieresisimacron: [ - 0, - 0, - 0, - 0, - 0, - 0, - -34 - ], - eg: [ - 0, - 0, - 0, - 0, - 0, - 0, - -40, - -15 - ], - egbreve: [ - 0, - 0, - 0, - 0, - 0, - 0, - -40, - -15 - ], - egcommaaccent: [ - 0, - 0, - 0, - 0, - 0, - 0, - -40, - -15 - ], - eacuteg: [ - 0, - 0, - 0, - 0, - 0, - 0, - -40, - -15 - ], - eacutegbreve: [ - 0, - 0, - 0, - 0, - 0, - 0, - -40, - -15 - ], - eacutegcommaaccent: [ - 0, - 0, - 0, - 0, - 0, - 0, - -40, - -15 - ], - ecarong: [ - 0, - 0, - 0, - 0, - 0, - 0, - -40, - -15 - ], - ecarongbreve: [ - 0, - 0, - 0, - 0, - 0, - 0, - -40, - -15 - ], - ecarongcommaaccent: [ - 0, - 0, - 0, - 0, - 0, - 0, - -40, - -15 - ], - ecircumflexg: [ - 0, - 0, - 0, - 0, - 0, - 0, - -40, - -15 - ], - ecircumflexgbreve: [ - 0, - 0, - 0, - 0, - 0, - 0, - -40, - -15 - ], - ecircumflexgcommaaccent: [ - 0, - 0, - 0, - 0, - 0, - 0, - -40, - -15 - ], - edieresisg: [ - 0, - 0, - 0, - 0, - 0, - 0, - -40, - -15 - ], - edieresisgbreve: [ - 0, - 0, - 0, - 0, - 0, - 0, - -40, - -15 - ], - edieresisgcommaaccent: [ - 0, - 0, - 0, - 0, - 0, - 0, - -40, - -15 - ], - edotaccentg: [ - 0, - 0, - 0, - 0, - 0, - 0, - -40, - -15 - ], - edotaccentgbreve: [ - 0, - 0, - 0, - 0, - 0, - 0, - -40, - -15 - ], - edotaccentgcommaaccent: [ - 0, - 0, - 0, - 0, - 0, - 0, - -40, - -15 - ], - egraveg: [ - 0, - 0, - 0, - 0, - 0, - 0, - -40, - -15 - ], - egravegbreve: [ - 0, - 0, - 0, - 0, - 0, - 0, - -40, - -15 - ], - egravegcommaaccent: [ - 0, - 0, - 0, - 0, - 0, - 0, - -40, - -15 - ], - emacrong: [ - 0, - 0, - 0, - 0, - 0, - 0, - -40, - -15 - ], - emacrongbreve: [ - 0, - 0, - 0, - 0, - 0, - 0, - -40, - -15 - ], - emacrongcommaaccent: [ - 0, - 0, - 0, - 0, - 0, - 0, - -40, - -15 - ], - eogonekg: [ - 0, - 0, - 0, - 0, - 0, - 0, - -40, - -15 - ], - eogonekgbreve: [ - 0, - 0, - 0, - 0, - 0, - 0, - -40, - -15 - ], - eogonekgcommaaccent: [ - 0, - 0, - 0, - 0, - 0, - 0, - -40, - -15 - ], - fiogonek: [ - 0, - 0, - 0, - 0, - 0, - 0, - -20 - ], - gcomma: [ - 0, - 0, - 0, - 0, - 0, - 0, - -10 - ], - gbrevecomma: [ - 0, - 0, - 0, - 0, - 0, - 0, - -10 - ], - gcommaaccentcomma: [ - 0, - 0, - 0, - 0, - 0, - 0, - -10 - ], - og: [ - 0, - 0, - 0, - 0, - 0, - 0, - -10 - ], - ogbreve: [ - 0, - 0, - 0, - 0, - 0, - 0, - -10 - ], - ogcommaaccent: [ - 0, - 0, - 0, - 0, - 0, - 0, - -10 - ], - oacuteg: [ - 0, - 0, - 0, - 0, - 0, - 0, - -10 - ], - oacutegbreve: [ - 0, - 0, - 0, - 0, - 0, - 0, - -10 - ], - oacutegcommaaccent: [ - 0, - 0, - 0, - 0, - 0, - 0, - -10 - ], - ocircumflexg: [ - 0, - 0, - 0, - 0, - 0, - 0, - -10 - ], - ocircumflexgbreve: [ - 0, - 0, - 0, - 0, - 0, - 0, - -10 - ], - ocircumflexgcommaaccent: [ - 0, - 0, - 0, - 0, - 0, - 0, - -10 - ], - odieresisg: [ - 0, - 0, - 0, - 0, - 0, - 0, - -10 - ], - odieresisgbreve: [ - 0, - 0, - 0, - 0, - 0, - 0, - -10 - ], - odieresisgcommaaccent: [ - 0, - 0, - 0, - 0, - 0, - 0, - -10 - ], - ograveg: [ - 0, - 0, - 0, - 0, - 0, - 0, - -10 - ], - ogravegbreve: [ - 0, - 0, - 0, - 0, - 0, - 0, - -10 - ], - ogravegcommaaccent: [ - 0, - 0, - 0, - 0, - 0, - 0, - -10 - ], - ohungarumlautg: [ - 0, - 0, - 0, - 0, - 0, - 0, - -10 - ], - ohungarumlautgbreve: [ - 0, - 0, - 0, - 0, - 0, - 0, - -10 - ], - ohungarumlautgcommaaccent: [ - 0, - 0, - 0, - 0, - 0, - 0, - -10 - ], - omacrong: [ - 0, - 0, - 0, - 0, - 0, - 0, - -10 - ], - omacrongbreve: [ - 0, - 0, - 0, - 0, - 0, - 0, - -10 - ], - omacrongcommaaccent: [ - 0, - 0, - 0, - 0, - 0, - 0, - -10 - ], - otildeg: [ - 0, - 0, - 0, - 0, - 0, - 0, - -10 - ], - otildegbreve: [ - 0, - 0, - 0, - 0, - 0, - 0, - -10 - ], - otildegcommaaccent: [ - 0, - 0, - 0, - 0, - 0, - 0, - -10 - ], - fiacute: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -20 - ], - ga: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ], - gaacute: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ], - gabreve: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ], - gacircumflex: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ], - gadieresis: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ], - gagrave: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ], - gamacron: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ], - gaogonek: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ], - garing: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ], - gatilde: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ], - gbrevea: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ], - gbreveaacute: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ], - gbreveabreve: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ], - gbreveacircumflex: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ], - gbreveadieresis: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ], - gbreveagrave: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ], - gbreveamacron: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ], - gbreveaogonek: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ], - gbrevearing: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ], - gbreveatilde: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ], - gcommaaccenta: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ], - gcommaaccentaacute: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ], - gcommaaccentabreve: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ], - gcommaaccentacircumflex: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ], - gcommaaccentadieresis: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ], - gcommaaccentagrave: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ], - gcommaaccentamacron: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ], - gcommaaccentaogonek: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ], - gcommaaccentaring: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ], - gcommaaccentatilde: [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -5 - ] -}; -var data = { - attributes: attributes, - glyphWidths: glyphWidths, - kernPairs: kernPairs -}; - -const initFont = font => { - return [font.FontName, { - attributes: font, - glyphWidths: {}, - kernPairs: {} - }]; -}; -const expandData = data => { - const { - attributes, - glyphWidths, - kernPairs - } = data; - const fonts = attributes.map(initFont); - Object.keys(glyphWidths).forEach(key => { - glyphWidths[key].forEach((value, index) => { - if (value) fonts[index][1].glyphWidths[key] = value; - }); - }); - Object.keys(kernPairs).forEach(key => { - kernPairs[key].forEach((value, index) => { - if (value) fonts[index][1].kernPairs[key] = value; - }); - }); - return Object.fromEntries(fonts); -}; - -const STANDARD_FONTS = expandData(data); -const createStandardFont = PDFFont => class StandardFont extends PDFFont { - constructor(document, name, id) { - super(); - this.document = document; - this.name = name; - this.id = id; - this.font = AFMFont.fromJson(STANDARD_FONTS[this.name]); - this.ascender = this.font.ascender; - this.descender = this.font.descender; - this.bbox = this.font.bbox; - this.lineGap = this.font.lineGap; - } - embed() { - this.dictionary.data = { - Type: 'Font', - BaseFont: this.name, - Subtype: 'Type1', - Encoding: 'WinAnsiEncoding' - }; - return this.dictionary.end(); - } - encode(text) { - const encoded = this.font.encodeText(text); - const glyphs = this.font.glyphsForString(`${text}`); - const advances = this.font.advancesForGlyphs(glyphs); - const positions = []; - for (let i = 0; i < glyphs.length; i++) { - const glyph = glyphs[i]; - positions.push({ - xAdvance: advances[i], - yAdvance: 0, - xOffset: 0, - yOffset: 0, - advanceWidth: this.font.widthOfGlyph(glyph) - }); - } - return [encoded, positions]; - } - widthOfString(string, size) { - const glyphs = this.font.glyphsForString(`${string}`); - const advances = this.font.advancesForGlyphs(glyphs); - let width = 0; - for (let advance of Array.from(advances)) { - width += advance; - } - const scale = size / 1000; - return width * scale; - } - static isStandardFont(name) { - return name in STANDARD_FONTS; - } -}; - -const toHex = function () { - for (var _len = arguments.length, codePoints = new Array(_len), _key = 0; _key < _len; _key++) { - codePoints[_key] = arguments[_key]; - } - const codes = Array.from(codePoints).map(code => `0000${code.toString(16)}`.slice(-4)); - return codes.join(''); -}; -const createEmbeddedFont = PDFFont => class EmbeddedFont extends PDFFont { - constructor(document, font, id) { - super(); - this.document = document; - this.font = font; - this.id = id; - this.subset = this.font.createSubset(); - this.unicode = [[0]]; - this.widths = [this.font.getGlyph(0).advanceWidth]; - this.name = this.font.postscriptName; - this.scale = 1000 / this.font.unitsPerEm; - this.ascender = this.font.ascent * this.scale; - this.descender = this.font.descent * this.scale; - this.xHeight = this.font.xHeight * this.scale; - this.capHeight = this.font.capHeight * this.scale; - this.lineGap = this.font.lineGap * this.scale; - this.bbox = this.font.bbox; - this.layoutCache = Object.create(null); - } - layoutRun(text, features) { - // passing LTR To force fontkit to not reverse the string - const run = this.font.layout(text, features, undefined, undefined, 'ltr'); - - // Normalize position values - for (let i = 0; i < run.positions.length; i++) { - const position = run.positions[i]; - for (let key in position) { - position[key] *= this.scale; - } - position.advanceWidth = run.glyphs[i].advanceWidth * this.scale; - } - return run; - } - layoutCached(text) { - let cached; - if (cached = this.layoutCache[text]) { - return cached; - } - const run = this.layoutRun(text); - this.layoutCache[text] = run; - return run; - } - layout(text, features, onlyWidth) { - // Skip the cache if any user defined features are applied - if (onlyWidth == null) { - onlyWidth = false; - } - if (features) { - return this.layoutRun(text, features); - } - const glyphs = onlyWidth ? null : []; - const positions = onlyWidth ? null : []; - let advanceWidth = 0; - - // Split the string by words to increase cache efficiency. - // For this purpose, spaces and tabs are a good enough delimeter. - let last = 0; - let index = 0; - while (index <= text.length) { - let needle; - if (index === text.length && last < index || (needle = text.charAt(index), [' ', '\t'].includes(needle))) { - const run = this.layoutCached(text.slice(last, ++index)); - if (!onlyWidth) { - glyphs.push(...Array.from(run.glyphs || [])); - positions.push(...Array.from(run.positions || [])); - } - advanceWidth += run.advanceWidth; - last = index; - } else { - index++; - } - } - return { - glyphs, - positions, - advanceWidth - }; - } - encode(text, features) { - const { - glyphs, - positions - } = this.layout(text, features); - const res = []; - for (let i = 0; i < glyphs.length; i++) { - const glyph = glyphs[i]; - const gid = this.subset.includeGlyph(glyph.id); - res.push(`0000${gid.toString(16)}`.slice(-4)); - if (this.widths[gid] == null) { - this.widths[gid] = glyph.advanceWidth * this.scale; - } - if (this.unicode[gid] == null) { - this.unicode[gid] = glyph.codePoints; - } - } - return [res, positions]; - } - widthOfString(string, size, features) { - const width = this.layout(string, features, true).advanceWidth; - const scale = size / 1000; - return width * scale; - } - embed() { - const isCFF = this.subset.cff != null; - const fontFile = this.document.ref(); - if (isCFF) { - fontFile.data.Subtype = 'CIDFontType0C'; - } - fontFile.end(this.subset.encode()); - const familyClass = ((this.font['OS/2'] != null ? this.font['OS/2'].sFamilyClass : undefined) || 0) >> 8; - let flags = 0; - if (this.font.post.isFixedPitch) { - flags |= 1 << 0; - } - if (1 <= familyClass && familyClass <= 7) { - flags |= 1 << 1; - } - flags |= 1 << 2; // assume the font uses non-latin characters - if (familyClass === 10) { - flags |= 1 << 3; - } - if (this.font.head.macStyle.italic) { - flags |= 1 << 6; - } - - // generate a random tag (6 uppercase letters. 65 is the char code for 'A') - const tag = [0, 1, 2, 3, 4, 5].map(() => String.fromCharCode(Math.random() * 26 + 65)).join(''); - const name = tag + '+' + this.font.postscriptName; - const { - bbox - } = this.font; - const descriptor = this.document.ref({ - Type: 'FontDescriptor', - FontName: name, - Flags: flags, - FontBBox: [bbox.minX * this.scale, bbox.minY * this.scale, bbox.maxX * this.scale, bbox.maxY * this.scale], - ItalicAngle: this.font.italicAngle, - Ascent: this.ascender, - Descent: this.descender, - CapHeight: (this.font.capHeight || this.font.ascent) * this.scale, - XHeight: (this.font.xHeight || 0) * this.scale, - StemV: 0 - }); // not sure how to calculate this - - if (isCFF) { - descriptor.data.FontFile3 = fontFile; - } else { - descriptor.data.FontFile2 = fontFile; - } - descriptor.end(); - const descendantFontData = { - Type: 'Font', - Subtype: 'CIDFontType0', - BaseFont: name, - CIDSystemInfo: { - Registry: new String('Adobe'), - Ordering: new String('Identity'), - Supplement: 0 - }, - FontDescriptor: descriptor, - W: [0, this.widths] - }; - if (!isCFF) { - descendantFontData.Subtype = 'CIDFontType2'; - descendantFontData.CIDToGIDMap = 'Identity'; - } - const descendantFont = this.document.ref(descendantFontData); - descendantFont.end(); - this.dictionary.data = { - Type: 'Font', - Subtype: 'Type0', - BaseFont: name, - Encoding: 'Identity-H', - DescendantFonts: [descendantFont], - ToUnicode: this.toUnicodeCmap() - }; - return this.dictionary.end(); - } - - // Maps the glyph ids encoded in the PDF back to unicode strings - // Because of ligature substitutions and the like, there may be one or more - // unicode characters represented by each glyph. - toUnicodeCmap() { - const cmap = this.document.ref(); - let entries = []; - let unicodeMap = '/CIDInit /ProcSet findresource begin\n12 dict begin\nbegincmap\n/CIDSystemInfo <<\n /Registry (Adobe)\n /Ordering (UCS)\n /Supplement 0\n>> def\n/CMapName /Adobe-Identity-UCS def\n/CMapType 2 def\n1 begincodespacerange\n<0000>\nendcodespacerange'; - for (let [index, codePoints] of this.unicode.entries()) { - const encoded = []; - if (entries.length >= 100) { - unicodeMap += '\n' + entries.length + ' beginbfchar\n' + entries.join('\n') + '\nendbfchar'; - entries = []; - } - // encode codePoints to utf16 - for (let value of codePoints) { - if (value > 0xffff) { - value -= 0x10000; - encoded.push(toHex(value >>> 10 & 0x3ff | 0xd800)); - value = 0xdc00 | value & 0x3ff; - } - encoded.push(toHex(value)); - } - entries.push('<' + toHex(index) + '>' + '<' + encoded.join(' ') + '>'); - } - if (entries.length) { - unicodeMap += '\n' + entries.length + ' beginbfchar\n' + entries.join('\n') + '\nendbfchar\n'; - } - unicodeMap += 'endcmap\nCMapName currentdict /CMap defineresource pop\nend\nend'; - cmap.end(unicodeMap); - return cmap; - } -}; - -class PDFFont { - static open(document, src, family, id) { - let font; - if (typeof src === 'string') { - if (StandardFont.isStandardFont(src)) { - return new StandardFont(document, src, id); - } - { - font = fontkit.openSync(src, family); - } - } else if (src instanceof Uint8Array) { - font = fontkit.create(src, family); - } else if (src instanceof ArrayBuffer) { - font = fontkit.create(new Uint8Array(src), family); - } else if (typeof src === 'object') { - font = src; - } - if (font == null) { - throw new Error('Not a supported font format or standard PDF font.'); - } - return new EmbeddedFont(document, font, id); - } - encode() { - throw new Error('Must be implemented by subclasses'); - } - widthOfString() { - throw new Error('Must be implemented by subclasses'); - } - ref() { - return this.dictionary != null ? this.dictionary : this.dictionary = this.document.ref(); - } - finalize() { - if (this.embedded || this.dictionary == null) { - return; - } - this.embed(); - return this.embedded = true; - } - embed() { - throw new Error('Must be implemented by subclasses'); - } - lineHeight(size, includeGap) { - if (includeGap == null) { - includeGap = false; - } - const gap = includeGap ? this.lineGap : 0; - return (this.ascender + gap - this.descender) / 1000 * size; - } -} -const StandardFont = createStandardFont(PDFFont); -const EmbeddedFont = createEmbeddedFont(PDFFont); - -var FontsMixin = { - initFonts() { - // Lookup table for embedded fonts - this._fontFamilies = {}; - this._fontCount = 0; - - // Font state - this._fontSize = 12; - this._font = null; - this._registeredFonts = {}; - - // Set the default font - return this.font('Helvetica'); - }, - font(src, family, size) { - let cacheKey; - let font; - if (typeof family === 'number') { - size = family; - family = null; - } - - // check registered fonts if src is a string - if (typeof src === 'string' && this._registeredFonts[src]) { - cacheKey = src; - ({ - src, - family - } = this._registeredFonts[src]); - } else { - cacheKey = family || src; - if (typeof cacheKey !== 'string') { - cacheKey = null; - } - } - if (size != null) { - this.fontSize(size); - } - - // fast path: check if the font is already in the PDF - if (font = this._fontFamilies[cacheKey]) { - this._font = font; - return this; - } - - // load the font - const id = `F${++this._fontCount}`; - this._font = PDFFont.open(this, src, family, id); - - // check for existing font familes with the same name already in the PDF - // useful if the font was passed as a buffer - if (font = this._fontFamilies[this._font.name]) { - this._font = font; - return this; - } - - // save the font for reuse later - if (cacheKey) { - this._fontFamilies[cacheKey] = this._font; - } - if (this._font.name) { - this._fontFamilies[this._font.name] = this._font; - } - return this; - }, - fontSize(_fontSize) { - this._fontSize = _fontSize; - return this; - }, - currentLineHeight(includeGap) { - if (includeGap == null) { - includeGap = false; - } - return this._font.lineHeight(this._fontSize, includeGap); - }, - registerFont(name, src, family) { - this._registeredFonts[name] = { - src, - family - }; - return this; - } -}; - -function PDFNumber(n) { - // PDF numbers are strictly 32bit - // so convert this number to the nearest 32bit number - // @see ISO 32000-1 Annex C.2 (real numbers) - return Math.fround(n); -} - -const SOFT_HYPHEN = '\u00AD'; -const HYPHEN = '-'; -class LineWrapper extends EventEmitter { - constructor(document, options) { - super(); - this.document = document; - this.horizontalScaling = options.horizontalScaling || 100; - this.indent = (options.indent || 0) * this.horizontalScaling / 100; - this.characterSpacing = (options.characterSpacing || 0) * this.horizontalScaling / 100; - this.wordSpacing = (options.wordSpacing === 0) * this.horizontalScaling / 100; - this.columns = options.columns || 1; - this.columnGap = (options.columnGap != null ? options.columnGap : 18) * this.horizontalScaling / 100; // 1/4 inch - this.lineWidth = (options.width * this.horizontalScaling / 100 - this.columnGap * (this.columns - 1)) / this.columns; - this.spaceLeft = this.lineWidth; - this.startX = this.document.x; - this.startY = this.document.y; - this.column = 1; - this.ellipsis = options.ellipsis; - this.continuedX = 0; - this.features = options.features; - - // calculate the maximum Y position the text can appear at - if (options.height != null) { - this.height = options.height; - this.maxY = PDFNumber(this.startY + options.height); - } else { - this.maxY = PDFNumber(this.document.page.maxY()); - } - - // handle paragraph indents - this.on('firstLine', options => { - // if this is the first line of the text segment, and - // we're continuing where we left off, indent that much - // otherwise use the user specified indent option - const indent = this.continuedX || this.indent; - this.document.x += indent; - this.lineWidth -= indent; - - // if indentAllLines is set to true - // we're not resetting the indentation for this paragraph after the first line - if (options.indentAllLines) { - return; - } - - // otherwise we start the next line without indent - return this.once('line', () => { - this.document.x -= indent; - this.lineWidth += indent; - if (options.continued && !this.continuedX) { - this.continuedX = this.indent; - } - if (!options.continued) { - return this.continuedX = 0; - } - }); - }); - - // handle left aligning last lines of paragraphs - this.on('lastLine', options => { - const { - align - } = options; - if (align === 'justify') { - options.align = 'left'; - } - this.lastLine = true; - return this.once('line', () => { - this.document.y += options.paragraphGap || 0; - options.align = align; - return this.lastLine = false; - }); - }); - } - wordWidth(word) { - return this.document.widthOfString(word, this) + this.characterSpacing + this.wordSpacing; - } - canFit(word, w) { - if (word[word.length - 1] != SOFT_HYPHEN) { - return w <= this.spaceLeft; - } - return w + this.wordWidth(HYPHEN) <= this.spaceLeft; - } - eachWord(text, fn) { - // setup a unicode line breaker - let bk; - const breaker = new LineBreaker(text); - let last = null; - const wordWidths = Object.create(null); - while (bk = breaker.nextBreak()) { - var shouldContinue; - let word = text.slice((last != null ? last.position : undefined) || 0, bk.position); - let w = wordWidths[word] != null ? wordWidths[word] : wordWidths[word] = this.wordWidth(word); - - // if the word is longer than the whole line, chop it up - // TODO: break by grapheme clusters, not JS string characters - if (w > this.lineWidth + this.continuedX) { - // make some fake break objects - let lbk = last; - const fbk = {}; - while (word.length) { - // fit as much of the word as possible into the space we have - var l, mightGrow; - if (w > this.spaceLeft) { - // start our check at the end of our available space - this method is faster than a loop of each character and it resolves - // an issue with long loops when processing massive words, such as a huge number of spaces - l = Math.ceil(this.spaceLeft / (w / word.length)); - w = this.wordWidth(word.slice(0, l)); - mightGrow = w <= this.spaceLeft && l < word.length; - } else { - l = word.length; - } - let mustShrink = w > this.spaceLeft && l > 0; - // shrink or grow word as necessary after our near-guess above - while (mustShrink || mightGrow) { - if (mustShrink) { - w = this.wordWidth(word.slice(0, --l)); - mustShrink = w > this.spaceLeft && l > 0; - } else { - w = this.wordWidth(word.slice(0, ++l)); - mustShrink = w > this.spaceLeft && l > 0; - mightGrow = w <= this.spaceLeft && l < word.length; - } - } - - // check for the edge case where a single character cannot fit into a line. - if (l === 0 && this.spaceLeft === this.lineWidth) { - l = 1; - } - - // send a required break unless this is the last piece and a linebreak is not specified - fbk.required = bk.required || l < word.length; - shouldContinue = fn(word.slice(0, l), w, fbk, lbk); - lbk = { - required: false - }; - - // get the remaining piece of the word - word = word.slice(l); - w = this.wordWidth(word); - if (shouldContinue === false) { - break; - } - } - } else { - // otherwise just emit the break as it was given to us - shouldContinue = fn(word, w, bk, last); - } - if (shouldContinue === false) { - break; - } - last = bk; - } - } - wrap(text, options) { - // override options from previous continued fragments - this.horizontalScaling = options.horizontalScaling || 100; - if (options.indent != null) { - this.indent = options.indent * this.horizontalScaling / 100; - } - if (options.characterSpacing != null) { - this.characterSpacing = options.characterSpacing * this.horizontalScaling / 100; - } - if (options.wordSpacing != null) { - this.wordSpacing = options.wordSpacing * this.horizontalScaling / 100; - } - if (options.ellipsis != null) { - this.ellipsis = options.ellipsis; - } - - // make sure we're actually on the page - // and that the first line of is never by - // itself at the bottom of a page (orphans) - const nextY = this.document.y + this.document.currentLineHeight(true); - if (this.document.y > this.maxY || nextY > this.maxY) { - this.nextSection(); - } - let buffer = ''; - let textWidth = 0; - let wc = 0; - let lc = 0; - let { - y - } = this.document; // used to reset Y pos if options.continued (below) - const emitLine = () => { - options.textWidth = textWidth + this.wordSpacing * (wc - 1); - options.wordCount = wc; - options.lineWidth = this.lineWidth; - ({ - y - } = this.document); - this.emit('line', buffer, options, this); - return lc++; - }; - this.emit('sectionStart', options, this); - this.eachWord(text, (word, w, bk, last) => { - if (last == null || last.required) { - this.emit('firstLine', options, this); - this.spaceLeft = this.lineWidth; - } - if (this.canFit(word, w)) { - buffer += word; - textWidth += w; - wc++; - } - if (bk.required || !this.canFit(word, w)) { - // if the user specified a max height and an ellipsis, and is about to pass the - // max height and max columns after the next line, append the ellipsis - const lh = this.document.currentLineHeight(true); - if (this.height != null && this.ellipsis && PDFNumber(this.document.y + lh * 2) > this.maxY && this.column >= this.columns) { - if (this.ellipsis === true) { - this.ellipsis = '…'; - } // map default ellipsis character - buffer = buffer.replace(/\s+$/, ''); - textWidth = this.wordWidth(buffer + this.ellipsis); - - // remove characters from the buffer until the ellipsis fits - // to avoid infinite loop need to stop while-loop if buffer is empty string - while (buffer && textWidth > this.lineWidth) { - buffer = buffer.slice(0, -1).replace(/\s+$/, ''); - textWidth = this.wordWidth(buffer + this.ellipsis); - } - // need to add ellipsis only if there is enough space for it - if (textWidth <= this.lineWidth) { - buffer = buffer + this.ellipsis; - } - textWidth = this.wordWidth(buffer); - } - if (bk.required) { - if (w > this.spaceLeft) { - emitLine(); - buffer = word; - textWidth = w; - wc = 1; - } - this.emit('lastLine', options, this); - } - - // Previous entry is a soft hyphen - add visible hyphen. - if (buffer[buffer.length - 1] == SOFT_HYPHEN) { - buffer = buffer.slice(0, -1) + HYPHEN; - this.spaceLeft -= this.wordWidth(HYPHEN); - } - emitLine(); - - // if we've reached the edge of the page, - // continue on a new page or column - if (PDFNumber(this.document.y + lh) > this.maxY) { - const shouldContinue = this.nextSection(); - - // stop if we reached the maximum height - if (!shouldContinue) { - wc = 0; - buffer = ''; - return false; - } - } - - // reset the space left and buffer - if (bk.required) { - this.spaceLeft = this.lineWidth; - buffer = ''; - textWidth = 0; - return wc = 0; - } else { - // reset the space left and buffer - this.spaceLeft = this.lineWidth - w; - buffer = word; - textWidth = w; - return wc = 1; - } - } else { - return this.spaceLeft -= w; - } - }); - if (wc > 0) { - this.emit('lastLine', options, this); - emitLine(); - } - this.emit('sectionEnd', options, this); - - // if the wrap is set to be continued, save the X position - // to start the first line of the next segment at, and reset - // the y position - if (options.continued === true) { - if (lc > 1) { - this.continuedX = 0; - } - this.continuedX += options.textWidth || 0; - return this.document.y = y; - } else { - return this.document.x = this.startX; - } - } - nextSection(options) { - this.emit('sectionEnd', options, this); - if (++this.column > this.columns) { - // if a max height was specified by the user, we're done. - // otherwise, the default is to make a new page at the bottom. - if (this.height != null) { - return false; - } - this.document.continueOnNewPage(); - this.column = 1; - this.startY = this.document.page.margins.top; - this.maxY = this.document.page.maxY(); - this.document.x = this.startX; - if (this.document._fillColor) { - this.document.fillColor(...this.document._fillColor); - } - this.emit('pageBreak', options, this); - } else { - this.document.x += this.lineWidth + this.columnGap; - this.document.y = this.startY; - this.emit('columnBreak', options, this); - } - this.emit('sectionStart', options, this); - return true; - } -} - -const { - number -} = PDFObject; -var TextMixin = { - initText() { - this._line = this._line.bind(this); - - // Current coordinates - this.x = 0; - this.y = 0; - return this._lineGap = 0; - }, - lineGap(_lineGap) { - this._lineGap = _lineGap; - return this; - }, - moveDown(lines) { - if (lines == null) { - lines = 1; - } - this.y += this.currentLineHeight(true) * lines + this._lineGap; - return this; - }, - moveUp(lines) { - if (lines == null) { - lines = 1; - } - this.y -= this.currentLineHeight(true) * lines + this._lineGap; - return this; - }, - _text(text, x, y, options, lineCallback) { - options = this._initOptions(x, y, options); - - // Convert text to a string - text = text == null ? '' : `${text}`; - - // if the wordSpacing option is specified, remove multiple consecutive spaces - if (options.wordSpacing) { - text = text.replace(/\s{2,}/g, ' '); - } - const addStructure = () => { - if (options.structParent) { - options.structParent.add(this.struct(options.structType || 'P', [this.markStructureContent(options.structType || 'P')])); - } - }; - - // We can save some bytes if there is no rotation - if (options.rotation !== 0) { - this.save(); - this.rotate(-options.rotation, { - origin: [this.x, this.y] - }); - } - - // word wrapping - if (options.width) { - let wrapper = this._wrapper; - if (!wrapper) { - wrapper = new LineWrapper(this, options); - wrapper.on('line', lineCallback); - wrapper.on('firstLine', addStructure); - } - this._wrapper = options.continued ? wrapper : null; - this._textOptions = options.continued ? options : null; - wrapper.wrap(text, options); - - // render paragraphs as single lines - } else { - for (let line of text.split('\n')) { - addStructure(); - lineCallback(line, options); - } - } - - // Cleanup if there was a rotation - if (options.rotation !== 0) this.restore(); - return this; - }, - text(text, x, y, options) { - return this._text(text, x, y, options, this._line); - }, - widthOfString(string, options) { - if (options === void 0) { - options = {}; - } - const horizontalScaling = options.horizontalScaling || 100; - return (this._font.widthOfString(string, this._fontSize, options.features) + (options.characterSpacing || 0) * (string.length - 1)) * horizontalScaling / 100; - }, - /** - * Compute the bounding box of a string - * based on what will actually be rendered by `doc.text()` - * - * @param string - The string - * @param x - X position of text (defaults to this.x) - * @param y - Y position of text (defaults to this.y) - * @param options - Any text options (The same you would apply to `doc.text()`) - * @returns {{x: number, y: number, width: number, height: number}} - */ - boundsOfString(string, x, y, options) {}, - heightOfString(text, options) { - const { - x, - y - } = this; - options = this._initOptions(options); - options.height = Infinity; // don't break pages - - const lineGap = options.lineGap || this._lineGap || 0; - this._text(text, this.x, this.y, options, () => { - return this.y += this.currentLineHeight(true) + lineGap; - }); - const height = this.y - y; - this.x = x; - this.y = y; - return height; - }, - list(list, x, y, options, wrapper) { - options = this._initOptions(x, y, options); - const listType = options.listType || 'bullet'; - const unit = Math.round(this._font.ascender / 1000 * this._fontSize); - const midLine = unit / 2; - const r = options.bulletRadius || unit / 3; - const indent = options.textIndent || (listType === 'bullet' ? r * 5 : unit * 2); - const itemIndent = options.bulletIndent || (listType === 'bullet' ? r * 8 : unit * 2); - let level = 1; - const items = []; - const levels = []; - const numbers = []; - var flatten = function (list) { - let n = 1; - for (let i = 0; i < list.length; i++) { - const item = list[i]; - if (Array.isArray(item)) { - level++; - flatten(item); - level--; - } else { - items.push(item); - levels.push(level); - if (listType !== 'bullet') { - numbers.push(n++); - } - } - } - }; - flatten(list); - const label = function (n) { - switch (listType) { - case 'numbered': - return `${n}.`; - case 'lettered': - var letter = String.fromCharCode((n - 1) % 26 + 65); - var times = Math.floor((n - 1) / 26 + 1); - var text = Array(times + 1).join(letter); - return `${text}.`; - } - }; - const drawListItem = function (listItem, i) { - wrapper = new LineWrapper(this, options); - wrapper.on('line', this._line); - level = 1; - wrapper.once('firstLine', () => { - let item, itemType, labelType, bodyType; - if (options.structParent) { - if (options.structTypes) { - [itemType, labelType, bodyType] = options.structTypes; - } else { - [itemType, labelType, bodyType] = ['LI', 'Lbl', 'LBody']; - } - } - if (itemType) { - item = this.struct(itemType); - options.structParent.add(item); - } else if (options.structParent) { - item = options.structParent; - } - let l; - if ((l = levels[i++]) !== level) { - const diff = itemIndent * (l - level); - this.x += diff; - wrapper.lineWidth -= diff; - level = l; - } - if (item && (labelType || bodyType)) { - item.add(this.struct(labelType || bodyType, [this.markStructureContent(labelType || bodyType)])); - } - switch (listType) { - case 'bullet': - this.circle(this.x - indent + r, this.y + midLine, r); - this.fill(); - break; - case 'numbered': - case 'lettered': - var text = label(numbers[i - 1]); - this._fragment(text, this.x - indent, this.y, options); - break; - } - if (item && labelType && bodyType) { - item.add(this.struct(bodyType, [this.markStructureContent(bodyType)])); - } - if (item && item !== options.structParent) { - item.end(); - } - }); - wrapper.on('sectionStart', () => { - const pos = indent + itemIndent * (level - 1); - this.x += pos; - return wrapper.lineWidth -= pos; - }); - wrapper.on('sectionEnd', () => { - const pos = indent + itemIndent * (level - 1); - this.x -= pos; - return wrapper.lineWidth += pos; - }); - wrapper.wrap(listItem, options); - }; - for (let i = 0; i < items.length; i++) { - drawListItem.call(this, items[i], i); - } - return this; - }, - _initOptions(x, y, options) { - var _options$rotation; - if (x === void 0) { - x = {}; - } - if (options === void 0) { - options = {}; - } - if (typeof x === 'object') { - options = x; - x = null; - } - - // clone options object - const result = Object.assign({}, options); - - // extend options with previous values for continued text - if (this._textOptions) { - for (let key in this._textOptions) { - const val = this._textOptions[key]; - if (key !== 'continued') { - if (result[key] === undefined) { - result[key] = val; - } - } - } - } - - // Update the current position - if (x != null) { - this.x = x; - } - if (y != null) { - this.y = y; - } - - // wrap to margins if no x or y position passed - if (result.lineBreak !== false) { - if (result.width == null) { - result.width = this.page.width - this.x - this.page.margins.right; - } - result.width = Math.max(result.width, 0); - } - if (!result.columns) { - result.columns = 0; - } - if (result.columnGap == null) { - result.columnGap = 18; - } // 1/4 inch - - // Normalize rotation to between 0 - 360 - result.rotation = Number((_options$rotation = options.rotation) !== null && _options$rotation !== void 0 ? _options$rotation : 0) % 360; - if (result.rotation < 0) result.rotation += 360; - return result; - }, - _line(text, options, wrapper) { - if (options === void 0) { - options = {}; - } - this._fragment(text, this.x, this.y, options); - const lineGap = options.lineGap || this._lineGap || 0; - if (!wrapper) { - return this.x += this.widthOfString(text, options); - } else { - return this.y += this.currentLineHeight(true) + lineGap; - } - }, - _fragment(text, x, y, options) { - let dy, encoded, i, positions, textWidth, words; - text = `${text}`.replace(/\n/g, ''); - if (text.length === 0) { - return; - } - - // handle options - const align = options.align || 'left'; - let wordSpacing = options.wordSpacing || 0; - const characterSpacing = options.characterSpacing || 0; - const horizontalScaling = options.horizontalScaling || 100; - - // text alignments - if (options.width) { - switch (align) { - case 'right': - textWidth = this.widthOfString(text.replace(/\s+$/, ''), options); - x += options.lineWidth - textWidth; - break; - case 'center': - x += options.lineWidth / 2 - options.textWidth / 2; - break; - case 'justify': - // calculate the word spacing value - words = text.trim().split(/\s+/); - textWidth = this.widthOfString(text.replace(/\s+/g, ''), options); - var spaceWidth = this.widthOfString(' ') + characterSpacing; - wordSpacing = Math.max(0, (options.lineWidth - textWidth) / Math.max(1, words.length - 1) - spaceWidth); - break; - } - } - - // text baseline alignments based on http://wiki.apache.org/xmlgraphics-fop/LineLayout/AlignmentHandling - if (typeof options.baseline === 'number') { - dy = -options.baseline; - } else { - switch (options.baseline) { - case 'svg-middle': - dy = 0.5 * this._font.xHeight; - break; - case 'middle': - case 'svg-central': - dy = 0.5 * (this._font.descender + this._font.ascender); - break; - case 'bottom': - case 'ideographic': - dy = this._font.descender; - break; - case 'alphabetic': - dy = 0; - break; - case 'mathematical': - dy = 0.5 * this._font.ascender; - break; - case 'hanging': - dy = 0.8 * this._font.ascender; - break; - case 'top': - dy = this._font.ascender; - break; - default: - dy = this._font.ascender; - } - dy = dy / 1000 * this._fontSize; - } - - // calculate the actual rendered width of the string after word and character spacing - const renderedWidth = options.textWidth + wordSpacing * (options.wordCount - 1) + characterSpacing * (text.length - 1); - - // create link annotations if the link option is given - if (options.link != null) { - this.link(x, y, renderedWidth, this.currentLineHeight(), options.link); - } - if (options.goTo != null) { - this.goTo(x, y, renderedWidth, this.currentLineHeight(), options.goTo); - } - if (options.destination != null) { - this.addNamedDestination(options.destination, 'XYZ', x, y, null); - } - - // create underline - if (options.underline) { - this.save(); - if (!options.stroke) { - this.strokeColor(...(this._fillColor || [])); - } - const lineWidth = this._fontSize < 10 ? 0.5 : Math.floor(this._fontSize / 10); - this.lineWidth(lineWidth); - let lineY = y + this.currentLineHeight() - lineWidth; - this.moveTo(x, lineY); - this.lineTo(x + renderedWidth, lineY); - this.stroke(); - this.restore(); - } - - // create strikethrough line - if (options.strike) { - this.save(); - if (!options.stroke) { - this.strokeColor(...(this._fillColor || [])); - } - const lineWidth = this._fontSize < 10 ? 0.5 : Math.floor(this._fontSize / 10); - this.lineWidth(lineWidth); - let lineY = y + this.currentLineHeight() / 2; - this.moveTo(x, lineY); - this.lineTo(x + renderedWidth, lineY); - this.stroke(); - this.restore(); - } - this.save(); - - // oblique (angle in degrees or boolean) - if (options.oblique) { - let skew; - if (typeof options.oblique === 'number') { - skew = -Math.tan(options.oblique * Math.PI / 180); - } else { - skew = -0.25; - } - this.transform(1, 0, 0, 1, x, y); - this.transform(1, 0, skew, 1, -skew * dy, 0); - this.transform(1, 0, 0, 1, -x, -y); - } - - // flip coordinate system - this.transform(1, 0, 0, -1, 0, this.page.height); - y = this.page.height - y - dy; - - // add current font to page if necessary - if (this.page.fonts[this._font.id] == null) { - this.page.fonts[this._font.id] = this._font.ref(); - } - - // begin the text object - this.addContent('BT'); - - // text position - this.addContent(`1 0 0 1 ${number(x)} ${number(y)} Tm`); - - // font and font size - this.addContent(`/${this._font.id} ${number(this._fontSize)} Tf`); - - // rendering mode - const mode = options.fill && options.stroke ? 2 : options.stroke ? 1 : 0; - if (mode) { - this.addContent(`${mode} Tr`); - } - - // Character spacing - if (characterSpacing) { - this.addContent(`${number(characterSpacing)} Tc`); - } - - // Horizontal scaling - if (horizontalScaling !== 100) { - this.addContent(`${horizontalScaling} Tz`); - } - - // Add the actual text - // If we have a word spacing value, we need to encode each word separately - // since the normal Tw operator only works on character code 32, which isn't - // used for embedded fonts. - if (wordSpacing) { - words = text.trim().split(/\s+/); - wordSpacing += this.widthOfString(' ') + characterSpacing; - wordSpacing *= 1000 / this._fontSize; - encoded = []; - positions = []; - for (let word of words) { - const [encodedWord, positionsWord] = this._font.encode(word, options.features); - encoded = encoded.concat(encodedWord); - positions = positions.concat(positionsWord); - - // add the word spacing to the end of the word - // clone object because of cache - const space = {}; - const object = positions[positions.length - 1]; - for (let key in object) { - const val = object[key]; - space[key] = val; - } - space.xAdvance += wordSpacing; - positions[positions.length - 1] = space; - } - } else { - [encoded, positions] = this._font.encode(text, options.features); - } - const scale = this._fontSize / 1000; - const commands = []; - let last = 0; - let hadOffset = false; - - // Adds a segment of text to the TJ command buffer - const addSegment = cur => { - if (last < cur) { - const hex = encoded.slice(last, cur).join(''); - const advance = positions[cur - 1].xAdvance - positions[cur - 1].advanceWidth; - commands.push(`<${hex}> ${number(-advance)}`); - } - return last = cur; - }; - - // Flushes the current TJ commands to the output stream - const flush = i => { - addSegment(i); - if (commands.length > 0) { - this.addContent(`[${commands.join(' ')}] TJ`); - return commands.length = 0; - } - }; - for (i = 0; i < positions.length; i++) { - // If we have an x or y offset, we have to break out of the current TJ command - // so we can move the text position. - const pos = positions[i]; - if (pos.xOffset || pos.yOffset) { - // Flush the current buffer - flush(i); - - // Move the text position and flush just the current character - this.addContent(`1 0 0 1 ${number(x + pos.xOffset * scale)} ${number(y + pos.yOffset * scale)} Tm`); - flush(i + 1); - hadOffset = true; - } else { - // If the last character had an offset, reset the text position - if (hadOffset) { - this.addContent(`1 0 0 1 ${number(x)} ${number(y)} Tm`); - hadOffset = false; - } - - // Group segments that don't have any advance adjustments - if (pos.xAdvance - pos.advanceWidth !== 0) { - addSegment(i + 1); - } - } - x += pos.xAdvance * scale; - } - - // Flush any remaining commands - flush(i); - - // end the text object - this.addContent('ET'); - - // restore flipped coordinate system - return this.restore(); - } -}; - -const COLOR_SPACE_MAP = { - 1: 'DeviceGray', - 3: 'DeviceRGB', - 4: 'DeviceCMYK' -}; -class JPEG { - constructor(data, label) { - this.data = data; - this.label = label; - this.orientation = 1; - if (this.data.readUInt16BE(0) !== 0xffd8) { - throw 'SOI not found in JPEG'; - } - const markers = _JPEG.decode(this.data); - for (let i = 0; i < markers.length; i += 1) { - const marker = markers[i]; - if (marker.name === 'EXIF' && marker.entries.orientation) { - this.orientation = marker.entries.orientation; - } - if (marker.name === 'SOF') { - this.bits ||= marker.precision; - this.width ||= marker.width; - this.height ||= marker.height; - this.colorSpace ||= COLOR_SPACE_MAP[marker.numberOfComponents]; - } - } - this.obj = null; - } - embed(document) { - if (this.obj) { - return; - } - this.obj = document.ref({ - Type: 'XObject', - Subtype: 'Image', - BitsPerComponent: this.bits, - Width: this.width, - Height: this.height, - ColorSpace: this.colorSpace, - Filter: 'DCTDecode' - }); - - // add extra decode params for CMYK images. By swapping the - // min and max values from the default, we invert the colors. See - // section 4.8.4 of the spec. - if (this.colorSpace === 'DeviceCMYK') { - this.obj.data['Decode'] = [1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0]; - } - this.obj.end(this.data); - - // free memory - return this.data = null; - } -} - -class PNGImage { - constructor(data, label) { - this.label = label; - this.image = new PNG(data); - this.width = this.image.width; - this.height = this.image.height; - this.imgData = this.image.imgData; - this.obj = null; - } - embed(document) { - let dataDecoded = false; - this.document = document; - if (this.obj) { - return; - } - const hasAlphaChannel = this.image.hasAlphaChannel; - const isInterlaced = this.image.interlaceMethod === 1; - this.obj = this.document.ref({ - Type: 'XObject', - Subtype: 'Image', - BitsPerComponent: hasAlphaChannel ? 8 : this.image.bits, - Width: this.width, - Height: this.height, - Filter: 'FlateDecode' - }); - if (!hasAlphaChannel) { - const params = this.document.ref({ - Predictor: isInterlaced ? 1 : 15, - Colors: this.image.colors, - BitsPerComponent: this.image.bits, - Columns: this.width - }); - this.obj.data.DecodeParms = params; - params.end(); - } - if (this.image.palette.length === 0) { - this.obj.data.ColorSpace = this.image.colorSpace; - } else { - // embed the color palette in the PDF as an object stream - const palette = this.document.ref(); - palette.end(Buffer.from(this.image.palette)); - - // build the color space array for the image - this.obj.data.ColorSpace = ['Indexed', 'DeviceRGB', this.image.palette.length / 3 - 1, palette]; - } - - // For PNG color types 0, 2 and 3, the transparency data is stored in - // a dedicated PNG chunk. - if (this.image.transparency.grayscale != null) { - // Use Color Key Masking (spec section 4.8.5) - // An array with N elements, where N is two times the number of color components. - const val = this.image.transparency.grayscale; - this.obj.data.Mask = [val, val]; - } else if (this.image.transparency.rgb) { - // Use Color Key Masking (spec section 4.8.5) - // An array with N elements, where N is two times the number of color components. - const { - rgb - } = this.image.transparency; - const mask = []; - for (let x of rgb) { - mask.push(x, x); - } - this.obj.data.Mask = mask; - } else if (this.image.transparency.indexed) { - // Create a transparency SMask for the image based on the data - // in the PLTE and tRNS sections. See below for details on SMasks. - dataDecoded = true; - return this.loadIndexedAlphaChannel(); - } else if (hasAlphaChannel) { - // For PNG color types 4 and 6, the transparency data is stored as a alpha - // channel mixed in with the main image data. Separate this data out into an - // SMask object and store it separately in the PDF. - dataDecoded = true; - return this.splitAlphaChannel(); - } - if (isInterlaced && !dataDecoded) { - return this.decodeData(); - } - this.finalize(); - } - finalize() { - if (this.alphaChannel) { - const sMask = this.document.ref({ - Type: 'XObject', - Subtype: 'Image', - Height: this.height, - Width: this.width, - BitsPerComponent: 8, - Filter: 'FlateDecode', - ColorSpace: 'DeviceGray', - Decode: [0, 1] - }); - sMask.end(this.alphaChannel); - this.obj.data.SMask = sMask; - } - - // add the actual image data - this.obj.end(this.imgData); - - // free memory - this.image = null; - return this.imgData = null; - } - splitAlphaChannel() { - return this.image.decodePixels(pixels => { - let a; - let p; - const colorCount = this.image.colors; - const pixelCount = this.width * this.height; - const imgData = Buffer.alloc(pixelCount * colorCount); - const alphaChannel = Buffer.alloc(pixelCount); - let i = p = a = 0; - const len = pixels.length; - // For 16bit images copy only most significant byte (MSB) - PNG data is always stored in network byte order (MSB first) - const skipByteCount = this.image.bits === 16 ? 1 : 0; - while (i < len) { - for (let colorIndex = 0; colorIndex < colorCount; colorIndex++) { - imgData[p++] = pixels[i++]; - i += skipByteCount; - } - alphaChannel[a++] = pixels[i++]; - i += skipByteCount; - } - this.imgData = zlib.deflateSync(imgData); - this.alphaChannel = zlib.deflateSync(alphaChannel); - return this.finalize(); - }); - } - loadIndexedAlphaChannel() { - const transparency = this.image.transparency.indexed; - return this.image.decodePixels(pixels => { - const alphaChannel = Buffer.alloc(this.width * this.height); - let i = 0; - for (let j = 0, end = pixels.length; j < end; j++) { - alphaChannel[i++] = transparency[pixels[j]]; - } - this.alphaChannel = zlib.deflateSync(alphaChannel); - return this.finalize(); - }); - } - decodeData() { - this.image.decodePixels(pixels => { - this.imgData = zlib.deflateSync(pixels); - this.finalize(); - }); - } -} - -/* -PDFImage - embeds images in PDF documents -By Devon Govett -*/ - -class PDFImage { - static open(src, label) { - let data; - if (Buffer.isBuffer(src)) { - data = src; - } else if (src instanceof ArrayBuffer) { - data = Buffer.from(new Uint8Array(src)); - } else { - let match; - if (match = /^data:.+?;base64,(.*)$/.exec(src)) { - data = Buffer.from(match[1], 'base64'); - } else { - data = fs.readFileSync(src); - if (!data) { - return; - } - } - } - if (data[0] === 0xff && data[1] === 0xd8) { - return new JPEG(data, label); - } else if (data[0] === 0x89 && data.toString('ascii', 1, 4) === 'PNG') { - return new PNGImage(data, label); - } else { - throw new Error('Unknown image format.'); - } - } -} - -var ImagesMixin = { - initImages() { - this._imageRegistry = {}; - return this._imageCount = 0; - }, - image(src, x, y, options) { - if (options === void 0) { - options = {}; - } - let bh, bp, bw, image, ip, left, left1, rotateAngle, originX, originY; - if (typeof x === 'object') { - options = x; - x = null; - } - - // Ignore orientation based on document options or image options - const ignoreOrientation = options.ignoreOrientation || options.ignoreOrientation !== false && this.options.ignoreOrientation; - x = (left = x != null ? x : options.x) != null ? left : this.x; - y = (left1 = y != null ? y : options.y) != null ? left1 : this.y; - if (typeof src === 'string') { - image = this._imageRegistry[src]; - } - if (!image) { - if (src.width && src.height) { - image = src; - } else { - image = this.openImage(src); - } - } - if (!image.obj) { - image.embed(this); - } - if (this.page.xobjects[image.label] == null) { - this.page.xobjects[image.label] = image.obj; - } - let { - width, - height - } = image; - - // If EXIF orientation calls for it, swap width and height - if (!ignoreOrientation && image.orientation > 4) { - [width, height] = [height, width]; - } - let w = options.width || width; - let h = options.height || height; - if (options.width && !options.height) { - const wp = w / width; - w = width * wp; - h = height * wp; - } else if (options.height && !options.width) { - const hp = h / height; - w = width * hp; - h = height * hp; - } else if (options.scale) { - w = width * options.scale; - h = height * options.scale; - } else if (options.fit) { - [bw, bh] = options.fit; - bp = bw / bh; - ip = width / height; - if (ip > bp) { - w = bw; - h = bw / ip; - } else { - h = bh; - w = bh * ip; - } - } else if (options.cover) { - [bw, bh] = options.cover; - bp = bw / bh; - ip = width / height; - if (ip > bp) { - h = bh; - w = bh * ip; - } else { - w = bw; - h = bw / ip; - } - } - if (options.fit || options.cover) { - if (options.align === 'center') { - x = x + bw / 2 - w / 2; - } else if (options.align === 'right') { - x = x + bw - w; - } - if (options.valign === 'center') { - y = y + bh / 2 - h / 2; - } else if (options.valign === 'bottom') { - y = y + bh - h; - } - } - if (!ignoreOrientation) { - switch (image.orientation) { - // No orientation (need to flip image, though, because of the default transform matrix on the document) - default: - case 1: - h = -h; - y -= h; - rotateAngle = 0; - break; - // Flip Horizontal - case 2: - w = -w; - h = -h; - x -= w; - y -= h; - rotateAngle = 0; - break; - // Rotate 180 degrees - case 3: - originX = x; - originY = y; - h = -h; - x -= w; - rotateAngle = 180; - break; - // Flip vertical - case 4: - // Do nothing, image will be flipped - - break; - // Flip horizontally and rotate 270 degrees CW - case 5: - originX = x; - originY = y; - [w, h] = [h, w]; - y -= h; - rotateAngle = 90; - break; - // Rotate 90 degrees CW - case 6: - originX = x; - originY = y; - [w, h] = [h, w]; - h = -h; - rotateAngle = 90; - break; - // Flip horizontally and rotate 90 degrees CW - case 7: - originX = x; - originY = y; - [w, h] = [h, w]; - h = -h; - w = -w; - x -= w; - rotateAngle = 90; - break; - // Rotate 270 degrees CW - case 8: - originX = x; - originY = y; - [w, h] = [h, w]; - h = -h; - x -= w; - y -= h; - rotateAngle = -90; - break; - } - } else { - h = -h; - y -= h; - rotateAngle = 0; - } - - // create link annotations if the link option is given - if (options.link != null) { - this.link(x, y, w, h, options.link); - } - if (options.goTo != null) { - this.goTo(x, y, w, h, options.goTo); - } - if (options.destination != null) { - this.addNamedDestination(options.destination, 'XYZ', x, y, null); - } - - // Set the current y position to below the image if it is in the document flow - if (this.y === y) { - this.y += h; - } - this.save(); - if (rotateAngle) { - this.rotate(rotateAngle, { - origin: [originX, originY] - }); - } - this.transform(w, 0, 0, h, x, y); - this.addContent(`/${image.label} Do`); - this.restore(); - return this; - }, - openImage(src) { - let image; - if (typeof src === 'string') { - image = this._imageRegistry[src]; - } - if (!image) { - image = PDFImage.open(src, `I${++this._imageCount}`); - if (typeof src === 'string') { - this._imageRegistry[src] = image; - } - } - return image; - } -}; - -var AnnotationsMixin = { - annotate(x, y, w, h, options) { - options.Type = 'Annot'; - options.Rect = this._convertRect(x, y, w, h); - options.Border = [0, 0, 0]; - if (options.Subtype === 'Link' && typeof options.F === 'undefined') { - options.F = 1 << 2; // Print Annotation Flag - } - if (options.Subtype !== 'Link') { - if (options.C == null) { - options.C = this._normalizeColor(options.color || [0, 0, 0]); - } - } // convert colors - delete options.color; - if (typeof options.Dest === 'string') { - options.Dest = new String(options.Dest); - } - - // Capitalize keys - for (let key in options) { - const val = options[key]; - options[key[0].toUpperCase() + key.slice(1)] = val; - } - const ref = this.ref(options); - this.page.annotations.push(ref); - ref.end(); - return this; - }, - note(x, y, w, h, contents, options) { - if (options === void 0) { - options = {}; - } - options.Subtype = 'Text'; - options.Contents = new String(contents); - if (options.Name == null) { - options.Name = 'Comment'; - } - if (options.color == null) { - options.color = [243, 223, 92]; - } - return this.annotate(x, y, w, h, options); - }, - goTo(x, y, w, h, name, options) { - if (options === void 0) { - options = {}; - } - options.Subtype = 'Link'; - options.A = this.ref({ - S: 'GoTo', - D: new String(name) - }); - options.A.end(); - return this.annotate(x, y, w, h, options); - }, - link(x, y, w, h, url, options) { - if (options === void 0) { - options = {}; - } - options.Subtype = 'Link'; - if (typeof url === 'number') { - // Link to a page in the document (the page must already exist) - const pages = this._root.data.Pages.data; - if (url >= 0 && url < pages.Kids.length) { - options.A = this.ref({ - S: 'GoTo', - D: [pages.Kids[url], 'XYZ', null, null, null] - }); - options.A.end(); - } else { - throw new Error(`The document has no page ${url}`); - } - } else { - // Link to an external url - options.A = this.ref({ - S: 'URI', - URI: new String(url) - }); - options.A.end(); - } - return this.annotate(x, y, w, h, options); - }, - _markup(x, y, w, h, options) { - if (options === void 0) { - options = {}; - } - const [x1, y1, x2, y2] = this._convertRect(x, y, w, h); - options.QuadPoints = [x1, y2, x2, y2, x1, y1, x2, y1]; - options.Contents = new String(); - return this.annotate(x, y, w, h, options); - }, - highlight(x, y, w, h, options) { - if (options === void 0) { - options = {}; - } - options.Subtype = 'Highlight'; - if (options.color == null) { - options.color = [241, 238, 148]; - } - return this._markup(x, y, w, h, options); - }, - underline(x, y, w, h, options) { - if (options === void 0) { - options = {}; - } - options.Subtype = 'Underline'; - return this._markup(x, y, w, h, options); - }, - strike(x, y, w, h, options) { - if (options === void 0) { - options = {}; - } - options.Subtype = 'StrikeOut'; - return this._markup(x, y, w, h, options); - }, - lineAnnotation(x1, y1, x2, y2, options) { - if (options === void 0) { - options = {}; - } - options.Subtype = 'Line'; - options.Contents = new String(); - options.L = [x1, this.page.height - y1, x2, this.page.height - y2]; - return this.annotate(x1, y1, x2, y2, options); - }, - rectAnnotation(x, y, w, h, options) { - if (options === void 0) { - options = {}; - } - options.Subtype = 'Square'; - options.Contents = new String(); - return this.annotate(x, y, w, h, options); - }, - ellipseAnnotation(x, y, w, h, options) { - if (options === void 0) { - options = {}; - } - options.Subtype = 'Circle'; - options.Contents = new String(); - return this.annotate(x, y, w, h, options); - }, - textAnnotation(x, y, w, h, text, options) { - if (options === void 0) { - options = {}; - } - options.Subtype = 'FreeText'; - options.Contents = new String(text); - options.DA = new String(); - return this.annotate(x, y, w, h, options); - }, - fileAnnotation(x, y, w, h, file, options) { - if (file === void 0) { - file = {}; - } - if (options === void 0) { - options = {}; - } - // create hidden file - const filespec = this.file(file.src, Object.assign({ - hidden: true - }, file)); - options.Subtype = 'FileAttachment'; - options.FS = filespec; - - // add description from filespec unless description (Contents) has already been set - if (options.Contents) { - options.Contents = new String(options.Contents); - } else if (filespec.data.Desc) { - options.Contents = filespec.data.Desc; - } - return this.annotate(x, y, w, h, options); - }, - _convertRect(x1, y1, w, h) { - // flip y1 and y2 - let y2 = y1; - y1 += h; - - // make x2 - let x2 = x1 + w; - - // apply current transformation matrix to points - const [m0, m1, m2, m3, m4, m5] = this._ctm; - x1 = m0 * x1 + m2 * y1 + m4; - y1 = m1 * x1 + m3 * y1 + m5; - x2 = m0 * x2 + m2 * y2 + m4; - y2 = m1 * x2 + m3 * y2 + m5; - return [x1, y1, x2, y2]; - } -}; - -/* Custom fork start */ -const DEFAULT_OPTIONS = { - top: 0, - left: 0, - zoom: 0, - fit: false, - pageNumber: null, - expanded: false -}; -/* Custom fork end */ - -class PDFOutline { - constructor(document, parent, title, dest, options) { - if (options === void 0) { - options = DEFAULT_OPTIONS; - } - this.document = document; - this.options = options; - this.outlineData = {}; - if (dest !== null) { - /* Custom fork start */ - const destWidth = dest.data.MediaBox[2]; - const destHeight = dest.data.MediaBox[3]; - const top = destHeight - (options.top || 0); - const left = destWidth - (options.left || 0); - const zoom = options.zoom || 0; - this.outlineData['Dest'] = options.fit ? [dest, 'Fit'] : [dest, 'XYZ', left, top, zoom]; - /* Custom fork end */ - } - if (parent !== null) { - this.outlineData['Parent'] = parent; - } - if (title !== null) { - this.outlineData['Title'] = new String(title); - } - this.dictionary = this.document.ref(this.outlineData); - this.children = []; - } - addItem(title, options) { - if (options === void 0) { - options = DEFAULT_OPTIONS; - } - /* Custom fork start */ - const pages = this.document._root.data.Pages.data.Kids; - const dest = options.pageNumber !== null ? pages[options.pageNumber] : this.document.page.dictionary; - /* Custom fork end */ - - const result = new PDFOutline(this.document, this.dictionary, title, dest, options); - this.children.push(result); - return result; - } - endOutline() { - if (this.children.length > 0) { - if (this.options.expanded) { - this.outlineData.Count = this.children.length; - } - const first = this.children[0], - last = this.children[this.children.length - 1]; - this.outlineData.First = first.dictionary; - this.outlineData.Last = last.dictionary; - for (let i = 0, len = this.children.length; i < len; i++) { - const child = this.children[i]; - if (i > 0) { - child.outlineData.Prev = this.children[i - 1].dictionary; - } - if (i < this.children.length - 1) { - child.outlineData.Next = this.children[i + 1].dictionary; - } - child.endOutline(); - } - } - return this.dictionary.end(); - } -} - -var OutlineMixin = { - initOutline() { - return this.outline = new PDFOutline(this, null, null, null); - }, - endOutline() { - this.outline.endOutline(); - if (this.outline.children.length > 0) { - this._root.data.Outlines = this.outline.dictionary; - /* Custom fork start */ - return this._root.data.PageMode = this._root.data.PageMode || 'UseOutlines'; - /* Custom fork end */ - } - } -}; - -/* -PDFStructureContent - a reference to a marked structure content -By Ben Schmidt -*/ - -class PDFStructureContent { - constructor(pageRef, mcid) { - this.refs = [{ - pageRef, - mcid - }]; - } - push(structContent) { - structContent.refs.forEach(ref => this.refs.push(ref)); - } -} - -/* -PDFStructureElement - represents an element in the PDF logical structure tree -By Ben Schmidt -*/ - -class PDFStructureElement { - constructor(document, type, options, children) { - if (options === void 0) { - options = {}; - } - if (children === void 0) { - children = null; - } - this.document = document; - this._attached = false; - this._ended = false; - this._flushed = false; - this.dictionary = document.ref({ - // Type: "StructElem", - S: type - }); - const data = this.dictionary.data; - if (Array.isArray(options) || this._isValidChild(options)) { - children = options; - options = {}; - } - if (typeof options.title !== 'undefined') { - data.T = new String(options.title); - } - if (typeof options.lang !== 'undefined') { - data.Lang = new String(options.lang); - } - if (typeof options.alt !== 'undefined') { - data.Alt = new String(options.alt); - } - if (typeof options.expanded !== 'undefined') { - data.E = new String(options.expanded); - } - if (typeof options.actual !== 'undefined') { - data.ActualText = new String(options.actual); - } - this._children = []; - if (children) { - if (!Array.isArray(children)) { - children = [children]; - } - children.forEach(child => this.add(child)); - this.end(); - } - } - add(child) { - if (this._ended) { - throw new Error(`Cannot add child to already-ended structure element`); - } - if (!this._isValidChild(child)) { - throw new Error(`Invalid structure element child`); - } - if (child instanceof PDFStructureElement) { - child.setParent(this.dictionary); - if (this._attached) { - child.setAttached(); - } - } - if (child instanceof PDFStructureContent) { - this._addContentToParentTree(child); - } - if (typeof child === 'function' && this._attached) { - // _contentForClosure() adds the content to the parent tree - child = this._contentForClosure(child); - } - this._children.push(child); - return this; - } - _addContentToParentTree(content) { - content.refs.forEach(_ref => { - let { - pageRef, - mcid - } = _ref; - const pageStructParents = this.document.getStructParentTree().get(pageRef.data.StructParents); - pageStructParents[mcid] = this.dictionary; - }); - } - setParent(parentRef) { - if (this.dictionary.data.P) { - throw new Error(`Structure element added to more than one parent`); - } - this.dictionary.data.P = parentRef; - this._flush(); - } - setAttached() { - if (this._attached) { - return; - } - this._children.forEach((child, index) => { - if (child instanceof PDFStructureElement) { - child.setAttached(); - } - if (typeof child === 'function') { - this._children[index] = this._contentForClosure(child); - } - }); - this._attached = true; - this._flush(); - } - end() { - if (this._ended) { - return; - } - this._children.filter(child => child instanceof PDFStructureElement).forEach(child => child.end()); - this._ended = true; - this._flush(); - } - _isValidChild(child) { - return child instanceof PDFStructureElement || child instanceof PDFStructureContent || typeof child === 'function'; - } - _contentForClosure(closure) { - const content = this.document.markStructureContent(this.dictionary.data.S); - closure(); - this.document.endMarkedContent(); - this._addContentToParentTree(content); - return content; - } - _isFlushable() { - if (!this.dictionary.data.P || !this._ended) { - return false; - } - return this._children.every(child => { - if (typeof child === 'function') { - return false; - } - if (child instanceof PDFStructureElement) { - return child._isFlushable(); - } - return true; - }); - } - _flush() { - if (this._flushed || !this._isFlushable()) { - return; - } - this.dictionary.data.K = []; - this._children.forEach(child => this._flushChild(child)); - this.dictionary.end(); - - // free memory used by children; the dictionary itself may still be - // referenced by a parent structure element or root, but we can - // at least trim the tree here - this._children = []; - this.dictionary.data.K = null; - this._flushed = true; - } - _flushChild(child) { - if (child instanceof PDFStructureElement) { - this.dictionary.data.K.push(child.dictionary); - } - if (child instanceof PDFStructureContent) { - child.refs.forEach(_ref2 => { - let { - pageRef, - mcid - } = _ref2; - if (!this.dictionary.data.Pg) { - this.dictionary.data.Pg = pageRef; - } - if (this.dictionary.data.Pg === pageRef) { - this.dictionary.data.K.push(mcid); - } else { - this.dictionary.data.K.push({ - Type: 'MCR', - Pg: pageRef, - MCID: mcid - }); - } - }); - } - } -} - -/* -PDFNumberTree - represents a number tree object -*/ - -class PDFNumberTree extends PDFTree { - _compareKeys(a, b) { - return parseInt(a) - parseInt(b); - } - _keysName() { - return 'Nums'; - } - _dataForKey(k) { - return parseInt(k); - } -} - -/* -Markings mixin - support marked content sequences in content streams -By Ben Schmidt -*/ - -var MarkingsMixin = { - initMarkings(options) { - this.structChildren = []; - if (options.tagged) { - this.getMarkInfoDictionary().data.Marked = true; - this.getStructTreeRoot(); - } - }, - markContent(tag, options) { - if (options === void 0) { - options = null; - } - if (tag === 'Artifact' || options && options.mcid) { - let toClose = 0; - this.page.markings.forEach(marking => { - if (toClose || marking.structContent || marking.tag === 'Artifact') { - toClose++; - } - }); - while (toClose--) { - this.endMarkedContent(); - } - } - if (!options) { - this.page.markings.push({ - tag - }); - this.addContent(`/${tag} BMC`); - return this; - } - this.page.markings.push({ - tag, - options - }); - const dictionary = {}; - if (typeof options.mcid !== 'undefined') { - dictionary.MCID = options.mcid; - } - if (tag === 'Artifact') { - if (typeof options.type === 'string') { - dictionary.Type = options.type; - } - if (Array.isArray(options.bbox)) { - dictionary.BBox = [options.bbox[0], this.page.height - options.bbox[3], options.bbox[2], this.page.height - options.bbox[1]]; - } - if (Array.isArray(options.attached) && options.attached.every(val => typeof val === 'string')) { - dictionary.Attached = options.attached; - } - } - if (tag === 'Span') { - if (options.lang) { - dictionary.Lang = new String(options.lang); - } - if (options.alt) { - dictionary.Alt = new String(options.alt); - } - if (options.expanded) { - dictionary.E = new String(options.expanded); - } - if (options.actual) { - dictionary.ActualText = new String(options.actual); - } - } - this.addContent(`/${tag} ${PDFObject.convert(dictionary)} BDC`); - return this; - }, - markStructureContent(tag, options) { - if (options === void 0) { - options = {}; - } - const pageStructParents = this.getStructParentTree().get(this.page.structParentTreeKey); - const mcid = pageStructParents.length; - pageStructParents.push(null); - this.markContent(tag, { - ...options, - mcid - }); - const structContent = new PDFStructureContent(this.page.dictionary, mcid); - this.page.markings.slice(-1)[0].structContent = structContent; - return structContent; - }, - endMarkedContent() { - this.page.markings.pop(); - this.addContent('EMC'); - return this; - }, - struct(type, options, children) { - if (options === void 0) { - options = {}; - } - if (children === void 0) { - children = null; - } - return new PDFStructureElement(this, type, options, children); - }, - addStructure(structElem) { - const structTreeRoot = this.getStructTreeRoot(); - structElem.setParent(structTreeRoot); - structElem.setAttached(); - this.structChildren.push(structElem); - if (!structTreeRoot.data.K) { - structTreeRoot.data.K = []; - } - structTreeRoot.data.K.push(structElem.dictionary); - return this; - }, - initPageMarkings(pageMarkings) { - pageMarkings.forEach(marking => { - if (marking.structContent) { - const structContent = marking.structContent; - const newStructContent = this.markStructureContent(marking.tag, marking.options); - structContent.push(newStructContent); - this.page.markings.slice(-1)[0].structContent = structContent; - } else { - this.markContent(marking.tag, marking.options); - } - }); - }, - endPageMarkings(page) { - const pageMarkings = page.markings; - pageMarkings.forEach(() => page.write('EMC')); - page.markings = []; - return pageMarkings; - }, - getMarkInfoDictionary() { - if (!this._root.data.MarkInfo) { - this._root.data.MarkInfo = this.ref({}); - } - return this._root.data.MarkInfo; - }, - hasMarkInfoDictionary() { - return !!this._root.data.MarkInfo; - }, - getStructTreeRoot() { - if (!this._root.data.StructTreeRoot) { - this._root.data.StructTreeRoot = this.ref({ - Type: 'StructTreeRoot', - ParentTree: new PDFNumberTree(), - ParentTreeNextKey: 0 - }); - } - return this._root.data.StructTreeRoot; - }, - getStructParentTree() { - return this.getStructTreeRoot().data.ParentTree; - }, - createStructParentTreeNextKey() { - // initialise the MarkInfo dictionary - this.getMarkInfoDictionary(); - const structTreeRoot = this.getStructTreeRoot(); - const key = structTreeRoot.data.ParentTreeNextKey++; - structTreeRoot.data.ParentTree.add(key, []); - return key; - }, - endMarkings() { - const structTreeRoot = this._root.data.StructTreeRoot; - if (structTreeRoot) { - structTreeRoot.end(); - this.structChildren.forEach(structElem => structElem.end()); - } - if (this._root.data.MarkInfo) { - this._root.data.MarkInfo.end(); - } - } -}; - -const FIELD_FLAGS = { - readOnly: 1, - required: 2, - noExport: 4, - multiline: 0x1000, - password: 0x2000, - toggleToOffButton: 0x4000, - radioButton: 0x8000, - pushButton: 0x10000, - combo: 0x20000, - edit: 0x40000, - sort: 0x80000, - multiSelect: 0x200000, - noSpell: 0x400000 -}; -const FIELD_JUSTIFY = { - left: 0, - center: 1, - right: 2 -}; -const VALUE_MAP = { - value: 'V', - defaultValue: 'DV' -}; -const FORMAT_SPECIAL = { - zip: '0', - zipPlus4: '1', - zip4: '1', - phone: '2', - ssn: '3' -}; -const FORMAT_DEFAULT = { - number: { - nDec: 0, - sepComma: false, - negStyle: 'MinusBlack', - currency: '', - currencyPrepend: true - }, - percent: { - nDec: 0, - sepComma: false - } -}; -var AcroFormMixin = { - /** - * Must call if adding AcroForms to a document. Must also call font() before - * this method to set the default font. - */ - initForm() { - if (!this._font) { - throw new Error('Must set a font before calling initForm method'); - } - this._acroform = { - fonts: {}, - defaultFont: this._font.name - }; - this._acroform.fonts[this._font.id] = this._font.ref(); - let data = { - Fields: [], - NeedAppearances: true, - DA: new String(`/${this._font.id} 0 Tf 0 g`), - DR: { - Font: {} - } - }; - data.DR.Font[this._font.id] = this._font.ref(); - const AcroForm = this.ref(data); - this._root.data.AcroForm = AcroForm; - return this; - }, - /** - * Called automatically by document.js - */ - endAcroForm() { - if (this._root.data.AcroForm) { - if (!Object.keys(this._acroform.fonts).length && !this._acroform.defaultFont) { - throw new Error('No fonts specified for PDF form'); - } - let fontDict = this._root.data.AcroForm.data.DR.Font; - Object.keys(this._acroform.fonts).forEach(name => { - fontDict[name] = this._acroform.fonts[name]; - }); - this._root.data.AcroForm.data.Fields.forEach(fieldRef => { - this._endChild(fieldRef); - }); - this._root.data.AcroForm.end(); - } - return this; - }, - _endChild(ref) { - if (Array.isArray(ref.data.Kids)) { - ref.data.Kids.forEach(childRef => { - this._endChild(childRef); - }); - ref.end(); - } - return this; - }, - /** - * Creates and adds a form field to the document. Form fields are intermediate - * nodes in a PDF form that are used to specify form name heirarchy and form - * value defaults. - * @param {string} name - field name (T attribute in field dictionary) - * @param {object} options - other attributes to include in field dictionary - */ - formField(name, options) { - if (options === void 0) { - options = {}; - } - let fieldDict = this._fieldDict(name, null, options); - let fieldRef = this.ref(fieldDict); - this._addToParent(fieldRef); - return fieldRef; - }, - /** - * Creates and adds a Form Annotation to the document. Form annotations are - * called Widget annotations internally within a PDF file. - * @param {string} name - form field name (T attribute of widget annotation - * dictionary) - * @param {number} x - * @param {number} y - * @param {number} w - * @param {number} h - * @param {object} options - */ - formAnnotation(name, type, x, y, w, h, options) { - if (options === void 0) { - options = {}; - } - let fieldDict = this._fieldDict(name, type, options); - fieldDict.Subtype = 'Widget'; - if (fieldDict.F === undefined) { - fieldDict.F = 4; // print the annotation - } - - // Add Field annot to page, and get it's ref - this.annotate(x, y, w, h, fieldDict); - let annotRef = this.page.annotations[this.page.annotations.length - 1]; - return this._addToParent(annotRef); - }, - formText(name, x, y, w, h, options) { - if (options === void 0) { - options = {}; - } - return this.formAnnotation(name, 'text', x, y, w, h, options); - }, - formPushButton(name, x, y, w, h, options) { - if (options === void 0) { - options = {}; - } - return this.formAnnotation(name, 'pushButton', x, y, w, h, options); - }, - formCombo(name, x, y, w, h, options) { - if (options === void 0) { - options = {}; - } - return this.formAnnotation(name, 'combo', x, y, w, h, options); - }, - formList(name, x, y, w, h, options) { - if (options === void 0) { - options = {}; - } - return this.formAnnotation(name, 'list', x, y, w, h, options); - }, - formRadioButton(name, x, y, w, h, options) { - if (options === void 0) { - options = {}; - } - return this.formAnnotation(name, 'radioButton', x, y, w, h, options); - }, - formCheckbox(name, x, y, w, h, options) { - if (options === void 0) { - options = {}; - } - return this.formAnnotation(name, 'checkbox', x, y, w, h, options); - }, - _addToParent(fieldRef) { - let parent = fieldRef.data.Parent; - if (parent) { - if (!parent.data.Kids) { - parent.data.Kids = []; - } - parent.data.Kids.push(fieldRef); - } else { - this._root.data.AcroForm.data.Fields.push(fieldRef); - } - return this; - }, - _fieldDict(name, type, options) { - if (options === void 0) { - options = {}; - } - if (!this._acroform) { - throw new Error('Call document.initForm() method before adding form elements to document'); - } - let opts = Object.assign({}, options); - if (type !== null) { - opts = this._resolveType(type, options); - } - opts = this._resolveFlags(opts); - opts = this._resolveJustify(opts); - opts = this._resolveFont(opts); - opts = this._resolveStrings(opts); - opts = this._resolveColors(opts); - opts = this._resolveFormat(opts); - opts.T = new String(name); - if (opts.parent) { - opts.Parent = opts.parent; - delete opts.parent; - } - return opts; - }, - _resolveType(type, opts) { - if (type === 'text') { - opts.FT = 'Tx'; - } else if (type === 'pushButton') { - opts.FT = 'Btn'; - opts.pushButton = true; - } else if (type === 'radioButton') { - opts.FT = 'Btn'; - opts.radioButton = true; - } else if (type === 'checkbox') { - opts.FT = 'Btn'; - } else if (type === 'combo') { - opts.FT = 'Ch'; - opts.combo = true; - } else if (type === 'list') { - opts.FT = 'Ch'; - } else { - throw new Error(`Invalid form annotation type '${type}'`); - } - return opts; - }, - _resolveFormat(opts) { - const f = opts.format; - if (f && f.type) { - let fnKeystroke; - let fnFormat; - let params = ''; - if (FORMAT_SPECIAL[f.type] !== undefined) { - fnKeystroke = `AFSpecial_Keystroke`; - fnFormat = `AFSpecial_Format`; - params = FORMAT_SPECIAL[f.type]; - } else { - let format = f.type.charAt(0).toUpperCase() + f.type.slice(1); - fnKeystroke = `AF${format}_Keystroke`; - fnFormat = `AF${format}_Format`; - if (f.type === 'date') { - fnKeystroke += 'Ex'; - params = String(f.param); - } else if (f.type === 'time') { - params = String(f.param); - } else if (f.type === 'number') { - let p = Object.assign({}, FORMAT_DEFAULT.number, f); - params = String([String(p.nDec), p.sepComma ? '0' : '1', '"' + p.negStyle + '"', 'null', '"' + p.currency + '"', String(p.currencyPrepend)].join(',')); - } else if (f.type === 'percent') { - let p = Object.assign({}, FORMAT_DEFAULT.percent, f); - params = String([String(p.nDec), p.sepComma ? '0' : '1'].join(',')); - } - } - opts.AA = opts.AA ? opts.AA : {}; - opts.AA.K = { - S: 'JavaScript', - JS: new String(`${fnKeystroke}(${params});`) - }; - opts.AA.F = { - S: 'JavaScript', - JS: new String(`${fnFormat}(${params});`) - }; - } - delete opts.format; - return opts; - }, - _resolveColors(opts) { - let color = this._normalizeColor(opts.backgroundColor); - if (color) { - if (!opts.MK) { - opts.MK = {}; - } - opts.MK.BG = color; - } - color = this._normalizeColor(opts.borderColor); - if (color) { - if (!opts.MK) { - opts.MK = {}; - } - opts.MK.BC = color; - } - delete opts.backgroundColor; - delete opts.borderColor; - return opts; - }, - _resolveFlags(options) { - let result = 0; - Object.keys(options).forEach(key => { - if (FIELD_FLAGS[key]) { - if (options[key]) { - result |= FIELD_FLAGS[key]; - } - delete options[key]; - } - }); - if (result !== 0) { - options.Ff = options.Ff ? options.Ff : 0; - options.Ff |= result; - } - return options; - }, - _resolveJustify(options) { - let result = 0; - if (options.align !== undefined) { - if (typeof FIELD_JUSTIFY[options.align] === 'number') { - result = FIELD_JUSTIFY[options.align]; - } - delete options.align; - } - if (result !== 0) { - options.Q = result; // default - } - return options; - }, - _resolveFont(options) { - // add current font to document-level AcroForm dict if necessary - if (this._acroform.fonts[this._font.id] == null) { - this._acroform.fonts[this._font.id] = this._font.ref(); - } - - // add current font to field's resource dict (RD) if not the default acroform font - if (this._acroform.defaultFont !== this._font.name) { - options.DR = { - Font: {} - }; - - // Get the fontSize option. If not set use auto sizing - const fontSize = options.fontSize || 0; - options.DR.Font[this._font.id] = this._font.ref(); - options.DA = new String(`/${this._font.id} ${fontSize} Tf 0 g`); - } - return options; - }, - _resolveStrings(options) { - let select = []; - function appendChoices(a) { - if (Array.isArray(a)) { - for (let idx = 0; idx < a.length; idx++) { - if (typeof a[idx] === 'string') { - select.push(new String(a[idx])); - } else { - select.push(a[idx]); - } - } - } - } - appendChoices(options.Opt); - if (options.select) { - appendChoices(options.select); - delete options.select; - } - if (select.length) { - options.Opt = select; - } - Object.keys(VALUE_MAP).forEach(key => { - if (options[key] !== undefined) { - options[VALUE_MAP[key]] = options[key]; - delete options[key]; - } - }); - ['V', 'DV'].forEach(key => { - if (typeof options[key] === 'string') { - options[key] = new String(options[key]); - } - }); - if (options.MK && options.MK.CA) { - options.MK.CA = new String(options.MK.CA); - } - if (options.label) { - options.MK = options.MK ? options.MK : {}; - options.MK.CA = new String(options.label); - delete options.label; - } - return options; - } -}; - -var AttachmentsMixin = { - /** - * Embed contents of `src` in PDF - * @param {Buffer | ArrayBuffer | string} src input Buffer, ArrayBuffer, base64 encoded string or path to file - * @param {object} options - * * options.name: filename to be shown in PDF, will use `src` if none set - * * options.type: filetype to be shown in PDF - * * options.description: description to be shown in PDF - * * options.hidden: if true, do not add attachment to EmbeddedFiles dictionary. Useful for file attachment annotations - * * options.creationDate: override creation date - * * options.modifiedDate: override modified date - * * options.relationship: Relationship between the PDF document and its attached file. Can be 'Alternative', 'Data', 'Source', 'Supplement' or 'Unspecified'. - * @returns filespec reference - */ - file(src, options) { - if (options === void 0) { - options = {}; - } - options.name = options.name || src; - options.relationship = options.relationship || 'Unspecified'; - const refBody = { - Type: 'EmbeddedFile', - Params: {} - }; - let data; - if (!src) { - throw new Error('No src specified'); - } - if (Buffer.isBuffer(src)) { - data = src; - } else if (src instanceof ArrayBuffer) { - data = Buffer.from(new Uint8Array(src)); - } else { - let match; - if (match = /^data:(.*?);base64,(.*)$/.exec(src)) { - if (match[1]) { - refBody.Subtype = match[1].replace('/', '#2F'); - } - data = Buffer.from(match[2], 'base64'); - } else { - data = fs.readFileSync(src); - if (!data) { - throw new Error(`Could not read contents of file at filepath ${src}`); - } - - // update CreationDate and ModDate - const { - birthtime, - ctime - } = fs.statSync(src); - refBody.Params.CreationDate = birthtime; - refBody.Params.ModDate = ctime; - } - } - - // override creation date and modified date - if (options.creationDate instanceof Date) { - refBody.Params.CreationDate = options.creationDate; - } - if (options.modifiedDate instanceof Date) { - refBody.Params.ModDate = options.modifiedDate; - } - // add optional subtype - if (options.type) { - refBody.Subtype = options.type.replace('/', '#2F'); - } - - // add checksum and size information - const checksum = md5Hex(new Uint8Array(data)); - refBody.Params.CheckSum = new String(checksum); - refBody.Params.Size = data.byteLength; - - // save some space when embedding the same file again - // if a file with the same name and metadata exists, reuse its reference - let ref; - if (!this._fileRegistry) this._fileRegistry = {}; - let file = this._fileRegistry[options.name]; - if (file && isEqual(refBody, file)) { - ref = file.ref; - } else { - ref = this.ref(refBody); - ref.end(data); - this._fileRegistry[options.name] = { - ...refBody, - ref - }; - } - // add filespec for embedded file - const fileSpecBody = { - Type: 'Filespec', - AFRelationship: options.relationship, - F: new String(options.name), - EF: { - F: ref - }, - UF: new String(options.name) - }; - if (options.description) { - fileSpecBody.Desc = new String(options.description); - } - const filespec = this.ref(fileSpecBody); - filespec.end(); - if (!options.hidden) { - this.addNamedEmbeddedFile(options.name, filespec); - } - - // Add file to the catalogue to be PDF/A3 compliant - if (this._root.data.AF) { - this._root.data.AF.push(filespec); - } else { - this._root.data.AF = [filespec]; - } - return filespec; - } -}; - -/** check two embedded file metadata objects for equality */ -function isEqual(a, b) { - return a.Subtype === b.Subtype && a.Params.CheckSum.toString() === b.Params.CheckSum.toString() && a.Params.Size === b.Params.Size && a.Params.CreationDate.getTime() === b.Params.CreationDate.getTime() && (a.Params.ModDate === undefined && b.Params.ModDate === undefined || a.Params.ModDate.getTime() === b.Params.ModDate.getTime()); -} - -var PDFA = { - initPDFA(pSubset) { - if (pSubset.charAt(pSubset.length - 3) === '-') { - this.subset_conformance = pSubset.charAt(pSubset.length - 1).toUpperCase(); - this.subset = parseInt(pSubset.charAt(pSubset.length - 2)); - } else { - // Default to Basic conformance when user doesn't specify - this.subset_conformance = 'B'; - this.subset = parseInt(pSubset.charAt(pSubset.length - 1)); - } - }, - endSubset() { - this._addPdfaMetadata(); - this._addColorOutputIntent(); - }, - _addColorOutputIntent() { - const iccProfile = fs.readFileSync(`${__dirname}/data/sRGB_IEC61966_2_1.icc`); - const colorProfileRef = this.ref({ - Length: iccProfile.length, - N: 3 - }); - colorProfileRef.write(iccProfile); - colorProfileRef.end(); - const intentRef = this.ref({ - Type: 'OutputIntent', - S: 'GTS_PDFA1', - Info: new String('sRGB IEC61966-2.1'), - OutputConditionIdentifier: new String('sRGB IEC61966-2.1'), - DestOutputProfile: colorProfileRef - }); - intentRef.end(); - this._root.data.OutputIntents = [intentRef]; - }, - _getPdfaid() { - return ` - - ${this.subset} - ${this.subset_conformance} - - `; - }, - _addPdfaMetadata() { - this.appendXML(this._getPdfaid()); - } -}; - -var PDFUA = { - initPDFUA() { - this.subset = 1; - }, - endSubset() { - this._addPdfuaMetadata(); - }, - _addPdfuaMetadata() { - this.appendXML(this._getPdfuaid()); - }, - _getPdfuaid() { - return ` - - ${this.subset} - - `; - } -}; - -var SubsetMixin = { - _importSubset(subset) { - Object.assign(this, subset); - }, - initSubset(options) { - switch (options.subset) { - case 'PDF/A-1': - case 'PDF/A-1a': - case 'PDF/A-1b': - case 'PDF/A-2': - case 'PDF/A-2a': - case 'PDF/A-2b': - case 'PDF/A-3': - case 'PDF/A-3a': - case 'PDF/A-3b': - this._importSubset(PDFA); - this.initPDFA(options.subset); - break; - case 'PDF/UA': - this._importSubset(PDFUA); - this.initPDFUA(); - break; - } - } -}; - -class PDFMetadata { - constructor() { - this._metadata = ` - - - - `; - } - _closeTags() { - this._metadata = this._metadata.concat(` - - - - `); - } - append(xml, newline) { - if (newline === void 0) { - newline = true; - } - this._metadata = this._metadata.concat(xml); - if (newline) this._metadata = this._metadata.concat('\n'); - } - getXML() { - return this._metadata; - } - getLength() { - return this._metadata.length; - } - end() { - this._closeTags(); - this._metadata = this._metadata.trim(); - } -} - -var MetadataMixin = { - initMetadata() { - this.metadata = new PDFMetadata(); - }, - appendXML(xml, newline) { - if (newline === void 0) { - newline = true; - } - this.metadata.append(xml, newline); - }, - _addInfo() { - this.appendXML(` - - ${this.info.CreationDate.toISOString().split('.')[0] + 'Z'} - ${this.info.Creator} - - `); - if (this.info.Title || this.info.Author || this.info.Subject) { - this.appendXML(` - - `); - if (this.info.Title) { - this.appendXML(` - - - ${this.info.Title} - - - `); - } - if (this.info.Author) { - this.appendXML(` - - - ${this.info.Author} - - - `); - } - if (this.info.Subject) { - this.appendXML(` - - - ${this.info.Subject} - - - `); - } - this.appendXML(` - - `); - } - this.appendXML(` - - ${this.info.Creator}`, false); - if (this.info.Keywords) { - this.appendXML(` - ${this.info.Keywords}`, false); - } - this.appendXML(` - - `); - }, - endMetadata() { - this._addInfo(); - this.metadata.end(); - - /* - Metadata was introduced in PDF 1.4, so adding it to 1.3 - will likely only take up more space. - */ - if (this.version != 1.3) { - this.metadataRef = this.ref({ - length: this.metadata.getLength(), - Type: 'Metadata', - Subtype: 'XML' - }); - this.metadataRef.compress = false; - this.metadataRef.write(Buffer.from(this.metadata.getXML(), 'utf-8')); - this.metadataRef.end(); - this._root.data.Metadata = this.metadataRef; - } - } -}; - -/* -PDFDocument - represents an entire PDF document -By Devon Govett -*/ - -class PDFDocument extends stream.Readable { - constructor(options) { - if (options === void 0) { - options = {}; - } - super(options); - this.options = options; - - // PDF version - switch (options.pdfVersion) { - case '1.4': - this.version = 1.4; - break; - case '1.5': - this.version = 1.5; - break; - case '1.6': - this.version = 1.6; - break; - case '1.7': - case '1.7ext3': - this.version = 1.7; - break; - default: - this.version = 1.3; - break; - } - - // Whether streams should be compressed - this.compress = this.options.compress != null ? this.options.compress : true; - this._pageBuffer = []; - this._pageBufferStart = 0; - - // The PDF object store - this._offsets = []; - this._waiting = 0; - this._ended = false; - this._offset = 0; - const Pages = this.ref({ - Type: 'Pages', - Count: 0, - Kids: [] - }); - const Names = this.ref({ - Dests: new PDFNameTree() - }); - this._root = this.ref({ - Type: 'Catalog', - Pages, - Names - }); - if (this.options.lang) { - this._root.data.Lang = new String(this.options.lang); - } - - // The current page - this.page = null; - - // Initialize mixins - this.initMetadata(); - this.initColor(); - this.initVector(); - this.initFonts(options.font); - this.initText(); - this.initImages(); - this.initOutline(); - this.initMarkings(options); - this.initSubset(options); - - // Initialize the metadata - this.info = { - Producer: 'PDFKit', - Creator: 'PDFKit', - CreationDate: new Date() - }; - if (this.options.info) { - for (let key in this.options.info) { - const val = this.options.info[key]; - this.info[key] = val; - } - } - if (this.options.displayTitle) { - this._root.data.ViewerPreferences = this.ref({ - DisplayDocTitle: true - }); - } - - // Generate file ID - this._id = PDFSecurity.generateFileID(this.info); - - // Initialize security settings - this._security = PDFSecurity.create(this, options); - - // Write the header - // PDF version - this._write(`%PDF-${this.version}`); - - // 4 binary chars, as recommended by the spec - this._write('%\xFF\xFF\xFF\xFF'); - - // Add the first page - if (this.options.autoFirstPage !== false) { - this.addPage(); - } - } - addPage(options) { - if (options == null) { - ({ - options - } = this); - } - - // end the current page if needed - if (!this.options.bufferPages) { - this.flushPages(); - } - - // create a page object - this.page = new PDFPage(this, options); - this._pageBuffer.push(this.page); - - // add the page to the object store - const pages = this._root.data.Pages.data; - pages.Kids.push(this.page.dictionary); - pages.Count++; - - // reset x and y coordinates - this.x = this.page.margins.left; - this.y = this.page.margins.top; - - // flip PDF coordinate system so that the origin is in - // the top left rather than the bottom left - this._ctm = [1, 0, 0, 1, 0, 0]; - this.transform(1, 0, 0, -1, 0, this.page.height); - this.emit('pageAdded'); - return this; - } - continueOnNewPage(options) { - const pageMarkings = this.endPageMarkings(this.page); - this.addPage(options !== null && options !== void 0 ? options : this.page._options); - this.initPageMarkings(pageMarkings); - return this; - } - bufferedPageRange() { - return { - start: this._pageBufferStart, - count: this._pageBuffer.length - }; - } - switchToPage(n) { - let page; - if (!(page = this._pageBuffer[n - this._pageBufferStart])) { - throw new Error(`switchToPage(${n}) out of bounds, current buffer covers pages ${this._pageBufferStart} to ${this._pageBufferStart + this._pageBuffer.length - 1}`); - } - return this.page = page; - } - flushPages() { - // this local variable exists so we're future-proof against - // reentrant calls to flushPages. - const pages = this._pageBuffer; - this._pageBuffer = []; - this._pageBufferStart += pages.length; - for (let page of pages) { - this.endPageMarkings(page); - page.end(); - } - } - addNamedDestination(name) { - for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - args[_key - 1] = arguments[_key]; - } - if (args.length === 0) { - args = ['XYZ', null, null, null]; - } - if (args[0] === 'XYZ' && args[2] !== null) { - args[2] = this.page.height - args[2]; - } - args.unshift(this.page.dictionary); - this._root.data.Names.data.Dests.add(name, args); - } - addNamedEmbeddedFile(name, ref) { - if (!this._root.data.Names.data.EmbeddedFiles) { - // disabling /Limits for this tree fixes attachments not showing in Adobe Reader - this._root.data.Names.data.EmbeddedFiles = new PDFNameTree({ - limits: false - }); - } - - // add filespec to EmbeddedFiles - this._root.data.Names.data.EmbeddedFiles.add(name, ref); - } - addNamedJavaScript(name, js) { - if (!this._root.data.Names.data.JavaScript) { - this._root.data.Names.data.JavaScript = new PDFNameTree(); - } - let data = { - JS: new String(js), - S: 'JavaScript' - }; - this._root.data.Names.data.JavaScript.add(name, data); - } - ref(data) { - const ref = new PDFReference(this, this._offsets.length + 1, data); - this._offsets.push(null); // placeholder for this object's offset once it is finalized - this._waiting++; - return ref; - } - _read() {} - // do nothing, but this method is required by node - - _write(data) { - if (!Buffer.isBuffer(data)) { - data = Buffer.from(data + '\n', 'binary'); - } - this.push(data); - return this._offset += data.length; - } - addContent(data) { - this.page.write(data); - return this; - } - _refEnd(ref) { - this._offsets[ref.id - 1] = ref.offset; - if (--this._waiting === 0 && this._ended) { - this._finalize(); - return this._ended = false; - } - } - end() { - this.flushPages(); - this._info = this.ref(); - for (let key in this.info) { - let val = this.info[key]; - if (typeof val === 'string') { - val = new String(val); - } - let entry = this.ref(val); - entry.end(); - this._info.data[key] = entry; - } - this._info.end(); - for (let name in this._fontFamilies) { - const font = this._fontFamilies[name]; - font.finalize(); - } - this.endOutline(); - this.endMarkings(); - if (this.subset) { - this.endSubset(); - } - this.endMetadata(); - this._root.end(); - this._root.data.Pages.end(); - this._root.data.Names.end(); - this.endAcroForm(); - if (this._root.data.ViewerPreferences) { - this._root.data.ViewerPreferences.end(); - } - if (this._security) { - this._security.end(); - } - if (this._waiting === 0) { - return this._finalize(); - } else { - return this._ended = true; - } - } - _finalize() { - // generate xref - const xRefOffset = this._offset; - this._write('xref'); - this._write(`0 ${this._offsets.length + 1}`); - this._write('0000000000 65535 f '); - for (let offset of this._offsets) { - offset = `0000000000${offset}`.slice(-10); - this._write(offset + ' 00000 n '); - } - - // trailer - const trailer = { - Size: this._offsets.length + 1, - Root: this._root, - Info: this._info, - ID: [this._id, this._id] - }; - if (this._security) { - trailer.Encrypt = this._security.dictionary; - } - this._write('trailer'); - this._write(PDFObject.convert(trailer)); - this._write('startxref'); - this._write(`${xRefOffset}`); - this._write('%%EOF'); - - // end the stream - return this.push(null); - } - toString() { - return '[object PDFDocument]'; - } -} -const mixin = methods => { - Object.assign(PDFDocument.prototype, methods); -}; -mixin(MetadataMixin); -mixin(ColorMixin); -mixin(VectorMixin); -mixin(FontsMixin); -mixin(TextMixin); -mixin(ImagesMixin); -mixin(AnnotationsMixin); -mixin(OutlineMixin); -mixin(MarkingsMixin); -mixin(AcroFormMixin); -mixin(AttachmentsMixin); -mixin(SubsetMixin); -PDFDocument.LineWrapper = LineWrapper; - -export { PDFDocument as default }; diff --git a/packages/pdfkit/src/font/data/Courier-Bold.json b/packages/pdfkit/src/font/data/Courier-Bold.json deleted file mode 100644 index 6d92eef87..000000000 --- a/packages/pdfkit/src/font/data/Courier-Bold.json +++ /dev/null @@ -1 +0,0 @@ -{"attributes":{"Comment":["Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.","Creation Date: Mon Jun 23 16:28:00 1997","UniqueID 43048","VMusage 41139 52164"],"FontName":"Courier-Bold","FullName":"Courier Bold","FamilyName":"Courier","Weight":"Bold","ItalicAngle":"0","IsFixedPitch":"true","CharacterSet":"ExtendedRoman","FontBBox":"-113 -250 749 801 ","UnderlinePosition":"-100","UnderlineThickness":"50","Version":"003.000","Notice":"Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.","EncodingScheme":"AdobeStandardEncoding","CapHeight":"562","XHeight":"439","Ascender":"629","Descender":"-157","StdHW":"84","StdVW":"106"},"glyphWidths":{"space":600,"exclam":600,"quotedbl":600,"numbersign":600,"dollar":600,"percent":600,"ampersand":600,"quoteright":600,"parenleft":600,"parenright":600,"asterisk":600,"plus":600,"comma":600,"hyphen":600,"period":600,"slash":600,"zero":600,"one":600,"two":600,"three":600,"four":600,"five":600,"six":600,"seven":600,"eight":600,"nine":600,"colon":600,"semicolon":600,"less":600,"equal":600,"greater":600,"question":600,"at":600,"A":600,"B":600,"C":600,"D":600,"E":600,"F":600,"G":600,"H":600,"I":600,"J":600,"K":600,"L":600,"M":600,"N":600,"O":600,"P":600,"Q":600,"R":600,"S":600,"T":600,"U":600,"V":600,"W":600,"X":600,"Y":600,"Z":600,"bracketleft":600,"backslash":600,"bracketright":600,"asciicircum":600,"underscore":600,"quoteleft":600,"a":600,"b":600,"c":600,"d":600,"e":600,"f":600,"g":600,"h":600,"i":600,"j":600,"k":600,"l":600,"m":600,"n":600,"o":600,"p":600,"q":600,"r":600,"s":600,"t":600,"u":600,"v":600,"w":600,"x":600,"y":600,"z":600,"braceleft":600,"bar":600,"braceright":600,"asciitilde":600,"exclamdown":600,"cent":600,"sterling":600,"fraction":600,"yen":600,"florin":600,"section":600,"currency":600,"quotesingle":600,"quotedblleft":600,"guillemotleft":600,"guilsinglleft":600,"guilsinglright":600,"fi":600,"fl":600,"endash":600,"dagger":600,"daggerdbl":600,"periodcentered":600,"paragraph":600,"bullet":600,"quotesinglbase":600,"quotedblbase":600,"quotedblright":600,"guillemotright":600,"ellipsis":600,"perthousand":600,"questiondown":600,"grave":600,"acute":600,"circumflex":600,"tilde":600,"macron":600,"breve":600,"dotaccent":600,"dieresis":600,"ring":600,"cedilla":600,"hungarumlaut":600,"ogonek":600,"caron":600,"emdash":600,"AE":600,"ordfeminine":600,"Lslash":600,"Oslash":600,"OE":600,"ordmasculine":600,"ae":600,"dotlessi":600,"lslash":600,"oslash":600,"oe":600,"germandbls":600,"Idieresis":600,"eacute":600,"abreve":600,"uhungarumlaut":600,"ecaron":600,"Ydieresis":600,"divide":600,"Yacute":600,"Acircumflex":600,"aacute":600,"Ucircumflex":600,"yacute":600,"scommaaccent":600,"ecircumflex":600,"Uring":600,"Udieresis":600,"aogonek":600,"Uacute":600,"uogonek":600,"Edieresis":600,"Dcroat":600,"commaaccent":600,"copyright":600,"Emacron":600,"ccaron":600,"aring":600,"Ncommaaccent":600,"lacute":600,"agrave":600,"Tcommaaccent":600,"Cacute":600,"atilde":600,"Edotaccent":600,"scaron":600,"scedilla":600,"iacute":600,"lozenge":600,"Rcaron":600,"Gcommaaccent":600,"ucircumflex":600,"acircumflex":600,"Amacron":600,"rcaron":600,"ccedilla":600,"Zdotaccent":600,"Thorn":600,"Omacron":600,"Racute":600,"Sacute":600,"dcaron":600,"Umacron":600,"uring":600,"threesuperior":600,"Ograve":600,"Agrave":600,"Abreve":600,"multiply":600,"uacute":600,"Tcaron":600,"partialdiff":600,"ydieresis":600,"Nacute":600,"icircumflex":600,"Ecircumflex":600,"adieresis":600,"edieresis":600,"cacute":600,"nacute":600,"umacron":600,"Ncaron":600,"Iacute":600,"plusminus":600,"brokenbar":600,"registered":600,"Gbreve":600,"Idotaccent":600,"summation":600,"Egrave":600,"racute":600,"omacron":600,"Zacute":600,"Zcaron":600,"greaterequal":600,"Eth":600,"Ccedilla":600,"lcommaaccent":600,"tcaron":600,"eogonek":600,"Uogonek":600,"Aacute":600,"Adieresis":600,"egrave":600,"zacute":600,"iogonek":600,"Oacute":600,"oacute":600,"amacron":600,"sacute":600,"idieresis":600,"Ocircumflex":600,"Ugrave":600,"Delta":600,"thorn":600,"twosuperior":600,"Odieresis":600,"mu":600,"igrave":600,"ohungarumlaut":600,"Eogonek":600,"dcroat":600,"threequarters":600,"Scedilla":600,"lcaron":600,"Kcommaaccent":600,"Lacute":600,"trademark":600,"edotaccent":600,"Igrave":600,"Imacron":600,"Lcaron":600,"onehalf":600,"lessequal":600,"ocircumflex":600,"ntilde":600,"Uhungarumlaut":600,"Eacute":600,"emacron":600,"gbreve":600,"onequarter":600,"Scaron":600,"Scommaaccent":600,"Ohungarumlaut":600,"degree":600,"ograve":600,"Ccaron":600,"ugrave":600,"radical":600,"Dcaron":600,"rcommaaccent":600,"Ntilde":600,"otilde":600,"Rcommaaccent":600,"Lcommaaccent":600,"Atilde":600,"Aogonek":600,"Aring":600,"Otilde":600,"zdotaccent":600,"Ecaron":600,"Iogonek":600,"kcommaaccent":600,"minus":600,"Icircumflex":600,"ncaron":600,"tcommaaccent":600,"logicalnot":600,"odieresis":600,"udieresis":600,"notequal":600,"gcommaaccent":600,"eth":600,"zcaron":600,"ncommaaccent":600,"onesuperior":600,"imacron":600,"Euro":600},"kernPairs":{}} \ No newline at end of file diff --git a/packages/pdfkit/src/font/data/Courier-BoldOblique.json b/packages/pdfkit/src/font/data/Courier-BoldOblique.json deleted file mode 100644 index 573043642..000000000 --- a/packages/pdfkit/src/font/data/Courier-BoldOblique.json +++ /dev/null @@ -1 +0,0 @@ -{"attributes":{"Comment":["Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.","Creation Date: Mon Jun 23 16:28:46 1997","UniqueID 43049","VMusage 17529 79244"],"FontName":"Courier-BoldOblique","FullName":"Courier Bold Oblique","FamilyName":"Courier","Weight":"Bold","ItalicAngle":"-12","IsFixedPitch":"true","CharacterSet":"ExtendedRoman","FontBBox":"-57 -250 869 801","UnderlinePosition":"-100","UnderlineThickness":"50","Version":"003.000","Notice":"Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.","EncodingScheme":"AdobeStandardEncoding","CapHeight":"562","XHeight":"439","Ascender":"629","Descender":"-157","StdHW":"84","StdVW":"106"},"glyphWidths":{"space":600,"exclam":600,"quotedbl":600,"numbersign":600,"dollar":600,"percent":600,"ampersand":600,"quoteright":600,"parenleft":600,"parenright":600,"asterisk":600,"plus":600,"comma":600,"hyphen":600,"period":600,"slash":600,"zero":600,"one":600,"two":600,"three":600,"four":600,"five":600,"six":600,"seven":600,"eight":600,"nine":600,"colon":600,"semicolon":600,"less":600,"equal":600,"greater":600,"question":600,"at":600,"A":600,"B":600,"C":600,"D":600,"E":600,"F":600,"G":600,"H":600,"I":600,"J":600,"K":600,"L":600,"M":600,"N":600,"O":600,"P":600,"Q":600,"R":600,"S":600,"T":600,"U":600,"V":600,"W":600,"X":600,"Y":600,"Z":600,"bracketleft":600,"backslash":600,"bracketright":600,"asciicircum":600,"underscore":600,"quoteleft":600,"a":600,"b":600,"c":600,"d":600,"e":600,"f":600,"g":600,"h":600,"i":600,"j":600,"k":600,"l":600,"m":600,"n":600,"o":600,"p":600,"q":600,"r":600,"s":600,"t":600,"u":600,"v":600,"w":600,"x":600,"y":600,"z":600,"braceleft":600,"bar":600,"braceright":600,"asciitilde":600,"exclamdown":600,"cent":600,"sterling":600,"fraction":600,"yen":600,"florin":600,"section":600,"currency":600,"quotesingle":600,"quotedblleft":600,"guillemotleft":600,"guilsinglleft":600,"guilsinglright":600,"fi":600,"fl":600,"endash":600,"dagger":600,"daggerdbl":600,"periodcentered":600,"paragraph":600,"bullet":600,"quotesinglbase":600,"quotedblbase":600,"quotedblright":600,"guillemotright":600,"ellipsis":600,"perthousand":600,"questiondown":600,"grave":600,"acute":600,"circumflex":600,"tilde":600,"macron":600,"breve":600,"dotaccent":600,"dieresis":600,"ring":600,"cedilla":600,"hungarumlaut":600,"ogonek":600,"caron":600,"emdash":600,"AE":600,"ordfeminine":600,"Lslash":600,"Oslash":600,"OE":600,"ordmasculine":600,"ae":600,"dotlessi":600,"lslash":600,"oslash":600,"oe":600,"germandbls":600,"Idieresis":600,"eacute":600,"abreve":600,"uhungarumlaut":600,"ecaron":600,"Ydieresis":600,"divide":600,"Yacute":600,"Acircumflex":600,"aacute":600,"Ucircumflex":600,"yacute":600,"scommaaccent":600,"ecircumflex":600,"Uring":600,"Udieresis":600,"aogonek":600,"Uacute":600,"uogonek":600,"Edieresis":600,"Dcroat":600,"commaaccent":600,"copyright":600,"Emacron":600,"ccaron":600,"aring":600,"Ncommaaccent":600,"lacute":600,"agrave":600,"Tcommaaccent":600,"Cacute":600,"atilde":600,"Edotaccent":600,"scaron":600,"scedilla":600,"iacute":600,"lozenge":600,"Rcaron":600,"Gcommaaccent":600,"ucircumflex":600,"acircumflex":600,"Amacron":600,"rcaron":600,"ccedilla":600,"Zdotaccent":600,"Thorn":600,"Omacron":600,"Racute":600,"Sacute":600,"dcaron":600,"Umacron":600,"uring":600,"threesuperior":600,"Ograve":600,"Agrave":600,"Abreve":600,"multiply":600,"uacute":600,"Tcaron":600,"partialdiff":600,"ydieresis":600,"Nacute":600,"icircumflex":600,"Ecircumflex":600,"adieresis":600,"edieresis":600,"cacute":600,"nacute":600,"umacron":600,"Ncaron":600,"Iacute":600,"plusminus":600,"brokenbar":600,"registered":600,"Gbreve":600,"Idotaccent":600,"summation":600,"Egrave":600,"racute":600,"omacron":600,"Zacute":600,"Zcaron":600,"greaterequal":600,"Eth":600,"Ccedilla":600,"lcommaaccent":600,"tcaron":600,"eogonek":600,"Uogonek":600,"Aacute":600,"Adieresis":600,"egrave":600,"zacute":600,"iogonek":600,"Oacute":600,"oacute":600,"amacron":600,"sacute":600,"idieresis":600,"Ocircumflex":600,"Ugrave":600,"Delta":600,"thorn":600,"twosuperior":600,"Odieresis":600,"mu":600,"igrave":600,"ohungarumlaut":600,"Eogonek":600,"dcroat":600,"threequarters":600,"Scedilla":600,"lcaron":600,"Kcommaaccent":600,"Lacute":600,"trademark":600,"edotaccent":600,"Igrave":600,"Imacron":600,"Lcaron":600,"onehalf":600,"lessequal":600,"ocircumflex":600,"ntilde":600,"Uhungarumlaut":600,"Eacute":600,"emacron":600,"gbreve":600,"onequarter":600,"Scaron":600,"Scommaaccent":600,"Ohungarumlaut":600,"degree":600,"ograve":600,"Ccaron":600,"ugrave":600,"radical":600,"Dcaron":600,"rcommaaccent":600,"Ntilde":600,"otilde":600,"Rcommaaccent":600,"Lcommaaccent":600,"Atilde":600,"Aogonek":600,"Aring":600,"Otilde":600,"zdotaccent":600,"Ecaron":600,"Iogonek":600,"kcommaaccent":600,"minus":600,"Icircumflex":600,"ncaron":600,"tcommaaccent":600,"logicalnot":600,"odieresis":600,"udieresis":600,"notequal":600,"gcommaaccent":600,"eth":600,"zcaron":600,"ncommaaccent":600,"onesuperior":600,"imacron":600,"Euro":600},"kernPairs":{}} \ No newline at end of file diff --git a/packages/pdfkit/src/font/data/Courier-Oblique.json b/packages/pdfkit/src/font/data/Courier-Oblique.json deleted file mode 100644 index 99903e3b4..000000000 --- a/packages/pdfkit/src/font/data/Courier-Oblique.json +++ /dev/null @@ -1 +0,0 @@ -{"attributes":{"Comment":["Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.","Creation Date: Thu May 1 17:37:52 1997","UniqueID 43051","VMusage 16248 75829"],"FontName":"Courier-Oblique","FullName":"Courier Oblique","FamilyName":"Courier","Weight":"Medium","ItalicAngle":"-12","IsFixedPitch":"true","CharacterSet":"ExtendedRoman","FontBBox":"-27 -250 849 805 ","UnderlinePosition":"-100","UnderlineThickness":"50","Version":"003.000","Notice":"Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.","EncodingScheme":"AdobeStandardEncoding","CapHeight":"562","XHeight":"426","Ascender":"629","Descender":"-157","StdHW":"51","StdVW":"51"},"glyphWidths":{"space":600,"exclam":600,"quotedbl":600,"numbersign":600,"dollar":600,"percent":600,"ampersand":600,"quoteright":600,"parenleft":600,"parenright":600,"asterisk":600,"plus":600,"comma":600,"hyphen":600,"period":600,"slash":600,"zero":600,"one":600,"two":600,"three":600,"four":600,"five":600,"six":600,"seven":600,"eight":600,"nine":600,"colon":600,"semicolon":600,"less":600,"equal":600,"greater":600,"question":600,"at":600,"A":600,"B":600,"C":600,"D":600,"E":600,"F":600,"G":600,"H":600,"I":600,"J":600,"K":600,"L":600,"M":600,"N":600,"O":600,"P":600,"Q":600,"R":600,"S":600,"T":600,"U":600,"V":600,"W":600,"X":600,"Y":600,"Z":600,"bracketleft":600,"backslash":600,"bracketright":600,"asciicircum":600,"underscore":600,"quoteleft":600,"a":600,"b":600,"c":600,"d":600,"e":600,"f":600,"g":600,"h":600,"i":600,"j":600,"k":600,"l":600,"m":600,"n":600,"o":600,"p":600,"q":600,"r":600,"s":600,"t":600,"u":600,"v":600,"w":600,"x":600,"y":600,"z":600,"braceleft":600,"bar":600,"braceright":600,"asciitilde":600,"exclamdown":600,"cent":600,"sterling":600,"fraction":600,"yen":600,"florin":600,"section":600,"currency":600,"quotesingle":600,"quotedblleft":600,"guillemotleft":600,"guilsinglleft":600,"guilsinglright":600,"fi":600,"fl":600,"endash":600,"dagger":600,"daggerdbl":600,"periodcentered":600,"paragraph":600,"bullet":600,"quotesinglbase":600,"quotedblbase":600,"quotedblright":600,"guillemotright":600,"ellipsis":600,"perthousand":600,"questiondown":600,"grave":600,"acute":600,"circumflex":600,"tilde":600,"macron":600,"breve":600,"dotaccent":600,"dieresis":600,"ring":600,"cedilla":600,"hungarumlaut":600,"ogonek":600,"caron":600,"emdash":600,"AE":600,"ordfeminine":600,"Lslash":600,"Oslash":600,"OE":600,"ordmasculine":600,"ae":600,"dotlessi":600,"lslash":600,"oslash":600,"oe":600,"germandbls":600,"Idieresis":600,"eacute":600,"abreve":600,"uhungarumlaut":600,"ecaron":600,"Ydieresis":600,"divide":600,"Yacute":600,"Acircumflex":600,"aacute":600,"Ucircumflex":600,"yacute":600,"scommaaccent":600,"ecircumflex":600,"Uring":600,"Udieresis":600,"aogonek":600,"Uacute":600,"uogonek":600,"Edieresis":600,"Dcroat":600,"commaaccent":600,"copyright":600,"Emacron":600,"ccaron":600,"aring":600,"Ncommaaccent":600,"lacute":600,"agrave":600,"Tcommaaccent":600,"Cacute":600,"atilde":600,"Edotaccent":600,"scaron":600,"scedilla":600,"iacute":600,"lozenge":600,"Rcaron":600,"Gcommaaccent":600,"ucircumflex":600,"acircumflex":600,"Amacron":600,"rcaron":600,"ccedilla":600,"Zdotaccent":600,"Thorn":600,"Omacron":600,"Racute":600,"Sacute":600,"dcaron":600,"Umacron":600,"uring":600,"threesuperior":600,"Ograve":600,"Agrave":600,"Abreve":600,"multiply":600,"uacute":600,"Tcaron":600,"partialdiff":600,"ydieresis":600,"Nacute":600,"icircumflex":600,"Ecircumflex":600,"adieresis":600,"edieresis":600,"cacute":600,"nacute":600,"umacron":600,"Ncaron":600,"Iacute":600,"plusminus":600,"brokenbar":600,"registered":600,"Gbreve":600,"Idotaccent":600,"summation":600,"Egrave":600,"racute":600,"omacron":600,"Zacute":600,"Zcaron":600,"greaterequal":600,"Eth":600,"Ccedilla":600,"lcommaaccent":600,"tcaron":600,"eogonek":600,"Uogonek":600,"Aacute":600,"Adieresis":600,"egrave":600,"zacute":600,"iogonek":600,"Oacute":600,"oacute":600,"amacron":600,"sacute":600,"idieresis":600,"Ocircumflex":600,"Ugrave":600,"Delta":600,"thorn":600,"twosuperior":600,"Odieresis":600,"mu":600,"igrave":600,"ohungarumlaut":600,"Eogonek":600,"dcroat":600,"threequarters":600,"Scedilla":600,"lcaron":600,"Kcommaaccent":600,"Lacute":600,"trademark":600,"edotaccent":600,"Igrave":600,"Imacron":600,"Lcaron":600,"onehalf":600,"lessequal":600,"ocircumflex":600,"ntilde":600,"Uhungarumlaut":600,"Eacute":600,"emacron":600,"gbreve":600,"onequarter":600,"Scaron":600,"Scommaaccent":600,"Ohungarumlaut":600,"degree":600,"ograve":600,"Ccaron":600,"ugrave":600,"radical":600,"Dcaron":600,"rcommaaccent":600,"Ntilde":600,"otilde":600,"Rcommaaccent":600,"Lcommaaccent":600,"Atilde":600,"Aogonek":600,"Aring":600,"Otilde":600,"zdotaccent":600,"Ecaron":600,"Iogonek":600,"kcommaaccent":600,"minus":600,"Icircumflex":600,"ncaron":600,"tcommaaccent":600,"logicalnot":600,"odieresis":600,"udieresis":600,"notequal":600,"gcommaaccent":600,"eth":600,"zcaron":600,"ncommaaccent":600,"onesuperior":600,"imacron":600,"Euro":600},"kernPairs":{}} \ No newline at end of file diff --git a/packages/pdfkit/src/font/data/Courier.json b/packages/pdfkit/src/font/data/Courier.json deleted file mode 100644 index c42acf22b..000000000 --- a/packages/pdfkit/src/font/data/Courier.json +++ /dev/null @@ -1 +0,0 @@ -{"attributes":{"Comment":["Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.","Creation Date: Thu May 1 17:27:09 1997","UniqueID 43050","VMusage 39754 50779"],"FontName":"Courier","FullName":"Courier","FamilyName":"Courier","Weight":"Medium","ItalicAngle":"0","IsFixedPitch":"true","CharacterSet":"ExtendedRoman","FontBBox":"-23 -250 715 805 ","UnderlinePosition":"-100","UnderlineThickness":"50","Version":"003.000","Notice":"Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.","EncodingScheme":"AdobeStandardEncoding","CapHeight":"562","XHeight":"426","Ascender":"629","Descender":"-157","StdHW":"51","StdVW":"51"},"glyphWidths":{"space":600,"exclam":600,"quotedbl":600,"numbersign":600,"dollar":600,"percent":600,"ampersand":600,"quoteright":600,"parenleft":600,"parenright":600,"asterisk":600,"plus":600,"comma":600,"hyphen":600,"period":600,"slash":600,"zero":600,"one":600,"two":600,"three":600,"four":600,"five":600,"six":600,"seven":600,"eight":600,"nine":600,"colon":600,"semicolon":600,"less":600,"equal":600,"greater":600,"question":600,"at":600,"A":600,"B":600,"C":600,"D":600,"E":600,"F":600,"G":600,"H":600,"I":600,"J":600,"K":600,"L":600,"M":600,"N":600,"O":600,"P":600,"Q":600,"R":600,"S":600,"T":600,"U":600,"V":600,"W":600,"X":600,"Y":600,"Z":600,"bracketleft":600,"backslash":600,"bracketright":600,"asciicircum":600,"underscore":600,"quoteleft":600,"a":600,"b":600,"c":600,"d":600,"e":600,"f":600,"g":600,"h":600,"i":600,"j":600,"k":600,"l":600,"m":600,"n":600,"o":600,"p":600,"q":600,"r":600,"s":600,"t":600,"u":600,"v":600,"w":600,"x":600,"y":600,"z":600,"braceleft":600,"bar":600,"braceright":600,"asciitilde":600,"exclamdown":600,"cent":600,"sterling":600,"fraction":600,"yen":600,"florin":600,"section":600,"currency":600,"quotesingle":600,"quotedblleft":600,"guillemotleft":600,"guilsinglleft":600,"guilsinglright":600,"fi":600,"fl":600,"endash":600,"dagger":600,"daggerdbl":600,"periodcentered":600,"paragraph":600,"bullet":600,"quotesinglbase":600,"quotedblbase":600,"quotedblright":600,"guillemotright":600,"ellipsis":600,"perthousand":600,"questiondown":600,"grave":600,"acute":600,"circumflex":600,"tilde":600,"macron":600,"breve":600,"dotaccent":600,"dieresis":600,"ring":600,"cedilla":600,"hungarumlaut":600,"ogonek":600,"caron":600,"emdash":600,"AE":600,"ordfeminine":600,"Lslash":600,"Oslash":600,"OE":600,"ordmasculine":600,"ae":600,"dotlessi":600,"lslash":600,"oslash":600,"oe":600,"germandbls":600,"Idieresis":600,"eacute":600,"abreve":600,"uhungarumlaut":600,"ecaron":600,"Ydieresis":600,"divide":600,"Yacute":600,"Acircumflex":600,"aacute":600,"Ucircumflex":600,"yacute":600,"scommaaccent":600,"ecircumflex":600,"Uring":600,"Udieresis":600,"aogonek":600,"Uacute":600,"uogonek":600,"Edieresis":600,"Dcroat":600,"commaaccent":600,"copyright":600,"Emacron":600,"ccaron":600,"aring":600,"Ncommaaccent":600,"lacute":600,"agrave":600,"Tcommaaccent":600,"Cacute":600,"atilde":600,"Edotaccent":600,"scaron":600,"scedilla":600,"iacute":600,"lozenge":600,"Rcaron":600,"Gcommaaccent":600,"ucircumflex":600,"acircumflex":600,"Amacron":600,"rcaron":600,"ccedilla":600,"Zdotaccent":600,"Thorn":600,"Omacron":600,"Racute":600,"Sacute":600,"dcaron":600,"Umacron":600,"uring":600,"threesuperior":600,"Ograve":600,"Agrave":600,"Abreve":600,"multiply":600,"uacute":600,"Tcaron":600,"partialdiff":600,"ydieresis":600,"Nacute":600,"icircumflex":600,"Ecircumflex":600,"adieresis":600,"edieresis":600,"cacute":600,"nacute":600,"umacron":600,"Ncaron":600,"Iacute":600,"plusminus":600,"brokenbar":600,"registered":600,"Gbreve":600,"Idotaccent":600,"summation":600,"Egrave":600,"racute":600,"omacron":600,"Zacute":600,"Zcaron":600,"greaterequal":600,"Eth":600,"Ccedilla":600,"lcommaaccent":600,"tcaron":600,"eogonek":600,"Uogonek":600,"Aacute":600,"Adieresis":600,"egrave":600,"zacute":600,"iogonek":600,"Oacute":600,"oacute":600,"amacron":600,"sacute":600,"idieresis":600,"Ocircumflex":600,"Ugrave":600,"Delta":600,"thorn":600,"twosuperior":600,"Odieresis":600,"mu":600,"igrave":600,"ohungarumlaut":600,"Eogonek":600,"dcroat":600,"threequarters":600,"Scedilla":600,"lcaron":600,"Kcommaaccent":600,"Lacute":600,"trademark":600,"edotaccent":600,"Igrave":600,"Imacron":600,"Lcaron":600,"onehalf":600,"lessequal":600,"ocircumflex":600,"ntilde":600,"Uhungarumlaut":600,"Eacute":600,"emacron":600,"gbreve":600,"onequarter":600,"Scaron":600,"Scommaaccent":600,"Ohungarumlaut":600,"degree":600,"ograve":600,"Ccaron":600,"ugrave":600,"radical":600,"Dcaron":600,"rcommaaccent":600,"Ntilde":600,"otilde":600,"Rcommaaccent":600,"Lcommaaccent":600,"Atilde":600,"Aogonek":600,"Aring":600,"Otilde":600,"zdotaccent":600,"Ecaron":600,"Iogonek":600,"kcommaaccent":600,"minus":600,"Icircumflex":600,"ncaron":600,"tcommaaccent":600,"logicalnot":600,"odieresis":600,"udieresis":600,"notequal":600,"gcommaaccent":600,"eth":600,"zcaron":600,"ncommaaccent":600,"onesuperior":600,"imacron":600,"Euro":600},"kernPairs":{}} \ No newline at end of file diff --git a/packages/pdfkit/src/font/data/Helvetica-Bold.json b/packages/pdfkit/src/font/data/Helvetica-Bold.json deleted file mode 100644 index 0f6921749..000000000 --- a/packages/pdfkit/src/font/data/Helvetica-Bold.json +++ /dev/null @@ -1 +0,0 @@ -{"attributes":{"Comment":["Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.","Creation Date: Thu May 1 12:43:52 1997","UniqueID 43052","VMusage 37169 48194"],"FontName":"Helvetica-Bold","FullName":"Helvetica Bold","FamilyName":"Helvetica","Weight":"Bold","ItalicAngle":"0","IsFixedPitch":"false","CharacterSet":"ExtendedRoman","FontBBox":"-170 -228 1003 962 ","UnderlinePosition":"-100","UnderlineThickness":"50","Version":"002.000","Notice":"Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries.","EncodingScheme":"AdobeStandardEncoding","CapHeight":"718","XHeight":"532","Ascender":"718","Descender":"-207","StdHW":"118","StdVW":"140"},"glyphWidths":{"space":278,"exclam":333,"quotedbl":474,"numbersign":556,"dollar":556,"percent":889,"ampersand":722,"quoteright":278,"parenleft":333,"parenright":333,"asterisk":389,"plus":584,"comma":278,"hyphen":333,"period":278,"slash":278,"zero":556,"one":556,"two":556,"three":556,"four":556,"five":556,"six":556,"seven":556,"eight":556,"nine":556,"colon":333,"semicolon":333,"less":584,"equal":584,"greater":584,"question":611,"at":975,"A":722,"B":722,"C":722,"D":722,"E":667,"F":611,"G":778,"H":722,"I":278,"J":556,"K":722,"L":611,"M":833,"N":722,"O":778,"P":667,"Q":778,"R":722,"S":667,"T":611,"U":722,"V":667,"W":944,"X":667,"Y":667,"Z":611,"bracketleft":333,"backslash":278,"bracketright":333,"asciicircum":584,"underscore":556,"quoteleft":278,"a":556,"b":611,"c":556,"d":611,"e":556,"f":333,"g":611,"h":611,"i":278,"j":278,"k":556,"l":278,"m":889,"n":611,"o":611,"p":611,"q":611,"r":389,"s":556,"t":333,"u":611,"v":556,"w":778,"x":556,"y":556,"z":500,"braceleft":389,"bar":280,"braceright":389,"asciitilde":584,"exclamdown":333,"cent":556,"sterling":556,"fraction":167,"yen":556,"florin":556,"section":556,"currency":556,"quotesingle":238,"quotedblleft":500,"guillemotleft":556,"guilsinglleft":333,"guilsinglright":333,"fi":611,"fl":611,"endash":556,"dagger":556,"daggerdbl":556,"periodcentered":278,"paragraph":556,"bullet":350,"quotesinglbase":278,"quotedblbase":500,"quotedblright":500,"guillemotright":556,"ellipsis":1000,"perthousand":1000,"questiondown":611,"grave":333,"acute":333,"circumflex":333,"tilde":333,"macron":333,"breve":333,"dotaccent":333,"dieresis":333,"ring":333,"cedilla":333,"hungarumlaut":333,"ogonek":333,"caron":333,"emdash":1000,"AE":1000,"ordfeminine":370,"Lslash":611,"Oslash":778,"OE":1000,"ordmasculine":365,"ae":889,"dotlessi":278,"lslash":278,"oslash":611,"oe":944,"germandbls":611,"Idieresis":278,"eacute":556,"abreve":556,"uhungarumlaut":611,"ecaron":556,"Ydieresis":667,"divide":584,"Yacute":667,"Acircumflex":722,"aacute":556,"Ucircumflex":722,"yacute":556,"scommaaccent":556,"ecircumflex":556,"Uring":722,"Udieresis":722,"aogonek":556,"Uacute":722,"uogonek":611,"Edieresis":667,"Dcroat":722,"commaaccent":250,"copyright":737,"Emacron":667,"ccaron":556,"aring":556,"Ncommaaccent":722,"lacute":278,"agrave":556,"Tcommaaccent":611,"Cacute":722,"atilde":556,"Edotaccent":667,"scaron":556,"scedilla":556,"iacute":278,"lozenge":494,"Rcaron":722,"Gcommaaccent":778,"ucircumflex":611,"acircumflex":556,"Amacron":722,"rcaron":389,"ccedilla":556,"Zdotaccent":611,"Thorn":667,"Omacron":778,"Racute":722,"Sacute":667,"dcaron":743,"Umacron":722,"uring":611,"threesuperior":333,"Ograve":778,"Agrave":722,"Abreve":722,"multiply":584,"uacute":611,"Tcaron":611,"partialdiff":494,"ydieresis":556,"Nacute":722,"icircumflex":278,"Ecircumflex":667,"adieresis":556,"edieresis":556,"cacute":556,"nacute":611,"umacron":611,"Ncaron":722,"Iacute":278,"plusminus":584,"brokenbar":280,"registered":737,"Gbreve":778,"Idotaccent":278,"summation":600,"Egrave":667,"racute":389,"omacron":611,"Zacute":611,"Zcaron":611,"greaterequal":549,"Eth":722,"Ccedilla":722,"lcommaaccent":278,"tcaron":389,"eogonek":556,"Uogonek":722,"Aacute":722,"Adieresis":722,"egrave":556,"zacute":500,"iogonek":278,"Oacute":778,"oacute":611,"amacron":556,"sacute":556,"idieresis":278,"Ocircumflex":778,"Ugrave":722,"Delta":612,"thorn":611,"twosuperior":333,"Odieresis":778,"mu":611,"igrave":278,"ohungarumlaut":611,"Eogonek":667,"dcroat":611,"threequarters":834,"Scedilla":667,"lcaron":400,"Kcommaaccent":722,"Lacute":611,"trademark":1000,"edotaccent":556,"Igrave":278,"Imacron":278,"Lcaron":611,"onehalf":834,"lessequal":549,"ocircumflex":611,"ntilde":611,"Uhungarumlaut":722,"Eacute":667,"emacron":556,"gbreve":611,"onequarter":834,"Scaron":667,"Scommaaccent":667,"Ohungarumlaut":778,"degree":400,"ograve":611,"Ccaron":722,"ugrave":611,"radical":549,"Dcaron":722,"rcommaaccent":389,"Ntilde":722,"otilde":611,"Rcommaaccent":722,"Lcommaaccent":611,"Atilde":722,"Aogonek":722,"Aring":722,"Otilde":778,"zdotaccent":500,"Ecaron":667,"Iogonek":278,"kcommaaccent":556,"minus":584,"Icircumflex":278,"ncaron":611,"tcommaaccent":333,"logicalnot":584,"odieresis":611,"udieresis":611,"notequal":549,"gcommaaccent":611,"eth":611,"zcaron":500,"ncommaaccent":611,"onesuperior":333,"imacron":278,"Euro":556},"kernPairs":{"AC":-40,"ACacute":-40,"ACcaron":-40,"ACcedilla":-40,"AG":-50,"AGbreve":-50,"AGcommaaccent":-50,"AO":-40,"AOacute":-40,"AOcircumflex":-40,"AOdieresis":-40,"AOgrave":-40,"AOhungarumlaut":-40,"AOmacron":-40,"AOslash":-40,"AOtilde":-40,"AQ":-40,"AT":-90,"ATcaron":-90,"ATcommaaccent":-90,"AU":-50,"AUacute":-50,"AUcircumflex":-50,"AUdieresis":-50,"AUgrave":-50,"AUhungarumlaut":-50,"AUmacron":-50,"AUogonek":-50,"AUring":-50,"AV":-80,"AW":-60,"AY":-110,"AYacute":-110,"AYdieresis":-110,"Au":-30,"Auacute":-30,"Aucircumflex":-30,"Audieresis":-30,"Augrave":-30,"Auhungarumlaut":-30,"Aumacron":-30,"Auogonek":-30,"Auring":-30,"Av":-40,"Aw":-30,"Ay":-30,"Ayacute":-30,"Aydieresis":-30,"AacuteC":-40,"AacuteCacute":-40,"AacuteCcaron":-40,"AacuteCcedilla":-40,"AacuteG":-50,"AacuteGbreve":-50,"AacuteGcommaaccent":-50,"AacuteO":-40,"AacuteOacute":-40,"AacuteOcircumflex":-40,"AacuteOdieresis":-40,"AacuteOgrave":-40,"AacuteOhungarumlaut":-40,"AacuteOmacron":-40,"AacuteOslash":-40,"AacuteOtilde":-40,"AacuteQ":-40,"AacuteT":-90,"AacuteTcaron":-90,"AacuteTcommaaccent":-90,"AacuteU":-50,"AacuteUacute":-50,"AacuteUcircumflex":-50,"AacuteUdieresis":-50,"AacuteUgrave":-50,"AacuteUhungarumlaut":-50,"AacuteUmacron":-50,"AacuteUogonek":-50,"AacuteUring":-50,"AacuteV":-80,"AacuteW":-60,"AacuteY":-110,"AacuteYacute":-110,"AacuteYdieresis":-110,"Aacuteu":-30,"Aacuteuacute":-30,"Aacuteucircumflex":-30,"Aacuteudieresis":-30,"Aacuteugrave":-30,"Aacuteuhungarumlaut":-30,"Aacuteumacron":-30,"Aacuteuogonek":-30,"Aacuteuring":-30,"Aacutev":-40,"Aacutew":-30,"Aacutey":-30,"Aacuteyacute":-30,"Aacuteydieresis":-30,"AbreveC":-40,"AbreveCacute":-40,"AbreveCcaron":-40,"AbreveCcedilla":-40,"AbreveG":-50,"AbreveGbreve":-50,"AbreveGcommaaccent":-50,"AbreveO":-40,"AbreveOacute":-40,"AbreveOcircumflex":-40,"AbreveOdieresis":-40,"AbreveOgrave":-40,"AbreveOhungarumlaut":-40,"AbreveOmacron":-40,"AbreveOslash":-40,"AbreveOtilde":-40,"AbreveQ":-40,"AbreveT":-90,"AbreveTcaron":-90,"AbreveTcommaaccent":-90,"AbreveU":-50,"AbreveUacute":-50,"AbreveUcircumflex":-50,"AbreveUdieresis":-50,"AbreveUgrave":-50,"AbreveUhungarumlaut":-50,"AbreveUmacron":-50,"AbreveUogonek":-50,"AbreveUring":-50,"AbreveV":-80,"AbreveW":-60,"AbreveY":-110,"AbreveYacute":-110,"AbreveYdieresis":-110,"Abreveu":-30,"Abreveuacute":-30,"Abreveucircumflex":-30,"Abreveudieresis":-30,"Abreveugrave":-30,"Abreveuhungarumlaut":-30,"Abreveumacron":-30,"Abreveuogonek":-30,"Abreveuring":-30,"Abrevev":-40,"Abrevew":-30,"Abrevey":-30,"Abreveyacute":-30,"Abreveydieresis":-30,"AcircumflexC":-40,"AcircumflexCacute":-40,"AcircumflexCcaron":-40,"AcircumflexCcedilla":-40,"AcircumflexG":-50,"AcircumflexGbreve":-50,"AcircumflexGcommaaccent":-50,"AcircumflexO":-40,"AcircumflexOacute":-40,"AcircumflexOcircumflex":-40,"AcircumflexOdieresis":-40,"AcircumflexOgrave":-40,"AcircumflexOhungarumlaut":-40,"AcircumflexOmacron":-40,"AcircumflexOslash":-40,"AcircumflexOtilde":-40,"AcircumflexQ":-40,"AcircumflexT":-90,"AcircumflexTcaron":-90,"AcircumflexTcommaaccent":-90,"AcircumflexU":-50,"AcircumflexUacute":-50,"AcircumflexUcircumflex":-50,"AcircumflexUdieresis":-50,"AcircumflexUgrave":-50,"AcircumflexUhungarumlaut":-50,"AcircumflexUmacron":-50,"AcircumflexUogonek":-50,"AcircumflexUring":-50,"AcircumflexV":-80,"AcircumflexW":-60,"AcircumflexY":-110,"AcircumflexYacute":-110,"AcircumflexYdieresis":-110,"Acircumflexu":-30,"Acircumflexuacute":-30,"Acircumflexucircumflex":-30,"Acircumflexudieresis":-30,"Acircumflexugrave":-30,"Acircumflexuhungarumlaut":-30,"Acircumflexumacron":-30,"Acircumflexuogonek":-30,"Acircumflexuring":-30,"Acircumflexv":-40,"Acircumflexw":-30,"Acircumflexy":-30,"Acircumflexyacute":-30,"Acircumflexydieresis":-30,"AdieresisC":-40,"AdieresisCacute":-40,"AdieresisCcaron":-40,"AdieresisCcedilla":-40,"AdieresisG":-50,"AdieresisGbreve":-50,"AdieresisGcommaaccent":-50,"AdieresisO":-40,"AdieresisOacute":-40,"AdieresisOcircumflex":-40,"AdieresisOdieresis":-40,"AdieresisOgrave":-40,"AdieresisOhungarumlaut":-40,"AdieresisOmacron":-40,"AdieresisOslash":-40,"AdieresisOtilde":-40,"AdieresisQ":-40,"AdieresisT":-90,"AdieresisTcaron":-90,"AdieresisTcommaaccent":-90,"AdieresisU":-50,"AdieresisUacute":-50,"AdieresisUcircumflex":-50,"AdieresisUdieresis":-50,"AdieresisUgrave":-50,"AdieresisUhungarumlaut":-50,"AdieresisUmacron":-50,"AdieresisUogonek":-50,"AdieresisUring":-50,"AdieresisV":-80,"AdieresisW":-60,"AdieresisY":-110,"AdieresisYacute":-110,"AdieresisYdieresis":-110,"Adieresisu":-30,"Adieresisuacute":-30,"Adieresisucircumflex":-30,"Adieresisudieresis":-30,"Adieresisugrave":-30,"Adieresisuhungarumlaut":-30,"Adieresisumacron":-30,"Adieresisuogonek":-30,"Adieresisuring":-30,"Adieresisv":-40,"Adieresisw":-30,"Adieresisy":-30,"Adieresisyacute":-30,"Adieresisydieresis":-30,"AgraveC":-40,"AgraveCacute":-40,"AgraveCcaron":-40,"AgraveCcedilla":-40,"AgraveG":-50,"AgraveGbreve":-50,"AgraveGcommaaccent":-50,"AgraveO":-40,"AgraveOacute":-40,"AgraveOcircumflex":-40,"AgraveOdieresis":-40,"AgraveOgrave":-40,"AgraveOhungarumlaut":-40,"AgraveOmacron":-40,"AgraveOslash":-40,"AgraveOtilde":-40,"AgraveQ":-40,"AgraveT":-90,"AgraveTcaron":-90,"AgraveTcommaaccent":-90,"AgraveU":-50,"AgraveUacute":-50,"AgraveUcircumflex":-50,"AgraveUdieresis":-50,"AgraveUgrave":-50,"AgraveUhungarumlaut":-50,"AgraveUmacron":-50,"AgraveUogonek":-50,"AgraveUring":-50,"AgraveV":-80,"AgraveW":-60,"AgraveY":-110,"AgraveYacute":-110,"AgraveYdieresis":-110,"Agraveu":-30,"Agraveuacute":-30,"Agraveucircumflex":-30,"Agraveudieresis":-30,"Agraveugrave":-30,"Agraveuhungarumlaut":-30,"Agraveumacron":-30,"Agraveuogonek":-30,"Agraveuring":-30,"Agravev":-40,"Agravew":-30,"Agravey":-30,"Agraveyacute":-30,"Agraveydieresis":-30,"AmacronC":-40,"AmacronCacute":-40,"AmacronCcaron":-40,"AmacronCcedilla":-40,"AmacronG":-50,"AmacronGbreve":-50,"AmacronGcommaaccent":-50,"AmacronO":-40,"AmacronOacute":-40,"AmacronOcircumflex":-40,"AmacronOdieresis":-40,"AmacronOgrave":-40,"AmacronOhungarumlaut":-40,"AmacronOmacron":-40,"AmacronOslash":-40,"AmacronOtilde":-40,"AmacronQ":-40,"AmacronT":-90,"AmacronTcaron":-90,"AmacronTcommaaccent":-90,"AmacronU":-50,"AmacronUacute":-50,"AmacronUcircumflex":-50,"AmacronUdieresis":-50,"AmacronUgrave":-50,"AmacronUhungarumlaut":-50,"AmacronUmacron":-50,"AmacronUogonek":-50,"AmacronUring":-50,"AmacronV":-80,"AmacronW":-60,"AmacronY":-110,"AmacronYacute":-110,"AmacronYdieresis":-110,"Amacronu":-30,"Amacronuacute":-30,"Amacronucircumflex":-30,"Amacronudieresis":-30,"Amacronugrave":-30,"Amacronuhungarumlaut":-30,"Amacronumacron":-30,"Amacronuogonek":-30,"Amacronuring":-30,"Amacronv":-40,"Amacronw":-30,"Amacrony":-30,"Amacronyacute":-30,"Amacronydieresis":-30,"AogonekC":-40,"AogonekCacute":-40,"AogonekCcaron":-40,"AogonekCcedilla":-40,"AogonekG":-50,"AogonekGbreve":-50,"AogonekGcommaaccent":-50,"AogonekO":-40,"AogonekOacute":-40,"AogonekOcircumflex":-40,"AogonekOdieresis":-40,"AogonekOgrave":-40,"AogonekOhungarumlaut":-40,"AogonekOmacron":-40,"AogonekOslash":-40,"AogonekOtilde":-40,"AogonekQ":-40,"AogonekT":-90,"AogonekTcaron":-90,"AogonekTcommaaccent":-90,"AogonekU":-50,"AogonekUacute":-50,"AogonekUcircumflex":-50,"AogonekUdieresis":-50,"AogonekUgrave":-50,"AogonekUhungarumlaut":-50,"AogonekUmacron":-50,"AogonekUogonek":-50,"AogonekUring":-50,"AogonekV":-80,"AogonekW":-60,"AogonekY":-110,"AogonekYacute":-110,"AogonekYdieresis":-110,"Aogoneku":-30,"Aogonekuacute":-30,"Aogonekucircumflex":-30,"Aogonekudieresis":-30,"Aogonekugrave":-30,"Aogonekuhungarumlaut":-30,"Aogonekumacron":-30,"Aogonekuogonek":-30,"Aogonekuring":-30,"Aogonekv":-40,"Aogonekw":-30,"Aogoneky":-30,"Aogonekyacute":-30,"Aogonekydieresis":-30,"AringC":-40,"AringCacute":-40,"AringCcaron":-40,"AringCcedilla":-40,"AringG":-50,"AringGbreve":-50,"AringGcommaaccent":-50,"AringO":-40,"AringOacute":-40,"AringOcircumflex":-40,"AringOdieresis":-40,"AringOgrave":-40,"AringOhungarumlaut":-40,"AringOmacron":-40,"AringOslash":-40,"AringOtilde":-40,"AringQ":-40,"AringT":-90,"AringTcaron":-90,"AringTcommaaccent":-90,"AringU":-50,"AringUacute":-50,"AringUcircumflex":-50,"AringUdieresis":-50,"AringUgrave":-50,"AringUhungarumlaut":-50,"AringUmacron":-50,"AringUogonek":-50,"AringUring":-50,"AringV":-80,"AringW":-60,"AringY":-110,"AringYacute":-110,"AringYdieresis":-110,"Aringu":-30,"Aringuacute":-30,"Aringucircumflex":-30,"Aringudieresis":-30,"Aringugrave":-30,"Aringuhungarumlaut":-30,"Aringumacron":-30,"Aringuogonek":-30,"Aringuring":-30,"Aringv":-40,"Aringw":-30,"Aringy":-30,"Aringyacute":-30,"Aringydieresis":-30,"AtildeC":-40,"AtildeCacute":-40,"AtildeCcaron":-40,"AtildeCcedilla":-40,"AtildeG":-50,"AtildeGbreve":-50,"AtildeGcommaaccent":-50,"AtildeO":-40,"AtildeOacute":-40,"AtildeOcircumflex":-40,"AtildeOdieresis":-40,"AtildeOgrave":-40,"AtildeOhungarumlaut":-40,"AtildeOmacron":-40,"AtildeOslash":-40,"AtildeOtilde":-40,"AtildeQ":-40,"AtildeT":-90,"AtildeTcaron":-90,"AtildeTcommaaccent":-90,"AtildeU":-50,"AtildeUacute":-50,"AtildeUcircumflex":-50,"AtildeUdieresis":-50,"AtildeUgrave":-50,"AtildeUhungarumlaut":-50,"AtildeUmacron":-50,"AtildeUogonek":-50,"AtildeUring":-50,"AtildeV":-80,"AtildeW":-60,"AtildeY":-110,"AtildeYacute":-110,"AtildeYdieresis":-110,"Atildeu":-30,"Atildeuacute":-30,"Atildeucircumflex":-30,"Atildeudieresis":-30,"Atildeugrave":-30,"Atildeuhungarumlaut":-30,"Atildeumacron":-30,"Atildeuogonek":-30,"Atildeuring":-30,"Atildev":-40,"Atildew":-30,"Atildey":-30,"Atildeyacute":-30,"Atildeydieresis":-30,"BA":-30,"BAacute":-30,"BAbreve":-30,"BAcircumflex":-30,"BAdieresis":-30,"BAgrave":-30,"BAmacron":-30,"BAogonek":-30,"BAring":-30,"BAtilde":-30,"BU":-10,"BUacute":-10,"BUcircumflex":-10,"BUdieresis":-10,"BUgrave":-10,"BUhungarumlaut":-10,"BUmacron":-10,"BUogonek":-10,"BUring":-10,"DA":-40,"DAacute":-40,"DAbreve":-40,"DAcircumflex":-40,"DAdieresis":-40,"DAgrave":-40,"DAmacron":-40,"DAogonek":-40,"DAring":-40,"DAtilde":-40,"DV":-40,"DW":-40,"DY":-70,"DYacute":-70,"DYdieresis":-70,"Dcomma":-30,"Dperiod":-30,"DcaronA":-40,"DcaronAacute":-40,"DcaronAbreve":-40,"DcaronAcircumflex":-40,"DcaronAdieresis":-40,"DcaronAgrave":-40,"DcaronAmacron":-40,"DcaronAogonek":-40,"DcaronAring":-40,"DcaronAtilde":-40,"DcaronV":-40,"DcaronW":-40,"DcaronY":-70,"DcaronYacute":-70,"DcaronYdieresis":-70,"Dcaroncomma":-30,"Dcaronperiod":-30,"DcroatA":-40,"DcroatAacute":-40,"DcroatAbreve":-40,"DcroatAcircumflex":-40,"DcroatAdieresis":-40,"DcroatAgrave":-40,"DcroatAmacron":-40,"DcroatAogonek":-40,"DcroatAring":-40,"DcroatAtilde":-40,"DcroatV":-40,"DcroatW":-40,"DcroatY":-70,"DcroatYacute":-70,"DcroatYdieresis":-70,"Dcroatcomma":-30,"Dcroatperiod":-30,"FA":-80,"FAacute":-80,"FAbreve":-80,"FAcircumflex":-80,"FAdieresis":-80,"FAgrave":-80,"FAmacron":-80,"FAogonek":-80,"FAring":-80,"FAtilde":-80,"Fa":-20,"Faacute":-20,"Fabreve":-20,"Facircumflex":-20,"Fadieresis":-20,"Fagrave":-20,"Famacron":-20,"Faogonek":-20,"Faring":-20,"Fatilde":-20,"Fcomma":-100,"Fperiod":-100,"JA":-20,"JAacute":-20,"JAbreve":-20,"JAcircumflex":-20,"JAdieresis":-20,"JAgrave":-20,"JAmacron":-20,"JAogonek":-20,"JAring":-20,"JAtilde":-20,"Jcomma":-20,"Jperiod":-20,"Ju":-20,"Juacute":-20,"Jucircumflex":-20,"Judieresis":-20,"Jugrave":-20,"Juhungarumlaut":-20,"Jumacron":-20,"Juogonek":-20,"Juring":-20,"KO":-30,"KOacute":-30,"KOcircumflex":-30,"KOdieresis":-30,"KOgrave":-30,"KOhungarumlaut":-30,"KOmacron":-30,"KOslash":-30,"KOtilde":-30,"Ke":-15,"Keacute":-15,"Kecaron":-15,"Kecircumflex":-15,"Kedieresis":-15,"Kedotaccent":-15,"Kegrave":-15,"Kemacron":-15,"Keogonek":-15,"Ko":-35,"Koacute":-35,"Kocircumflex":-35,"Kodieresis":-35,"Kograve":-35,"Kohungarumlaut":-35,"Komacron":-35,"Koslash":-35,"Kotilde":-35,"Ku":-30,"Kuacute":-30,"Kucircumflex":-30,"Kudieresis":-30,"Kugrave":-30,"Kuhungarumlaut":-30,"Kumacron":-30,"Kuogonek":-30,"Kuring":-30,"Ky":-40,"Kyacute":-40,"Kydieresis":-40,"KcommaaccentO":-30,"KcommaaccentOacute":-30,"KcommaaccentOcircumflex":-30,"KcommaaccentOdieresis":-30,"KcommaaccentOgrave":-30,"KcommaaccentOhungarumlaut":-30,"KcommaaccentOmacron":-30,"KcommaaccentOslash":-30,"KcommaaccentOtilde":-30,"Kcommaaccente":-15,"Kcommaaccenteacute":-15,"Kcommaaccentecaron":-15,"Kcommaaccentecircumflex":-15,"Kcommaaccentedieresis":-15,"Kcommaaccentedotaccent":-15,"Kcommaaccentegrave":-15,"Kcommaaccentemacron":-15,"Kcommaaccenteogonek":-15,"Kcommaaccento":-35,"Kcommaaccentoacute":-35,"Kcommaaccentocircumflex":-35,"Kcommaaccentodieresis":-35,"Kcommaaccentograve":-35,"Kcommaaccentohungarumlaut":-35,"Kcommaaccentomacron":-35,"Kcommaaccentoslash":-35,"Kcommaaccentotilde":-35,"Kcommaaccentu":-30,"Kcommaaccentuacute":-30,"Kcommaaccentucircumflex":-30,"Kcommaaccentudieresis":-30,"Kcommaaccentugrave":-30,"Kcommaaccentuhungarumlaut":-30,"Kcommaaccentumacron":-30,"Kcommaaccentuogonek":-30,"Kcommaaccenturing":-30,"Kcommaaccenty":-40,"Kcommaaccentyacute":-40,"Kcommaaccentydieresis":-40,"LT":-90,"LTcaron":-90,"LTcommaaccent":-90,"LV":-110,"LW":-80,"LY":-120,"LYacute":-120,"LYdieresis":-120,"Lquotedblright":-140,"Lquoteright":-140,"Ly":-30,"Lyacute":-30,"Lydieresis":-30,"LacuteT":-90,"LacuteTcaron":-90,"LacuteTcommaaccent":-90,"LacuteV":-110,"LacuteW":-80,"LacuteY":-120,"LacuteYacute":-120,"LacuteYdieresis":-120,"Lacutequotedblright":-140,"Lacutequoteright":-140,"Lacutey":-30,"Lacuteyacute":-30,"Lacuteydieresis":-30,"LcommaaccentT":-90,"LcommaaccentTcaron":-90,"LcommaaccentTcommaaccent":-90,"LcommaaccentV":-110,"LcommaaccentW":-80,"LcommaaccentY":-120,"LcommaaccentYacute":-120,"LcommaaccentYdieresis":-120,"Lcommaaccentquotedblright":-140,"Lcommaaccentquoteright":-140,"Lcommaaccenty":-30,"Lcommaaccentyacute":-30,"Lcommaaccentydieresis":-30,"LslashT":-90,"LslashTcaron":-90,"LslashTcommaaccent":-90,"LslashV":-110,"LslashW":-80,"LslashY":-120,"LslashYacute":-120,"LslashYdieresis":-120,"Lslashquotedblright":-140,"Lslashquoteright":-140,"Lslashy":-30,"Lslashyacute":-30,"Lslashydieresis":-30,"OA":-50,"OAacute":-50,"OAbreve":-50,"OAcircumflex":-50,"OAdieresis":-50,"OAgrave":-50,"OAmacron":-50,"OAogonek":-50,"OAring":-50,"OAtilde":-50,"OT":-40,"OTcaron":-40,"OTcommaaccent":-40,"OV":-50,"OW":-50,"OX":-50,"OY":-70,"OYacute":-70,"OYdieresis":-70,"Ocomma":-40,"Operiod":-40,"OacuteA":-50,"OacuteAacute":-50,"OacuteAbreve":-50,"OacuteAcircumflex":-50,"OacuteAdieresis":-50,"OacuteAgrave":-50,"OacuteAmacron":-50,"OacuteAogonek":-50,"OacuteAring":-50,"OacuteAtilde":-50,"OacuteT":-40,"OacuteTcaron":-40,"OacuteTcommaaccent":-40,"OacuteV":-50,"OacuteW":-50,"OacuteX":-50,"OacuteY":-70,"OacuteYacute":-70,"OacuteYdieresis":-70,"Oacutecomma":-40,"Oacuteperiod":-40,"OcircumflexA":-50,"OcircumflexAacute":-50,"OcircumflexAbreve":-50,"OcircumflexAcircumflex":-50,"OcircumflexAdieresis":-50,"OcircumflexAgrave":-50,"OcircumflexAmacron":-50,"OcircumflexAogonek":-50,"OcircumflexAring":-50,"OcircumflexAtilde":-50,"OcircumflexT":-40,"OcircumflexTcaron":-40,"OcircumflexTcommaaccent":-40,"OcircumflexV":-50,"OcircumflexW":-50,"OcircumflexX":-50,"OcircumflexY":-70,"OcircumflexYacute":-70,"OcircumflexYdieresis":-70,"Ocircumflexcomma":-40,"Ocircumflexperiod":-40,"OdieresisA":-50,"OdieresisAacute":-50,"OdieresisAbreve":-50,"OdieresisAcircumflex":-50,"OdieresisAdieresis":-50,"OdieresisAgrave":-50,"OdieresisAmacron":-50,"OdieresisAogonek":-50,"OdieresisAring":-50,"OdieresisAtilde":-50,"OdieresisT":-40,"OdieresisTcaron":-40,"OdieresisTcommaaccent":-40,"OdieresisV":-50,"OdieresisW":-50,"OdieresisX":-50,"OdieresisY":-70,"OdieresisYacute":-70,"OdieresisYdieresis":-70,"Odieresiscomma":-40,"Odieresisperiod":-40,"OgraveA":-50,"OgraveAacute":-50,"OgraveAbreve":-50,"OgraveAcircumflex":-50,"OgraveAdieresis":-50,"OgraveAgrave":-50,"OgraveAmacron":-50,"OgraveAogonek":-50,"OgraveAring":-50,"OgraveAtilde":-50,"OgraveT":-40,"OgraveTcaron":-40,"OgraveTcommaaccent":-40,"OgraveV":-50,"OgraveW":-50,"OgraveX":-50,"OgraveY":-70,"OgraveYacute":-70,"OgraveYdieresis":-70,"Ogravecomma":-40,"Ograveperiod":-40,"OhungarumlautA":-50,"OhungarumlautAacute":-50,"OhungarumlautAbreve":-50,"OhungarumlautAcircumflex":-50,"OhungarumlautAdieresis":-50,"OhungarumlautAgrave":-50,"OhungarumlautAmacron":-50,"OhungarumlautAogonek":-50,"OhungarumlautAring":-50,"OhungarumlautAtilde":-50,"OhungarumlautT":-40,"OhungarumlautTcaron":-40,"OhungarumlautTcommaaccent":-40,"OhungarumlautV":-50,"OhungarumlautW":-50,"OhungarumlautX":-50,"OhungarumlautY":-70,"OhungarumlautYacute":-70,"OhungarumlautYdieresis":-70,"Ohungarumlautcomma":-40,"Ohungarumlautperiod":-40,"OmacronA":-50,"OmacronAacute":-50,"OmacronAbreve":-50,"OmacronAcircumflex":-50,"OmacronAdieresis":-50,"OmacronAgrave":-50,"OmacronAmacron":-50,"OmacronAogonek":-50,"OmacronAring":-50,"OmacronAtilde":-50,"OmacronT":-40,"OmacronTcaron":-40,"OmacronTcommaaccent":-40,"OmacronV":-50,"OmacronW":-50,"OmacronX":-50,"OmacronY":-70,"OmacronYacute":-70,"OmacronYdieresis":-70,"Omacroncomma":-40,"Omacronperiod":-40,"OslashA":-50,"OslashAacute":-50,"OslashAbreve":-50,"OslashAcircumflex":-50,"OslashAdieresis":-50,"OslashAgrave":-50,"OslashAmacron":-50,"OslashAogonek":-50,"OslashAring":-50,"OslashAtilde":-50,"OslashT":-40,"OslashTcaron":-40,"OslashTcommaaccent":-40,"OslashV":-50,"OslashW":-50,"OslashX":-50,"OslashY":-70,"OslashYacute":-70,"OslashYdieresis":-70,"Oslashcomma":-40,"Oslashperiod":-40,"OtildeA":-50,"OtildeAacute":-50,"OtildeAbreve":-50,"OtildeAcircumflex":-50,"OtildeAdieresis":-50,"OtildeAgrave":-50,"OtildeAmacron":-50,"OtildeAogonek":-50,"OtildeAring":-50,"OtildeAtilde":-50,"OtildeT":-40,"OtildeTcaron":-40,"OtildeTcommaaccent":-40,"OtildeV":-50,"OtildeW":-50,"OtildeX":-50,"OtildeY":-70,"OtildeYacute":-70,"OtildeYdieresis":-70,"Otildecomma":-40,"Otildeperiod":-40,"PA":-100,"PAacute":-100,"PAbreve":-100,"PAcircumflex":-100,"PAdieresis":-100,"PAgrave":-100,"PAmacron":-100,"PAogonek":-100,"PAring":-100,"PAtilde":-100,"Pa":-30,"Paacute":-30,"Pabreve":-30,"Pacircumflex":-30,"Padieresis":-30,"Pagrave":-30,"Pamacron":-30,"Paogonek":-30,"Paring":-30,"Patilde":-30,"Pcomma":-120,"Pe":-30,"Peacute":-30,"Pecaron":-30,"Pecircumflex":-30,"Pedieresis":-30,"Pedotaccent":-30,"Pegrave":-30,"Pemacron":-30,"Peogonek":-30,"Po":-40,"Poacute":-40,"Pocircumflex":-40,"Podieresis":-40,"Pograve":-40,"Pohungarumlaut":-40,"Pomacron":-40,"Poslash":-40,"Potilde":-40,"Pperiod":-120,"QU":-10,"QUacute":-10,"QUcircumflex":-10,"QUdieresis":-10,"QUgrave":-10,"QUhungarumlaut":-10,"QUmacron":-10,"QUogonek":-10,"QUring":-10,"Qcomma":20,"Qperiod":20,"RO":-20,"ROacute":-20,"ROcircumflex":-20,"ROdieresis":-20,"ROgrave":-20,"ROhungarumlaut":-20,"ROmacron":-20,"ROslash":-20,"ROtilde":-20,"RT":-20,"RTcaron":-20,"RTcommaaccent":-20,"RU":-20,"RUacute":-20,"RUcircumflex":-20,"RUdieresis":-20,"RUgrave":-20,"RUhungarumlaut":-20,"RUmacron":-20,"RUogonek":-20,"RUring":-20,"RV":-50,"RW":-40,"RY":-50,"RYacute":-50,"RYdieresis":-50,"RacuteO":-20,"RacuteOacute":-20,"RacuteOcircumflex":-20,"RacuteOdieresis":-20,"RacuteOgrave":-20,"RacuteOhungarumlaut":-20,"RacuteOmacron":-20,"RacuteOslash":-20,"RacuteOtilde":-20,"RacuteT":-20,"RacuteTcaron":-20,"RacuteTcommaaccent":-20,"RacuteU":-20,"RacuteUacute":-20,"RacuteUcircumflex":-20,"RacuteUdieresis":-20,"RacuteUgrave":-20,"RacuteUhungarumlaut":-20,"RacuteUmacron":-20,"RacuteUogonek":-20,"RacuteUring":-20,"RacuteV":-50,"RacuteW":-40,"RacuteY":-50,"RacuteYacute":-50,"RacuteYdieresis":-50,"RcaronO":-20,"RcaronOacute":-20,"RcaronOcircumflex":-20,"RcaronOdieresis":-20,"RcaronOgrave":-20,"RcaronOhungarumlaut":-20,"RcaronOmacron":-20,"RcaronOslash":-20,"RcaronOtilde":-20,"RcaronT":-20,"RcaronTcaron":-20,"RcaronTcommaaccent":-20,"RcaronU":-20,"RcaronUacute":-20,"RcaronUcircumflex":-20,"RcaronUdieresis":-20,"RcaronUgrave":-20,"RcaronUhungarumlaut":-20,"RcaronUmacron":-20,"RcaronUogonek":-20,"RcaronUring":-20,"RcaronV":-50,"RcaronW":-40,"RcaronY":-50,"RcaronYacute":-50,"RcaronYdieresis":-50,"RcommaaccentO":-20,"RcommaaccentOacute":-20,"RcommaaccentOcircumflex":-20,"RcommaaccentOdieresis":-20,"RcommaaccentOgrave":-20,"RcommaaccentOhungarumlaut":-20,"RcommaaccentOmacron":-20,"RcommaaccentOslash":-20,"RcommaaccentOtilde":-20,"RcommaaccentT":-20,"RcommaaccentTcaron":-20,"RcommaaccentTcommaaccent":-20,"RcommaaccentU":-20,"RcommaaccentUacute":-20,"RcommaaccentUcircumflex":-20,"RcommaaccentUdieresis":-20,"RcommaaccentUgrave":-20,"RcommaaccentUhungarumlaut":-20,"RcommaaccentUmacron":-20,"RcommaaccentUogonek":-20,"RcommaaccentUring":-20,"RcommaaccentV":-50,"RcommaaccentW":-40,"RcommaaccentY":-50,"RcommaaccentYacute":-50,"RcommaaccentYdieresis":-50,"TA":-90,"TAacute":-90,"TAbreve":-90,"TAcircumflex":-90,"TAdieresis":-90,"TAgrave":-90,"TAmacron":-90,"TAogonek":-90,"TAring":-90,"TAtilde":-90,"TO":-40,"TOacute":-40,"TOcircumflex":-40,"TOdieresis":-40,"TOgrave":-40,"TOhungarumlaut":-40,"TOmacron":-40,"TOslash":-40,"TOtilde":-40,"Ta":-80,"Taacute":-80,"Tabreve":-80,"Tacircumflex":-80,"Tadieresis":-80,"Tagrave":-80,"Tamacron":-80,"Taogonek":-80,"Taring":-80,"Tatilde":-80,"Tcolon":-40,"Tcomma":-80,"Te":-60,"Teacute":-60,"Tecaron":-60,"Tecircumflex":-60,"Tedieresis":-60,"Tedotaccent":-60,"Tegrave":-60,"Temacron":-60,"Teogonek":-60,"Thyphen":-120,"To":-80,"Toacute":-80,"Tocircumflex":-80,"Todieresis":-80,"Tograve":-80,"Tohungarumlaut":-80,"Tomacron":-80,"Toslash":-80,"Totilde":-80,"Tperiod":-80,"Tr":-80,"Tracute":-80,"Trcommaaccent":-80,"Tsemicolon":-40,"Tu":-90,"Tuacute":-90,"Tucircumflex":-90,"Tudieresis":-90,"Tugrave":-90,"Tuhungarumlaut":-90,"Tumacron":-90,"Tuogonek":-90,"Turing":-90,"Tw":-60,"Ty":-60,"Tyacute":-60,"Tydieresis":-60,"TcaronA":-90,"TcaronAacute":-90,"TcaronAbreve":-90,"TcaronAcircumflex":-90,"TcaronAdieresis":-90,"TcaronAgrave":-90,"TcaronAmacron":-90,"TcaronAogonek":-90,"TcaronAring":-90,"TcaronAtilde":-90,"TcaronO":-40,"TcaronOacute":-40,"TcaronOcircumflex":-40,"TcaronOdieresis":-40,"TcaronOgrave":-40,"TcaronOhungarumlaut":-40,"TcaronOmacron":-40,"TcaronOslash":-40,"TcaronOtilde":-40,"Tcarona":-80,"Tcaronaacute":-80,"Tcaronabreve":-80,"Tcaronacircumflex":-80,"Tcaronadieresis":-80,"Tcaronagrave":-80,"Tcaronamacron":-80,"Tcaronaogonek":-80,"Tcaronaring":-80,"Tcaronatilde":-80,"Tcaroncolon":-40,"Tcaroncomma":-80,"Tcarone":-60,"Tcaroneacute":-60,"Tcaronecaron":-60,"Tcaronecircumflex":-60,"Tcaronedieresis":-60,"Tcaronedotaccent":-60,"Tcaronegrave":-60,"Tcaronemacron":-60,"Tcaroneogonek":-60,"Tcaronhyphen":-120,"Tcarono":-80,"Tcaronoacute":-80,"Tcaronocircumflex":-80,"Tcaronodieresis":-80,"Tcaronograve":-80,"Tcaronohungarumlaut":-80,"Tcaronomacron":-80,"Tcaronoslash":-80,"Tcaronotilde":-80,"Tcaronperiod":-80,"Tcaronr":-80,"Tcaronracute":-80,"Tcaronrcommaaccent":-80,"Tcaronsemicolon":-40,"Tcaronu":-90,"Tcaronuacute":-90,"Tcaronucircumflex":-90,"Tcaronudieresis":-90,"Tcaronugrave":-90,"Tcaronuhungarumlaut":-90,"Tcaronumacron":-90,"Tcaronuogonek":-90,"Tcaronuring":-90,"Tcaronw":-60,"Tcarony":-60,"Tcaronyacute":-60,"Tcaronydieresis":-60,"TcommaaccentA":-90,"TcommaaccentAacute":-90,"TcommaaccentAbreve":-90,"TcommaaccentAcircumflex":-90,"TcommaaccentAdieresis":-90,"TcommaaccentAgrave":-90,"TcommaaccentAmacron":-90,"TcommaaccentAogonek":-90,"TcommaaccentAring":-90,"TcommaaccentAtilde":-90,"TcommaaccentO":-40,"TcommaaccentOacute":-40,"TcommaaccentOcircumflex":-40,"TcommaaccentOdieresis":-40,"TcommaaccentOgrave":-40,"TcommaaccentOhungarumlaut":-40,"TcommaaccentOmacron":-40,"TcommaaccentOslash":-40,"TcommaaccentOtilde":-40,"Tcommaaccenta":-80,"Tcommaaccentaacute":-80,"Tcommaaccentabreve":-80,"Tcommaaccentacircumflex":-80,"Tcommaaccentadieresis":-80,"Tcommaaccentagrave":-80,"Tcommaaccentamacron":-80,"Tcommaaccentaogonek":-80,"Tcommaaccentaring":-80,"Tcommaaccentatilde":-80,"Tcommaaccentcolon":-40,"Tcommaaccentcomma":-80,"Tcommaaccente":-60,"Tcommaaccenteacute":-60,"Tcommaaccentecaron":-60,"Tcommaaccentecircumflex":-60,"Tcommaaccentedieresis":-60,"Tcommaaccentedotaccent":-60,"Tcommaaccentegrave":-60,"Tcommaaccentemacron":-60,"Tcommaaccenteogonek":-60,"Tcommaaccenthyphen":-120,"Tcommaaccento":-80,"Tcommaaccentoacute":-80,"Tcommaaccentocircumflex":-80,"Tcommaaccentodieresis":-80,"Tcommaaccentograve":-80,"Tcommaaccentohungarumlaut":-80,"Tcommaaccentomacron":-80,"Tcommaaccentoslash":-80,"Tcommaaccentotilde":-80,"Tcommaaccentperiod":-80,"Tcommaaccentr":-80,"Tcommaaccentracute":-80,"Tcommaaccentrcommaaccent":-80,"Tcommaaccentsemicolon":-40,"Tcommaaccentu":-90,"Tcommaaccentuacute":-90,"Tcommaaccentucircumflex":-90,"Tcommaaccentudieresis":-90,"Tcommaaccentugrave":-90,"Tcommaaccentuhungarumlaut":-90,"Tcommaaccentumacron":-90,"Tcommaaccentuogonek":-90,"Tcommaaccenturing":-90,"Tcommaaccentw":-60,"Tcommaaccenty":-60,"Tcommaaccentyacute":-60,"Tcommaaccentydieresis":-60,"UA":-50,"UAacute":-50,"UAbreve":-50,"UAcircumflex":-50,"UAdieresis":-50,"UAgrave":-50,"UAmacron":-50,"UAogonek":-50,"UAring":-50,"UAtilde":-50,"Ucomma":-30,"Uperiod":-30,"UacuteA":-50,"UacuteAacute":-50,"UacuteAbreve":-50,"UacuteAcircumflex":-50,"UacuteAdieresis":-50,"UacuteAgrave":-50,"UacuteAmacron":-50,"UacuteAogonek":-50,"UacuteAring":-50,"UacuteAtilde":-50,"Uacutecomma":-30,"Uacuteperiod":-30,"UcircumflexA":-50,"UcircumflexAacute":-50,"UcircumflexAbreve":-50,"UcircumflexAcircumflex":-50,"UcircumflexAdieresis":-50,"UcircumflexAgrave":-50,"UcircumflexAmacron":-50,"UcircumflexAogonek":-50,"UcircumflexAring":-50,"UcircumflexAtilde":-50,"Ucircumflexcomma":-30,"Ucircumflexperiod":-30,"UdieresisA":-50,"UdieresisAacute":-50,"UdieresisAbreve":-50,"UdieresisAcircumflex":-50,"UdieresisAdieresis":-50,"UdieresisAgrave":-50,"UdieresisAmacron":-50,"UdieresisAogonek":-50,"UdieresisAring":-50,"UdieresisAtilde":-50,"Udieresiscomma":-30,"Udieresisperiod":-30,"UgraveA":-50,"UgraveAacute":-50,"UgraveAbreve":-50,"UgraveAcircumflex":-50,"UgraveAdieresis":-50,"UgraveAgrave":-50,"UgraveAmacron":-50,"UgraveAogonek":-50,"UgraveAring":-50,"UgraveAtilde":-50,"Ugravecomma":-30,"Ugraveperiod":-30,"UhungarumlautA":-50,"UhungarumlautAacute":-50,"UhungarumlautAbreve":-50,"UhungarumlautAcircumflex":-50,"UhungarumlautAdieresis":-50,"UhungarumlautAgrave":-50,"UhungarumlautAmacron":-50,"UhungarumlautAogonek":-50,"UhungarumlautAring":-50,"UhungarumlautAtilde":-50,"Uhungarumlautcomma":-30,"Uhungarumlautperiod":-30,"UmacronA":-50,"UmacronAacute":-50,"UmacronAbreve":-50,"UmacronAcircumflex":-50,"UmacronAdieresis":-50,"UmacronAgrave":-50,"UmacronAmacron":-50,"UmacronAogonek":-50,"UmacronAring":-50,"UmacronAtilde":-50,"Umacroncomma":-30,"Umacronperiod":-30,"UogonekA":-50,"UogonekAacute":-50,"UogonekAbreve":-50,"UogonekAcircumflex":-50,"UogonekAdieresis":-50,"UogonekAgrave":-50,"UogonekAmacron":-50,"UogonekAogonek":-50,"UogonekAring":-50,"UogonekAtilde":-50,"Uogonekcomma":-30,"Uogonekperiod":-30,"UringA":-50,"UringAacute":-50,"UringAbreve":-50,"UringAcircumflex":-50,"UringAdieresis":-50,"UringAgrave":-50,"UringAmacron":-50,"UringAogonek":-50,"UringAring":-50,"UringAtilde":-50,"Uringcomma":-30,"Uringperiod":-30,"VA":-80,"VAacute":-80,"VAbreve":-80,"VAcircumflex":-80,"VAdieresis":-80,"VAgrave":-80,"VAmacron":-80,"VAogonek":-80,"VAring":-80,"VAtilde":-80,"VG":-50,"VGbreve":-50,"VGcommaaccent":-50,"VO":-50,"VOacute":-50,"VOcircumflex":-50,"VOdieresis":-50,"VOgrave":-50,"VOhungarumlaut":-50,"VOmacron":-50,"VOslash":-50,"VOtilde":-50,"Va":-60,"Vaacute":-60,"Vabreve":-60,"Vacircumflex":-60,"Vadieresis":-60,"Vagrave":-60,"Vamacron":-60,"Vaogonek":-60,"Varing":-60,"Vatilde":-60,"Vcolon":-40,"Vcomma":-120,"Ve":-50,"Veacute":-50,"Vecaron":-50,"Vecircumflex":-50,"Vedieresis":-50,"Vedotaccent":-50,"Vegrave":-50,"Vemacron":-50,"Veogonek":-50,"Vhyphen":-80,"Vo":-90,"Voacute":-90,"Vocircumflex":-90,"Vodieresis":-90,"Vograve":-90,"Vohungarumlaut":-90,"Vomacron":-90,"Voslash":-90,"Votilde":-90,"Vperiod":-120,"Vsemicolon":-40,"Vu":-60,"Vuacute":-60,"Vucircumflex":-60,"Vudieresis":-60,"Vugrave":-60,"Vuhungarumlaut":-60,"Vumacron":-60,"Vuogonek":-60,"Vuring":-60,"WA":-60,"WAacute":-60,"WAbreve":-60,"WAcircumflex":-60,"WAdieresis":-60,"WAgrave":-60,"WAmacron":-60,"WAogonek":-60,"WAring":-60,"WAtilde":-60,"WO":-20,"WOacute":-20,"WOcircumflex":-20,"WOdieresis":-20,"WOgrave":-20,"WOhungarumlaut":-20,"WOmacron":-20,"WOslash":-20,"WOtilde":-20,"Wa":-40,"Waacute":-40,"Wabreve":-40,"Wacircumflex":-40,"Wadieresis":-40,"Wagrave":-40,"Wamacron":-40,"Waogonek":-40,"Waring":-40,"Watilde":-40,"Wcolon":-10,"Wcomma":-80,"We":-35,"Weacute":-35,"Wecaron":-35,"Wecircumflex":-35,"Wedieresis":-35,"Wedotaccent":-35,"Wegrave":-35,"Wemacron":-35,"Weogonek":-35,"Whyphen":-40,"Wo":-60,"Woacute":-60,"Wocircumflex":-60,"Wodieresis":-60,"Wograve":-60,"Wohungarumlaut":-60,"Womacron":-60,"Woslash":-60,"Wotilde":-60,"Wperiod":-80,"Wsemicolon":-10,"Wu":-45,"Wuacute":-45,"Wucircumflex":-45,"Wudieresis":-45,"Wugrave":-45,"Wuhungarumlaut":-45,"Wumacron":-45,"Wuogonek":-45,"Wuring":-45,"Wy":-20,"Wyacute":-20,"Wydieresis":-20,"YA":-110,"YAacute":-110,"YAbreve":-110,"YAcircumflex":-110,"YAdieresis":-110,"YAgrave":-110,"YAmacron":-110,"YAogonek":-110,"YAring":-110,"YAtilde":-110,"YO":-70,"YOacute":-70,"YOcircumflex":-70,"YOdieresis":-70,"YOgrave":-70,"YOhungarumlaut":-70,"YOmacron":-70,"YOslash":-70,"YOtilde":-70,"Ya":-90,"Yaacute":-90,"Yabreve":-90,"Yacircumflex":-90,"Yadieresis":-90,"Yagrave":-90,"Yamacron":-90,"Yaogonek":-90,"Yaring":-90,"Yatilde":-90,"Ycolon":-50,"Ycomma":-100,"Ye":-80,"Yeacute":-80,"Yecaron":-80,"Yecircumflex":-80,"Yedieresis":-80,"Yedotaccent":-80,"Yegrave":-80,"Yemacron":-80,"Yeogonek":-80,"Yo":-100,"Yoacute":-100,"Yocircumflex":-100,"Yodieresis":-100,"Yograve":-100,"Yohungarumlaut":-100,"Yomacron":-100,"Yoslash":-100,"Yotilde":-100,"Yperiod":-100,"Ysemicolon":-50,"Yu":-100,"Yuacute":-100,"Yucircumflex":-100,"Yudieresis":-100,"Yugrave":-100,"Yuhungarumlaut":-100,"Yumacron":-100,"Yuogonek":-100,"Yuring":-100,"YacuteA":-110,"YacuteAacute":-110,"YacuteAbreve":-110,"YacuteAcircumflex":-110,"YacuteAdieresis":-110,"YacuteAgrave":-110,"YacuteAmacron":-110,"YacuteAogonek":-110,"YacuteAring":-110,"YacuteAtilde":-110,"YacuteO":-70,"YacuteOacute":-70,"YacuteOcircumflex":-70,"YacuteOdieresis":-70,"YacuteOgrave":-70,"YacuteOhungarumlaut":-70,"YacuteOmacron":-70,"YacuteOslash":-70,"YacuteOtilde":-70,"Yacutea":-90,"Yacuteaacute":-90,"Yacuteabreve":-90,"Yacuteacircumflex":-90,"Yacuteadieresis":-90,"Yacuteagrave":-90,"Yacuteamacron":-90,"Yacuteaogonek":-90,"Yacutearing":-90,"Yacuteatilde":-90,"Yacutecolon":-50,"Yacutecomma":-100,"Yacutee":-80,"Yacuteeacute":-80,"Yacuteecaron":-80,"Yacuteecircumflex":-80,"Yacuteedieresis":-80,"Yacuteedotaccent":-80,"Yacuteegrave":-80,"Yacuteemacron":-80,"Yacuteeogonek":-80,"Yacuteo":-100,"Yacuteoacute":-100,"Yacuteocircumflex":-100,"Yacuteodieresis":-100,"Yacuteograve":-100,"Yacuteohungarumlaut":-100,"Yacuteomacron":-100,"Yacuteoslash":-100,"Yacuteotilde":-100,"Yacuteperiod":-100,"Yacutesemicolon":-50,"Yacuteu":-100,"Yacuteuacute":-100,"Yacuteucircumflex":-100,"Yacuteudieresis":-100,"Yacuteugrave":-100,"Yacuteuhungarumlaut":-100,"Yacuteumacron":-100,"Yacuteuogonek":-100,"Yacuteuring":-100,"YdieresisA":-110,"YdieresisAacute":-110,"YdieresisAbreve":-110,"YdieresisAcircumflex":-110,"YdieresisAdieresis":-110,"YdieresisAgrave":-110,"YdieresisAmacron":-110,"YdieresisAogonek":-110,"YdieresisAring":-110,"YdieresisAtilde":-110,"YdieresisO":-70,"YdieresisOacute":-70,"YdieresisOcircumflex":-70,"YdieresisOdieresis":-70,"YdieresisOgrave":-70,"YdieresisOhungarumlaut":-70,"YdieresisOmacron":-70,"YdieresisOslash":-70,"YdieresisOtilde":-70,"Ydieresisa":-90,"Ydieresisaacute":-90,"Ydieresisabreve":-90,"Ydieresisacircumflex":-90,"Ydieresisadieresis":-90,"Ydieresisagrave":-90,"Ydieresisamacron":-90,"Ydieresisaogonek":-90,"Ydieresisaring":-90,"Ydieresisatilde":-90,"Ydieresiscolon":-50,"Ydieresiscomma":-100,"Ydieresise":-80,"Ydieresiseacute":-80,"Ydieresisecaron":-80,"Ydieresisecircumflex":-80,"Ydieresisedieresis":-80,"Ydieresisedotaccent":-80,"Ydieresisegrave":-80,"Ydieresisemacron":-80,"Ydieresiseogonek":-80,"Ydieresiso":-100,"Ydieresisoacute":-100,"Ydieresisocircumflex":-100,"Ydieresisodieresis":-100,"Ydieresisograve":-100,"Ydieresisohungarumlaut":-100,"Ydieresisomacron":-100,"Ydieresisoslash":-100,"Ydieresisotilde":-100,"Ydieresisperiod":-100,"Ydieresissemicolon":-50,"Ydieresisu":-100,"Ydieresisuacute":-100,"Ydieresisucircumflex":-100,"Ydieresisudieresis":-100,"Ydieresisugrave":-100,"Ydieresisuhungarumlaut":-100,"Ydieresisumacron":-100,"Ydieresisuogonek":-100,"Ydieresisuring":-100,"ag":-10,"agbreve":-10,"agcommaaccent":-10,"av":-15,"aw":-15,"ay":-20,"ayacute":-20,"aydieresis":-20,"aacuteg":-10,"aacutegbreve":-10,"aacutegcommaaccent":-10,"aacutev":-15,"aacutew":-15,"aacutey":-20,"aacuteyacute":-20,"aacuteydieresis":-20,"abreveg":-10,"abrevegbreve":-10,"abrevegcommaaccent":-10,"abrevev":-15,"abrevew":-15,"abrevey":-20,"abreveyacute":-20,"abreveydieresis":-20,"acircumflexg":-10,"acircumflexgbreve":-10,"acircumflexgcommaaccent":-10,"acircumflexv":-15,"acircumflexw":-15,"acircumflexy":-20,"acircumflexyacute":-20,"acircumflexydieresis":-20,"adieresisg":-10,"adieresisgbreve":-10,"adieresisgcommaaccent":-10,"adieresisv":-15,"adieresisw":-15,"adieresisy":-20,"adieresisyacute":-20,"adieresisydieresis":-20,"agraveg":-10,"agravegbreve":-10,"agravegcommaaccent":-10,"agravev":-15,"agravew":-15,"agravey":-20,"agraveyacute":-20,"agraveydieresis":-20,"amacrong":-10,"amacrongbreve":-10,"amacrongcommaaccent":-10,"amacronv":-15,"amacronw":-15,"amacrony":-20,"amacronyacute":-20,"amacronydieresis":-20,"aogonekg":-10,"aogonekgbreve":-10,"aogonekgcommaaccent":-10,"aogonekv":-15,"aogonekw":-15,"aogoneky":-20,"aogonekyacute":-20,"aogonekydieresis":-20,"aringg":-10,"aringgbreve":-10,"aringgcommaaccent":-10,"aringv":-15,"aringw":-15,"aringy":-20,"aringyacute":-20,"aringydieresis":-20,"atildeg":-10,"atildegbreve":-10,"atildegcommaaccent":-10,"atildev":-15,"atildew":-15,"atildey":-20,"atildeyacute":-20,"atildeydieresis":-20,"bl":-10,"blacute":-10,"blcommaaccent":-10,"blslash":-10,"bu":-20,"buacute":-20,"bucircumflex":-20,"budieresis":-20,"bugrave":-20,"buhungarumlaut":-20,"bumacron":-20,"buogonek":-20,"buring":-20,"bv":-20,"by":-20,"byacute":-20,"bydieresis":-20,"ch":-10,"ck":-20,"ckcommaaccent":-20,"cl":-20,"clacute":-20,"clcommaaccent":-20,"clslash":-20,"cy":-10,"cyacute":-10,"cydieresis":-10,"cacuteh":-10,"cacutek":-20,"cacutekcommaaccent":-20,"cacutel":-20,"cacutelacute":-20,"cacutelcommaaccent":-20,"cacutelslash":-20,"cacutey":-10,"cacuteyacute":-10,"cacuteydieresis":-10,"ccaronh":-10,"ccaronk":-20,"ccaronkcommaaccent":-20,"ccaronl":-20,"ccaronlacute":-20,"ccaronlcommaaccent":-20,"ccaronlslash":-20,"ccarony":-10,"ccaronyacute":-10,"ccaronydieresis":-10,"ccedillah":-10,"ccedillak":-20,"ccedillakcommaaccent":-20,"ccedillal":-20,"ccedillalacute":-20,"ccedillalcommaaccent":-20,"ccedillalslash":-20,"ccedillay":-10,"ccedillayacute":-10,"ccedillaydieresis":-10,"colonspace":-40,"commaquotedblright":-120,"commaquoteright":-120,"commaspace":-40,"dd":-10,"ddcroat":-10,"dv":-15,"dw":-15,"dy":-15,"dyacute":-15,"dydieresis":-15,"dcroatd":-10,"dcroatdcroat":-10,"dcroatv":-15,"dcroatw":-15,"dcroaty":-15,"dcroatyacute":-15,"dcroatydieresis":-15,"ecomma":10,"eperiod":20,"ev":-15,"ew":-15,"ex":-15,"ey":-15,"eyacute":-15,"eydieresis":-15,"eacutecomma":10,"eacuteperiod":20,"eacutev":-15,"eacutew":-15,"eacutex":-15,"eacutey":-15,"eacuteyacute":-15,"eacuteydieresis":-15,"ecaroncomma":10,"ecaronperiod":20,"ecaronv":-15,"ecaronw":-15,"ecaronx":-15,"ecarony":-15,"ecaronyacute":-15,"ecaronydieresis":-15,"ecircumflexcomma":10,"ecircumflexperiod":20,"ecircumflexv":-15,"ecircumflexw":-15,"ecircumflexx":-15,"ecircumflexy":-15,"ecircumflexyacute":-15,"ecircumflexydieresis":-15,"edieresiscomma":10,"edieresisperiod":20,"edieresisv":-15,"edieresisw":-15,"edieresisx":-15,"edieresisy":-15,"edieresisyacute":-15,"edieresisydieresis":-15,"edotaccentcomma":10,"edotaccentperiod":20,"edotaccentv":-15,"edotaccentw":-15,"edotaccentx":-15,"edotaccenty":-15,"edotaccentyacute":-15,"edotaccentydieresis":-15,"egravecomma":10,"egraveperiod":20,"egravev":-15,"egravew":-15,"egravex":-15,"egravey":-15,"egraveyacute":-15,"egraveydieresis":-15,"emacroncomma":10,"emacronperiod":20,"emacronv":-15,"emacronw":-15,"emacronx":-15,"emacrony":-15,"emacronyacute":-15,"emacronydieresis":-15,"eogonekcomma":10,"eogonekperiod":20,"eogonekv":-15,"eogonekw":-15,"eogonekx":-15,"eogoneky":-15,"eogonekyacute":-15,"eogonekydieresis":-15,"fcomma":-10,"fe":-10,"feacute":-10,"fecaron":-10,"fecircumflex":-10,"fedieresis":-10,"fedotaccent":-10,"fegrave":-10,"femacron":-10,"feogonek":-10,"fo":-20,"foacute":-20,"focircumflex":-20,"fodieresis":-20,"fograve":-20,"fohungarumlaut":-20,"fomacron":-20,"foslash":-20,"fotilde":-20,"fperiod":-10,"fquotedblright":30,"fquoteright":30,"ge":10,"geacute":10,"gecaron":10,"gecircumflex":10,"gedieresis":10,"gedotaccent":10,"gegrave":10,"gemacron":10,"geogonek":10,"gg":-10,"ggbreve":-10,"ggcommaaccent":-10,"gbrevee":10,"gbreveeacute":10,"gbreveecaron":10,"gbreveecircumflex":10,"gbreveedieresis":10,"gbreveedotaccent":10,"gbreveegrave":10,"gbreveemacron":10,"gbreveeogonek":10,"gbreveg":-10,"gbrevegbreve":-10,"gbrevegcommaaccent":-10,"gcommaaccente":10,"gcommaaccenteacute":10,"gcommaaccentecaron":10,"gcommaaccentecircumflex":10,"gcommaaccentedieresis":10,"gcommaaccentedotaccent":10,"gcommaaccentegrave":10,"gcommaaccentemacron":10,"gcommaaccenteogonek":10,"gcommaaccentg":-10,"gcommaaccentgbreve":-10,"gcommaaccentgcommaaccent":-10,"hy":-20,"hyacute":-20,"hydieresis":-20,"ko":-15,"koacute":-15,"kocircumflex":-15,"kodieresis":-15,"kograve":-15,"kohungarumlaut":-15,"komacron":-15,"koslash":-15,"kotilde":-15,"kcommaaccento":-15,"kcommaaccentoacute":-15,"kcommaaccentocircumflex":-15,"kcommaaccentodieresis":-15,"kcommaaccentograve":-15,"kcommaaccentohungarumlaut":-15,"kcommaaccentomacron":-15,"kcommaaccentoslash":-15,"kcommaaccentotilde":-15,"lw":-15,"ly":-15,"lyacute":-15,"lydieresis":-15,"lacutew":-15,"lacutey":-15,"lacuteyacute":-15,"lacuteydieresis":-15,"lcommaaccentw":-15,"lcommaaccenty":-15,"lcommaaccentyacute":-15,"lcommaaccentydieresis":-15,"lslashw":-15,"lslashy":-15,"lslashyacute":-15,"lslashydieresis":-15,"mu":-20,"muacute":-20,"mucircumflex":-20,"mudieresis":-20,"mugrave":-20,"muhungarumlaut":-20,"mumacron":-20,"muogonek":-20,"muring":-20,"my":-30,"myacute":-30,"mydieresis":-30,"nu":-10,"nuacute":-10,"nucircumflex":-10,"nudieresis":-10,"nugrave":-10,"nuhungarumlaut":-10,"numacron":-10,"nuogonek":-10,"nuring":-10,"nv":-40,"ny":-20,"nyacute":-20,"nydieresis":-20,"nacuteu":-10,"nacuteuacute":-10,"nacuteucircumflex":-10,"nacuteudieresis":-10,"nacuteugrave":-10,"nacuteuhungarumlaut":-10,"nacuteumacron":-10,"nacuteuogonek":-10,"nacuteuring":-10,"nacutev":-40,"nacutey":-20,"nacuteyacute":-20,"nacuteydieresis":-20,"ncaronu":-10,"ncaronuacute":-10,"ncaronucircumflex":-10,"ncaronudieresis":-10,"ncaronugrave":-10,"ncaronuhungarumlaut":-10,"ncaronumacron":-10,"ncaronuogonek":-10,"ncaronuring":-10,"ncaronv":-40,"ncarony":-20,"ncaronyacute":-20,"ncaronydieresis":-20,"ncommaaccentu":-10,"ncommaaccentuacute":-10,"ncommaaccentucircumflex":-10,"ncommaaccentudieresis":-10,"ncommaaccentugrave":-10,"ncommaaccentuhungarumlaut":-10,"ncommaaccentumacron":-10,"ncommaaccentuogonek":-10,"ncommaaccenturing":-10,"ncommaaccentv":-40,"ncommaaccenty":-20,"ncommaaccentyacute":-20,"ncommaaccentydieresis":-20,"ntildeu":-10,"ntildeuacute":-10,"ntildeucircumflex":-10,"ntildeudieresis":-10,"ntildeugrave":-10,"ntildeuhungarumlaut":-10,"ntildeumacron":-10,"ntildeuogonek":-10,"ntildeuring":-10,"ntildev":-40,"ntildey":-20,"ntildeyacute":-20,"ntildeydieresis":-20,"ov":-20,"ow":-15,"ox":-30,"oy":-20,"oyacute":-20,"oydieresis":-20,"oacutev":-20,"oacutew":-15,"oacutex":-30,"oacutey":-20,"oacuteyacute":-20,"oacuteydieresis":-20,"ocircumflexv":-20,"ocircumflexw":-15,"ocircumflexx":-30,"ocircumflexy":-20,"ocircumflexyacute":-20,"ocircumflexydieresis":-20,"odieresisv":-20,"odieresisw":-15,"odieresisx":-30,"odieresisy":-20,"odieresisyacute":-20,"odieresisydieresis":-20,"ogravev":-20,"ogravew":-15,"ogravex":-30,"ogravey":-20,"ograveyacute":-20,"ograveydieresis":-20,"ohungarumlautv":-20,"ohungarumlautw":-15,"ohungarumlautx":-30,"ohungarumlauty":-20,"ohungarumlautyacute":-20,"ohungarumlautydieresis":-20,"omacronv":-20,"omacronw":-15,"omacronx":-30,"omacrony":-20,"omacronyacute":-20,"omacronydieresis":-20,"oslashv":-20,"oslashw":-15,"oslashx":-30,"oslashy":-20,"oslashyacute":-20,"oslashydieresis":-20,"otildev":-20,"otildew":-15,"otildex":-30,"otildey":-20,"otildeyacute":-20,"otildeydieresis":-20,"py":-15,"pyacute":-15,"pydieresis":-15,"periodquotedblright":-120,"periodquoteright":-120,"periodspace":-40,"quotedblrightspace":-80,"quoteleftquoteleft":-46,"quoterightd":-80,"quoterightdcroat":-80,"quoterightl":-20,"quoterightlacute":-20,"quoterightlcommaaccent":-20,"quoterightlslash":-20,"quoterightquoteright":-46,"quoterightr":-40,"quoterightracute":-40,"quoterightrcaron":-40,"quoterightrcommaaccent":-40,"quoterights":-60,"quoterightsacute":-60,"quoterightscaron":-60,"quoterightscedilla":-60,"quoterightscommaaccent":-60,"quoterightspace":-80,"quoterightv":-20,"rc":-20,"rcacute":-20,"rccaron":-20,"rccedilla":-20,"rcomma":-60,"rd":-20,"rdcroat":-20,"rg":-15,"rgbreve":-15,"rgcommaaccent":-15,"rhyphen":-20,"ro":-20,"roacute":-20,"rocircumflex":-20,"rodieresis":-20,"rograve":-20,"rohungarumlaut":-20,"romacron":-20,"roslash":-20,"rotilde":-20,"rperiod":-60,"rq":-20,"rs":-15,"rsacute":-15,"rscaron":-15,"rscedilla":-15,"rscommaaccent":-15,"rt":20,"rtcommaaccent":20,"rv":10,"ry":10,"ryacute":10,"rydieresis":10,"racutec":-20,"racutecacute":-20,"racuteccaron":-20,"racuteccedilla":-20,"racutecomma":-60,"racuted":-20,"racutedcroat":-20,"racuteg":-15,"racutegbreve":-15,"racutegcommaaccent":-15,"racutehyphen":-20,"racuteo":-20,"racuteoacute":-20,"racuteocircumflex":-20,"racuteodieresis":-20,"racuteograve":-20,"racuteohungarumlaut":-20,"racuteomacron":-20,"racuteoslash":-20,"racuteotilde":-20,"racuteperiod":-60,"racuteq":-20,"racutes":-15,"racutesacute":-15,"racutescaron":-15,"racutescedilla":-15,"racutescommaaccent":-15,"racutet":20,"racutetcommaaccent":20,"racutev":10,"racutey":10,"racuteyacute":10,"racuteydieresis":10,"rcaronc":-20,"rcaroncacute":-20,"rcaronccaron":-20,"rcaronccedilla":-20,"rcaroncomma":-60,"rcarond":-20,"rcarondcroat":-20,"rcarong":-15,"rcarongbreve":-15,"rcarongcommaaccent":-15,"rcaronhyphen":-20,"rcarono":-20,"rcaronoacute":-20,"rcaronocircumflex":-20,"rcaronodieresis":-20,"rcaronograve":-20,"rcaronohungarumlaut":-20,"rcaronomacron":-20,"rcaronoslash":-20,"rcaronotilde":-20,"rcaronperiod":-60,"rcaronq":-20,"rcarons":-15,"rcaronsacute":-15,"rcaronscaron":-15,"rcaronscedilla":-15,"rcaronscommaaccent":-15,"rcaront":20,"rcarontcommaaccent":20,"rcaronv":10,"rcarony":10,"rcaronyacute":10,"rcaronydieresis":10,"rcommaaccentc":-20,"rcommaaccentcacute":-20,"rcommaaccentccaron":-20,"rcommaaccentccedilla":-20,"rcommaaccentcomma":-60,"rcommaaccentd":-20,"rcommaaccentdcroat":-20,"rcommaaccentg":-15,"rcommaaccentgbreve":-15,"rcommaaccentgcommaaccent":-15,"rcommaaccenthyphen":-20,"rcommaaccento":-20,"rcommaaccentoacute":-20,"rcommaaccentocircumflex":-20,"rcommaaccentodieresis":-20,"rcommaaccentograve":-20,"rcommaaccentohungarumlaut":-20,"rcommaaccentomacron":-20,"rcommaaccentoslash":-20,"rcommaaccentotilde":-20,"rcommaaccentperiod":-60,"rcommaaccentq":-20,"rcommaaccents":-15,"rcommaaccentsacute":-15,"rcommaaccentscaron":-15,"rcommaaccentscedilla":-15,"rcommaaccentscommaaccent":-15,"rcommaaccentt":20,"rcommaaccenttcommaaccent":20,"rcommaaccentv":10,"rcommaaccenty":10,"rcommaaccentyacute":10,"rcommaaccentydieresis":10,"sw":-15,"sacutew":-15,"scaronw":-15,"scedillaw":-15,"scommaaccentw":-15,"semicolonspace":-40,"spaceT":-100,"spaceTcaron":-100,"spaceTcommaaccent":-100,"spaceV":-80,"spaceW":-80,"spaceY":-120,"spaceYacute":-120,"spaceYdieresis":-120,"spacequotedblleft":-80,"spacequoteleft":-60,"va":-20,"vaacute":-20,"vabreve":-20,"vacircumflex":-20,"vadieresis":-20,"vagrave":-20,"vamacron":-20,"vaogonek":-20,"varing":-20,"vatilde":-20,"vcomma":-80,"vo":-30,"voacute":-30,"vocircumflex":-30,"vodieresis":-30,"vograve":-30,"vohungarumlaut":-30,"vomacron":-30,"voslash":-30,"votilde":-30,"vperiod":-80,"wcomma":-40,"wo":-20,"woacute":-20,"wocircumflex":-20,"wodieresis":-20,"wograve":-20,"wohungarumlaut":-20,"womacron":-20,"woslash":-20,"wotilde":-20,"wperiod":-40,"xe":-10,"xeacute":-10,"xecaron":-10,"xecircumflex":-10,"xedieresis":-10,"xedotaccent":-10,"xegrave":-10,"xemacron":-10,"xeogonek":-10,"ya":-30,"yaacute":-30,"yabreve":-30,"yacircumflex":-30,"yadieresis":-30,"yagrave":-30,"yamacron":-30,"yaogonek":-30,"yaring":-30,"yatilde":-30,"ycomma":-80,"ye":-10,"yeacute":-10,"yecaron":-10,"yecircumflex":-10,"yedieresis":-10,"yedotaccent":-10,"yegrave":-10,"yemacron":-10,"yeogonek":-10,"yo":-25,"yoacute":-25,"yocircumflex":-25,"yodieresis":-25,"yograve":-25,"yohungarumlaut":-25,"yomacron":-25,"yoslash":-25,"yotilde":-25,"yperiod":-80,"yacutea":-30,"yacuteaacute":-30,"yacuteabreve":-30,"yacuteacircumflex":-30,"yacuteadieresis":-30,"yacuteagrave":-30,"yacuteamacron":-30,"yacuteaogonek":-30,"yacutearing":-30,"yacuteatilde":-30,"yacutecomma":-80,"yacutee":-10,"yacuteeacute":-10,"yacuteecaron":-10,"yacuteecircumflex":-10,"yacuteedieresis":-10,"yacuteedotaccent":-10,"yacuteegrave":-10,"yacuteemacron":-10,"yacuteeogonek":-10,"yacuteo":-25,"yacuteoacute":-25,"yacuteocircumflex":-25,"yacuteodieresis":-25,"yacuteograve":-25,"yacuteohungarumlaut":-25,"yacuteomacron":-25,"yacuteoslash":-25,"yacuteotilde":-25,"yacuteperiod":-80,"ydieresisa":-30,"ydieresisaacute":-30,"ydieresisabreve":-30,"ydieresisacircumflex":-30,"ydieresisadieresis":-30,"ydieresisagrave":-30,"ydieresisamacron":-30,"ydieresisaogonek":-30,"ydieresisaring":-30,"ydieresisatilde":-30,"ydieresiscomma":-80,"ydieresise":-10,"ydieresiseacute":-10,"ydieresisecaron":-10,"ydieresisecircumflex":-10,"ydieresisedieresis":-10,"ydieresisedotaccent":-10,"ydieresisegrave":-10,"ydieresisemacron":-10,"ydieresiseogonek":-10,"ydieresiso":-25,"ydieresisoacute":-25,"ydieresisocircumflex":-25,"ydieresisodieresis":-25,"ydieresisograve":-25,"ydieresisohungarumlaut":-25,"ydieresisomacron":-25,"ydieresisoslash":-25,"ydieresisotilde":-25,"ydieresisperiod":-80,"ze":10,"zeacute":10,"zecaron":10,"zecircumflex":10,"zedieresis":10,"zedotaccent":10,"zegrave":10,"zemacron":10,"zeogonek":10,"zacutee":10,"zacuteeacute":10,"zacuteecaron":10,"zacuteecircumflex":10,"zacuteedieresis":10,"zacuteedotaccent":10,"zacuteegrave":10,"zacuteemacron":10,"zacuteeogonek":10,"zcarone":10,"zcaroneacute":10,"zcaronecaron":10,"zcaronecircumflex":10,"zcaronedieresis":10,"zcaronedotaccent":10,"zcaronegrave":10,"zcaronemacron":10,"zcaroneogonek":10,"zdotaccente":10,"zdotaccenteacute":10,"zdotaccentecaron":10,"zdotaccentecircumflex":10,"zdotaccentedieresis":10,"zdotaccentedotaccent":10,"zdotaccentegrave":10,"zdotaccentemacron":10,"zdotaccenteogonek":10}} \ No newline at end of file diff --git a/packages/pdfkit/src/font/data/Helvetica-BoldOblique.json b/packages/pdfkit/src/font/data/Helvetica-BoldOblique.json deleted file mode 100644 index c75c5cf8d..000000000 --- a/packages/pdfkit/src/font/data/Helvetica-BoldOblique.json +++ /dev/null @@ -1 +0,0 @@ -{"attributes":{"Comment":["Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.","Creation Date: Thu May 1 12:45:12 1997","UniqueID 43053","VMusage 14482 68586"],"FontName":"Helvetica-BoldOblique","FullName":"Helvetica Bold Oblique","FamilyName":"Helvetica","Weight":"Bold","ItalicAngle":"-12","IsFixedPitch":"false","CharacterSet":"ExtendedRoman","FontBBox":"-174 -228 1114 962","UnderlinePosition":"-100","UnderlineThickness":"50","Version":"002.000","Notice":"Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries.","EncodingScheme":"AdobeStandardEncoding","CapHeight":"718","XHeight":"532","Ascender":"718","Descender":"-207","StdHW":"118","StdVW":"140"},"glyphWidths":{"space":278,"exclam":333,"quotedbl":474,"numbersign":556,"dollar":556,"percent":889,"ampersand":722,"quoteright":278,"parenleft":333,"parenright":333,"asterisk":389,"plus":584,"comma":278,"hyphen":333,"period":278,"slash":278,"zero":556,"one":556,"two":556,"three":556,"four":556,"five":556,"six":556,"seven":556,"eight":556,"nine":556,"colon":333,"semicolon":333,"less":584,"equal":584,"greater":584,"question":611,"at":975,"A":722,"B":722,"C":722,"D":722,"E":667,"F":611,"G":778,"H":722,"I":278,"J":556,"K":722,"L":611,"M":833,"N":722,"O":778,"P":667,"Q":778,"R":722,"S":667,"T":611,"U":722,"V":667,"W":944,"X":667,"Y":667,"Z":611,"bracketleft":333,"backslash":278,"bracketright":333,"asciicircum":584,"underscore":556,"quoteleft":278,"a":556,"b":611,"c":556,"d":611,"e":556,"f":333,"g":611,"h":611,"i":278,"j":278,"k":556,"l":278,"m":889,"n":611,"o":611,"p":611,"q":611,"r":389,"s":556,"t":333,"u":611,"v":556,"w":778,"x":556,"y":556,"z":500,"braceleft":389,"bar":280,"braceright":389,"asciitilde":584,"exclamdown":333,"cent":556,"sterling":556,"fraction":167,"yen":556,"florin":556,"section":556,"currency":556,"quotesingle":238,"quotedblleft":500,"guillemotleft":556,"guilsinglleft":333,"guilsinglright":333,"fi":611,"fl":611,"endash":556,"dagger":556,"daggerdbl":556,"periodcentered":278,"paragraph":556,"bullet":350,"quotesinglbase":278,"quotedblbase":500,"quotedblright":500,"guillemotright":556,"ellipsis":1000,"perthousand":1000,"questiondown":611,"grave":333,"acute":333,"circumflex":333,"tilde":333,"macron":333,"breve":333,"dotaccent":333,"dieresis":333,"ring":333,"cedilla":333,"hungarumlaut":333,"ogonek":333,"caron":333,"emdash":1000,"AE":1000,"ordfeminine":370,"Lslash":611,"Oslash":778,"OE":1000,"ordmasculine":365,"ae":889,"dotlessi":278,"lslash":278,"oslash":611,"oe":944,"germandbls":611,"Idieresis":278,"eacute":556,"abreve":556,"uhungarumlaut":611,"ecaron":556,"Ydieresis":667,"divide":584,"Yacute":667,"Acircumflex":722,"aacute":556,"Ucircumflex":722,"yacute":556,"scommaaccent":556,"ecircumflex":556,"Uring":722,"Udieresis":722,"aogonek":556,"Uacute":722,"uogonek":611,"Edieresis":667,"Dcroat":722,"commaaccent":250,"copyright":737,"Emacron":667,"ccaron":556,"aring":556,"Ncommaaccent":722,"lacute":278,"agrave":556,"Tcommaaccent":611,"Cacute":722,"atilde":556,"Edotaccent":667,"scaron":556,"scedilla":556,"iacute":278,"lozenge":494,"Rcaron":722,"Gcommaaccent":778,"ucircumflex":611,"acircumflex":556,"Amacron":722,"rcaron":389,"ccedilla":556,"Zdotaccent":611,"Thorn":667,"Omacron":778,"Racute":722,"Sacute":667,"dcaron":743,"Umacron":722,"uring":611,"threesuperior":333,"Ograve":778,"Agrave":722,"Abreve":722,"multiply":584,"uacute":611,"Tcaron":611,"partialdiff":494,"ydieresis":556,"Nacute":722,"icircumflex":278,"Ecircumflex":667,"adieresis":556,"edieresis":556,"cacute":556,"nacute":611,"umacron":611,"Ncaron":722,"Iacute":278,"plusminus":584,"brokenbar":280,"registered":737,"Gbreve":778,"Idotaccent":278,"summation":600,"Egrave":667,"racute":389,"omacron":611,"Zacute":611,"Zcaron":611,"greaterequal":549,"Eth":722,"Ccedilla":722,"lcommaaccent":278,"tcaron":389,"eogonek":556,"Uogonek":722,"Aacute":722,"Adieresis":722,"egrave":556,"zacute":500,"iogonek":278,"Oacute":778,"oacute":611,"amacron":556,"sacute":556,"idieresis":278,"Ocircumflex":778,"Ugrave":722,"Delta":612,"thorn":611,"twosuperior":333,"Odieresis":778,"mu":611,"igrave":278,"ohungarumlaut":611,"Eogonek":667,"dcroat":611,"threequarters":834,"Scedilla":667,"lcaron":400,"Kcommaaccent":722,"Lacute":611,"trademark":1000,"edotaccent":556,"Igrave":278,"Imacron":278,"Lcaron":611,"onehalf":834,"lessequal":549,"ocircumflex":611,"ntilde":611,"Uhungarumlaut":722,"Eacute":667,"emacron":556,"gbreve":611,"onequarter":834,"Scaron":667,"Scommaaccent":667,"Ohungarumlaut":778,"degree":400,"ograve":611,"Ccaron":722,"ugrave":611,"radical":549,"Dcaron":722,"rcommaaccent":389,"Ntilde":722,"otilde":611,"Rcommaaccent":722,"Lcommaaccent":611,"Atilde":722,"Aogonek":722,"Aring":722,"Otilde":778,"zdotaccent":500,"Ecaron":667,"Iogonek":278,"kcommaaccent":556,"minus":584,"Icircumflex":278,"ncaron":611,"tcommaaccent":333,"logicalnot":584,"odieresis":611,"udieresis":611,"notequal":549,"gcommaaccent":611,"eth":611,"zcaron":500,"ncommaaccent":611,"onesuperior":333,"imacron":278,"Euro":556},"kernPairs":{"AC":-40,"ACacute":-40,"ACcaron":-40,"ACcedilla":-40,"AG":-50,"AGbreve":-50,"AGcommaaccent":-50,"AO":-40,"AOacute":-40,"AOcircumflex":-40,"AOdieresis":-40,"AOgrave":-40,"AOhungarumlaut":-40,"AOmacron":-40,"AOslash":-40,"AOtilde":-40,"AQ":-40,"AT":-90,"ATcaron":-90,"ATcommaaccent":-90,"AU":-50,"AUacute":-50,"AUcircumflex":-50,"AUdieresis":-50,"AUgrave":-50,"AUhungarumlaut":-50,"AUmacron":-50,"AUogonek":-50,"AUring":-50,"AV":-80,"AW":-60,"AY":-110,"AYacute":-110,"AYdieresis":-110,"Au":-30,"Auacute":-30,"Aucircumflex":-30,"Audieresis":-30,"Augrave":-30,"Auhungarumlaut":-30,"Aumacron":-30,"Auogonek":-30,"Auring":-30,"Av":-40,"Aw":-30,"Ay":-30,"Ayacute":-30,"Aydieresis":-30,"AacuteC":-40,"AacuteCacute":-40,"AacuteCcaron":-40,"AacuteCcedilla":-40,"AacuteG":-50,"AacuteGbreve":-50,"AacuteGcommaaccent":-50,"AacuteO":-40,"AacuteOacute":-40,"AacuteOcircumflex":-40,"AacuteOdieresis":-40,"AacuteOgrave":-40,"AacuteOhungarumlaut":-40,"AacuteOmacron":-40,"AacuteOslash":-40,"AacuteOtilde":-40,"AacuteQ":-40,"AacuteT":-90,"AacuteTcaron":-90,"AacuteTcommaaccent":-90,"AacuteU":-50,"AacuteUacute":-50,"AacuteUcircumflex":-50,"AacuteUdieresis":-50,"AacuteUgrave":-50,"AacuteUhungarumlaut":-50,"AacuteUmacron":-50,"AacuteUogonek":-50,"AacuteUring":-50,"AacuteV":-80,"AacuteW":-60,"AacuteY":-110,"AacuteYacute":-110,"AacuteYdieresis":-110,"Aacuteu":-30,"Aacuteuacute":-30,"Aacuteucircumflex":-30,"Aacuteudieresis":-30,"Aacuteugrave":-30,"Aacuteuhungarumlaut":-30,"Aacuteumacron":-30,"Aacuteuogonek":-30,"Aacuteuring":-30,"Aacutev":-40,"Aacutew":-30,"Aacutey":-30,"Aacuteyacute":-30,"Aacuteydieresis":-30,"AbreveC":-40,"AbreveCacute":-40,"AbreveCcaron":-40,"AbreveCcedilla":-40,"AbreveG":-50,"AbreveGbreve":-50,"AbreveGcommaaccent":-50,"AbreveO":-40,"AbreveOacute":-40,"AbreveOcircumflex":-40,"AbreveOdieresis":-40,"AbreveOgrave":-40,"AbreveOhungarumlaut":-40,"AbreveOmacron":-40,"AbreveOslash":-40,"AbreveOtilde":-40,"AbreveQ":-40,"AbreveT":-90,"AbreveTcaron":-90,"AbreveTcommaaccent":-90,"AbreveU":-50,"AbreveUacute":-50,"AbreveUcircumflex":-50,"AbreveUdieresis":-50,"AbreveUgrave":-50,"AbreveUhungarumlaut":-50,"AbreveUmacron":-50,"AbreveUogonek":-50,"AbreveUring":-50,"AbreveV":-80,"AbreveW":-60,"AbreveY":-110,"AbreveYacute":-110,"AbreveYdieresis":-110,"Abreveu":-30,"Abreveuacute":-30,"Abreveucircumflex":-30,"Abreveudieresis":-30,"Abreveugrave":-30,"Abreveuhungarumlaut":-30,"Abreveumacron":-30,"Abreveuogonek":-30,"Abreveuring":-30,"Abrevev":-40,"Abrevew":-30,"Abrevey":-30,"Abreveyacute":-30,"Abreveydieresis":-30,"AcircumflexC":-40,"AcircumflexCacute":-40,"AcircumflexCcaron":-40,"AcircumflexCcedilla":-40,"AcircumflexG":-50,"AcircumflexGbreve":-50,"AcircumflexGcommaaccent":-50,"AcircumflexO":-40,"AcircumflexOacute":-40,"AcircumflexOcircumflex":-40,"AcircumflexOdieresis":-40,"AcircumflexOgrave":-40,"AcircumflexOhungarumlaut":-40,"AcircumflexOmacron":-40,"AcircumflexOslash":-40,"AcircumflexOtilde":-40,"AcircumflexQ":-40,"AcircumflexT":-90,"AcircumflexTcaron":-90,"AcircumflexTcommaaccent":-90,"AcircumflexU":-50,"AcircumflexUacute":-50,"AcircumflexUcircumflex":-50,"AcircumflexUdieresis":-50,"AcircumflexUgrave":-50,"AcircumflexUhungarumlaut":-50,"AcircumflexUmacron":-50,"AcircumflexUogonek":-50,"AcircumflexUring":-50,"AcircumflexV":-80,"AcircumflexW":-60,"AcircumflexY":-110,"AcircumflexYacute":-110,"AcircumflexYdieresis":-110,"Acircumflexu":-30,"Acircumflexuacute":-30,"Acircumflexucircumflex":-30,"Acircumflexudieresis":-30,"Acircumflexugrave":-30,"Acircumflexuhungarumlaut":-30,"Acircumflexumacron":-30,"Acircumflexuogonek":-30,"Acircumflexuring":-30,"Acircumflexv":-40,"Acircumflexw":-30,"Acircumflexy":-30,"Acircumflexyacute":-30,"Acircumflexydieresis":-30,"AdieresisC":-40,"AdieresisCacute":-40,"AdieresisCcaron":-40,"AdieresisCcedilla":-40,"AdieresisG":-50,"AdieresisGbreve":-50,"AdieresisGcommaaccent":-50,"AdieresisO":-40,"AdieresisOacute":-40,"AdieresisOcircumflex":-40,"AdieresisOdieresis":-40,"AdieresisOgrave":-40,"AdieresisOhungarumlaut":-40,"AdieresisOmacron":-40,"AdieresisOslash":-40,"AdieresisOtilde":-40,"AdieresisQ":-40,"AdieresisT":-90,"AdieresisTcaron":-90,"AdieresisTcommaaccent":-90,"AdieresisU":-50,"AdieresisUacute":-50,"AdieresisUcircumflex":-50,"AdieresisUdieresis":-50,"AdieresisUgrave":-50,"AdieresisUhungarumlaut":-50,"AdieresisUmacron":-50,"AdieresisUogonek":-50,"AdieresisUring":-50,"AdieresisV":-80,"AdieresisW":-60,"AdieresisY":-110,"AdieresisYacute":-110,"AdieresisYdieresis":-110,"Adieresisu":-30,"Adieresisuacute":-30,"Adieresisucircumflex":-30,"Adieresisudieresis":-30,"Adieresisugrave":-30,"Adieresisuhungarumlaut":-30,"Adieresisumacron":-30,"Adieresisuogonek":-30,"Adieresisuring":-30,"Adieresisv":-40,"Adieresisw":-30,"Adieresisy":-30,"Adieresisyacute":-30,"Adieresisydieresis":-30,"AgraveC":-40,"AgraveCacute":-40,"AgraveCcaron":-40,"AgraveCcedilla":-40,"AgraveG":-50,"AgraveGbreve":-50,"AgraveGcommaaccent":-50,"AgraveO":-40,"AgraveOacute":-40,"AgraveOcircumflex":-40,"AgraveOdieresis":-40,"AgraveOgrave":-40,"AgraveOhungarumlaut":-40,"AgraveOmacron":-40,"AgraveOslash":-40,"AgraveOtilde":-40,"AgraveQ":-40,"AgraveT":-90,"AgraveTcaron":-90,"AgraveTcommaaccent":-90,"AgraveU":-50,"AgraveUacute":-50,"AgraveUcircumflex":-50,"AgraveUdieresis":-50,"AgraveUgrave":-50,"AgraveUhungarumlaut":-50,"AgraveUmacron":-50,"AgraveUogonek":-50,"AgraveUring":-50,"AgraveV":-80,"AgraveW":-60,"AgraveY":-110,"AgraveYacute":-110,"AgraveYdieresis":-110,"Agraveu":-30,"Agraveuacute":-30,"Agraveucircumflex":-30,"Agraveudieresis":-30,"Agraveugrave":-30,"Agraveuhungarumlaut":-30,"Agraveumacron":-30,"Agraveuogonek":-30,"Agraveuring":-30,"Agravev":-40,"Agravew":-30,"Agravey":-30,"Agraveyacute":-30,"Agraveydieresis":-30,"AmacronC":-40,"AmacronCacute":-40,"AmacronCcaron":-40,"AmacronCcedilla":-40,"AmacronG":-50,"AmacronGbreve":-50,"AmacronGcommaaccent":-50,"AmacronO":-40,"AmacronOacute":-40,"AmacronOcircumflex":-40,"AmacronOdieresis":-40,"AmacronOgrave":-40,"AmacronOhungarumlaut":-40,"AmacronOmacron":-40,"AmacronOslash":-40,"AmacronOtilde":-40,"AmacronQ":-40,"AmacronT":-90,"AmacronTcaron":-90,"AmacronTcommaaccent":-90,"AmacronU":-50,"AmacronUacute":-50,"AmacronUcircumflex":-50,"AmacronUdieresis":-50,"AmacronUgrave":-50,"AmacronUhungarumlaut":-50,"AmacronUmacron":-50,"AmacronUogonek":-50,"AmacronUring":-50,"AmacronV":-80,"AmacronW":-60,"AmacronY":-110,"AmacronYacute":-110,"AmacronYdieresis":-110,"Amacronu":-30,"Amacronuacute":-30,"Amacronucircumflex":-30,"Amacronudieresis":-30,"Amacronugrave":-30,"Amacronuhungarumlaut":-30,"Amacronumacron":-30,"Amacronuogonek":-30,"Amacronuring":-30,"Amacronv":-40,"Amacronw":-30,"Amacrony":-30,"Amacronyacute":-30,"Amacronydieresis":-30,"AogonekC":-40,"AogonekCacute":-40,"AogonekCcaron":-40,"AogonekCcedilla":-40,"AogonekG":-50,"AogonekGbreve":-50,"AogonekGcommaaccent":-50,"AogonekO":-40,"AogonekOacute":-40,"AogonekOcircumflex":-40,"AogonekOdieresis":-40,"AogonekOgrave":-40,"AogonekOhungarumlaut":-40,"AogonekOmacron":-40,"AogonekOslash":-40,"AogonekOtilde":-40,"AogonekQ":-40,"AogonekT":-90,"AogonekTcaron":-90,"AogonekTcommaaccent":-90,"AogonekU":-50,"AogonekUacute":-50,"AogonekUcircumflex":-50,"AogonekUdieresis":-50,"AogonekUgrave":-50,"AogonekUhungarumlaut":-50,"AogonekUmacron":-50,"AogonekUogonek":-50,"AogonekUring":-50,"AogonekV":-80,"AogonekW":-60,"AogonekY":-110,"AogonekYacute":-110,"AogonekYdieresis":-110,"Aogoneku":-30,"Aogonekuacute":-30,"Aogonekucircumflex":-30,"Aogonekudieresis":-30,"Aogonekugrave":-30,"Aogonekuhungarumlaut":-30,"Aogonekumacron":-30,"Aogonekuogonek":-30,"Aogonekuring":-30,"Aogonekv":-40,"Aogonekw":-30,"Aogoneky":-30,"Aogonekyacute":-30,"Aogonekydieresis":-30,"AringC":-40,"AringCacute":-40,"AringCcaron":-40,"AringCcedilla":-40,"AringG":-50,"AringGbreve":-50,"AringGcommaaccent":-50,"AringO":-40,"AringOacute":-40,"AringOcircumflex":-40,"AringOdieresis":-40,"AringOgrave":-40,"AringOhungarumlaut":-40,"AringOmacron":-40,"AringOslash":-40,"AringOtilde":-40,"AringQ":-40,"AringT":-90,"AringTcaron":-90,"AringTcommaaccent":-90,"AringU":-50,"AringUacute":-50,"AringUcircumflex":-50,"AringUdieresis":-50,"AringUgrave":-50,"AringUhungarumlaut":-50,"AringUmacron":-50,"AringUogonek":-50,"AringUring":-50,"AringV":-80,"AringW":-60,"AringY":-110,"AringYacute":-110,"AringYdieresis":-110,"Aringu":-30,"Aringuacute":-30,"Aringucircumflex":-30,"Aringudieresis":-30,"Aringugrave":-30,"Aringuhungarumlaut":-30,"Aringumacron":-30,"Aringuogonek":-30,"Aringuring":-30,"Aringv":-40,"Aringw":-30,"Aringy":-30,"Aringyacute":-30,"Aringydieresis":-30,"AtildeC":-40,"AtildeCacute":-40,"AtildeCcaron":-40,"AtildeCcedilla":-40,"AtildeG":-50,"AtildeGbreve":-50,"AtildeGcommaaccent":-50,"AtildeO":-40,"AtildeOacute":-40,"AtildeOcircumflex":-40,"AtildeOdieresis":-40,"AtildeOgrave":-40,"AtildeOhungarumlaut":-40,"AtildeOmacron":-40,"AtildeOslash":-40,"AtildeOtilde":-40,"AtildeQ":-40,"AtildeT":-90,"AtildeTcaron":-90,"AtildeTcommaaccent":-90,"AtildeU":-50,"AtildeUacute":-50,"AtildeUcircumflex":-50,"AtildeUdieresis":-50,"AtildeUgrave":-50,"AtildeUhungarumlaut":-50,"AtildeUmacron":-50,"AtildeUogonek":-50,"AtildeUring":-50,"AtildeV":-80,"AtildeW":-60,"AtildeY":-110,"AtildeYacute":-110,"AtildeYdieresis":-110,"Atildeu":-30,"Atildeuacute":-30,"Atildeucircumflex":-30,"Atildeudieresis":-30,"Atildeugrave":-30,"Atildeuhungarumlaut":-30,"Atildeumacron":-30,"Atildeuogonek":-30,"Atildeuring":-30,"Atildev":-40,"Atildew":-30,"Atildey":-30,"Atildeyacute":-30,"Atildeydieresis":-30,"BA":-30,"BAacute":-30,"BAbreve":-30,"BAcircumflex":-30,"BAdieresis":-30,"BAgrave":-30,"BAmacron":-30,"BAogonek":-30,"BAring":-30,"BAtilde":-30,"BU":-10,"BUacute":-10,"BUcircumflex":-10,"BUdieresis":-10,"BUgrave":-10,"BUhungarumlaut":-10,"BUmacron":-10,"BUogonek":-10,"BUring":-10,"DA":-40,"DAacute":-40,"DAbreve":-40,"DAcircumflex":-40,"DAdieresis":-40,"DAgrave":-40,"DAmacron":-40,"DAogonek":-40,"DAring":-40,"DAtilde":-40,"DV":-40,"DW":-40,"DY":-70,"DYacute":-70,"DYdieresis":-70,"Dcomma":-30,"Dperiod":-30,"DcaronA":-40,"DcaronAacute":-40,"DcaronAbreve":-40,"DcaronAcircumflex":-40,"DcaronAdieresis":-40,"DcaronAgrave":-40,"DcaronAmacron":-40,"DcaronAogonek":-40,"DcaronAring":-40,"DcaronAtilde":-40,"DcaronV":-40,"DcaronW":-40,"DcaronY":-70,"DcaronYacute":-70,"DcaronYdieresis":-70,"Dcaroncomma":-30,"Dcaronperiod":-30,"DcroatA":-40,"DcroatAacute":-40,"DcroatAbreve":-40,"DcroatAcircumflex":-40,"DcroatAdieresis":-40,"DcroatAgrave":-40,"DcroatAmacron":-40,"DcroatAogonek":-40,"DcroatAring":-40,"DcroatAtilde":-40,"DcroatV":-40,"DcroatW":-40,"DcroatY":-70,"DcroatYacute":-70,"DcroatYdieresis":-70,"Dcroatcomma":-30,"Dcroatperiod":-30,"FA":-80,"FAacute":-80,"FAbreve":-80,"FAcircumflex":-80,"FAdieresis":-80,"FAgrave":-80,"FAmacron":-80,"FAogonek":-80,"FAring":-80,"FAtilde":-80,"Fa":-20,"Faacute":-20,"Fabreve":-20,"Facircumflex":-20,"Fadieresis":-20,"Fagrave":-20,"Famacron":-20,"Faogonek":-20,"Faring":-20,"Fatilde":-20,"Fcomma":-100,"Fperiod":-100,"JA":-20,"JAacute":-20,"JAbreve":-20,"JAcircumflex":-20,"JAdieresis":-20,"JAgrave":-20,"JAmacron":-20,"JAogonek":-20,"JAring":-20,"JAtilde":-20,"Jcomma":-20,"Jperiod":-20,"Ju":-20,"Juacute":-20,"Jucircumflex":-20,"Judieresis":-20,"Jugrave":-20,"Juhungarumlaut":-20,"Jumacron":-20,"Juogonek":-20,"Juring":-20,"KO":-30,"KOacute":-30,"KOcircumflex":-30,"KOdieresis":-30,"KOgrave":-30,"KOhungarumlaut":-30,"KOmacron":-30,"KOslash":-30,"KOtilde":-30,"Ke":-15,"Keacute":-15,"Kecaron":-15,"Kecircumflex":-15,"Kedieresis":-15,"Kedotaccent":-15,"Kegrave":-15,"Kemacron":-15,"Keogonek":-15,"Ko":-35,"Koacute":-35,"Kocircumflex":-35,"Kodieresis":-35,"Kograve":-35,"Kohungarumlaut":-35,"Komacron":-35,"Koslash":-35,"Kotilde":-35,"Ku":-30,"Kuacute":-30,"Kucircumflex":-30,"Kudieresis":-30,"Kugrave":-30,"Kuhungarumlaut":-30,"Kumacron":-30,"Kuogonek":-30,"Kuring":-30,"Ky":-40,"Kyacute":-40,"Kydieresis":-40,"KcommaaccentO":-30,"KcommaaccentOacute":-30,"KcommaaccentOcircumflex":-30,"KcommaaccentOdieresis":-30,"KcommaaccentOgrave":-30,"KcommaaccentOhungarumlaut":-30,"KcommaaccentOmacron":-30,"KcommaaccentOslash":-30,"KcommaaccentOtilde":-30,"Kcommaaccente":-15,"Kcommaaccenteacute":-15,"Kcommaaccentecaron":-15,"Kcommaaccentecircumflex":-15,"Kcommaaccentedieresis":-15,"Kcommaaccentedotaccent":-15,"Kcommaaccentegrave":-15,"Kcommaaccentemacron":-15,"Kcommaaccenteogonek":-15,"Kcommaaccento":-35,"Kcommaaccentoacute":-35,"Kcommaaccentocircumflex":-35,"Kcommaaccentodieresis":-35,"Kcommaaccentograve":-35,"Kcommaaccentohungarumlaut":-35,"Kcommaaccentomacron":-35,"Kcommaaccentoslash":-35,"Kcommaaccentotilde":-35,"Kcommaaccentu":-30,"Kcommaaccentuacute":-30,"Kcommaaccentucircumflex":-30,"Kcommaaccentudieresis":-30,"Kcommaaccentugrave":-30,"Kcommaaccentuhungarumlaut":-30,"Kcommaaccentumacron":-30,"Kcommaaccentuogonek":-30,"Kcommaaccenturing":-30,"Kcommaaccenty":-40,"Kcommaaccentyacute":-40,"Kcommaaccentydieresis":-40,"LT":-90,"LTcaron":-90,"LTcommaaccent":-90,"LV":-110,"LW":-80,"LY":-120,"LYacute":-120,"LYdieresis":-120,"Lquotedblright":-140,"Lquoteright":-140,"Ly":-30,"Lyacute":-30,"Lydieresis":-30,"LacuteT":-90,"LacuteTcaron":-90,"LacuteTcommaaccent":-90,"LacuteV":-110,"LacuteW":-80,"LacuteY":-120,"LacuteYacute":-120,"LacuteYdieresis":-120,"Lacutequotedblright":-140,"Lacutequoteright":-140,"Lacutey":-30,"Lacuteyacute":-30,"Lacuteydieresis":-30,"LcommaaccentT":-90,"LcommaaccentTcaron":-90,"LcommaaccentTcommaaccent":-90,"LcommaaccentV":-110,"LcommaaccentW":-80,"LcommaaccentY":-120,"LcommaaccentYacute":-120,"LcommaaccentYdieresis":-120,"Lcommaaccentquotedblright":-140,"Lcommaaccentquoteright":-140,"Lcommaaccenty":-30,"Lcommaaccentyacute":-30,"Lcommaaccentydieresis":-30,"LslashT":-90,"LslashTcaron":-90,"LslashTcommaaccent":-90,"LslashV":-110,"LslashW":-80,"LslashY":-120,"LslashYacute":-120,"LslashYdieresis":-120,"Lslashquotedblright":-140,"Lslashquoteright":-140,"Lslashy":-30,"Lslashyacute":-30,"Lslashydieresis":-30,"OA":-50,"OAacute":-50,"OAbreve":-50,"OAcircumflex":-50,"OAdieresis":-50,"OAgrave":-50,"OAmacron":-50,"OAogonek":-50,"OAring":-50,"OAtilde":-50,"OT":-40,"OTcaron":-40,"OTcommaaccent":-40,"OV":-50,"OW":-50,"OX":-50,"OY":-70,"OYacute":-70,"OYdieresis":-70,"Ocomma":-40,"Operiod":-40,"OacuteA":-50,"OacuteAacute":-50,"OacuteAbreve":-50,"OacuteAcircumflex":-50,"OacuteAdieresis":-50,"OacuteAgrave":-50,"OacuteAmacron":-50,"OacuteAogonek":-50,"OacuteAring":-50,"OacuteAtilde":-50,"OacuteT":-40,"OacuteTcaron":-40,"OacuteTcommaaccent":-40,"OacuteV":-50,"OacuteW":-50,"OacuteX":-50,"OacuteY":-70,"OacuteYacute":-70,"OacuteYdieresis":-70,"Oacutecomma":-40,"Oacuteperiod":-40,"OcircumflexA":-50,"OcircumflexAacute":-50,"OcircumflexAbreve":-50,"OcircumflexAcircumflex":-50,"OcircumflexAdieresis":-50,"OcircumflexAgrave":-50,"OcircumflexAmacron":-50,"OcircumflexAogonek":-50,"OcircumflexAring":-50,"OcircumflexAtilde":-50,"OcircumflexT":-40,"OcircumflexTcaron":-40,"OcircumflexTcommaaccent":-40,"OcircumflexV":-50,"OcircumflexW":-50,"OcircumflexX":-50,"OcircumflexY":-70,"OcircumflexYacute":-70,"OcircumflexYdieresis":-70,"Ocircumflexcomma":-40,"Ocircumflexperiod":-40,"OdieresisA":-50,"OdieresisAacute":-50,"OdieresisAbreve":-50,"OdieresisAcircumflex":-50,"OdieresisAdieresis":-50,"OdieresisAgrave":-50,"OdieresisAmacron":-50,"OdieresisAogonek":-50,"OdieresisAring":-50,"OdieresisAtilde":-50,"OdieresisT":-40,"OdieresisTcaron":-40,"OdieresisTcommaaccent":-40,"OdieresisV":-50,"OdieresisW":-50,"OdieresisX":-50,"OdieresisY":-70,"OdieresisYacute":-70,"OdieresisYdieresis":-70,"Odieresiscomma":-40,"Odieresisperiod":-40,"OgraveA":-50,"OgraveAacute":-50,"OgraveAbreve":-50,"OgraveAcircumflex":-50,"OgraveAdieresis":-50,"OgraveAgrave":-50,"OgraveAmacron":-50,"OgraveAogonek":-50,"OgraveAring":-50,"OgraveAtilde":-50,"OgraveT":-40,"OgraveTcaron":-40,"OgraveTcommaaccent":-40,"OgraveV":-50,"OgraveW":-50,"OgraveX":-50,"OgraveY":-70,"OgraveYacute":-70,"OgraveYdieresis":-70,"Ogravecomma":-40,"Ograveperiod":-40,"OhungarumlautA":-50,"OhungarumlautAacute":-50,"OhungarumlautAbreve":-50,"OhungarumlautAcircumflex":-50,"OhungarumlautAdieresis":-50,"OhungarumlautAgrave":-50,"OhungarumlautAmacron":-50,"OhungarumlautAogonek":-50,"OhungarumlautAring":-50,"OhungarumlautAtilde":-50,"OhungarumlautT":-40,"OhungarumlautTcaron":-40,"OhungarumlautTcommaaccent":-40,"OhungarumlautV":-50,"OhungarumlautW":-50,"OhungarumlautX":-50,"OhungarumlautY":-70,"OhungarumlautYacute":-70,"OhungarumlautYdieresis":-70,"Ohungarumlautcomma":-40,"Ohungarumlautperiod":-40,"OmacronA":-50,"OmacronAacute":-50,"OmacronAbreve":-50,"OmacronAcircumflex":-50,"OmacronAdieresis":-50,"OmacronAgrave":-50,"OmacronAmacron":-50,"OmacronAogonek":-50,"OmacronAring":-50,"OmacronAtilde":-50,"OmacronT":-40,"OmacronTcaron":-40,"OmacronTcommaaccent":-40,"OmacronV":-50,"OmacronW":-50,"OmacronX":-50,"OmacronY":-70,"OmacronYacute":-70,"OmacronYdieresis":-70,"Omacroncomma":-40,"Omacronperiod":-40,"OslashA":-50,"OslashAacute":-50,"OslashAbreve":-50,"OslashAcircumflex":-50,"OslashAdieresis":-50,"OslashAgrave":-50,"OslashAmacron":-50,"OslashAogonek":-50,"OslashAring":-50,"OslashAtilde":-50,"OslashT":-40,"OslashTcaron":-40,"OslashTcommaaccent":-40,"OslashV":-50,"OslashW":-50,"OslashX":-50,"OslashY":-70,"OslashYacute":-70,"OslashYdieresis":-70,"Oslashcomma":-40,"Oslashperiod":-40,"OtildeA":-50,"OtildeAacute":-50,"OtildeAbreve":-50,"OtildeAcircumflex":-50,"OtildeAdieresis":-50,"OtildeAgrave":-50,"OtildeAmacron":-50,"OtildeAogonek":-50,"OtildeAring":-50,"OtildeAtilde":-50,"OtildeT":-40,"OtildeTcaron":-40,"OtildeTcommaaccent":-40,"OtildeV":-50,"OtildeW":-50,"OtildeX":-50,"OtildeY":-70,"OtildeYacute":-70,"OtildeYdieresis":-70,"Otildecomma":-40,"Otildeperiod":-40,"PA":-100,"PAacute":-100,"PAbreve":-100,"PAcircumflex":-100,"PAdieresis":-100,"PAgrave":-100,"PAmacron":-100,"PAogonek":-100,"PAring":-100,"PAtilde":-100,"Pa":-30,"Paacute":-30,"Pabreve":-30,"Pacircumflex":-30,"Padieresis":-30,"Pagrave":-30,"Pamacron":-30,"Paogonek":-30,"Paring":-30,"Patilde":-30,"Pcomma":-120,"Pe":-30,"Peacute":-30,"Pecaron":-30,"Pecircumflex":-30,"Pedieresis":-30,"Pedotaccent":-30,"Pegrave":-30,"Pemacron":-30,"Peogonek":-30,"Po":-40,"Poacute":-40,"Pocircumflex":-40,"Podieresis":-40,"Pograve":-40,"Pohungarumlaut":-40,"Pomacron":-40,"Poslash":-40,"Potilde":-40,"Pperiod":-120,"QU":-10,"QUacute":-10,"QUcircumflex":-10,"QUdieresis":-10,"QUgrave":-10,"QUhungarumlaut":-10,"QUmacron":-10,"QUogonek":-10,"QUring":-10,"Qcomma":20,"Qperiod":20,"RO":-20,"ROacute":-20,"ROcircumflex":-20,"ROdieresis":-20,"ROgrave":-20,"ROhungarumlaut":-20,"ROmacron":-20,"ROslash":-20,"ROtilde":-20,"RT":-20,"RTcaron":-20,"RTcommaaccent":-20,"RU":-20,"RUacute":-20,"RUcircumflex":-20,"RUdieresis":-20,"RUgrave":-20,"RUhungarumlaut":-20,"RUmacron":-20,"RUogonek":-20,"RUring":-20,"RV":-50,"RW":-40,"RY":-50,"RYacute":-50,"RYdieresis":-50,"RacuteO":-20,"RacuteOacute":-20,"RacuteOcircumflex":-20,"RacuteOdieresis":-20,"RacuteOgrave":-20,"RacuteOhungarumlaut":-20,"RacuteOmacron":-20,"RacuteOslash":-20,"RacuteOtilde":-20,"RacuteT":-20,"RacuteTcaron":-20,"RacuteTcommaaccent":-20,"RacuteU":-20,"RacuteUacute":-20,"RacuteUcircumflex":-20,"RacuteUdieresis":-20,"RacuteUgrave":-20,"RacuteUhungarumlaut":-20,"RacuteUmacron":-20,"RacuteUogonek":-20,"RacuteUring":-20,"RacuteV":-50,"RacuteW":-40,"RacuteY":-50,"RacuteYacute":-50,"RacuteYdieresis":-50,"RcaronO":-20,"RcaronOacute":-20,"RcaronOcircumflex":-20,"RcaronOdieresis":-20,"RcaronOgrave":-20,"RcaronOhungarumlaut":-20,"RcaronOmacron":-20,"RcaronOslash":-20,"RcaronOtilde":-20,"RcaronT":-20,"RcaronTcaron":-20,"RcaronTcommaaccent":-20,"RcaronU":-20,"RcaronUacute":-20,"RcaronUcircumflex":-20,"RcaronUdieresis":-20,"RcaronUgrave":-20,"RcaronUhungarumlaut":-20,"RcaronUmacron":-20,"RcaronUogonek":-20,"RcaronUring":-20,"RcaronV":-50,"RcaronW":-40,"RcaronY":-50,"RcaronYacute":-50,"RcaronYdieresis":-50,"RcommaaccentO":-20,"RcommaaccentOacute":-20,"RcommaaccentOcircumflex":-20,"RcommaaccentOdieresis":-20,"RcommaaccentOgrave":-20,"RcommaaccentOhungarumlaut":-20,"RcommaaccentOmacron":-20,"RcommaaccentOslash":-20,"RcommaaccentOtilde":-20,"RcommaaccentT":-20,"RcommaaccentTcaron":-20,"RcommaaccentTcommaaccent":-20,"RcommaaccentU":-20,"RcommaaccentUacute":-20,"RcommaaccentUcircumflex":-20,"RcommaaccentUdieresis":-20,"RcommaaccentUgrave":-20,"RcommaaccentUhungarumlaut":-20,"RcommaaccentUmacron":-20,"RcommaaccentUogonek":-20,"RcommaaccentUring":-20,"RcommaaccentV":-50,"RcommaaccentW":-40,"RcommaaccentY":-50,"RcommaaccentYacute":-50,"RcommaaccentYdieresis":-50,"TA":-90,"TAacute":-90,"TAbreve":-90,"TAcircumflex":-90,"TAdieresis":-90,"TAgrave":-90,"TAmacron":-90,"TAogonek":-90,"TAring":-90,"TAtilde":-90,"TO":-40,"TOacute":-40,"TOcircumflex":-40,"TOdieresis":-40,"TOgrave":-40,"TOhungarumlaut":-40,"TOmacron":-40,"TOslash":-40,"TOtilde":-40,"Ta":-80,"Taacute":-80,"Tabreve":-80,"Tacircumflex":-80,"Tadieresis":-80,"Tagrave":-80,"Tamacron":-80,"Taogonek":-80,"Taring":-80,"Tatilde":-80,"Tcolon":-40,"Tcomma":-80,"Te":-60,"Teacute":-60,"Tecaron":-60,"Tecircumflex":-60,"Tedieresis":-60,"Tedotaccent":-60,"Tegrave":-60,"Temacron":-60,"Teogonek":-60,"Thyphen":-120,"To":-80,"Toacute":-80,"Tocircumflex":-80,"Todieresis":-80,"Tograve":-80,"Tohungarumlaut":-80,"Tomacron":-80,"Toslash":-80,"Totilde":-80,"Tperiod":-80,"Tr":-80,"Tracute":-80,"Trcommaaccent":-80,"Tsemicolon":-40,"Tu":-90,"Tuacute":-90,"Tucircumflex":-90,"Tudieresis":-90,"Tugrave":-90,"Tuhungarumlaut":-90,"Tumacron":-90,"Tuogonek":-90,"Turing":-90,"Tw":-60,"Ty":-60,"Tyacute":-60,"Tydieresis":-60,"TcaronA":-90,"TcaronAacute":-90,"TcaronAbreve":-90,"TcaronAcircumflex":-90,"TcaronAdieresis":-90,"TcaronAgrave":-90,"TcaronAmacron":-90,"TcaronAogonek":-90,"TcaronAring":-90,"TcaronAtilde":-90,"TcaronO":-40,"TcaronOacute":-40,"TcaronOcircumflex":-40,"TcaronOdieresis":-40,"TcaronOgrave":-40,"TcaronOhungarumlaut":-40,"TcaronOmacron":-40,"TcaronOslash":-40,"TcaronOtilde":-40,"Tcarona":-80,"Tcaronaacute":-80,"Tcaronabreve":-80,"Tcaronacircumflex":-80,"Tcaronadieresis":-80,"Tcaronagrave":-80,"Tcaronamacron":-80,"Tcaronaogonek":-80,"Tcaronaring":-80,"Tcaronatilde":-80,"Tcaroncolon":-40,"Tcaroncomma":-80,"Tcarone":-60,"Tcaroneacute":-60,"Tcaronecaron":-60,"Tcaronecircumflex":-60,"Tcaronedieresis":-60,"Tcaronedotaccent":-60,"Tcaronegrave":-60,"Tcaronemacron":-60,"Tcaroneogonek":-60,"Tcaronhyphen":-120,"Tcarono":-80,"Tcaronoacute":-80,"Tcaronocircumflex":-80,"Tcaronodieresis":-80,"Tcaronograve":-80,"Tcaronohungarumlaut":-80,"Tcaronomacron":-80,"Tcaronoslash":-80,"Tcaronotilde":-80,"Tcaronperiod":-80,"Tcaronr":-80,"Tcaronracute":-80,"Tcaronrcommaaccent":-80,"Tcaronsemicolon":-40,"Tcaronu":-90,"Tcaronuacute":-90,"Tcaronucircumflex":-90,"Tcaronudieresis":-90,"Tcaronugrave":-90,"Tcaronuhungarumlaut":-90,"Tcaronumacron":-90,"Tcaronuogonek":-90,"Tcaronuring":-90,"Tcaronw":-60,"Tcarony":-60,"Tcaronyacute":-60,"Tcaronydieresis":-60,"TcommaaccentA":-90,"TcommaaccentAacute":-90,"TcommaaccentAbreve":-90,"TcommaaccentAcircumflex":-90,"TcommaaccentAdieresis":-90,"TcommaaccentAgrave":-90,"TcommaaccentAmacron":-90,"TcommaaccentAogonek":-90,"TcommaaccentAring":-90,"TcommaaccentAtilde":-90,"TcommaaccentO":-40,"TcommaaccentOacute":-40,"TcommaaccentOcircumflex":-40,"TcommaaccentOdieresis":-40,"TcommaaccentOgrave":-40,"TcommaaccentOhungarumlaut":-40,"TcommaaccentOmacron":-40,"TcommaaccentOslash":-40,"TcommaaccentOtilde":-40,"Tcommaaccenta":-80,"Tcommaaccentaacute":-80,"Tcommaaccentabreve":-80,"Tcommaaccentacircumflex":-80,"Tcommaaccentadieresis":-80,"Tcommaaccentagrave":-80,"Tcommaaccentamacron":-80,"Tcommaaccentaogonek":-80,"Tcommaaccentaring":-80,"Tcommaaccentatilde":-80,"Tcommaaccentcolon":-40,"Tcommaaccentcomma":-80,"Tcommaaccente":-60,"Tcommaaccenteacute":-60,"Tcommaaccentecaron":-60,"Tcommaaccentecircumflex":-60,"Tcommaaccentedieresis":-60,"Tcommaaccentedotaccent":-60,"Tcommaaccentegrave":-60,"Tcommaaccentemacron":-60,"Tcommaaccenteogonek":-60,"Tcommaaccenthyphen":-120,"Tcommaaccento":-80,"Tcommaaccentoacute":-80,"Tcommaaccentocircumflex":-80,"Tcommaaccentodieresis":-80,"Tcommaaccentograve":-80,"Tcommaaccentohungarumlaut":-80,"Tcommaaccentomacron":-80,"Tcommaaccentoslash":-80,"Tcommaaccentotilde":-80,"Tcommaaccentperiod":-80,"Tcommaaccentr":-80,"Tcommaaccentracute":-80,"Tcommaaccentrcommaaccent":-80,"Tcommaaccentsemicolon":-40,"Tcommaaccentu":-90,"Tcommaaccentuacute":-90,"Tcommaaccentucircumflex":-90,"Tcommaaccentudieresis":-90,"Tcommaaccentugrave":-90,"Tcommaaccentuhungarumlaut":-90,"Tcommaaccentumacron":-90,"Tcommaaccentuogonek":-90,"Tcommaaccenturing":-90,"Tcommaaccentw":-60,"Tcommaaccenty":-60,"Tcommaaccentyacute":-60,"Tcommaaccentydieresis":-60,"UA":-50,"UAacute":-50,"UAbreve":-50,"UAcircumflex":-50,"UAdieresis":-50,"UAgrave":-50,"UAmacron":-50,"UAogonek":-50,"UAring":-50,"UAtilde":-50,"Ucomma":-30,"Uperiod":-30,"UacuteA":-50,"UacuteAacute":-50,"UacuteAbreve":-50,"UacuteAcircumflex":-50,"UacuteAdieresis":-50,"UacuteAgrave":-50,"UacuteAmacron":-50,"UacuteAogonek":-50,"UacuteAring":-50,"UacuteAtilde":-50,"Uacutecomma":-30,"Uacuteperiod":-30,"UcircumflexA":-50,"UcircumflexAacute":-50,"UcircumflexAbreve":-50,"UcircumflexAcircumflex":-50,"UcircumflexAdieresis":-50,"UcircumflexAgrave":-50,"UcircumflexAmacron":-50,"UcircumflexAogonek":-50,"UcircumflexAring":-50,"UcircumflexAtilde":-50,"Ucircumflexcomma":-30,"Ucircumflexperiod":-30,"UdieresisA":-50,"UdieresisAacute":-50,"UdieresisAbreve":-50,"UdieresisAcircumflex":-50,"UdieresisAdieresis":-50,"UdieresisAgrave":-50,"UdieresisAmacron":-50,"UdieresisAogonek":-50,"UdieresisAring":-50,"UdieresisAtilde":-50,"Udieresiscomma":-30,"Udieresisperiod":-30,"UgraveA":-50,"UgraveAacute":-50,"UgraveAbreve":-50,"UgraveAcircumflex":-50,"UgraveAdieresis":-50,"UgraveAgrave":-50,"UgraveAmacron":-50,"UgraveAogonek":-50,"UgraveAring":-50,"UgraveAtilde":-50,"Ugravecomma":-30,"Ugraveperiod":-30,"UhungarumlautA":-50,"UhungarumlautAacute":-50,"UhungarumlautAbreve":-50,"UhungarumlautAcircumflex":-50,"UhungarumlautAdieresis":-50,"UhungarumlautAgrave":-50,"UhungarumlautAmacron":-50,"UhungarumlautAogonek":-50,"UhungarumlautAring":-50,"UhungarumlautAtilde":-50,"Uhungarumlautcomma":-30,"Uhungarumlautperiod":-30,"UmacronA":-50,"UmacronAacute":-50,"UmacronAbreve":-50,"UmacronAcircumflex":-50,"UmacronAdieresis":-50,"UmacronAgrave":-50,"UmacronAmacron":-50,"UmacronAogonek":-50,"UmacronAring":-50,"UmacronAtilde":-50,"Umacroncomma":-30,"Umacronperiod":-30,"UogonekA":-50,"UogonekAacute":-50,"UogonekAbreve":-50,"UogonekAcircumflex":-50,"UogonekAdieresis":-50,"UogonekAgrave":-50,"UogonekAmacron":-50,"UogonekAogonek":-50,"UogonekAring":-50,"UogonekAtilde":-50,"Uogonekcomma":-30,"Uogonekperiod":-30,"UringA":-50,"UringAacute":-50,"UringAbreve":-50,"UringAcircumflex":-50,"UringAdieresis":-50,"UringAgrave":-50,"UringAmacron":-50,"UringAogonek":-50,"UringAring":-50,"UringAtilde":-50,"Uringcomma":-30,"Uringperiod":-30,"VA":-80,"VAacute":-80,"VAbreve":-80,"VAcircumflex":-80,"VAdieresis":-80,"VAgrave":-80,"VAmacron":-80,"VAogonek":-80,"VAring":-80,"VAtilde":-80,"VG":-50,"VGbreve":-50,"VGcommaaccent":-50,"VO":-50,"VOacute":-50,"VOcircumflex":-50,"VOdieresis":-50,"VOgrave":-50,"VOhungarumlaut":-50,"VOmacron":-50,"VOslash":-50,"VOtilde":-50,"Va":-60,"Vaacute":-60,"Vabreve":-60,"Vacircumflex":-60,"Vadieresis":-60,"Vagrave":-60,"Vamacron":-60,"Vaogonek":-60,"Varing":-60,"Vatilde":-60,"Vcolon":-40,"Vcomma":-120,"Ve":-50,"Veacute":-50,"Vecaron":-50,"Vecircumflex":-50,"Vedieresis":-50,"Vedotaccent":-50,"Vegrave":-50,"Vemacron":-50,"Veogonek":-50,"Vhyphen":-80,"Vo":-90,"Voacute":-90,"Vocircumflex":-90,"Vodieresis":-90,"Vograve":-90,"Vohungarumlaut":-90,"Vomacron":-90,"Voslash":-90,"Votilde":-90,"Vperiod":-120,"Vsemicolon":-40,"Vu":-60,"Vuacute":-60,"Vucircumflex":-60,"Vudieresis":-60,"Vugrave":-60,"Vuhungarumlaut":-60,"Vumacron":-60,"Vuogonek":-60,"Vuring":-60,"WA":-60,"WAacute":-60,"WAbreve":-60,"WAcircumflex":-60,"WAdieresis":-60,"WAgrave":-60,"WAmacron":-60,"WAogonek":-60,"WAring":-60,"WAtilde":-60,"WO":-20,"WOacute":-20,"WOcircumflex":-20,"WOdieresis":-20,"WOgrave":-20,"WOhungarumlaut":-20,"WOmacron":-20,"WOslash":-20,"WOtilde":-20,"Wa":-40,"Waacute":-40,"Wabreve":-40,"Wacircumflex":-40,"Wadieresis":-40,"Wagrave":-40,"Wamacron":-40,"Waogonek":-40,"Waring":-40,"Watilde":-40,"Wcolon":-10,"Wcomma":-80,"We":-35,"Weacute":-35,"Wecaron":-35,"Wecircumflex":-35,"Wedieresis":-35,"Wedotaccent":-35,"Wegrave":-35,"Wemacron":-35,"Weogonek":-35,"Whyphen":-40,"Wo":-60,"Woacute":-60,"Wocircumflex":-60,"Wodieresis":-60,"Wograve":-60,"Wohungarumlaut":-60,"Womacron":-60,"Woslash":-60,"Wotilde":-60,"Wperiod":-80,"Wsemicolon":-10,"Wu":-45,"Wuacute":-45,"Wucircumflex":-45,"Wudieresis":-45,"Wugrave":-45,"Wuhungarumlaut":-45,"Wumacron":-45,"Wuogonek":-45,"Wuring":-45,"Wy":-20,"Wyacute":-20,"Wydieresis":-20,"YA":-110,"YAacute":-110,"YAbreve":-110,"YAcircumflex":-110,"YAdieresis":-110,"YAgrave":-110,"YAmacron":-110,"YAogonek":-110,"YAring":-110,"YAtilde":-110,"YO":-70,"YOacute":-70,"YOcircumflex":-70,"YOdieresis":-70,"YOgrave":-70,"YOhungarumlaut":-70,"YOmacron":-70,"YOslash":-70,"YOtilde":-70,"Ya":-90,"Yaacute":-90,"Yabreve":-90,"Yacircumflex":-90,"Yadieresis":-90,"Yagrave":-90,"Yamacron":-90,"Yaogonek":-90,"Yaring":-90,"Yatilde":-90,"Ycolon":-50,"Ycomma":-100,"Ye":-80,"Yeacute":-80,"Yecaron":-80,"Yecircumflex":-80,"Yedieresis":-80,"Yedotaccent":-80,"Yegrave":-80,"Yemacron":-80,"Yeogonek":-80,"Yo":-100,"Yoacute":-100,"Yocircumflex":-100,"Yodieresis":-100,"Yograve":-100,"Yohungarumlaut":-100,"Yomacron":-100,"Yoslash":-100,"Yotilde":-100,"Yperiod":-100,"Ysemicolon":-50,"Yu":-100,"Yuacute":-100,"Yucircumflex":-100,"Yudieresis":-100,"Yugrave":-100,"Yuhungarumlaut":-100,"Yumacron":-100,"Yuogonek":-100,"Yuring":-100,"YacuteA":-110,"YacuteAacute":-110,"YacuteAbreve":-110,"YacuteAcircumflex":-110,"YacuteAdieresis":-110,"YacuteAgrave":-110,"YacuteAmacron":-110,"YacuteAogonek":-110,"YacuteAring":-110,"YacuteAtilde":-110,"YacuteO":-70,"YacuteOacute":-70,"YacuteOcircumflex":-70,"YacuteOdieresis":-70,"YacuteOgrave":-70,"YacuteOhungarumlaut":-70,"YacuteOmacron":-70,"YacuteOslash":-70,"YacuteOtilde":-70,"Yacutea":-90,"Yacuteaacute":-90,"Yacuteabreve":-90,"Yacuteacircumflex":-90,"Yacuteadieresis":-90,"Yacuteagrave":-90,"Yacuteamacron":-90,"Yacuteaogonek":-90,"Yacutearing":-90,"Yacuteatilde":-90,"Yacutecolon":-50,"Yacutecomma":-100,"Yacutee":-80,"Yacuteeacute":-80,"Yacuteecaron":-80,"Yacuteecircumflex":-80,"Yacuteedieresis":-80,"Yacuteedotaccent":-80,"Yacuteegrave":-80,"Yacuteemacron":-80,"Yacuteeogonek":-80,"Yacuteo":-100,"Yacuteoacute":-100,"Yacuteocircumflex":-100,"Yacuteodieresis":-100,"Yacuteograve":-100,"Yacuteohungarumlaut":-100,"Yacuteomacron":-100,"Yacuteoslash":-100,"Yacuteotilde":-100,"Yacuteperiod":-100,"Yacutesemicolon":-50,"Yacuteu":-100,"Yacuteuacute":-100,"Yacuteucircumflex":-100,"Yacuteudieresis":-100,"Yacuteugrave":-100,"Yacuteuhungarumlaut":-100,"Yacuteumacron":-100,"Yacuteuogonek":-100,"Yacuteuring":-100,"YdieresisA":-110,"YdieresisAacute":-110,"YdieresisAbreve":-110,"YdieresisAcircumflex":-110,"YdieresisAdieresis":-110,"YdieresisAgrave":-110,"YdieresisAmacron":-110,"YdieresisAogonek":-110,"YdieresisAring":-110,"YdieresisAtilde":-110,"YdieresisO":-70,"YdieresisOacute":-70,"YdieresisOcircumflex":-70,"YdieresisOdieresis":-70,"YdieresisOgrave":-70,"YdieresisOhungarumlaut":-70,"YdieresisOmacron":-70,"YdieresisOslash":-70,"YdieresisOtilde":-70,"Ydieresisa":-90,"Ydieresisaacute":-90,"Ydieresisabreve":-90,"Ydieresisacircumflex":-90,"Ydieresisadieresis":-90,"Ydieresisagrave":-90,"Ydieresisamacron":-90,"Ydieresisaogonek":-90,"Ydieresisaring":-90,"Ydieresisatilde":-90,"Ydieresiscolon":-50,"Ydieresiscomma":-100,"Ydieresise":-80,"Ydieresiseacute":-80,"Ydieresisecaron":-80,"Ydieresisecircumflex":-80,"Ydieresisedieresis":-80,"Ydieresisedotaccent":-80,"Ydieresisegrave":-80,"Ydieresisemacron":-80,"Ydieresiseogonek":-80,"Ydieresiso":-100,"Ydieresisoacute":-100,"Ydieresisocircumflex":-100,"Ydieresisodieresis":-100,"Ydieresisograve":-100,"Ydieresisohungarumlaut":-100,"Ydieresisomacron":-100,"Ydieresisoslash":-100,"Ydieresisotilde":-100,"Ydieresisperiod":-100,"Ydieresissemicolon":-50,"Ydieresisu":-100,"Ydieresisuacute":-100,"Ydieresisucircumflex":-100,"Ydieresisudieresis":-100,"Ydieresisugrave":-100,"Ydieresisuhungarumlaut":-100,"Ydieresisumacron":-100,"Ydieresisuogonek":-100,"Ydieresisuring":-100,"ag":-10,"agbreve":-10,"agcommaaccent":-10,"av":-15,"aw":-15,"ay":-20,"ayacute":-20,"aydieresis":-20,"aacuteg":-10,"aacutegbreve":-10,"aacutegcommaaccent":-10,"aacutev":-15,"aacutew":-15,"aacutey":-20,"aacuteyacute":-20,"aacuteydieresis":-20,"abreveg":-10,"abrevegbreve":-10,"abrevegcommaaccent":-10,"abrevev":-15,"abrevew":-15,"abrevey":-20,"abreveyacute":-20,"abreveydieresis":-20,"acircumflexg":-10,"acircumflexgbreve":-10,"acircumflexgcommaaccent":-10,"acircumflexv":-15,"acircumflexw":-15,"acircumflexy":-20,"acircumflexyacute":-20,"acircumflexydieresis":-20,"adieresisg":-10,"adieresisgbreve":-10,"adieresisgcommaaccent":-10,"adieresisv":-15,"adieresisw":-15,"adieresisy":-20,"adieresisyacute":-20,"adieresisydieresis":-20,"agraveg":-10,"agravegbreve":-10,"agravegcommaaccent":-10,"agravev":-15,"agravew":-15,"agravey":-20,"agraveyacute":-20,"agraveydieresis":-20,"amacrong":-10,"amacrongbreve":-10,"amacrongcommaaccent":-10,"amacronv":-15,"amacronw":-15,"amacrony":-20,"amacronyacute":-20,"amacronydieresis":-20,"aogonekg":-10,"aogonekgbreve":-10,"aogonekgcommaaccent":-10,"aogonekv":-15,"aogonekw":-15,"aogoneky":-20,"aogonekyacute":-20,"aogonekydieresis":-20,"aringg":-10,"aringgbreve":-10,"aringgcommaaccent":-10,"aringv":-15,"aringw":-15,"aringy":-20,"aringyacute":-20,"aringydieresis":-20,"atildeg":-10,"atildegbreve":-10,"atildegcommaaccent":-10,"atildev":-15,"atildew":-15,"atildey":-20,"atildeyacute":-20,"atildeydieresis":-20,"bl":-10,"blacute":-10,"blcommaaccent":-10,"blslash":-10,"bu":-20,"buacute":-20,"bucircumflex":-20,"budieresis":-20,"bugrave":-20,"buhungarumlaut":-20,"bumacron":-20,"buogonek":-20,"buring":-20,"bv":-20,"by":-20,"byacute":-20,"bydieresis":-20,"ch":-10,"ck":-20,"ckcommaaccent":-20,"cl":-20,"clacute":-20,"clcommaaccent":-20,"clslash":-20,"cy":-10,"cyacute":-10,"cydieresis":-10,"cacuteh":-10,"cacutek":-20,"cacutekcommaaccent":-20,"cacutel":-20,"cacutelacute":-20,"cacutelcommaaccent":-20,"cacutelslash":-20,"cacutey":-10,"cacuteyacute":-10,"cacuteydieresis":-10,"ccaronh":-10,"ccaronk":-20,"ccaronkcommaaccent":-20,"ccaronl":-20,"ccaronlacute":-20,"ccaronlcommaaccent":-20,"ccaronlslash":-20,"ccarony":-10,"ccaronyacute":-10,"ccaronydieresis":-10,"ccedillah":-10,"ccedillak":-20,"ccedillakcommaaccent":-20,"ccedillal":-20,"ccedillalacute":-20,"ccedillalcommaaccent":-20,"ccedillalslash":-20,"ccedillay":-10,"ccedillayacute":-10,"ccedillaydieresis":-10,"colonspace":-40,"commaquotedblright":-120,"commaquoteright":-120,"commaspace":-40,"dd":-10,"ddcroat":-10,"dv":-15,"dw":-15,"dy":-15,"dyacute":-15,"dydieresis":-15,"dcroatd":-10,"dcroatdcroat":-10,"dcroatv":-15,"dcroatw":-15,"dcroaty":-15,"dcroatyacute":-15,"dcroatydieresis":-15,"ecomma":10,"eperiod":20,"ev":-15,"ew":-15,"ex":-15,"ey":-15,"eyacute":-15,"eydieresis":-15,"eacutecomma":10,"eacuteperiod":20,"eacutev":-15,"eacutew":-15,"eacutex":-15,"eacutey":-15,"eacuteyacute":-15,"eacuteydieresis":-15,"ecaroncomma":10,"ecaronperiod":20,"ecaronv":-15,"ecaronw":-15,"ecaronx":-15,"ecarony":-15,"ecaronyacute":-15,"ecaronydieresis":-15,"ecircumflexcomma":10,"ecircumflexperiod":20,"ecircumflexv":-15,"ecircumflexw":-15,"ecircumflexx":-15,"ecircumflexy":-15,"ecircumflexyacute":-15,"ecircumflexydieresis":-15,"edieresiscomma":10,"edieresisperiod":20,"edieresisv":-15,"edieresisw":-15,"edieresisx":-15,"edieresisy":-15,"edieresisyacute":-15,"edieresisydieresis":-15,"edotaccentcomma":10,"edotaccentperiod":20,"edotaccentv":-15,"edotaccentw":-15,"edotaccentx":-15,"edotaccenty":-15,"edotaccentyacute":-15,"edotaccentydieresis":-15,"egravecomma":10,"egraveperiod":20,"egravev":-15,"egravew":-15,"egravex":-15,"egravey":-15,"egraveyacute":-15,"egraveydieresis":-15,"emacroncomma":10,"emacronperiod":20,"emacronv":-15,"emacronw":-15,"emacronx":-15,"emacrony":-15,"emacronyacute":-15,"emacronydieresis":-15,"eogonekcomma":10,"eogonekperiod":20,"eogonekv":-15,"eogonekw":-15,"eogonekx":-15,"eogoneky":-15,"eogonekyacute":-15,"eogonekydieresis":-15,"fcomma":-10,"fe":-10,"feacute":-10,"fecaron":-10,"fecircumflex":-10,"fedieresis":-10,"fedotaccent":-10,"fegrave":-10,"femacron":-10,"feogonek":-10,"fo":-20,"foacute":-20,"focircumflex":-20,"fodieresis":-20,"fograve":-20,"fohungarumlaut":-20,"fomacron":-20,"foslash":-20,"fotilde":-20,"fperiod":-10,"fquotedblright":30,"fquoteright":30,"ge":10,"geacute":10,"gecaron":10,"gecircumflex":10,"gedieresis":10,"gedotaccent":10,"gegrave":10,"gemacron":10,"geogonek":10,"gg":-10,"ggbreve":-10,"ggcommaaccent":-10,"gbrevee":10,"gbreveeacute":10,"gbreveecaron":10,"gbreveecircumflex":10,"gbreveedieresis":10,"gbreveedotaccent":10,"gbreveegrave":10,"gbreveemacron":10,"gbreveeogonek":10,"gbreveg":-10,"gbrevegbreve":-10,"gbrevegcommaaccent":-10,"gcommaaccente":10,"gcommaaccenteacute":10,"gcommaaccentecaron":10,"gcommaaccentecircumflex":10,"gcommaaccentedieresis":10,"gcommaaccentedotaccent":10,"gcommaaccentegrave":10,"gcommaaccentemacron":10,"gcommaaccenteogonek":10,"gcommaaccentg":-10,"gcommaaccentgbreve":-10,"gcommaaccentgcommaaccent":-10,"hy":-20,"hyacute":-20,"hydieresis":-20,"ko":-15,"koacute":-15,"kocircumflex":-15,"kodieresis":-15,"kograve":-15,"kohungarumlaut":-15,"komacron":-15,"koslash":-15,"kotilde":-15,"kcommaaccento":-15,"kcommaaccentoacute":-15,"kcommaaccentocircumflex":-15,"kcommaaccentodieresis":-15,"kcommaaccentograve":-15,"kcommaaccentohungarumlaut":-15,"kcommaaccentomacron":-15,"kcommaaccentoslash":-15,"kcommaaccentotilde":-15,"lw":-15,"ly":-15,"lyacute":-15,"lydieresis":-15,"lacutew":-15,"lacutey":-15,"lacuteyacute":-15,"lacuteydieresis":-15,"lcommaaccentw":-15,"lcommaaccenty":-15,"lcommaaccentyacute":-15,"lcommaaccentydieresis":-15,"lslashw":-15,"lslashy":-15,"lslashyacute":-15,"lslashydieresis":-15,"mu":-20,"muacute":-20,"mucircumflex":-20,"mudieresis":-20,"mugrave":-20,"muhungarumlaut":-20,"mumacron":-20,"muogonek":-20,"muring":-20,"my":-30,"myacute":-30,"mydieresis":-30,"nu":-10,"nuacute":-10,"nucircumflex":-10,"nudieresis":-10,"nugrave":-10,"nuhungarumlaut":-10,"numacron":-10,"nuogonek":-10,"nuring":-10,"nv":-40,"ny":-20,"nyacute":-20,"nydieresis":-20,"nacuteu":-10,"nacuteuacute":-10,"nacuteucircumflex":-10,"nacuteudieresis":-10,"nacuteugrave":-10,"nacuteuhungarumlaut":-10,"nacuteumacron":-10,"nacuteuogonek":-10,"nacuteuring":-10,"nacutev":-40,"nacutey":-20,"nacuteyacute":-20,"nacuteydieresis":-20,"ncaronu":-10,"ncaronuacute":-10,"ncaronucircumflex":-10,"ncaronudieresis":-10,"ncaronugrave":-10,"ncaronuhungarumlaut":-10,"ncaronumacron":-10,"ncaronuogonek":-10,"ncaronuring":-10,"ncaronv":-40,"ncarony":-20,"ncaronyacute":-20,"ncaronydieresis":-20,"ncommaaccentu":-10,"ncommaaccentuacute":-10,"ncommaaccentucircumflex":-10,"ncommaaccentudieresis":-10,"ncommaaccentugrave":-10,"ncommaaccentuhungarumlaut":-10,"ncommaaccentumacron":-10,"ncommaaccentuogonek":-10,"ncommaaccenturing":-10,"ncommaaccentv":-40,"ncommaaccenty":-20,"ncommaaccentyacute":-20,"ncommaaccentydieresis":-20,"ntildeu":-10,"ntildeuacute":-10,"ntildeucircumflex":-10,"ntildeudieresis":-10,"ntildeugrave":-10,"ntildeuhungarumlaut":-10,"ntildeumacron":-10,"ntildeuogonek":-10,"ntildeuring":-10,"ntildev":-40,"ntildey":-20,"ntildeyacute":-20,"ntildeydieresis":-20,"ov":-20,"ow":-15,"ox":-30,"oy":-20,"oyacute":-20,"oydieresis":-20,"oacutev":-20,"oacutew":-15,"oacutex":-30,"oacutey":-20,"oacuteyacute":-20,"oacuteydieresis":-20,"ocircumflexv":-20,"ocircumflexw":-15,"ocircumflexx":-30,"ocircumflexy":-20,"ocircumflexyacute":-20,"ocircumflexydieresis":-20,"odieresisv":-20,"odieresisw":-15,"odieresisx":-30,"odieresisy":-20,"odieresisyacute":-20,"odieresisydieresis":-20,"ogravev":-20,"ogravew":-15,"ogravex":-30,"ogravey":-20,"ograveyacute":-20,"ograveydieresis":-20,"ohungarumlautv":-20,"ohungarumlautw":-15,"ohungarumlautx":-30,"ohungarumlauty":-20,"ohungarumlautyacute":-20,"ohungarumlautydieresis":-20,"omacronv":-20,"omacronw":-15,"omacronx":-30,"omacrony":-20,"omacronyacute":-20,"omacronydieresis":-20,"oslashv":-20,"oslashw":-15,"oslashx":-30,"oslashy":-20,"oslashyacute":-20,"oslashydieresis":-20,"otildev":-20,"otildew":-15,"otildex":-30,"otildey":-20,"otildeyacute":-20,"otildeydieresis":-20,"py":-15,"pyacute":-15,"pydieresis":-15,"periodquotedblright":-120,"periodquoteright":-120,"periodspace":-40,"quotedblrightspace":-80,"quoteleftquoteleft":-46,"quoterightd":-80,"quoterightdcroat":-80,"quoterightl":-20,"quoterightlacute":-20,"quoterightlcommaaccent":-20,"quoterightlslash":-20,"quoterightquoteright":-46,"quoterightr":-40,"quoterightracute":-40,"quoterightrcaron":-40,"quoterightrcommaaccent":-40,"quoterights":-60,"quoterightsacute":-60,"quoterightscaron":-60,"quoterightscedilla":-60,"quoterightscommaaccent":-60,"quoterightspace":-80,"quoterightv":-20,"rc":-20,"rcacute":-20,"rccaron":-20,"rccedilla":-20,"rcomma":-60,"rd":-20,"rdcroat":-20,"rg":-15,"rgbreve":-15,"rgcommaaccent":-15,"rhyphen":-20,"ro":-20,"roacute":-20,"rocircumflex":-20,"rodieresis":-20,"rograve":-20,"rohungarumlaut":-20,"romacron":-20,"roslash":-20,"rotilde":-20,"rperiod":-60,"rq":-20,"rs":-15,"rsacute":-15,"rscaron":-15,"rscedilla":-15,"rscommaaccent":-15,"rt":20,"rtcommaaccent":20,"rv":10,"ry":10,"ryacute":10,"rydieresis":10,"racutec":-20,"racutecacute":-20,"racuteccaron":-20,"racuteccedilla":-20,"racutecomma":-60,"racuted":-20,"racutedcroat":-20,"racuteg":-15,"racutegbreve":-15,"racutegcommaaccent":-15,"racutehyphen":-20,"racuteo":-20,"racuteoacute":-20,"racuteocircumflex":-20,"racuteodieresis":-20,"racuteograve":-20,"racuteohungarumlaut":-20,"racuteomacron":-20,"racuteoslash":-20,"racuteotilde":-20,"racuteperiod":-60,"racuteq":-20,"racutes":-15,"racutesacute":-15,"racutescaron":-15,"racutescedilla":-15,"racutescommaaccent":-15,"racutet":20,"racutetcommaaccent":20,"racutev":10,"racutey":10,"racuteyacute":10,"racuteydieresis":10,"rcaronc":-20,"rcaroncacute":-20,"rcaronccaron":-20,"rcaronccedilla":-20,"rcaroncomma":-60,"rcarond":-20,"rcarondcroat":-20,"rcarong":-15,"rcarongbreve":-15,"rcarongcommaaccent":-15,"rcaronhyphen":-20,"rcarono":-20,"rcaronoacute":-20,"rcaronocircumflex":-20,"rcaronodieresis":-20,"rcaronograve":-20,"rcaronohungarumlaut":-20,"rcaronomacron":-20,"rcaronoslash":-20,"rcaronotilde":-20,"rcaronperiod":-60,"rcaronq":-20,"rcarons":-15,"rcaronsacute":-15,"rcaronscaron":-15,"rcaronscedilla":-15,"rcaronscommaaccent":-15,"rcaront":20,"rcarontcommaaccent":20,"rcaronv":10,"rcarony":10,"rcaronyacute":10,"rcaronydieresis":10,"rcommaaccentc":-20,"rcommaaccentcacute":-20,"rcommaaccentccaron":-20,"rcommaaccentccedilla":-20,"rcommaaccentcomma":-60,"rcommaaccentd":-20,"rcommaaccentdcroat":-20,"rcommaaccentg":-15,"rcommaaccentgbreve":-15,"rcommaaccentgcommaaccent":-15,"rcommaaccenthyphen":-20,"rcommaaccento":-20,"rcommaaccentoacute":-20,"rcommaaccentocircumflex":-20,"rcommaaccentodieresis":-20,"rcommaaccentograve":-20,"rcommaaccentohungarumlaut":-20,"rcommaaccentomacron":-20,"rcommaaccentoslash":-20,"rcommaaccentotilde":-20,"rcommaaccentperiod":-60,"rcommaaccentq":-20,"rcommaaccents":-15,"rcommaaccentsacute":-15,"rcommaaccentscaron":-15,"rcommaaccentscedilla":-15,"rcommaaccentscommaaccent":-15,"rcommaaccentt":20,"rcommaaccenttcommaaccent":20,"rcommaaccentv":10,"rcommaaccenty":10,"rcommaaccentyacute":10,"rcommaaccentydieresis":10,"sw":-15,"sacutew":-15,"scaronw":-15,"scedillaw":-15,"scommaaccentw":-15,"semicolonspace":-40,"spaceT":-100,"spaceTcaron":-100,"spaceTcommaaccent":-100,"spaceV":-80,"spaceW":-80,"spaceY":-120,"spaceYacute":-120,"spaceYdieresis":-120,"spacequotedblleft":-80,"spacequoteleft":-60,"va":-20,"vaacute":-20,"vabreve":-20,"vacircumflex":-20,"vadieresis":-20,"vagrave":-20,"vamacron":-20,"vaogonek":-20,"varing":-20,"vatilde":-20,"vcomma":-80,"vo":-30,"voacute":-30,"vocircumflex":-30,"vodieresis":-30,"vograve":-30,"vohungarumlaut":-30,"vomacron":-30,"voslash":-30,"votilde":-30,"vperiod":-80,"wcomma":-40,"wo":-20,"woacute":-20,"wocircumflex":-20,"wodieresis":-20,"wograve":-20,"wohungarumlaut":-20,"womacron":-20,"woslash":-20,"wotilde":-20,"wperiod":-40,"xe":-10,"xeacute":-10,"xecaron":-10,"xecircumflex":-10,"xedieresis":-10,"xedotaccent":-10,"xegrave":-10,"xemacron":-10,"xeogonek":-10,"ya":-30,"yaacute":-30,"yabreve":-30,"yacircumflex":-30,"yadieresis":-30,"yagrave":-30,"yamacron":-30,"yaogonek":-30,"yaring":-30,"yatilde":-30,"ycomma":-80,"ye":-10,"yeacute":-10,"yecaron":-10,"yecircumflex":-10,"yedieresis":-10,"yedotaccent":-10,"yegrave":-10,"yemacron":-10,"yeogonek":-10,"yo":-25,"yoacute":-25,"yocircumflex":-25,"yodieresis":-25,"yograve":-25,"yohungarumlaut":-25,"yomacron":-25,"yoslash":-25,"yotilde":-25,"yperiod":-80,"yacutea":-30,"yacuteaacute":-30,"yacuteabreve":-30,"yacuteacircumflex":-30,"yacuteadieresis":-30,"yacuteagrave":-30,"yacuteamacron":-30,"yacuteaogonek":-30,"yacutearing":-30,"yacuteatilde":-30,"yacutecomma":-80,"yacutee":-10,"yacuteeacute":-10,"yacuteecaron":-10,"yacuteecircumflex":-10,"yacuteedieresis":-10,"yacuteedotaccent":-10,"yacuteegrave":-10,"yacuteemacron":-10,"yacuteeogonek":-10,"yacuteo":-25,"yacuteoacute":-25,"yacuteocircumflex":-25,"yacuteodieresis":-25,"yacuteograve":-25,"yacuteohungarumlaut":-25,"yacuteomacron":-25,"yacuteoslash":-25,"yacuteotilde":-25,"yacuteperiod":-80,"ydieresisa":-30,"ydieresisaacute":-30,"ydieresisabreve":-30,"ydieresisacircumflex":-30,"ydieresisadieresis":-30,"ydieresisagrave":-30,"ydieresisamacron":-30,"ydieresisaogonek":-30,"ydieresisaring":-30,"ydieresisatilde":-30,"ydieresiscomma":-80,"ydieresise":-10,"ydieresiseacute":-10,"ydieresisecaron":-10,"ydieresisecircumflex":-10,"ydieresisedieresis":-10,"ydieresisedotaccent":-10,"ydieresisegrave":-10,"ydieresisemacron":-10,"ydieresiseogonek":-10,"ydieresiso":-25,"ydieresisoacute":-25,"ydieresisocircumflex":-25,"ydieresisodieresis":-25,"ydieresisograve":-25,"ydieresisohungarumlaut":-25,"ydieresisomacron":-25,"ydieresisoslash":-25,"ydieresisotilde":-25,"ydieresisperiod":-80,"ze":10,"zeacute":10,"zecaron":10,"zecircumflex":10,"zedieresis":10,"zedotaccent":10,"zegrave":10,"zemacron":10,"zeogonek":10,"zacutee":10,"zacuteeacute":10,"zacuteecaron":10,"zacuteecircumflex":10,"zacuteedieresis":10,"zacuteedotaccent":10,"zacuteegrave":10,"zacuteemacron":10,"zacuteeogonek":10,"zcarone":10,"zcaroneacute":10,"zcaronecaron":10,"zcaronecircumflex":10,"zcaronedieresis":10,"zcaronedotaccent":10,"zcaronegrave":10,"zcaronemacron":10,"zcaroneogonek":10,"zdotaccente":10,"zdotaccenteacute":10,"zdotaccentecaron":10,"zdotaccentecircumflex":10,"zdotaccentedieresis":10,"zdotaccentedotaccent":10,"zdotaccentegrave":10,"zdotaccentemacron":10,"zdotaccenteogonek":10}} \ No newline at end of file diff --git a/packages/pdfkit/src/font/data/Helvetica-Oblique.json b/packages/pdfkit/src/font/data/Helvetica-Oblique.json deleted file mode 100644 index 05b6ccba7..000000000 --- a/packages/pdfkit/src/font/data/Helvetica-Oblique.json +++ /dev/null @@ -1 +0,0 @@ -{"attributes":{"Comment":["Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.","Creation Date: Thu May 1 12:44:31 1997","UniqueID 43055","VMusage 14960 69346"],"FontName":"Helvetica-Oblique","FullName":"Helvetica Oblique","FamilyName":"Helvetica","Weight":"Medium","ItalicAngle":"-12","IsFixedPitch":"false","CharacterSet":"ExtendedRoman","FontBBox":"-170 -225 1116 931 ","UnderlinePosition":"-100","UnderlineThickness":"50","Version":"002.000","Notice":"Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries.","EncodingScheme":"AdobeStandardEncoding","CapHeight":"718","XHeight":"523","Ascender":"718","Descender":"-207","StdHW":"76","StdVW":"88"},"glyphWidths":{"space":278,"exclam":278,"quotedbl":355,"numbersign":556,"dollar":556,"percent":889,"ampersand":667,"quoteright":222,"parenleft":333,"parenright":333,"asterisk":389,"plus":584,"comma":278,"hyphen":333,"period":278,"slash":278,"zero":556,"one":556,"two":556,"three":556,"four":556,"five":556,"six":556,"seven":556,"eight":556,"nine":556,"colon":278,"semicolon":278,"less":584,"equal":584,"greater":584,"question":556,"at":1015,"A":667,"B":667,"C":722,"D":722,"E":667,"F":611,"G":778,"H":722,"I":278,"J":500,"K":667,"L":556,"M":833,"N":722,"O":778,"P":667,"Q":778,"R":722,"S":667,"T":611,"U":722,"V":667,"W":944,"X":667,"Y":667,"Z":611,"bracketleft":278,"backslash":278,"bracketright":278,"asciicircum":469,"underscore":556,"quoteleft":222,"a":556,"b":556,"c":500,"d":556,"e":556,"f":278,"g":556,"h":556,"i":222,"j":222,"k":500,"l":222,"m":833,"n":556,"o":556,"p":556,"q":556,"r":333,"s":500,"t":278,"u":556,"v":500,"w":722,"x":500,"y":500,"z":500,"braceleft":334,"bar":260,"braceright":334,"asciitilde":584,"exclamdown":333,"cent":556,"sterling":556,"fraction":167,"yen":556,"florin":556,"section":556,"currency":556,"quotesingle":191,"quotedblleft":333,"guillemotleft":556,"guilsinglleft":333,"guilsinglright":333,"fi":500,"fl":500,"endash":556,"dagger":556,"daggerdbl":556,"periodcentered":278,"paragraph":537,"bullet":350,"quotesinglbase":222,"quotedblbase":333,"quotedblright":333,"guillemotright":556,"ellipsis":1000,"perthousand":1000,"questiondown":611,"grave":333,"acute":333,"circumflex":333,"tilde":333,"macron":333,"breve":333,"dotaccent":333,"dieresis":333,"ring":333,"cedilla":333,"hungarumlaut":333,"ogonek":333,"caron":333,"emdash":1000,"AE":1000,"ordfeminine":370,"Lslash":556,"Oslash":778,"OE":1000,"ordmasculine":365,"ae":889,"dotlessi":278,"lslash":222,"oslash":611,"oe":944,"germandbls":611,"Idieresis":278,"eacute":556,"abreve":556,"uhungarumlaut":556,"ecaron":556,"Ydieresis":667,"divide":584,"Yacute":667,"Acircumflex":667,"aacute":556,"Ucircumflex":722,"yacute":500,"scommaaccent":500,"ecircumflex":556,"Uring":722,"Udieresis":722,"aogonek":556,"Uacute":722,"uogonek":556,"Edieresis":667,"Dcroat":722,"commaaccent":250,"copyright":737,"Emacron":667,"ccaron":500,"aring":556,"Ncommaaccent":722,"lacute":222,"agrave":556,"Tcommaaccent":611,"Cacute":722,"atilde":556,"Edotaccent":667,"scaron":500,"scedilla":500,"iacute":278,"lozenge":471,"Rcaron":722,"Gcommaaccent":778,"ucircumflex":556,"acircumflex":556,"Amacron":667,"rcaron":333,"ccedilla":500,"Zdotaccent":611,"Thorn":667,"Omacron":778,"Racute":722,"Sacute":667,"dcaron":643,"Umacron":722,"uring":556,"threesuperior":333,"Ograve":778,"Agrave":667,"Abreve":667,"multiply":584,"uacute":556,"Tcaron":611,"partialdiff":476,"ydieresis":500,"Nacute":722,"icircumflex":278,"Ecircumflex":667,"adieresis":556,"edieresis":556,"cacute":500,"nacute":556,"umacron":556,"Ncaron":722,"Iacute":278,"plusminus":584,"brokenbar":260,"registered":737,"Gbreve":778,"Idotaccent":278,"summation":600,"Egrave":667,"racute":333,"omacron":556,"Zacute":611,"Zcaron":611,"greaterequal":549,"Eth":722,"Ccedilla":722,"lcommaaccent":222,"tcaron":317,"eogonek":556,"Uogonek":722,"Aacute":667,"Adieresis":667,"egrave":556,"zacute":500,"iogonek":222,"Oacute":778,"oacute":556,"amacron":556,"sacute":500,"idieresis":278,"Ocircumflex":778,"Ugrave":722,"Delta":612,"thorn":556,"twosuperior":333,"Odieresis":778,"mu":556,"igrave":278,"ohungarumlaut":556,"Eogonek":667,"dcroat":556,"threequarters":834,"Scedilla":667,"lcaron":299,"Kcommaaccent":667,"Lacute":556,"trademark":1000,"edotaccent":556,"Igrave":278,"Imacron":278,"Lcaron":556,"onehalf":834,"lessequal":549,"ocircumflex":556,"ntilde":556,"Uhungarumlaut":722,"Eacute":667,"emacron":556,"gbreve":556,"onequarter":834,"Scaron":667,"Scommaaccent":667,"Ohungarumlaut":778,"degree":400,"ograve":556,"Ccaron":722,"ugrave":556,"radical":453,"Dcaron":722,"rcommaaccent":333,"Ntilde":722,"otilde":556,"Rcommaaccent":722,"Lcommaaccent":556,"Atilde":667,"Aogonek":667,"Aring":667,"Otilde":778,"zdotaccent":500,"Ecaron":667,"Iogonek":278,"kcommaaccent":500,"minus":584,"Icircumflex":278,"ncaron":556,"tcommaaccent":278,"logicalnot":584,"odieresis":556,"udieresis":556,"notequal":549,"gcommaaccent":556,"eth":556,"zcaron":500,"ncommaaccent":556,"onesuperior":333,"imacron":278,"Euro":556},"kernPairs":{"AC":-30,"ACacute":-30,"ACcaron":-30,"ACcedilla":-30,"AG":-30,"AGbreve":-30,"AGcommaaccent":-30,"AO":-30,"AOacute":-30,"AOcircumflex":-30,"AOdieresis":-30,"AOgrave":-30,"AOhungarumlaut":-30,"AOmacron":-30,"AOslash":-30,"AOtilde":-30,"AQ":-30,"AT":-120,"ATcaron":-120,"ATcommaaccent":-120,"AU":-50,"AUacute":-50,"AUcircumflex":-50,"AUdieresis":-50,"AUgrave":-50,"AUhungarumlaut":-50,"AUmacron":-50,"AUogonek":-50,"AUring":-50,"AV":-70,"AW":-50,"AY":-100,"AYacute":-100,"AYdieresis":-100,"Au":-30,"Auacute":-30,"Aucircumflex":-30,"Audieresis":-30,"Augrave":-30,"Auhungarumlaut":-30,"Aumacron":-30,"Auogonek":-30,"Auring":-30,"Av":-40,"Aw":-40,"Ay":-40,"Ayacute":-40,"Aydieresis":-40,"AacuteC":-30,"AacuteCacute":-30,"AacuteCcaron":-30,"AacuteCcedilla":-30,"AacuteG":-30,"AacuteGbreve":-30,"AacuteGcommaaccent":-30,"AacuteO":-30,"AacuteOacute":-30,"AacuteOcircumflex":-30,"AacuteOdieresis":-30,"AacuteOgrave":-30,"AacuteOhungarumlaut":-30,"AacuteOmacron":-30,"AacuteOslash":-30,"AacuteOtilde":-30,"AacuteQ":-30,"AacuteT":-120,"AacuteTcaron":-120,"AacuteTcommaaccent":-120,"AacuteU":-50,"AacuteUacute":-50,"AacuteUcircumflex":-50,"AacuteUdieresis":-50,"AacuteUgrave":-50,"AacuteUhungarumlaut":-50,"AacuteUmacron":-50,"AacuteUogonek":-50,"AacuteUring":-50,"AacuteV":-70,"AacuteW":-50,"AacuteY":-100,"AacuteYacute":-100,"AacuteYdieresis":-100,"Aacuteu":-30,"Aacuteuacute":-30,"Aacuteucircumflex":-30,"Aacuteudieresis":-30,"Aacuteugrave":-30,"Aacuteuhungarumlaut":-30,"Aacuteumacron":-30,"Aacuteuogonek":-30,"Aacuteuring":-30,"Aacutev":-40,"Aacutew":-40,"Aacutey":-40,"Aacuteyacute":-40,"Aacuteydieresis":-40,"AbreveC":-30,"AbreveCacute":-30,"AbreveCcaron":-30,"AbreveCcedilla":-30,"AbreveG":-30,"AbreveGbreve":-30,"AbreveGcommaaccent":-30,"AbreveO":-30,"AbreveOacute":-30,"AbreveOcircumflex":-30,"AbreveOdieresis":-30,"AbreveOgrave":-30,"AbreveOhungarumlaut":-30,"AbreveOmacron":-30,"AbreveOslash":-30,"AbreveOtilde":-30,"AbreveQ":-30,"AbreveT":-120,"AbreveTcaron":-120,"AbreveTcommaaccent":-120,"AbreveU":-50,"AbreveUacute":-50,"AbreveUcircumflex":-50,"AbreveUdieresis":-50,"AbreveUgrave":-50,"AbreveUhungarumlaut":-50,"AbreveUmacron":-50,"AbreveUogonek":-50,"AbreveUring":-50,"AbreveV":-70,"AbreveW":-50,"AbreveY":-100,"AbreveYacute":-100,"AbreveYdieresis":-100,"Abreveu":-30,"Abreveuacute":-30,"Abreveucircumflex":-30,"Abreveudieresis":-30,"Abreveugrave":-30,"Abreveuhungarumlaut":-30,"Abreveumacron":-30,"Abreveuogonek":-30,"Abreveuring":-30,"Abrevev":-40,"Abrevew":-40,"Abrevey":-40,"Abreveyacute":-40,"Abreveydieresis":-40,"AcircumflexC":-30,"AcircumflexCacute":-30,"AcircumflexCcaron":-30,"AcircumflexCcedilla":-30,"AcircumflexG":-30,"AcircumflexGbreve":-30,"AcircumflexGcommaaccent":-30,"AcircumflexO":-30,"AcircumflexOacute":-30,"AcircumflexOcircumflex":-30,"AcircumflexOdieresis":-30,"AcircumflexOgrave":-30,"AcircumflexOhungarumlaut":-30,"AcircumflexOmacron":-30,"AcircumflexOslash":-30,"AcircumflexOtilde":-30,"AcircumflexQ":-30,"AcircumflexT":-120,"AcircumflexTcaron":-120,"AcircumflexTcommaaccent":-120,"AcircumflexU":-50,"AcircumflexUacute":-50,"AcircumflexUcircumflex":-50,"AcircumflexUdieresis":-50,"AcircumflexUgrave":-50,"AcircumflexUhungarumlaut":-50,"AcircumflexUmacron":-50,"AcircumflexUogonek":-50,"AcircumflexUring":-50,"AcircumflexV":-70,"AcircumflexW":-50,"AcircumflexY":-100,"AcircumflexYacute":-100,"AcircumflexYdieresis":-100,"Acircumflexu":-30,"Acircumflexuacute":-30,"Acircumflexucircumflex":-30,"Acircumflexudieresis":-30,"Acircumflexugrave":-30,"Acircumflexuhungarumlaut":-30,"Acircumflexumacron":-30,"Acircumflexuogonek":-30,"Acircumflexuring":-30,"Acircumflexv":-40,"Acircumflexw":-40,"Acircumflexy":-40,"Acircumflexyacute":-40,"Acircumflexydieresis":-40,"AdieresisC":-30,"AdieresisCacute":-30,"AdieresisCcaron":-30,"AdieresisCcedilla":-30,"AdieresisG":-30,"AdieresisGbreve":-30,"AdieresisGcommaaccent":-30,"AdieresisO":-30,"AdieresisOacute":-30,"AdieresisOcircumflex":-30,"AdieresisOdieresis":-30,"AdieresisOgrave":-30,"AdieresisOhungarumlaut":-30,"AdieresisOmacron":-30,"AdieresisOslash":-30,"AdieresisOtilde":-30,"AdieresisQ":-30,"AdieresisT":-120,"AdieresisTcaron":-120,"AdieresisTcommaaccent":-120,"AdieresisU":-50,"AdieresisUacute":-50,"AdieresisUcircumflex":-50,"AdieresisUdieresis":-50,"AdieresisUgrave":-50,"AdieresisUhungarumlaut":-50,"AdieresisUmacron":-50,"AdieresisUogonek":-50,"AdieresisUring":-50,"AdieresisV":-70,"AdieresisW":-50,"AdieresisY":-100,"AdieresisYacute":-100,"AdieresisYdieresis":-100,"Adieresisu":-30,"Adieresisuacute":-30,"Adieresisucircumflex":-30,"Adieresisudieresis":-30,"Adieresisugrave":-30,"Adieresisuhungarumlaut":-30,"Adieresisumacron":-30,"Adieresisuogonek":-30,"Adieresisuring":-30,"Adieresisv":-40,"Adieresisw":-40,"Adieresisy":-40,"Adieresisyacute":-40,"Adieresisydieresis":-40,"AgraveC":-30,"AgraveCacute":-30,"AgraveCcaron":-30,"AgraveCcedilla":-30,"AgraveG":-30,"AgraveGbreve":-30,"AgraveGcommaaccent":-30,"AgraveO":-30,"AgraveOacute":-30,"AgraveOcircumflex":-30,"AgraveOdieresis":-30,"AgraveOgrave":-30,"AgraveOhungarumlaut":-30,"AgraveOmacron":-30,"AgraveOslash":-30,"AgraveOtilde":-30,"AgraveQ":-30,"AgraveT":-120,"AgraveTcaron":-120,"AgraveTcommaaccent":-120,"AgraveU":-50,"AgraveUacute":-50,"AgraveUcircumflex":-50,"AgraveUdieresis":-50,"AgraveUgrave":-50,"AgraveUhungarumlaut":-50,"AgraveUmacron":-50,"AgraveUogonek":-50,"AgraveUring":-50,"AgraveV":-70,"AgraveW":-50,"AgraveY":-100,"AgraveYacute":-100,"AgraveYdieresis":-100,"Agraveu":-30,"Agraveuacute":-30,"Agraveucircumflex":-30,"Agraveudieresis":-30,"Agraveugrave":-30,"Agraveuhungarumlaut":-30,"Agraveumacron":-30,"Agraveuogonek":-30,"Agraveuring":-30,"Agravev":-40,"Agravew":-40,"Agravey":-40,"Agraveyacute":-40,"Agraveydieresis":-40,"AmacronC":-30,"AmacronCacute":-30,"AmacronCcaron":-30,"AmacronCcedilla":-30,"AmacronG":-30,"AmacronGbreve":-30,"AmacronGcommaaccent":-30,"AmacronO":-30,"AmacronOacute":-30,"AmacronOcircumflex":-30,"AmacronOdieresis":-30,"AmacronOgrave":-30,"AmacronOhungarumlaut":-30,"AmacronOmacron":-30,"AmacronOslash":-30,"AmacronOtilde":-30,"AmacronQ":-30,"AmacronT":-120,"AmacronTcaron":-120,"AmacronTcommaaccent":-120,"AmacronU":-50,"AmacronUacute":-50,"AmacronUcircumflex":-50,"AmacronUdieresis":-50,"AmacronUgrave":-50,"AmacronUhungarumlaut":-50,"AmacronUmacron":-50,"AmacronUogonek":-50,"AmacronUring":-50,"AmacronV":-70,"AmacronW":-50,"AmacronY":-100,"AmacronYacute":-100,"AmacronYdieresis":-100,"Amacronu":-30,"Amacronuacute":-30,"Amacronucircumflex":-30,"Amacronudieresis":-30,"Amacronugrave":-30,"Amacronuhungarumlaut":-30,"Amacronumacron":-30,"Amacronuogonek":-30,"Amacronuring":-30,"Amacronv":-40,"Amacronw":-40,"Amacrony":-40,"Amacronyacute":-40,"Amacronydieresis":-40,"AogonekC":-30,"AogonekCacute":-30,"AogonekCcaron":-30,"AogonekCcedilla":-30,"AogonekG":-30,"AogonekGbreve":-30,"AogonekGcommaaccent":-30,"AogonekO":-30,"AogonekOacute":-30,"AogonekOcircumflex":-30,"AogonekOdieresis":-30,"AogonekOgrave":-30,"AogonekOhungarumlaut":-30,"AogonekOmacron":-30,"AogonekOslash":-30,"AogonekOtilde":-30,"AogonekQ":-30,"AogonekT":-120,"AogonekTcaron":-120,"AogonekTcommaaccent":-120,"AogonekU":-50,"AogonekUacute":-50,"AogonekUcircumflex":-50,"AogonekUdieresis":-50,"AogonekUgrave":-50,"AogonekUhungarumlaut":-50,"AogonekUmacron":-50,"AogonekUogonek":-50,"AogonekUring":-50,"AogonekV":-70,"AogonekW":-50,"AogonekY":-100,"AogonekYacute":-100,"AogonekYdieresis":-100,"Aogoneku":-30,"Aogonekuacute":-30,"Aogonekucircumflex":-30,"Aogonekudieresis":-30,"Aogonekugrave":-30,"Aogonekuhungarumlaut":-30,"Aogonekumacron":-30,"Aogonekuogonek":-30,"Aogonekuring":-30,"Aogonekv":-40,"Aogonekw":-40,"Aogoneky":-40,"Aogonekyacute":-40,"Aogonekydieresis":-40,"AringC":-30,"AringCacute":-30,"AringCcaron":-30,"AringCcedilla":-30,"AringG":-30,"AringGbreve":-30,"AringGcommaaccent":-30,"AringO":-30,"AringOacute":-30,"AringOcircumflex":-30,"AringOdieresis":-30,"AringOgrave":-30,"AringOhungarumlaut":-30,"AringOmacron":-30,"AringOslash":-30,"AringOtilde":-30,"AringQ":-30,"AringT":-120,"AringTcaron":-120,"AringTcommaaccent":-120,"AringU":-50,"AringUacute":-50,"AringUcircumflex":-50,"AringUdieresis":-50,"AringUgrave":-50,"AringUhungarumlaut":-50,"AringUmacron":-50,"AringUogonek":-50,"AringUring":-50,"AringV":-70,"AringW":-50,"AringY":-100,"AringYacute":-100,"AringYdieresis":-100,"Aringu":-30,"Aringuacute":-30,"Aringucircumflex":-30,"Aringudieresis":-30,"Aringugrave":-30,"Aringuhungarumlaut":-30,"Aringumacron":-30,"Aringuogonek":-30,"Aringuring":-30,"Aringv":-40,"Aringw":-40,"Aringy":-40,"Aringyacute":-40,"Aringydieresis":-40,"AtildeC":-30,"AtildeCacute":-30,"AtildeCcaron":-30,"AtildeCcedilla":-30,"AtildeG":-30,"AtildeGbreve":-30,"AtildeGcommaaccent":-30,"AtildeO":-30,"AtildeOacute":-30,"AtildeOcircumflex":-30,"AtildeOdieresis":-30,"AtildeOgrave":-30,"AtildeOhungarumlaut":-30,"AtildeOmacron":-30,"AtildeOslash":-30,"AtildeOtilde":-30,"AtildeQ":-30,"AtildeT":-120,"AtildeTcaron":-120,"AtildeTcommaaccent":-120,"AtildeU":-50,"AtildeUacute":-50,"AtildeUcircumflex":-50,"AtildeUdieresis":-50,"AtildeUgrave":-50,"AtildeUhungarumlaut":-50,"AtildeUmacron":-50,"AtildeUogonek":-50,"AtildeUring":-50,"AtildeV":-70,"AtildeW":-50,"AtildeY":-100,"AtildeYacute":-100,"AtildeYdieresis":-100,"Atildeu":-30,"Atildeuacute":-30,"Atildeucircumflex":-30,"Atildeudieresis":-30,"Atildeugrave":-30,"Atildeuhungarumlaut":-30,"Atildeumacron":-30,"Atildeuogonek":-30,"Atildeuring":-30,"Atildev":-40,"Atildew":-40,"Atildey":-40,"Atildeyacute":-40,"Atildeydieresis":-40,"BU":-10,"BUacute":-10,"BUcircumflex":-10,"BUdieresis":-10,"BUgrave":-10,"BUhungarumlaut":-10,"BUmacron":-10,"BUogonek":-10,"BUring":-10,"Bcomma":-20,"Bperiod":-20,"Ccomma":-30,"Cperiod":-30,"Cacutecomma":-30,"Cacuteperiod":-30,"Ccaroncomma":-30,"Ccaronperiod":-30,"Ccedillacomma":-30,"Ccedillaperiod":-30,"DA":-40,"DAacute":-40,"DAbreve":-40,"DAcircumflex":-40,"DAdieresis":-40,"DAgrave":-40,"DAmacron":-40,"DAogonek":-40,"DAring":-40,"DAtilde":-40,"DV":-70,"DW":-40,"DY":-90,"DYacute":-90,"DYdieresis":-90,"Dcomma":-70,"Dperiod":-70,"DcaronA":-40,"DcaronAacute":-40,"DcaronAbreve":-40,"DcaronAcircumflex":-40,"DcaronAdieresis":-40,"DcaronAgrave":-40,"DcaronAmacron":-40,"DcaronAogonek":-40,"DcaronAring":-40,"DcaronAtilde":-40,"DcaronV":-70,"DcaronW":-40,"DcaronY":-90,"DcaronYacute":-90,"DcaronYdieresis":-90,"Dcaroncomma":-70,"Dcaronperiod":-70,"DcroatA":-40,"DcroatAacute":-40,"DcroatAbreve":-40,"DcroatAcircumflex":-40,"DcroatAdieresis":-40,"DcroatAgrave":-40,"DcroatAmacron":-40,"DcroatAogonek":-40,"DcroatAring":-40,"DcroatAtilde":-40,"DcroatV":-70,"DcroatW":-40,"DcroatY":-90,"DcroatYacute":-90,"DcroatYdieresis":-90,"Dcroatcomma":-70,"Dcroatperiod":-70,"FA":-80,"FAacute":-80,"FAbreve":-80,"FAcircumflex":-80,"FAdieresis":-80,"FAgrave":-80,"FAmacron":-80,"FAogonek":-80,"FAring":-80,"FAtilde":-80,"Fa":-50,"Faacute":-50,"Fabreve":-50,"Facircumflex":-50,"Fadieresis":-50,"Fagrave":-50,"Famacron":-50,"Faogonek":-50,"Faring":-50,"Fatilde":-50,"Fcomma":-150,"Fe":-30,"Feacute":-30,"Fecaron":-30,"Fecircumflex":-30,"Fedieresis":-30,"Fedotaccent":-30,"Fegrave":-30,"Femacron":-30,"Feogonek":-30,"Fo":-30,"Foacute":-30,"Focircumflex":-30,"Fodieresis":-30,"Fograve":-30,"Fohungarumlaut":-30,"Fomacron":-30,"Foslash":-30,"Fotilde":-30,"Fperiod":-150,"Fr":-45,"Fracute":-45,"Frcaron":-45,"Frcommaaccent":-45,"JA":-20,"JAacute":-20,"JAbreve":-20,"JAcircumflex":-20,"JAdieresis":-20,"JAgrave":-20,"JAmacron":-20,"JAogonek":-20,"JAring":-20,"JAtilde":-20,"Ja":-20,"Jaacute":-20,"Jabreve":-20,"Jacircumflex":-20,"Jadieresis":-20,"Jagrave":-20,"Jamacron":-20,"Jaogonek":-20,"Jaring":-20,"Jatilde":-20,"Jcomma":-30,"Jperiod":-30,"Ju":-20,"Juacute":-20,"Jucircumflex":-20,"Judieresis":-20,"Jugrave":-20,"Juhungarumlaut":-20,"Jumacron":-20,"Juogonek":-20,"Juring":-20,"KO":-50,"KOacute":-50,"KOcircumflex":-50,"KOdieresis":-50,"KOgrave":-50,"KOhungarumlaut":-50,"KOmacron":-50,"KOslash":-50,"KOtilde":-50,"Ke":-40,"Keacute":-40,"Kecaron":-40,"Kecircumflex":-40,"Kedieresis":-40,"Kedotaccent":-40,"Kegrave":-40,"Kemacron":-40,"Keogonek":-40,"Ko":-40,"Koacute":-40,"Kocircumflex":-40,"Kodieresis":-40,"Kograve":-40,"Kohungarumlaut":-40,"Komacron":-40,"Koslash":-40,"Kotilde":-40,"Ku":-30,"Kuacute":-30,"Kucircumflex":-30,"Kudieresis":-30,"Kugrave":-30,"Kuhungarumlaut":-30,"Kumacron":-30,"Kuogonek":-30,"Kuring":-30,"Ky":-50,"Kyacute":-50,"Kydieresis":-50,"KcommaaccentO":-50,"KcommaaccentOacute":-50,"KcommaaccentOcircumflex":-50,"KcommaaccentOdieresis":-50,"KcommaaccentOgrave":-50,"KcommaaccentOhungarumlaut":-50,"KcommaaccentOmacron":-50,"KcommaaccentOslash":-50,"KcommaaccentOtilde":-50,"Kcommaaccente":-40,"Kcommaaccenteacute":-40,"Kcommaaccentecaron":-40,"Kcommaaccentecircumflex":-40,"Kcommaaccentedieresis":-40,"Kcommaaccentedotaccent":-40,"Kcommaaccentegrave":-40,"Kcommaaccentemacron":-40,"Kcommaaccenteogonek":-40,"Kcommaaccento":-40,"Kcommaaccentoacute":-40,"Kcommaaccentocircumflex":-40,"Kcommaaccentodieresis":-40,"Kcommaaccentograve":-40,"Kcommaaccentohungarumlaut":-40,"Kcommaaccentomacron":-40,"Kcommaaccentoslash":-40,"Kcommaaccentotilde":-40,"Kcommaaccentu":-30,"Kcommaaccentuacute":-30,"Kcommaaccentucircumflex":-30,"Kcommaaccentudieresis":-30,"Kcommaaccentugrave":-30,"Kcommaaccentuhungarumlaut":-30,"Kcommaaccentumacron":-30,"Kcommaaccentuogonek":-30,"Kcommaaccenturing":-30,"Kcommaaccenty":-50,"Kcommaaccentyacute":-50,"Kcommaaccentydieresis":-50,"LT":-110,"LTcaron":-110,"LTcommaaccent":-110,"LV":-110,"LW":-70,"LY":-140,"LYacute":-140,"LYdieresis":-140,"Lquotedblright":-140,"Lquoteright":-160,"Ly":-30,"Lyacute":-30,"Lydieresis":-30,"LacuteT":-110,"LacuteTcaron":-110,"LacuteTcommaaccent":-110,"LacuteV":-110,"LacuteW":-70,"LacuteY":-140,"LacuteYacute":-140,"LacuteYdieresis":-140,"Lacutequotedblright":-140,"Lacutequoteright":-160,"Lacutey":-30,"Lacuteyacute":-30,"Lacuteydieresis":-30,"LcaronT":-110,"LcaronTcaron":-110,"LcaronTcommaaccent":-110,"LcaronV":-110,"LcaronW":-70,"LcaronY":-140,"LcaronYacute":-140,"LcaronYdieresis":-140,"Lcaronquotedblright":-140,"Lcaronquoteright":-160,"Lcarony":-30,"Lcaronyacute":-30,"Lcaronydieresis":-30,"LcommaaccentT":-110,"LcommaaccentTcaron":-110,"LcommaaccentTcommaaccent":-110,"LcommaaccentV":-110,"LcommaaccentW":-70,"LcommaaccentY":-140,"LcommaaccentYacute":-140,"LcommaaccentYdieresis":-140,"Lcommaaccentquotedblright":-140,"Lcommaaccentquoteright":-160,"Lcommaaccenty":-30,"Lcommaaccentyacute":-30,"Lcommaaccentydieresis":-30,"LslashT":-110,"LslashTcaron":-110,"LslashTcommaaccent":-110,"LslashV":-110,"LslashW":-70,"LslashY":-140,"LslashYacute":-140,"LslashYdieresis":-140,"Lslashquotedblright":-140,"Lslashquoteright":-160,"Lslashy":-30,"Lslashyacute":-30,"Lslashydieresis":-30,"OA":-20,"OAacute":-20,"OAbreve":-20,"OAcircumflex":-20,"OAdieresis":-20,"OAgrave":-20,"OAmacron":-20,"OAogonek":-20,"OAring":-20,"OAtilde":-20,"OT":-40,"OTcaron":-40,"OTcommaaccent":-40,"OV":-50,"OW":-30,"OX":-60,"OY":-70,"OYacute":-70,"OYdieresis":-70,"Ocomma":-40,"Operiod":-40,"OacuteA":-20,"OacuteAacute":-20,"OacuteAbreve":-20,"OacuteAcircumflex":-20,"OacuteAdieresis":-20,"OacuteAgrave":-20,"OacuteAmacron":-20,"OacuteAogonek":-20,"OacuteAring":-20,"OacuteAtilde":-20,"OacuteT":-40,"OacuteTcaron":-40,"OacuteTcommaaccent":-40,"OacuteV":-50,"OacuteW":-30,"OacuteX":-60,"OacuteY":-70,"OacuteYacute":-70,"OacuteYdieresis":-70,"Oacutecomma":-40,"Oacuteperiod":-40,"OcircumflexA":-20,"OcircumflexAacute":-20,"OcircumflexAbreve":-20,"OcircumflexAcircumflex":-20,"OcircumflexAdieresis":-20,"OcircumflexAgrave":-20,"OcircumflexAmacron":-20,"OcircumflexAogonek":-20,"OcircumflexAring":-20,"OcircumflexAtilde":-20,"OcircumflexT":-40,"OcircumflexTcaron":-40,"OcircumflexTcommaaccent":-40,"OcircumflexV":-50,"OcircumflexW":-30,"OcircumflexX":-60,"OcircumflexY":-70,"OcircumflexYacute":-70,"OcircumflexYdieresis":-70,"Ocircumflexcomma":-40,"Ocircumflexperiod":-40,"OdieresisA":-20,"OdieresisAacute":-20,"OdieresisAbreve":-20,"OdieresisAcircumflex":-20,"OdieresisAdieresis":-20,"OdieresisAgrave":-20,"OdieresisAmacron":-20,"OdieresisAogonek":-20,"OdieresisAring":-20,"OdieresisAtilde":-20,"OdieresisT":-40,"OdieresisTcaron":-40,"OdieresisTcommaaccent":-40,"OdieresisV":-50,"OdieresisW":-30,"OdieresisX":-60,"OdieresisY":-70,"OdieresisYacute":-70,"OdieresisYdieresis":-70,"Odieresiscomma":-40,"Odieresisperiod":-40,"OgraveA":-20,"OgraveAacute":-20,"OgraveAbreve":-20,"OgraveAcircumflex":-20,"OgraveAdieresis":-20,"OgraveAgrave":-20,"OgraveAmacron":-20,"OgraveAogonek":-20,"OgraveAring":-20,"OgraveAtilde":-20,"OgraveT":-40,"OgraveTcaron":-40,"OgraveTcommaaccent":-40,"OgraveV":-50,"OgraveW":-30,"OgraveX":-60,"OgraveY":-70,"OgraveYacute":-70,"OgraveYdieresis":-70,"Ogravecomma":-40,"Ograveperiod":-40,"OhungarumlautA":-20,"OhungarumlautAacute":-20,"OhungarumlautAbreve":-20,"OhungarumlautAcircumflex":-20,"OhungarumlautAdieresis":-20,"OhungarumlautAgrave":-20,"OhungarumlautAmacron":-20,"OhungarumlautAogonek":-20,"OhungarumlautAring":-20,"OhungarumlautAtilde":-20,"OhungarumlautT":-40,"OhungarumlautTcaron":-40,"OhungarumlautTcommaaccent":-40,"OhungarumlautV":-50,"OhungarumlautW":-30,"OhungarumlautX":-60,"OhungarumlautY":-70,"OhungarumlautYacute":-70,"OhungarumlautYdieresis":-70,"Ohungarumlautcomma":-40,"Ohungarumlautperiod":-40,"OmacronA":-20,"OmacronAacute":-20,"OmacronAbreve":-20,"OmacronAcircumflex":-20,"OmacronAdieresis":-20,"OmacronAgrave":-20,"OmacronAmacron":-20,"OmacronAogonek":-20,"OmacronAring":-20,"OmacronAtilde":-20,"OmacronT":-40,"OmacronTcaron":-40,"OmacronTcommaaccent":-40,"OmacronV":-50,"OmacronW":-30,"OmacronX":-60,"OmacronY":-70,"OmacronYacute":-70,"OmacronYdieresis":-70,"Omacroncomma":-40,"Omacronperiod":-40,"OslashA":-20,"OslashAacute":-20,"OslashAbreve":-20,"OslashAcircumflex":-20,"OslashAdieresis":-20,"OslashAgrave":-20,"OslashAmacron":-20,"OslashAogonek":-20,"OslashAring":-20,"OslashAtilde":-20,"OslashT":-40,"OslashTcaron":-40,"OslashTcommaaccent":-40,"OslashV":-50,"OslashW":-30,"OslashX":-60,"OslashY":-70,"OslashYacute":-70,"OslashYdieresis":-70,"Oslashcomma":-40,"Oslashperiod":-40,"OtildeA":-20,"OtildeAacute":-20,"OtildeAbreve":-20,"OtildeAcircumflex":-20,"OtildeAdieresis":-20,"OtildeAgrave":-20,"OtildeAmacron":-20,"OtildeAogonek":-20,"OtildeAring":-20,"OtildeAtilde":-20,"OtildeT":-40,"OtildeTcaron":-40,"OtildeTcommaaccent":-40,"OtildeV":-50,"OtildeW":-30,"OtildeX":-60,"OtildeY":-70,"OtildeYacute":-70,"OtildeYdieresis":-70,"Otildecomma":-40,"Otildeperiod":-40,"PA":-120,"PAacute":-120,"PAbreve":-120,"PAcircumflex":-120,"PAdieresis":-120,"PAgrave":-120,"PAmacron":-120,"PAogonek":-120,"PAring":-120,"PAtilde":-120,"Pa":-40,"Paacute":-40,"Pabreve":-40,"Pacircumflex":-40,"Padieresis":-40,"Pagrave":-40,"Pamacron":-40,"Paogonek":-40,"Paring":-40,"Patilde":-40,"Pcomma":-180,"Pe":-50,"Peacute":-50,"Pecaron":-50,"Pecircumflex":-50,"Pedieresis":-50,"Pedotaccent":-50,"Pegrave":-50,"Pemacron":-50,"Peogonek":-50,"Po":-50,"Poacute":-50,"Pocircumflex":-50,"Podieresis":-50,"Pograve":-50,"Pohungarumlaut":-50,"Pomacron":-50,"Poslash":-50,"Potilde":-50,"Pperiod":-180,"QU":-10,"QUacute":-10,"QUcircumflex":-10,"QUdieresis":-10,"QUgrave":-10,"QUhungarumlaut":-10,"QUmacron":-10,"QUogonek":-10,"QUring":-10,"RO":-20,"ROacute":-20,"ROcircumflex":-20,"ROdieresis":-20,"ROgrave":-20,"ROhungarumlaut":-20,"ROmacron":-20,"ROslash":-20,"ROtilde":-20,"RT":-30,"RTcaron":-30,"RTcommaaccent":-30,"RU":-40,"RUacute":-40,"RUcircumflex":-40,"RUdieresis":-40,"RUgrave":-40,"RUhungarumlaut":-40,"RUmacron":-40,"RUogonek":-40,"RUring":-40,"RV":-50,"RW":-30,"RY":-50,"RYacute":-50,"RYdieresis":-50,"RacuteO":-20,"RacuteOacute":-20,"RacuteOcircumflex":-20,"RacuteOdieresis":-20,"RacuteOgrave":-20,"RacuteOhungarumlaut":-20,"RacuteOmacron":-20,"RacuteOslash":-20,"RacuteOtilde":-20,"RacuteT":-30,"RacuteTcaron":-30,"RacuteTcommaaccent":-30,"RacuteU":-40,"RacuteUacute":-40,"RacuteUcircumflex":-40,"RacuteUdieresis":-40,"RacuteUgrave":-40,"RacuteUhungarumlaut":-40,"RacuteUmacron":-40,"RacuteUogonek":-40,"RacuteUring":-40,"RacuteV":-50,"RacuteW":-30,"RacuteY":-50,"RacuteYacute":-50,"RacuteYdieresis":-50,"RcaronO":-20,"RcaronOacute":-20,"RcaronOcircumflex":-20,"RcaronOdieresis":-20,"RcaronOgrave":-20,"RcaronOhungarumlaut":-20,"RcaronOmacron":-20,"RcaronOslash":-20,"RcaronOtilde":-20,"RcaronT":-30,"RcaronTcaron":-30,"RcaronTcommaaccent":-30,"RcaronU":-40,"RcaronUacute":-40,"RcaronUcircumflex":-40,"RcaronUdieresis":-40,"RcaronUgrave":-40,"RcaronUhungarumlaut":-40,"RcaronUmacron":-40,"RcaronUogonek":-40,"RcaronUring":-40,"RcaronV":-50,"RcaronW":-30,"RcaronY":-50,"RcaronYacute":-50,"RcaronYdieresis":-50,"RcommaaccentO":-20,"RcommaaccentOacute":-20,"RcommaaccentOcircumflex":-20,"RcommaaccentOdieresis":-20,"RcommaaccentOgrave":-20,"RcommaaccentOhungarumlaut":-20,"RcommaaccentOmacron":-20,"RcommaaccentOslash":-20,"RcommaaccentOtilde":-20,"RcommaaccentT":-30,"RcommaaccentTcaron":-30,"RcommaaccentTcommaaccent":-30,"RcommaaccentU":-40,"RcommaaccentUacute":-40,"RcommaaccentUcircumflex":-40,"RcommaaccentUdieresis":-40,"RcommaaccentUgrave":-40,"RcommaaccentUhungarumlaut":-40,"RcommaaccentUmacron":-40,"RcommaaccentUogonek":-40,"RcommaaccentUring":-40,"RcommaaccentV":-50,"RcommaaccentW":-30,"RcommaaccentY":-50,"RcommaaccentYacute":-50,"RcommaaccentYdieresis":-50,"Scomma":-20,"Speriod":-20,"Sacutecomma":-20,"Sacuteperiod":-20,"Scaroncomma":-20,"Scaronperiod":-20,"Scedillacomma":-20,"Scedillaperiod":-20,"Scommaaccentcomma":-20,"Scommaaccentperiod":-20,"TA":-120,"TAacute":-120,"TAbreve":-120,"TAcircumflex":-120,"TAdieresis":-120,"TAgrave":-120,"TAmacron":-120,"TAogonek":-120,"TAring":-120,"TAtilde":-120,"TO":-40,"TOacute":-40,"TOcircumflex":-40,"TOdieresis":-40,"TOgrave":-40,"TOhungarumlaut":-40,"TOmacron":-40,"TOslash":-40,"TOtilde":-40,"Ta":-120,"Taacute":-120,"Tabreve":-60,"Tacircumflex":-120,"Tadieresis":-120,"Tagrave":-120,"Tamacron":-60,"Taogonek":-120,"Taring":-120,"Tatilde":-60,"Tcolon":-20,"Tcomma":-120,"Te":-120,"Teacute":-120,"Tecaron":-120,"Tecircumflex":-120,"Tedieresis":-120,"Tedotaccent":-120,"Tegrave":-60,"Temacron":-60,"Teogonek":-120,"Thyphen":-140,"To":-120,"Toacute":-120,"Tocircumflex":-120,"Todieresis":-120,"Tograve":-120,"Tohungarumlaut":-120,"Tomacron":-60,"Toslash":-120,"Totilde":-60,"Tperiod":-120,"Tr":-120,"Tracute":-120,"Trcaron":-120,"Trcommaaccent":-120,"Tsemicolon":-20,"Tu":-120,"Tuacute":-120,"Tucircumflex":-120,"Tudieresis":-120,"Tugrave":-120,"Tuhungarumlaut":-120,"Tumacron":-60,"Tuogonek":-120,"Turing":-120,"Tw":-120,"Ty":-120,"Tyacute":-120,"Tydieresis":-60,"TcaronA":-120,"TcaronAacute":-120,"TcaronAbreve":-120,"TcaronAcircumflex":-120,"TcaronAdieresis":-120,"TcaronAgrave":-120,"TcaronAmacron":-120,"TcaronAogonek":-120,"TcaronAring":-120,"TcaronAtilde":-120,"TcaronO":-40,"TcaronOacute":-40,"TcaronOcircumflex":-40,"TcaronOdieresis":-40,"TcaronOgrave":-40,"TcaronOhungarumlaut":-40,"TcaronOmacron":-40,"TcaronOslash":-40,"TcaronOtilde":-40,"Tcarona":-120,"Tcaronaacute":-120,"Tcaronabreve":-60,"Tcaronacircumflex":-120,"Tcaronadieresis":-120,"Tcaronagrave":-120,"Tcaronamacron":-60,"Tcaronaogonek":-120,"Tcaronaring":-120,"Tcaronatilde":-60,"Tcaroncolon":-20,"Tcaroncomma":-120,"Tcarone":-120,"Tcaroneacute":-120,"Tcaronecaron":-120,"Tcaronecircumflex":-120,"Tcaronedieresis":-120,"Tcaronedotaccent":-120,"Tcaronegrave":-60,"Tcaronemacron":-60,"Tcaroneogonek":-120,"Tcaronhyphen":-140,"Tcarono":-120,"Tcaronoacute":-120,"Tcaronocircumflex":-120,"Tcaronodieresis":-120,"Tcaronograve":-120,"Tcaronohungarumlaut":-120,"Tcaronomacron":-60,"Tcaronoslash":-120,"Tcaronotilde":-60,"Tcaronperiod":-120,"Tcaronr":-120,"Tcaronracute":-120,"Tcaronrcaron":-120,"Tcaronrcommaaccent":-120,"Tcaronsemicolon":-20,"Tcaronu":-120,"Tcaronuacute":-120,"Tcaronucircumflex":-120,"Tcaronudieresis":-120,"Tcaronugrave":-120,"Tcaronuhungarumlaut":-120,"Tcaronumacron":-60,"Tcaronuogonek":-120,"Tcaronuring":-120,"Tcaronw":-120,"Tcarony":-120,"Tcaronyacute":-120,"Tcaronydieresis":-60,"TcommaaccentA":-120,"TcommaaccentAacute":-120,"TcommaaccentAbreve":-120,"TcommaaccentAcircumflex":-120,"TcommaaccentAdieresis":-120,"TcommaaccentAgrave":-120,"TcommaaccentAmacron":-120,"TcommaaccentAogonek":-120,"TcommaaccentAring":-120,"TcommaaccentAtilde":-120,"TcommaaccentO":-40,"TcommaaccentOacute":-40,"TcommaaccentOcircumflex":-40,"TcommaaccentOdieresis":-40,"TcommaaccentOgrave":-40,"TcommaaccentOhungarumlaut":-40,"TcommaaccentOmacron":-40,"TcommaaccentOslash":-40,"TcommaaccentOtilde":-40,"Tcommaaccenta":-120,"Tcommaaccentaacute":-120,"Tcommaaccentabreve":-60,"Tcommaaccentacircumflex":-120,"Tcommaaccentadieresis":-120,"Tcommaaccentagrave":-120,"Tcommaaccentamacron":-60,"Tcommaaccentaogonek":-120,"Tcommaaccentaring":-120,"Tcommaaccentatilde":-60,"Tcommaaccentcolon":-20,"Tcommaaccentcomma":-120,"Tcommaaccente":-120,"Tcommaaccenteacute":-120,"Tcommaaccentecaron":-120,"Tcommaaccentecircumflex":-120,"Tcommaaccentedieresis":-120,"Tcommaaccentedotaccent":-120,"Tcommaaccentegrave":-60,"Tcommaaccentemacron":-60,"Tcommaaccenteogonek":-120,"Tcommaaccenthyphen":-140,"Tcommaaccento":-120,"Tcommaaccentoacute":-120,"Tcommaaccentocircumflex":-120,"Tcommaaccentodieresis":-120,"Tcommaaccentograve":-120,"Tcommaaccentohungarumlaut":-120,"Tcommaaccentomacron":-60,"Tcommaaccentoslash":-120,"Tcommaaccentotilde":-60,"Tcommaaccentperiod":-120,"Tcommaaccentr":-120,"Tcommaaccentracute":-120,"Tcommaaccentrcaron":-120,"Tcommaaccentrcommaaccent":-120,"Tcommaaccentsemicolon":-20,"Tcommaaccentu":-120,"Tcommaaccentuacute":-120,"Tcommaaccentucircumflex":-120,"Tcommaaccentudieresis":-120,"Tcommaaccentugrave":-120,"Tcommaaccentuhungarumlaut":-120,"Tcommaaccentumacron":-60,"Tcommaaccentuogonek":-120,"Tcommaaccenturing":-120,"Tcommaaccentw":-120,"Tcommaaccenty":-120,"Tcommaaccentyacute":-120,"Tcommaaccentydieresis":-60,"UA":-40,"UAacute":-40,"UAbreve":-40,"UAcircumflex":-40,"UAdieresis":-40,"UAgrave":-40,"UAmacron":-40,"UAogonek":-40,"UAring":-40,"UAtilde":-40,"Ucomma":-40,"Uperiod":-40,"UacuteA":-40,"UacuteAacute":-40,"UacuteAbreve":-40,"UacuteAcircumflex":-40,"UacuteAdieresis":-40,"UacuteAgrave":-40,"UacuteAmacron":-40,"UacuteAogonek":-40,"UacuteAring":-40,"UacuteAtilde":-40,"Uacutecomma":-40,"Uacuteperiod":-40,"UcircumflexA":-40,"UcircumflexAacute":-40,"UcircumflexAbreve":-40,"UcircumflexAcircumflex":-40,"UcircumflexAdieresis":-40,"UcircumflexAgrave":-40,"UcircumflexAmacron":-40,"UcircumflexAogonek":-40,"UcircumflexAring":-40,"UcircumflexAtilde":-40,"Ucircumflexcomma":-40,"Ucircumflexperiod":-40,"UdieresisA":-40,"UdieresisAacute":-40,"UdieresisAbreve":-40,"UdieresisAcircumflex":-40,"UdieresisAdieresis":-40,"UdieresisAgrave":-40,"UdieresisAmacron":-40,"UdieresisAogonek":-40,"UdieresisAring":-40,"UdieresisAtilde":-40,"Udieresiscomma":-40,"Udieresisperiod":-40,"UgraveA":-40,"UgraveAacute":-40,"UgraveAbreve":-40,"UgraveAcircumflex":-40,"UgraveAdieresis":-40,"UgraveAgrave":-40,"UgraveAmacron":-40,"UgraveAogonek":-40,"UgraveAring":-40,"UgraveAtilde":-40,"Ugravecomma":-40,"Ugraveperiod":-40,"UhungarumlautA":-40,"UhungarumlautAacute":-40,"UhungarumlautAbreve":-40,"UhungarumlautAcircumflex":-40,"UhungarumlautAdieresis":-40,"UhungarumlautAgrave":-40,"UhungarumlautAmacron":-40,"UhungarumlautAogonek":-40,"UhungarumlautAring":-40,"UhungarumlautAtilde":-40,"Uhungarumlautcomma":-40,"Uhungarumlautperiod":-40,"UmacronA":-40,"UmacronAacute":-40,"UmacronAbreve":-40,"UmacronAcircumflex":-40,"UmacronAdieresis":-40,"UmacronAgrave":-40,"UmacronAmacron":-40,"UmacronAogonek":-40,"UmacronAring":-40,"UmacronAtilde":-40,"Umacroncomma":-40,"Umacronperiod":-40,"UogonekA":-40,"UogonekAacute":-40,"UogonekAbreve":-40,"UogonekAcircumflex":-40,"UogonekAdieresis":-40,"UogonekAgrave":-40,"UogonekAmacron":-40,"UogonekAogonek":-40,"UogonekAring":-40,"UogonekAtilde":-40,"Uogonekcomma":-40,"Uogonekperiod":-40,"UringA":-40,"UringAacute":-40,"UringAbreve":-40,"UringAcircumflex":-40,"UringAdieresis":-40,"UringAgrave":-40,"UringAmacron":-40,"UringAogonek":-40,"UringAring":-40,"UringAtilde":-40,"Uringcomma":-40,"Uringperiod":-40,"VA":-80,"VAacute":-80,"VAbreve":-80,"VAcircumflex":-80,"VAdieresis":-80,"VAgrave":-80,"VAmacron":-80,"VAogonek":-80,"VAring":-80,"VAtilde":-80,"VG":-40,"VGbreve":-40,"VGcommaaccent":-40,"VO":-40,"VOacute":-40,"VOcircumflex":-40,"VOdieresis":-40,"VOgrave":-40,"VOhungarumlaut":-40,"VOmacron":-40,"VOslash":-40,"VOtilde":-40,"Va":-70,"Vaacute":-70,"Vabreve":-70,"Vacircumflex":-70,"Vadieresis":-70,"Vagrave":-70,"Vamacron":-70,"Vaogonek":-70,"Varing":-70,"Vatilde":-70,"Vcolon":-40,"Vcomma":-125,"Ve":-80,"Veacute":-80,"Vecaron":-80,"Vecircumflex":-80,"Vedieresis":-80,"Vedotaccent":-80,"Vegrave":-80,"Vemacron":-80,"Veogonek":-80,"Vhyphen":-80,"Vo":-80,"Voacute":-80,"Vocircumflex":-80,"Vodieresis":-80,"Vograve":-80,"Vohungarumlaut":-80,"Vomacron":-80,"Voslash":-80,"Votilde":-80,"Vperiod":-125,"Vsemicolon":-40,"Vu":-70,"Vuacute":-70,"Vucircumflex":-70,"Vudieresis":-70,"Vugrave":-70,"Vuhungarumlaut":-70,"Vumacron":-70,"Vuogonek":-70,"Vuring":-70,"WA":-50,"WAacute":-50,"WAbreve":-50,"WAcircumflex":-50,"WAdieresis":-50,"WAgrave":-50,"WAmacron":-50,"WAogonek":-50,"WAring":-50,"WAtilde":-50,"WO":-20,"WOacute":-20,"WOcircumflex":-20,"WOdieresis":-20,"WOgrave":-20,"WOhungarumlaut":-20,"WOmacron":-20,"WOslash":-20,"WOtilde":-20,"Wa":-40,"Waacute":-40,"Wabreve":-40,"Wacircumflex":-40,"Wadieresis":-40,"Wagrave":-40,"Wamacron":-40,"Waogonek":-40,"Waring":-40,"Watilde":-40,"Wcomma":-80,"We":-30,"Weacute":-30,"Wecaron":-30,"Wecircumflex":-30,"Wedieresis":-30,"Wedotaccent":-30,"Wegrave":-30,"Wemacron":-30,"Weogonek":-30,"Whyphen":-40,"Wo":-30,"Woacute":-30,"Wocircumflex":-30,"Wodieresis":-30,"Wograve":-30,"Wohungarumlaut":-30,"Womacron":-30,"Woslash":-30,"Wotilde":-30,"Wperiod":-80,"Wu":-30,"Wuacute":-30,"Wucircumflex":-30,"Wudieresis":-30,"Wugrave":-30,"Wuhungarumlaut":-30,"Wumacron":-30,"Wuogonek":-30,"Wuring":-30,"Wy":-20,"Wyacute":-20,"Wydieresis":-20,"YA":-110,"YAacute":-110,"YAbreve":-110,"YAcircumflex":-110,"YAdieresis":-110,"YAgrave":-110,"YAmacron":-110,"YAogonek":-110,"YAring":-110,"YAtilde":-110,"YO":-85,"YOacute":-85,"YOcircumflex":-85,"YOdieresis":-85,"YOgrave":-85,"YOhungarumlaut":-85,"YOmacron":-85,"YOslash":-85,"YOtilde":-85,"Ya":-140,"Yaacute":-140,"Yabreve":-70,"Yacircumflex":-140,"Yadieresis":-140,"Yagrave":-140,"Yamacron":-70,"Yaogonek":-140,"Yaring":-140,"Yatilde":-140,"Ycolon":-60,"Ycomma":-140,"Ye":-140,"Yeacute":-140,"Yecaron":-140,"Yecircumflex":-140,"Yedieresis":-140,"Yedotaccent":-140,"Yegrave":-140,"Yemacron":-70,"Yeogonek":-140,"Yhyphen":-140,"Yi":-20,"Yiacute":-20,"Yiogonek":-20,"Yo":-140,"Yoacute":-140,"Yocircumflex":-140,"Yodieresis":-140,"Yograve":-140,"Yohungarumlaut":-140,"Yomacron":-140,"Yoslash":-140,"Yotilde":-140,"Yperiod":-140,"Ysemicolon":-60,"Yu":-110,"Yuacute":-110,"Yucircumflex":-110,"Yudieresis":-110,"Yugrave":-110,"Yuhungarumlaut":-110,"Yumacron":-110,"Yuogonek":-110,"Yuring":-110,"YacuteA":-110,"YacuteAacute":-110,"YacuteAbreve":-110,"YacuteAcircumflex":-110,"YacuteAdieresis":-110,"YacuteAgrave":-110,"YacuteAmacron":-110,"YacuteAogonek":-110,"YacuteAring":-110,"YacuteAtilde":-110,"YacuteO":-85,"YacuteOacute":-85,"YacuteOcircumflex":-85,"YacuteOdieresis":-85,"YacuteOgrave":-85,"YacuteOhungarumlaut":-85,"YacuteOmacron":-85,"YacuteOslash":-85,"YacuteOtilde":-85,"Yacutea":-140,"Yacuteaacute":-140,"Yacuteabreve":-70,"Yacuteacircumflex":-140,"Yacuteadieresis":-140,"Yacuteagrave":-140,"Yacuteamacron":-70,"Yacuteaogonek":-140,"Yacutearing":-140,"Yacuteatilde":-70,"Yacutecolon":-60,"Yacutecomma":-140,"Yacutee":-140,"Yacuteeacute":-140,"Yacuteecaron":-140,"Yacuteecircumflex":-140,"Yacuteedieresis":-140,"Yacuteedotaccent":-140,"Yacuteegrave":-140,"Yacuteemacron":-70,"Yacuteeogonek":-140,"Yacutehyphen":-140,"Yacutei":-20,"Yacuteiacute":-20,"Yacuteiogonek":-20,"Yacuteo":-140,"Yacuteoacute":-140,"Yacuteocircumflex":-140,"Yacuteodieresis":-140,"Yacuteograve":-140,"Yacuteohungarumlaut":-140,"Yacuteomacron":-70,"Yacuteoslash":-140,"Yacuteotilde":-140,"Yacuteperiod":-140,"Yacutesemicolon":-60,"Yacuteu":-110,"Yacuteuacute":-110,"Yacuteucircumflex":-110,"Yacuteudieresis":-110,"Yacuteugrave":-110,"Yacuteuhungarumlaut":-110,"Yacuteumacron":-110,"Yacuteuogonek":-110,"Yacuteuring":-110,"YdieresisA":-110,"YdieresisAacute":-110,"YdieresisAbreve":-110,"YdieresisAcircumflex":-110,"YdieresisAdieresis":-110,"YdieresisAgrave":-110,"YdieresisAmacron":-110,"YdieresisAogonek":-110,"YdieresisAring":-110,"YdieresisAtilde":-110,"YdieresisO":-85,"YdieresisOacute":-85,"YdieresisOcircumflex":-85,"YdieresisOdieresis":-85,"YdieresisOgrave":-85,"YdieresisOhungarumlaut":-85,"YdieresisOmacron":-85,"YdieresisOslash":-85,"YdieresisOtilde":-85,"Ydieresisa":-140,"Ydieresisaacute":-140,"Ydieresisabreve":-70,"Ydieresisacircumflex":-140,"Ydieresisadieresis":-140,"Ydieresisagrave":-140,"Ydieresisamacron":-70,"Ydieresisaogonek":-140,"Ydieresisaring":-140,"Ydieresisatilde":-70,"Ydieresiscolon":-60,"Ydieresiscomma":-140,"Ydieresise":-140,"Ydieresiseacute":-140,"Ydieresisecaron":-140,"Ydieresisecircumflex":-140,"Ydieresisedieresis":-140,"Ydieresisedotaccent":-140,"Ydieresisegrave":-140,"Ydieresisemacron":-70,"Ydieresiseogonek":-140,"Ydieresishyphen":-140,"Ydieresisi":-20,"Ydieresisiacute":-20,"Ydieresisiogonek":-20,"Ydieresiso":-140,"Ydieresisoacute":-140,"Ydieresisocircumflex":-140,"Ydieresisodieresis":-140,"Ydieresisograve":-140,"Ydieresisohungarumlaut":-140,"Ydieresisomacron":-140,"Ydieresisoslash":-140,"Ydieresisotilde":-140,"Ydieresisperiod":-140,"Ydieresissemicolon":-60,"Ydieresisu":-110,"Ydieresisuacute":-110,"Ydieresisucircumflex":-110,"Ydieresisudieresis":-110,"Ydieresisugrave":-110,"Ydieresisuhungarumlaut":-110,"Ydieresisumacron":-110,"Ydieresisuogonek":-110,"Ydieresisuring":-110,"av":-20,"aw":-20,"ay":-30,"ayacute":-30,"aydieresis":-30,"aacutev":-20,"aacutew":-20,"aacutey":-30,"aacuteyacute":-30,"aacuteydieresis":-30,"abrevev":-20,"abrevew":-20,"abrevey":-30,"abreveyacute":-30,"abreveydieresis":-30,"acircumflexv":-20,"acircumflexw":-20,"acircumflexy":-30,"acircumflexyacute":-30,"acircumflexydieresis":-30,"adieresisv":-20,"adieresisw":-20,"adieresisy":-30,"adieresisyacute":-30,"adieresisydieresis":-30,"agravev":-20,"agravew":-20,"agravey":-30,"agraveyacute":-30,"agraveydieresis":-30,"amacronv":-20,"amacronw":-20,"amacrony":-30,"amacronyacute":-30,"amacronydieresis":-30,"aogonekv":-20,"aogonekw":-20,"aogoneky":-30,"aogonekyacute":-30,"aogonekydieresis":-30,"aringv":-20,"aringw":-20,"aringy":-30,"aringyacute":-30,"aringydieresis":-30,"atildev":-20,"atildew":-20,"atildey":-30,"atildeyacute":-30,"atildeydieresis":-30,"bb":-10,"bcomma":-40,"bl":-20,"blacute":-20,"blcommaaccent":-20,"blslash":-20,"bperiod":-40,"bu":-20,"buacute":-20,"bucircumflex":-20,"budieresis":-20,"bugrave":-20,"buhungarumlaut":-20,"bumacron":-20,"buogonek":-20,"buring":-20,"bv":-20,"by":-20,"byacute":-20,"bydieresis":-20,"ccomma":-15,"ck":-20,"ckcommaaccent":-20,"cacutecomma":-15,"cacutek":-20,"cacutekcommaaccent":-20,"ccaroncomma":-15,"ccaronk":-20,"ccaronkcommaaccent":-20,"ccedillacomma":-15,"ccedillak":-20,"ccedillakcommaaccent":-20,"colonspace":-50,"commaquotedblright":-100,"commaquoteright":-100,"ecomma":-15,"eperiod":-15,"ev":-30,"ew":-20,"ex":-30,"ey":-20,"eyacute":-20,"eydieresis":-20,"eacutecomma":-15,"eacuteperiod":-15,"eacutev":-30,"eacutew":-20,"eacutex":-30,"eacutey":-20,"eacuteyacute":-20,"eacuteydieresis":-20,"ecaroncomma":-15,"ecaronperiod":-15,"ecaronv":-30,"ecaronw":-20,"ecaronx":-30,"ecarony":-20,"ecaronyacute":-20,"ecaronydieresis":-20,"ecircumflexcomma":-15,"ecircumflexperiod":-15,"ecircumflexv":-30,"ecircumflexw":-20,"ecircumflexx":-30,"ecircumflexy":-20,"ecircumflexyacute":-20,"ecircumflexydieresis":-20,"edieresiscomma":-15,"edieresisperiod":-15,"edieresisv":-30,"edieresisw":-20,"edieresisx":-30,"edieresisy":-20,"edieresisyacute":-20,"edieresisydieresis":-20,"edotaccentcomma":-15,"edotaccentperiod":-15,"edotaccentv":-30,"edotaccentw":-20,"edotaccentx":-30,"edotaccenty":-20,"edotaccentyacute":-20,"edotaccentydieresis":-20,"egravecomma":-15,"egraveperiod":-15,"egravev":-30,"egravew":-20,"egravex":-30,"egravey":-20,"egraveyacute":-20,"egraveydieresis":-20,"emacroncomma":-15,"emacronperiod":-15,"emacronv":-30,"emacronw":-20,"emacronx":-30,"emacrony":-20,"emacronyacute":-20,"emacronydieresis":-20,"eogonekcomma":-15,"eogonekperiod":-15,"eogonekv":-30,"eogonekw":-20,"eogonekx":-30,"eogoneky":-20,"eogonekyacute":-20,"eogonekydieresis":-20,"fa":-30,"faacute":-30,"fabreve":-30,"facircumflex":-30,"fadieresis":-30,"fagrave":-30,"famacron":-30,"faogonek":-30,"faring":-30,"fatilde":-30,"fcomma":-30,"fdotlessi":-28,"fe":-30,"feacute":-30,"fecaron":-30,"fecircumflex":-30,"fedieresis":-30,"fedotaccent":-30,"fegrave":-30,"femacron":-30,"feogonek":-30,"fo":-30,"foacute":-30,"focircumflex":-30,"fodieresis":-30,"fograve":-30,"fohungarumlaut":-30,"fomacron":-30,"foslash":-30,"fotilde":-30,"fperiod":-30,"fquotedblright":60,"fquoteright":50,"gr":-10,"gracute":-10,"grcaron":-10,"grcommaaccent":-10,"gbrever":-10,"gbreveracute":-10,"gbrevercaron":-10,"gbrevercommaaccent":-10,"gcommaaccentr":-10,"gcommaaccentracute":-10,"gcommaaccentrcaron":-10,"gcommaaccentrcommaaccent":-10,"hy":-30,"hyacute":-30,"hydieresis":-30,"ke":-20,"keacute":-20,"kecaron":-20,"kecircumflex":-20,"kedieresis":-20,"kedotaccent":-20,"kegrave":-20,"kemacron":-20,"keogonek":-20,"ko":-20,"koacute":-20,"kocircumflex":-20,"kodieresis":-20,"kograve":-20,"kohungarumlaut":-20,"komacron":-20,"koslash":-20,"kotilde":-20,"kcommaaccente":-20,"kcommaaccenteacute":-20,"kcommaaccentecaron":-20,"kcommaaccentecircumflex":-20,"kcommaaccentedieresis":-20,"kcommaaccentedotaccent":-20,"kcommaaccentegrave":-20,"kcommaaccentemacron":-20,"kcommaaccenteogonek":-20,"kcommaaccento":-20,"kcommaaccentoacute":-20,"kcommaaccentocircumflex":-20,"kcommaaccentodieresis":-20,"kcommaaccentograve":-20,"kcommaaccentohungarumlaut":-20,"kcommaaccentomacron":-20,"kcommaaccentoslash":-20,"kcommaaccentotilde":-20,"mu":-10,"muacute":-10,"mucircumflex":-10,"mudieresis":-10,"mugrave":-10,"muhungarumlaut":-10,"mumacron":-10,"muogonek":-10,"muring":-10,"my":-15,"myacute":-15,"mydieresis":-15,"nu":-10,"nuacute":-10,"nucircumflex":-10,"nudieresis":-10,"nugrave":-10,"nuhungarumlaut":-10,"numacron":-10,"nuogonek":-10,"nuring":-10,"nv":-20,"ny":-15,"nyacute":-15,"nydieresis":-15,"nacuteu":-10,"nacuteuacute":-10,"nacuteucircumflex":-10,"nacuteudieresis":-10,"nacuteugrave":-10,"nacuteuhungarumlaut":-10,"nacuteumacron":-10,"nacuteuogonek":-10,"nacuteuring":-10,"nacutev":-20,"nacutey":-15,"nacuteyacute":-15,"nacuteydieresis":-15,"ncaronu":-10,"ncaronuacute":-10,"ncaronucircumflex":-10,"ncaronudieresis":-10,"ncaronugrave":-10,"ncaronuhungarumlaut":-10,"ncaronumacron":-10,"ncaronuogonek":-10,"ncaronuring":-10,"ncaronv":-20,"ncarony":-15,"ncaronyacute":-15,"ncaronydieresis":-15,"ncommaaccentu":-10,"ncommaaccentuacute":-10,"ncommaaccentucircumflex":-10,"ncommaaccentudieresis":-10,"ncommaaccentugrave":-10,"ncommaaccentuhungarumlaut":-10,"ncommaaccentumacron":-10,"ncommaaccentuogonek":-10,"ncommaaccenturing":-10,"ncommaaccentv":-20,"ncommaaccenty":-15,"ncommaaccentyacute":-15,"ncommaaccentydieresis":-15,"ntildeu":-10,"ntildeuacute":-10,"ntildeucircumflex":-10,"ntildeudieresis":-10,"ntildeugrave":-10,"ntildeuhungarumlaut":-10,"ntildeumacron":-10,"ntildeuogonek":-10,"ntildeuring":-10,"ntildev":-20,"ntildey":-15,"ntildeyacute":-15,"ntildeydieresis":-15,"ocomma":-40,"operiod":-40,"ov":-15,"ow":-15,"ox":-30,"oy":-30,"oyacute":-30,"oydieresis":-30,"oacutecomma":-40,"oacuteperiod":-40,"oacutev":-15,"oacutew":-15,"oacutex":-30,"oacutey":-30,"oacuteyacute":-30,"oacuteydieresis":-30,"ocircumflexcomma":-40,"ocircumflexperiod":-40,"ocircumflexv":-15,"ocircumflexw":-15,"ocircumflexx":-30,"ocircumflexy":-30,"ocircumflexyacute":-30,"ocircumflexydieresis":-30,"odieresiscomma":-40,"odieresisperiod":-40,"odieresisv":-15,"odieresisw":-15,"odieresisx":-30,"odieresisy":-30,"odieresisyacute":-30,"odieresisydieresis":-30,"ogravecomma":-40,"ograveperiod":-40,"ogravev":-15,"ogravew":-15,"ogravex":-30,"ogravey":-30,"ograveyacute":-30,"ograveydieresis":-30,"ohungarumlautcomma":-40,"ohungarumlautperiod":-40,"ohungarumlautv":-15,"ohungarumlautw":-15,"ohungarumlautx":-30,"ohungarumlauty":-30,"ohungarumlautyacute":-30,"ohungarumlautydieresis":-30,"omacroncomma":-40,"omacronperiod":-40,"omacronv":-15,"omacronw":-15,"omacronx":-30,"omacrony":-30,"omacronyacute":-30,"omacronydieresis":-30,"oslasha":-55,"oslashaacute":-55,"oslashabreve":-55,"oslashacircumflex":-55,"oslashadieresis":-55,"oslashagrave":-55,"oslashamacron":-55,"oslashaogonek":-55,"oslasharing":-55,"oslashatilde":-55,"oslashb":-55,"oslashc":-55,"oslashcacute":-55,"oslashccaron":-55,"oslashccedilla":-55,"oslashcomma":-95,"oslashd":-55,"oslashdcroat":-55,"oslashe":-55,"oslasheacute":-55,"oslashecaron":-55,"oslashecircumflex":-55,"oslashedieresis":-55,"oslashedotaccent":-55,"oslashegrave":-55,"oslashemacron":-55,"oslasheogonek":-55,"oslashf":-55,"oslashg":-55,"oslashgbreve":-55,"oslashgcommaaccent":-55,"oslashh":-55,"oslashi":-55,"oslashiacute":-55,"oslashicircumflex":-55,"oslashidieresis":-55,"oslashigrave":-55,"oslashimacron":-55,"oslashiogonek":-55,"oslashj":-55,"oslashk":-55,"oslashkcommaaccent":-55,"oslashl":-55,"oslashlacute":-55,"oslashlcommaaccent":-55,"oslashlslash":-55,"oslashm":-55,"oslashn":-55,"oslashnacute":-55,"oslashncaron":-55,"oslashncommaaccent":-55,"oslashntilde":-55,"oslasho":-55,"oslashoacute":-55,"oslashocircumflex":-55,"oslashodieresis":-55,"oslashograve":-55,"oslashohungarumlaut":-55,"oslashomacron":-55,"oslashoslash":-55,"oslashotilde":-55,"oslashp":-55,"oslashperiod":-95,"oslashq":-55,"oslashr":-55,"oslashracute":-55,"oslashrcaron":-55,"oslashrcommaaccent":-55,"oslashs":-55,"oslashsacute":-55,"oslashscaron":-55,"oslashscedilla":-55,"oslashscommaaccent":-55,"oslasht":-55,"oslashtcommaaccent":-55,"oslashu":-55,"oslashuacute":-55,"oslashucircumflex":-55,"oslashudieresis":-55,"oslashugrave":-55,"oslashuhungarumlaut":-55,"oslashumacron":-55,"oslashuogonek":-55,"oslashuring":-55,"oslashv":-70,"oslashw":-70,"oslashx":-85,"oslashy":-70,"oslashyacute":-70,"oslashydieresis":-70,"oslashz":-55,"oslashzacute":-55,"oslashzcaron":-55,"oslashzdotaccent":-55,"otildecomma":-40,"otildeperiod":-40,"otildev":-15,"otildew":-15,"otildex":-30,"otildey":-30,"otildeyacute":-30,"otildeydieresis":-30,"pcomma":-35,"pperiod":-35,"py":-30,"pyacute":-30,"pydieresis":-30,"periodquotedblright":-100,"periodquoteright":-100,"periodspace":-60,"quotedblrightspace":-40,"quoteleftquoteleft":-57,"quoterightd":-50,"quoterightdcroat":-50,"quoterightquoteright":-57,"quoterightr":-50,"quoterightracute":-50,"quoterightrcaron":-50,"quoterightrcommaaccent":-50,"quoterights":-50,"quoterightsacute":-50,"quoterightscaron":-50,"quoterightscedilla":-50,"quoterightscommaaccent":-50,"quoterightspace":-70,"ra":-10,"raacute":-10,"rabreve":-10,"racircumflex":-10,"radieresis":-10,"ragrave":-10,"ramacron":-10,"raogonek":-10,"raring":-10,"ratilde":-10,"rcolon":30,"rcomma":-50,"ri":15,"riacute":15,"ricircumflex":15,"ridieresis":15,"rigrave":15,"rimacron":15,"riogonek":15,"rk":15,"rkcommaaccent":15,"rl":15,"rlacute":15,"rlcommaaccent":15,"rlslash":15,"rm":25,"rn":25,"rnacute":25,"rncaron":25,"rncommaaccent":25,"rntilde":25,"rp":30,"rperiod":-50,"rsemicolon":30,"rt":40,"rtcommaaccent":40,"ru":15,"ruacute":15,"rucircumflex":15,"rudieresis":15,"rugrave":15,"ruhungarumlaut":15,"rumacron":15,"ruogonek":15,"ruring":15,"rv":30,"ry":30,"ryacute":30,"rydieresis":30,"racutea":-10,"racuteaacute":-10,"racuteabreve":-10,"racuteacircumflex":-10,"racuteadieresis":-10,"racuteagrave":-10,"racuteamacron":-10,"racuteaogonek":-10,"racutearing":-10,"racuteatilde":-10,"racutecolon":30,"racutecomma":-50,"racutei":15,"racuteiacute":15,"racuteicircumflex":15,"racuteidieresis":15,"racuteigrave":15,"racuteimacron":15,"racuteiogonek":15,"racutek":15,"racutekcommaaccent":15,"racutel":15,"racutelacute":15,"racutelcommaaccent":15,"racutelslash":15,"racutem":25,"racuten":25,"racutenacute":25,"racutencaron":25,"racutencommaaccent":25,"racutentilde":25,"racutep":30,"racuteperiod":-50,"racutesemicolon":30,"racutet":40,"racutetcommaaccent":40,"racuteu":15,"racuteuacute":15,"racuteucircumflex":15,"racuteudieresis":15,"racuteugrave":15,"racuteuhungarumlaut":15,"racuteumacron":15,"racuteuogonek":15,"racuteuring":15,"racutev":30,"racutey":30,"racuteyacute":30,"racuteydieresis":30,"rcarona":-10,"rcaronaacute":-10,"rcaronabreve":-10,"rcaronacircumflex":-10,"rcaronadieresis":-10,"rcaronagrave":-10,"rcaronamacron":-10,"rcaronaogonek":-10,"rcaronaring":-10,"rcaronatilde":-10,"rcaroncolon":30,"rcaroncomma":-50,"rcaroni":15,"rcaroniacute":15,"rcaronicircumflex":15,"rcaronidieresis":15,"rcaronigrave":15,"rcaronimacron":15,"rcaroniogonek":15,"rcaronk":15,"rcaronkcommaaccent":15,"rcaronl":15,"rcaronlacute":15,"rcaronlcommaaccent":15,"rcaronlslash":15,"rcaronm":25,"rcaronn":25,"rcaronnacute":25,"rcaronncaron":25,"rcaronncommaaccent":25,"rcaronntilde":25,"rcaronp":30,"rcaronperiod":-50,"rcaronsemicolon":30,"rcaront":40,"rcarontcommaaccent":40,"rcaronu":15,"rcaronuacute":15,"rcaronucircumflex":15,"rcaronudieresis":15,"rcaronugrave":15,"rcaronuhungarumlaut":15,"rcaronumacron":15,"rcaronuogonek":15,"rcaronuring":15,"rcaronv":30,"rcarony":30,"rcaronyacute":30,"rcaronydieresis":30,"rcommaaccenta":-10,"rcommaaccentaacute":-10,"rcommaaccentabreve":-10,"rcommaaccentacircumflex":-10,"rcommaaccentadieresis":-10,"rcommaaccentagrave":-10,"rcommaaccentamacron":-10,"rcommaaccentaogonek":-10,"rcommaaccentaring":-10,"rcommaaccentatilde":-10,"rcommaaccentcolon":30,"rcommaaccentcomma":-50,"rcommaaccenti":15,"rcommaaccentiacute":15,"rcommaaccenticircumflex":15,"rcommaaccentidieresis":15,"rcommaaccentigrave":15,"rcommaaccentimacron":15,"rcommaaccentiogonek":15,"rcommaaccentk":15,"rcommaaccentkcommaaccent":15,"rcommaaccentl":15,"rcommaaccentlacute":15,"rcommaaccentlcommaaccent":15,"rcommaaccentlslash":15,"rcommaaccentm":25,"rcommaaccentn":25,"rcommaaccentnacute":25,"rcommaaccentncaron":25,"rcommaaccentncommaaccent":25,"rcommaaccentntilde":25,"rcommaaccentp":30,"rcommaaccentperiod":-50,"rcommaaccentsemicolon":30,"rcommaaccentt":40,"rcommaaccenttcommaaccent":40,"rcommaaccentu":15,"rcommaaccentuacute":15,"rcommaaccentucircumflex":15,"rcommaaccentudieresis":15,"rcommaaccentugrave":15,"rcommaaccentuhungarumlaut":15,"rcommaaccentumacron":15,"rcommaaccentuogonek":15,"rcommaaccenturing":15,"rcommaaccentv":30,"rcommaaccenty":30,"rcommaaccentyacute":30,"rcommaaccentydieresis":30,"scomma":-15,"speriod":-15,"sw":-30,"sacutecomma":-15,"sacuteperiod":-15,"sacutew":-30,"scaroncomma":-15,"scaronperiod":-15,"scaronw":-30,"scedillacomma":-15,"scedillaperiod":-15,"scedillaw":-30,"scommaaccentcomma":-15,"scommaaccentperiod":-15,"scommaaccentw":-30,"semicolonspace":-50,"spaceT":-50,"spaceTcaron":-50,"spaceTcommaaccent":-50,"spaceV":-50,"spaceW":-40,"spaceY":-90,"spaceYacute":-90,"spaceYdieresis":-90,"spacequotedblleft":-30,"spacequoteleft":-60,"va":-25,"vaacute":-25,"vabreve":-25,"vacircumflex":-25,"vadieresis":-25,"vagrave":-25,"vamacron":-25,"vaogonek":-25,"varing":-25,"vatilde":-25,"vcomma":-80,"ve":-25,"veacute":-25,"vecaron":-25,"vecircumflex":-25,"vedieresis":-25,"vedotaccent":-25,"vegrave":-25,"vemacron":-25,"veogonek":-25,"vo":-25,"voacute":-25,"vocircumflex":-25,"vodieresis":-25,"vograve":-25,"vohungarumlaut":-25,"vomacron":-25,"voslash":-25,"votilde":-25,"vperiod":-80,"wa":-15,"waacute":-15,"wabreve":-15,"wacircumflex":-15,"wadieresis":-15,"wagrave":-15,"wamacron":-15,"waogonek":-15,"waring":-15,"watilde":-15,"wcomma":-60,"we":-10,"weacute":-10,"wecaron":-10,"wecircumflex":-10,"wedieresis":-10,"wedotaccent":-10,"wegrave":-10,"wemacron":-10,"weogonek":-10,"wo":-10,"woacute":-10,"wocircumflex":-10,"wodieresis":-10,"wograve":-10,"wohungarumlaut":-10,"womacron":-10,"woslash":-10,"wotilde":-10,"wperiod":-60,"xe":-30,"xeacute":-30,"xecaron":-30,"xecircumflex":-30,"xedieresis":-30,"xedotaccent":-30,"xegrave":-30,"xemacron":-30,"xeogonek":-30,"ya":-20,"yaacute":-20,"yabreve":-20,"yacircumflex":-20,"yadieresis":-20,"yagrave":-20,"yamacron":-20,"yaogonek":-20,"yaring":-20,"yatilde":-20,"ycomma":-100,"ye":-20,"yeacute":-20,"yecaron":-20,"yecircumflex":-20,"yedieresis":-20,"yedotaccent":-20,"yegrave":-20,"yemacron":-20,"yeogonek":-20,"yo":-20,"yoacute":-20,"yocircumflex":-20,"yodieresis":-20,"yograve":-20,"yohungarumlaut":-20,"yomacron":-20,"yoslash":-20,"yotilde":-20,"yperiod":-100,"yacutea":-20,"yacuteaacute":-20,"yacuteabreve":-20,"yacuteacircumflex":-20,"yacuteadieresis":-20,"yacuteagrave":-20,"yacuteamacron":-20,"yacuteaogonek":-20,"yacutearing":-20,"yacuteatilde":-20,"yacutecomma":-100,"yacutee":-20,"yacuteeacute":-20,"yacuteecaron":-20,"yacuteecircumflex":-20,"yacuteedieresis":-20,"yacuteedotaccent":-20,"yacuteegrave":-20,"yacuteemacron":-20,"yacuteeogonek":-20,"yacuteo":-20,"yacuteoacute":-20,"yacuteocircumflex":-20,"yacuteodieresis":-20,"yacuteograve":-20,"yacuteohungarumlaut":-20,"yacuteomacron":-20,"yacuteoslash":-20,"yacuteotilde":-20,"yacuteperiod":-100,"ydieresisa":-20,"ydieresisaacute":-20,"ydieresisabreve":-20,"ydieresisacircumflex":-20,"ydieresisadieresis":-20,"ydieresisagrave":-20,"ydieresisamacron":-20,"ydieresisaogonek":-20,"ydieresisaring":-20,"ydieresisatilde":-20,"ydieresiscomma":-100,"ydieresise":-20,"ydieresiseacute":-20,"ydieresisecaron":-20,"ydieresisecircumflex":-20,"ydieresisedieresis":-20,"ydieresisedotaccent":-20,"ydieresisegrave":-20,"ydieresisemacron":-20,"ydieresiseogonek":-20,"ydieresiso":-20,"ydieresisoacute":-20,"ydieresisocircumflex":-20,"ydieresisodieresis":-20,"ydieresisograve":-20,"ydieresisohungarumlaut":-20,"ydieresisomacron":-20,"ydieresisoslash":-20,"ydieresisotilde":-20,"ydieresisperiod":-100,"ze":-15,"zeacute":-15,"zecaron":-15,"zecircumflex":-15,"zedieresis":-15,"zedotaccent":-15,"zegrave":-15,"zemacron":-15,"zeogonek":-15,"zo":-15,"zoacute":-15,"zocircumflex":-15,"zodieresis":-15,"zograve":-15,"zohungarumlaut":-15,"zomacron":-15,"zoslash":-15,"zotilde":-15,"zacutee":-15,"zacuteeacute":-15,"zacuteecaron":-15,"zacuteecircumflex":-15,"zacuteedieresis":-15,"zacuteedotaccent":-15,"zacuteegrave":-15,"zacuteemacron":-15,"zacuteeogonek":-15,"zacuteo":-15,"zacuteoacute":-15,"zacuteocircumflex":-15,"zacuteodieresis":-15,"zacuteograve":-15,"zacuteohungarumlaut":-15,"zacuteomacron":-15,"zacuteoslash":-15,"zacuteotilde":-15,"zcarone":-15,"zcaroneacute":-15,"zcaronecaron":-15,"zcaronecircumflex":-15,"zcaronedieresis":-15,"zcaronedotaccent":-15,"zcaronegrave":-15,"zcaronemacron":-15,"zcaroneogonek":-15,"zcarono":-15,"zcaronoacute":-15,"zcaronocircumflex":-15,"zcaronodieresis":-15,"zcaronograve":-15,"zcaronohungarumlaut":-15,"zcaronomacron":-15,"zcaronoslash":-15,"zcaronotilde":-15,"zdotaccente":-15,"zdotaccenteacute":-15,"zdotaccentecaron":-15,"zdotaccentecircumflex":-15,"zdotaccentedieresis":-15,"zdotaccentedotaccent":-15,"zdotaccentegrave":-15,"zdotaccentemacron":-15,"zdotaccenteogonek":-15,"zdotaccento":-15,"zdotaccentoacute":-15,"zdotaccentocircumflex":-15,"zdotaccentodieresis":-15,"zdotaccentograve":-15,"zdotaccentohungarumlaut":-15,"zdotaccentomacron":-15,"zdotaccentoslash":-15,"zdotaccentotilde":-15}} \ No newline at end of file diff --git a/packages/pdfkit/src/font/data/Helvetica.json b/packages/pdfkit/src/font/data/Helvetica.json deleted file mode 100644 index cc9e282fb..000000000 --- a/packages/pdfkit/src/font/data/Helvetica.json +++ /dev/null @@ -1 +0,0 @@ -{"attributes":{"Comment":["Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.","Creation Date: Thu May 1 12:38:23 1997","UniqueID 43054","VMusage 37069 48094"],"FontName":"Helvetica","FullName":"Helvetica","FamilyName":"Helvetica","Weight":"Medium","ItalicAngle":"0","IsFixedPitch":"false","CharacterSet":"ExtendedRoman","FontBBox":"-166 -225 1000 931 ","UnderlinePosition":"-100","UnderlineThickness":"50","Version":"002.000","Notice":"Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries.","EncodingScheme":"AdobeStandardEncoding","CapHeight":"718","XHeight":"523","Ascender":"718","Descender":"-207","StdHW":"76","StdVW":"88"},"glyphWidths":{"space":278,"exclam":278,"quotedbl":355,"numbersign":556,"dollar":556,"percent":889,"ampersand":667,"quoteright":222,"parenleft":333,"parenright":333,"asterisk":389,"plus":584,"comma":278,"hyphen":333,"period":278,"slash":278,"zero":556,"one":556,"two":556,"three":556,"four":556,"five":556,"six":556,"seven":556,"eight":556,"nine":556,"colon":278,"semicolon":278,"less":584,"equal":584,"greater":584,"question":556,"at":1015,"A":667,"B":667,"C":722,"D":722,"E":667,"F":611,"G":778,"H":722,"I":278,"J":500,"K":667,"L":556,"M":833,"N":722,"O":778,"P":667,"Q":778,"R":722,"S":667,"T":611,"U":722,"V":667,"W":944,"X":667,"Y":667,"Z":611,"bracketleft":278,"backslash":278,"bracketright":278,"asciicircum":469,"underscore":556,"quoteleft":222,"a":556,"b":556,"c":500,"d":556,"e":556,"f":278,"g":556,"h":556,"i":222,"j":222,"k":500,"l":222,"m":833,"n":556,"o":556,"p":556,"q":556,"r":333,"s":500,"t":278,"u":556,"v":500,"w":722,"x":500,"y":500,"z":500,"braceleft":334,"bar":260,"braceright":334,"asciitilde":584,"exclamdown":333,"cent":556,"sterling":556,"fraction":167,"yen":556,"florin":556,"section":556,"currency":556,"quotesingle":191,"quotedblleft":333,"guillemotleft":556,"guilsinglleft":333,"guilsinglright":333,"fi":500,"fl":500,"endash":556,"dagger":556,"daggerdbl":556,"periodcentered":278,"paragraph":537,"bullet":350,"quotesinglbase":222,"quotedblbase":333,"quotedblright":333,"guillemotright":556,"ellipsis":1000,"perthousand":1000,"questiondown":611,"grave":333,"acute":333,"circumflex":333,"tilde":333,"macron":333,"breve":333,"dotaccent":333,"dieresis":333,"ring":333,"cedilla":333,"hungarumlaut":333,"ogonek":333,"caron":333,"emdash":1000,"AE":1000,"ordfeminine":370,"Lslash":556,"Oslash":778,"OE":1000,"ordmasculine":365,"ae":889,"dotlessi":278,"lslash":222,"oslash":611,"oe":944,"germandbls":611,"Idieresis":278,"eacute":556,"abreve":556,"uhungarumlaut":556,"ecaron":556,"Ydieresis":667,"divide":584,"Yacute":667,"Acircumflex":667,"aacute":556,"Ucircumflex":722,"yacute":500,"scommaaccent":500,"ecircumflex":556,"Uring":722,"Udieresis":722,"aogonek":556,"Uacute":722,"uogonek":556,"Edieresis":667,"Dcroat":722,"commaaccent":250,"copyright":737,"Emacron":667,"ccaron":500,"aring":556,"Ncommaaccent":722,"lacute":222,"agrave":556,"Tcommaaccent":611,"Cacute":722,"atilde":556,"Edotaccent":667,"scaron":500,"scedilla":500,"iacute":278,"lozenge":471,"Rcaron":722,"Gcommaaccent":778,"ucircumflex":556,"acircumflex":556,"Amacron":667,"rcaron":333,"ccedilla":500,"Zdotaccent":611,"Thorn":667,"Omacron":778,"Racute":722,"Sacute":667,"dcaron":643,"Umacron":722,"uring":556,"threesuperior":333,"Ograve":778,"Agrave":667,"Abreve":667,"multiply":584,"uacute":556,"Tcaron":611,"partialdiff":476,"ydieresis":500,"Nacute":722,"icircumflex":278,"Ecircumflex":667,"adieresis":556,"edieresis":556,"cacute":500,"nacute":556,"umacron":556,"Ncaron":722,"Iacute":278,"plusminus":584,"brokenbar":260,"registered":737,"Gbreve":778,"Idotaccent":278,"summation":600,"Egrave":667,"racute":333,"omacron":556,"Zacute":611,"Zcaron":611,"greaterequal":549,"Eth":722,"Ccedilla":722,"lcommaaccent":222,"tcaron":317,"eogonek":556,"Uogonek":722,"Aacute":667,"Adieresis":667,"egrave":556,"zacute":500,"iogonek":222,"Oacute":778,"oacute":556,"amacron":556,"sacute":500,"idieresis":278,"Ocircumflex":778,"Ugrave":722,"Delta":612,"thorn":556,"twosuperior":333,"Odieresis":778,"mu":556,"igrave":278,"ohungarumlaut":556,"Eogonek":667,"dcroat":556,"threequarters":834,"Scedilla":667,"lcaron":299,"Kcommaaccent":667,"Lacute":556,"trademark":1000,"edotaccent":556,"Igrave":278,"Imacron":278,"Lcaron":556,"onehalf":834,"lessequal":549,"ocircumflex":556,"ntilde":556,"Uhungarumlaut":722,"Eacute":667,"emacron":556,"gbreve":556,"onequarter":834,"Scaron":667,"Scommaaccent":667,"Ohungarumlaut":778,"degree":400,"ograve":556,"Ccaron":722,"ugrave":556,"radical":453,"Dcaron":722,"rcommaaccent":333,"Ntilde":722,"otilde":556,"Rcommaaccent":722,"Lcommaaccent":556,"Atilde":667,"Aogonek":667,"Aring":667,"Otilde":778,"zdotaccent":500,"Ecaron":667,"Iogonek":278,"kcommaaccent":500,"minus":584,"Icircumflex":278,"ncaron":556,"tcommaaccent":278,"logicalnot":584,"odieresis":556,"udieresis":556,"notequal":549,"gcommaaccent":556,"eth":556,"zcaron":500,"ncommaaccent":556,"onesuperior":333,"imacron":278,"Euro":556},"kernPairs":{"AC":-30,"ACacute":-30,"ACcaron":-30,"ACcedilla":-30,"AG":-30,"AGbreve":-30,"AGcommaaccent":-30,"AO":-30,"AOacute":-30,"AOcircumflex":-30,"AOdieresis":-30,"AOgrave":-30,"AOhungarumlaut":-30,"AOmacron":-30,"AOslash":-30,"AOtilde":-30,"AQ":-30,"AT":-120,"ATcaron":-120,"ATcommaaccent":-120,"AU":-50,"AUacute":-50,"AUcircumflex":-50,"AUdieresis":-50,"AUgrave":-50,"AUhungarumlaut":-50,"AUmacron":-50,"AUogonek":-50,"AUring":-50,"AV":-70,"AW":-50,"AY":-100,"AYacute":-100,"AYdieresis":-100,"Au":-30,"Auacute":-30,"Aucircumflex":-30,"Audieresis":-30,"Augrave":-30,"Auhungarumlaut":-30,"Aumacron":-30,"Auogonek":-30,"Auring":-30,"Av":-40,"Aw":-40,"Ay":-40,"Ayacute":-40,"Aydieresis":-40,"AacuteC":-30,"AacuteCacute":-30,"AacuteCcaron":-30,"AacuteCcedilla":-30,"AacuteG":-30,"AacuteGbreve":-30,"AacuteGcommaaccent":-30,"AacuteO":-30,"AacuteOacute":-30,"AacuteOcircumflex":-30,"AacuteOdieresis":-30,"AacuteOgrave":-30,"AacuteOhungarumlaut":-30,"AacuteOmacron":-30,"AacuteOslash":-30,"AacuteOtilde":-30,"AacuteQ":-30,"AacuteT":-120,"AacuteTcaron":-120,"AacuteTcommaaccent":-120,"AacuteU":-50,"AacuteUacute":-50,"AacuteUcircumflex":-50,"AacuteUdieresis":-50,"AacuteUgrave":-50,"AacuteUhungarumlaut":-50,"AacuteUmacron":-50,"AacuteUogonek":-50,"AacuteUring":-50,"AacuteV":-70,"AacuteW":-50,"AacuteY":-100,"AacuteYacute":-100,"AacuteYdieresis":-100,"Aacuteu":-30,"Aacuteuacute":-30,"Aacuteucircumflex":-30,"Aacuteudieresis":-30,"Aacuteugrave":-30,"Aacuteuhungarumlaut":-30,"Aacuteumacron":-30,"Aacuteuogonek":-30,"Aacuteuring":-30,"Aacutev":-40,"Aacutew":-40,"Aacutey":-40,"Aacuteyacute":-40,"Aacuteydieresis":-40,"AbreveC":-30,"AbreveCacute":-30,"AbreveCcaron":-30,"AbreveCcedilla":-30,"AbreveG":-30,"AbreveGbreve":-30,"AbreveGcommaaccent":-30,"AbreveO":-30,"AbreveOacute":-30,"AbreveOcircumflex":-30,"AbreveOdieresis":-30,"AbreveOgrave":-30,"AbreveOhungarumlaut":-30,"AbreveOmacron":-30,"AbreveOslash":-30,"AbreveOtilde":-30,"AbreveQ":-30,"AbreveT":-120,"AbreveTcaron":-120,"AbreveTcommaaccent":-120,"AbreveU":-50,"AbreveUacute":-50,"AbreveUcircumflex":-50,"AbreveUdieresis":-50,"AbreveUgrave":-50,"AbreveUhungarumlaut":-50,"AbreveUmacron":-50,"AbreveUogonek":-50,"AbreveUring":-50,"AbreveV":-70,"AbreveW":-50,"AbreveY":-100,"AbreveYacute":-100,"AbreveYdieresis":-100,"Abreveu":-30,"Abreveuacute":-30,"Abreveucircumflex":-30,"Abreveudieresis":-30,"Abreveugrave":-30,"Abreveuhungarumlaut":-30,"Abreveumacron":-30,"Abreveuogonek":-30,"Abreveuring":-30,"Abrevev":-40,"Abrevew":-40,"Abrevey":-40,"Abreveyacute":-40,"Abreveydieresis":-40,"AcircumflexC":-30,"AcircumflexCacute":-30,"AcircumflexCcaron":-30,"AcircumflexCcedilla":-30,"AcircumflexG":-30,"AcircumflexGbreve":-30,"AcircumflexGcommaaccent":-30,"AcircumflexO":-30,"AcircumflexOacute":-30,"AcircumflexOcircumflex":-30,"AcircumflexOdieresis":-30,"AcircumflexOgrave":-30,"AcircumflexOhungarumlaut":-30,"AcircumflexOmacron":-30,"AcircumflexOslash":-30,"AcircumflexOtilde":-30,"AcircumflexQ":-30,"AcircumflexT":-120,"AcircumflexTcaron":-120,"AcircumflexTcommaaccent":-120,"AcircumflexU":-50,"AcircumflexUacute":-50,"AcircumflexUcircumflex":-50,"AcircumflexUdieresis":-50,"AcircumflexUgrave":-50,"AcircumflexUhungarumlaut":-50,"AcircumflexUmacron":-50,"AcircumflexUogonek":-50,"AcircumflexUring":-50,"AcircumflexV":-70,"AcircumflexW":-50,"AcircumflexY":-100,"AcircumflexYacute":-100,"AcircumflexYdieresis":-100,"Acircumflexu":-30,"Acircumflexuacute":-30,"Acircumflexucircumflex":-30,"Acircumflexudieresis":-30,"Acircumflexugrave":-30,"Acircumflexuhungarumlaut":-30,"Acircumflexumacron":-30,"Acircumflexuogonek":-30,"Acircumflexuring":-30,"Acircumflexv":-40,"Acircumflexw":-40,"Acircumflexy":-40,"Acircumflexyacute":-40,"Acircumflexydieresis":-40,"AdieresisC":-30,"AdieresisCacute":-30,"AdieresisCcaron":-30,"AdieresisCcedilla":-30,"AdieresisG":-30,"AdieresisGbreve":-30,"AdieresisGcommaaccent":-30,"AdieresisO":-30,"AdieresisOacute":-30,"AdieresisOcircumflex":-30,"AdieresisOdieresis":-30,"AdieresisOgrave":-30,"AdieresisOhungarumlaut":-30,"AdieresisOmacron":-30,"AdieresisOslash":-30,"AdieresisOtilde":-30,"AdieresisQ":-30,"AdieresisT":-120,"AdieresisTcaron":-120,"AdieresisTcommaaccent":-120,"AdieresisU":-50,"AdieresisUacute":-50,"AdieresisUcircumflex":-50,"AdieresisUdieresis":-50,"AdieresisUgrave":-50,"AdieresisUhungarumlaut":-50,"AdieresisUmacron":-50,"AdieresisUogonek":-50,"AdieresisUring":-50,"AdieresisV":-70,"AdieresisW":-50,"AdieresisY":-100,"AdieresisYacute":-100,"AdieresisYdieresis":-100,"Adieresisu":-30,"Adieresisuacute":-30,"Adieresisucircumflex":-30,"Adieresisudieresis":-30,"Adieresisugrave":-30,"Adieresisuhungarumlaut":-30,"Adieresisumacron":-30,"Adieresisuogonek":-30,"Adieresisuring":-30,"Adieresisv":-40,"Adieresisw":-40,"Adieresisy":-40,"Adieresisyacute":-40,"Adieresisydieresis":-40,"AgraveC":-30,"AgraveCacute":-30,"AgraveCcaron":-30,"AgraveCcedilla":-30,"AgraveG":-30,"AgraveGbreve":-30,"AgraveGcommaaccent":-30,"AgraveO":-30,"AgraveOacute":-30,"AgraveOcircumflex":-30,"AgraveOdieresis":-30,"AgraveOgrave":-30,"AgraveOhungarumlaut":-30,"AgraveOmacron":-30,"AgraveOslash":-30,"AgraveOtilde":-30,"AgraveQ":-30,"AgraveT":-120,"AgraveTcaron":-120,"AgraveTcommaaccent":-120,"AgraveU":-50,"AgraveUacute":-50,"AgraveUcircumflex":-50,"AgraveUdieresis":-50,"AgraveUgrave":-50,"AgraveUhungarumlaut":-50,"AgraveUmacron":-50,"AgraveUogonek":-50,"AgraveUring":-50,"AgraveV":-70,"AgraveW":-50,"AgraveY":-100,"AgraveYacute":-100,"AgraveYdieresis":-100,"Agraveu":-30,"Agraveuacute":-30,"Agraveucircumflex":-30,"Agraveudieresis":-30,"Agraveugrave":-30,"Agraveuhungarumlaut":-30,"Agraveumacron":-30,"Agraveuogonek":-30,"Agraveuring":-30,"Agravev":-40,"Agravew":-40,"Agravey":-40,"Agraveyacute":-40,"Agraveydieresis":-40,"AmacronC":-30,"AmacronCacute":-30,"AmacronCcaron":-30,"AmacronCcedilla":-30,"AmacronG":-30,"AmacronGbreve":-30,"AmacronGcommaaccent":-30,"AmacronO":-30,"AmacronOacute":-30,"AmacronOcircumflex":-30,"AmacronOdieresis":-30,"AmacronOgrave":-30,"AmacronOhungarumlaut":-30,"AmacronOmacron":-30,"AmacronOslash":-30,"AmacronOtilde":-30,"AmacronQ":-30,"AmacronT":-120,"AmacronTcaron":-120,"AmacronTcommaaccent":-120,"AmacronU":-50,"AmacronUacute":-50,"AmacronUcircumflex":-50,"AmacronUdieresis":-50,"AmacronUgrave":-50,"AmacronUhungarumlaut":-50,"AmacronUmacron":-50,"AmacronUogonek":-50,"AmacronUring":-50,"AmacronV":-70,"AmacronW":-50,"AmacronY":-100,"AmacronYacute":-100,"AmacronYdieresis":-100,"Amacronu":-30,"Amacronuacute":-30,"Amacronucircumflex":-30,"Amacronudieresis":-30,"Amacronugrave":-30,"Amacronuhungarumlaut":-30,"Amacronumacron":-30,"Amacronuogonek":-30,"Amacronuring":-30,"Amacronv":-40,"Amacronw":-40,"Amacrony":-40,"Amacronyacute":-40,"Amacronydieresis":-40,"AogonekC":-30,"AogonekCacute":-30,"AogonekCcaron":-30,"AogonekCcedilla":-30,"AogonekG":-30,"AogonekGbreve":-30,"AogonekGcommaaccent":-30,"AogonekO":-30,"AogonekOacute":-30,"AogonekOcircumflex":-30,"AogonekOdieresis":-30,"AogonekOgrave":-30,"AogonekOhungarumlaut":-30,"AogonekOmacron":-30,"AogonekOslash":-30,"AogonekOtilde":-30,"AogonekQ":-30,"AogonekT":-120,"AogonekTcaron":-120,"AogonekTcommaaccent":-120,"AogonekU":-50,"AogonekUacute":-50,"AogonekUcircumflex":-50,"AogonekUdieresis":-50,"AogonekUgrave":-50,"AogonekUhungarumlaut":-50,"AogonekUmacron":-50,"AogonekUogonek":-50,"AogonekUring":-50,"AogonekV":-70,"AogonekW":-50,"AogonekY":-100,"AogonekYacute":-100,"AogonekYdieresis":-100,"Aogoneku":-30,"Aogonekuacute":-30,"Aogonekucircumflex":-30,"Aogonekudieresis":-30,"Aogonekugrave":-30,"Aogonekuhungarumlaut":-30,"Aogonekumacron":-30,"Aogonekuogonek":-30,"Aogonekuring":-30,"Aogonekv":-40,"Aogonekw":-40,"Aogoneky":-40,"Aogonekyacute":-40,"Aogonekydieresis":-40,"AringC":-30,"AringCacute":-30,"AringCcaron":-30,"AringCcedilla":-30,"AringG":-30,"AringGbreve":-30,"AringGcommaaccent":-30,"AringO":-30,"AringOacute":-30,"AringOcircumflex":-30,"AringOdieresis":-30,"AringOgrave":-30,"AringOhungarumlaut":-30,"AringOmacron":-30,"AringOslash":-30,"AringOtilde":-30,"AringQ":-30,"AringT":-120,"AringTcaron":-120,"AringTcommaaccent":-120,"AringU":-50,"AringUacute":-50,"AringUcircumflex":-50,"AringUdieresis":-50,"AringUgrave":-50,"AringUhungarumlaut":-50,"AringUmacron":-50,"AringUogonek":-50,"AringUring":-50,"AringV":-70,"AringW":-50,"AringY":-100,"AringYacute":-100,"AringYdieresis":-100,"Aringu":-30,"Aringuacute":-30,"Aringucircumflex":-30,"Aringudieresis":-30,"Aringugrave":-30,"Aringuhungarumlaut":-30,"Aringumacron":-30,"Aringuogonek":-30,"Aringuring":-30,"Aringv":-40,"Aringw":-40,"Aringy":-40,"Aringyacute":-40,"Aringydieresis":-40,"AtildeC":-30,"AtildeCacute":-30,"AtildeCcaron":-30,"AtildeCcedilla":-30,"AtildeG":-30,"AtildeGbreve":-30,"AtildeGcommaaccent":-30,"AtildeO":-30,"AtildeOacute":-30,"AtildeOcircumflex":-30,"AtildeOdieresis":-30,"AtildeOgrave":-30,"AtildeOhungarumlaut":-30,"AtildeOmacron":-30,"AtildeOslash":-30,"AtildeOtilde":-30,"AtildeQ":-30,"AtildeT":-120,"AtildeTcaron":-120,"AtildeTcommaaccent":-120,"AtildeU":-50,"AtildeUacute":-50,"AtildeUcircumflex":-50,"AtildeUdieresis":-50,"AtildeUgrave":-50,"AtildeUhungarumlaut":-50,"AtildeUmacron":-50,"AtildeUogonek":-50,"AtildeUring":-50,"AtildeV":-70,"AtildeW":-50,"AtildeY":-100,"AtildeYacute":-100,"AtildeYdieresis":-100,"Atildeu":-30,"Atildeuacute":-30,"Atildeucircumflex":-30,"Atildeudieresis":-30,"Atildeugrave":-30,"Atildeuhungarumlaut":-30,"Atildeumacron":-30,"Atildeuogonek":-30,"Atildeuring":-30,"Atildev":-40,"Atildew":-40,"Atildey":-40,"Atildeyacute":-40,"Atildeydieresis":-40,"BU":-10,"BUacute":-10,"BUcircumflex":-10,"BUdieresis":-10,"BUgrave":-10,"BUhungarumlaut":-10,"BUmacron":-10,"BUogonek":-10,"BUring":-10,"Bcomma":-20,"Bperiod":-20,"Ccomma":-30,"Cperiod":-30,"Cacutecomma":-30,"Cacuteperiod":-30,"Ccaroncomma":-30,"Ccaronperiod":-30,"Ccedillacomma":-30,"Ccedillaperiod":-30,"DA":-40,"DAacute":-40,"DAbreve":-40,"DAcircumflex":-40,"DAdieresis":-40,"DAgrave":-40,"DAmacron":-40,"DAogonek":-40,"DAring":-40,"DAtilde":-40,"DV":-70,"DW":-40,"DY":-90,"DYacute":-90,"DYdieresis":-90,"Dcomma":-70,"Dperiod":-70,"DcaronA":-40,"DcaronAacute":-40,"DcaronAbreve":-40,"DcaronAcircumflex":-40,"DcaronAdieresis":-40,"DcaronAgrave":-40,"DcaronAmacron":-40,"DcaronAogonek":-40,"DcaronAring":-40,"DcaronAtilde":-40,"DcaronV":-70,"DcaronW":-40,"DcaronY":-90,"DcaronYacute":-90,"DcaronYdieresis":-90,"Dcaroncomma":-70,"Dcaronperiod":-70,"DcroatA":-40,"DcroatAacute":-40,"DcroatAbreve":-40,"DcroatAcircumflex":-40,"DcroatAdieresis":-40,"DcroatAgrave":-40,"DcroatAmacron":-40,"DcroatAogonek":-40,"DcroatAring":-40,"DcroatAtilde":-40,"DcroatV":-70,"DcroatW":-40,"DcroatY":-90,"DcroatYacute":-90,"DcroatYdieresis":-90,"Dcroatcomma":-70,"Dcroatperiod":-70,"FA":-80,"FAacute":-80,"FAbreve":-80,"FAcircumflex":-80,"FAdieresis":-80,"FAgrave":-80,"FAmacron":-80,"FAogonek":-80,"FAring":-80,"FAtilde":-80,"Fa":-50,"Faacute":-50,"Fabreve":-50,"Facircumflex":-50,"Fadieresis":-50,"Fagrave":-50,"Famacron":-50,"Faogonek":-50,"Faring":-50,"Fatilde":-50,"Fcomma":-150,"Fe":-30,"Feacute":-30,"Fecaron":-30,"Fecircumflex":-30,"Fedieresis":-30,"Fedotaccent":-30,"Fegrave":-30,"Femacron":-30,"Feogonek":-30,"Fo":-30,"Foacute":-30,"Focircumflex":-30,"Fodieresis":-30,"Fograve":-30,"Fohungarumlaut":-30,"Fomacron":-30,"Foslash":-30,"Fotilde":-30,"Fperiod":-150,"Fr":-45,"Fracute":-45,"Frcaron":-45,"Frcommaaccent":-45,"JA":-20,"JAacute":-20,"JAbreve":-20,"JAcircumflex":-20,"JAdieresis":-20,"JAgrave":-20,"JAmacron":-20,"JAogonek":-20,"JAring":-20,"JAtilde":-20,"Ja":-20,"Jaacute":-20,"Jabreve":-20,"Jacircumflex":-20,"Jadieresis":-20,"Jagrave":-20,"Jamacron":-20,"Jaogonek":-20,"Jaring":-20,"Jatilde":-20,"Jcomma":-30,"Jperiod":-30,"Ju":-20,"Juacute":-20,"Jucircumflex":-20,"Judieresis":-20,"Jugrave":-20,"Juhungarumlaut":-20,"Jumacron":-20,"Juogonek":-20,"Juring":-20,"KO":-50,"KOacute":-50,"KOcircumflex":-50,"KOdieresis":-50,"KOgrave":-50,"KOhungarumlaut":-50,"KOmacron":-50,"KOslash":-50,"KOtilde":-50,"Ke":-40,"Keacute":-40,"Kecaron":-40,"Kecircumflex":-40,"Kedieresis":-40,"Kedotaccent":-40,"Kegrave":-40,"Kemacron":-40,"Keogonek":-40,"Ko":-40,"Koacute":-40,"Kocircumflex":-40,"Kodieresis":-40,"Kograve":-40,"Kohungarumlaut":-40,"Komacron":-40,"Koslash":-40,"Kotilde":-40,"Ku":-30,"Kuacute":-30,"Kucircumflex":-30,"Kudieresis":-30,"Kugrave":-30,"Kuhungarumlaut":-30,"Kumacron":-30,"Kuogonek":-30,"Kuring":-30,"Ky":-50,"Kyacute":-50,"Kydieresis":-50,"KcommaaccentO":-50,"KcommaaccentOacute":-50,"KcommaaccentOcircumflex":-50,"KcommaaccentOdieresis":-50,"KcommaaccentOgrave":-50,"KcommaaccentOhungarumlaut":-50,"KcommaaccentOmacron":-50,"KcommaaccentOslash":-50,"KcommaaccentOtilde":-50,"Kcommaaccente":-40,"Kcommaaccenteacute":-40,"Kcommaaccentecaron":-40,"Kcommaaccentecircumflex":-40,"Kcommaaccentedieresis":-40,"Kcommaaccentedotaccent":-40,"Kcommaaccentegrave":-40,"Kcommaaccentemacron":-40,"Kcommaaccenteogonek":-40,"Kcommaaccento":-40,"Kcommaaccentoacute":-40,"Kcommaaccentocircumflex":-40,"Kcommaaccentodieresis":-40,"Kcommaaccentograve":-40,"Kcommaaccentohungarumlaut":-40,"Kcommaaccentomacron":-40,"Kcommaaccentoslash":-40,"Kcommaaccentotilde":-40,"Kcommaaccentu":-30,"Kcommaaccentuacute":-30,"Kcommaaccentucircumflex":-30,"Kcommaaccentudieresis":-30,"Kcommaaccentugrave":-30,"Kcommaaccentuhungarumlaut":-30,"Kcommaaccentumacron":-30,"Kcommaaccentuogonek":-30,"Kcommaaccenturing":-30,"Kcommaaccenty":-50,"Kcommaaccentyacute":-50,"Kcommaaccentydieresis":-50,"LT":-110,"LTcaron":-110,"LTcommaaccent":-110,"LV":-110,"LW":-70,"LY":-140,"LYacute":-140,"LYdieresis":-140,"Lquotedblright":-140,"Lquoteright":-160,"Ly":-30,"Lyacute":-30,"Lydieresis":-30,"LacuteT":-110,"LacuteTcaron":-110,"LacuteTcommaaccent":-110,"LacuteV":-110,"LacuteW":-70,"LacuteY":-140,"LacuteYacute":-140,"LacuteYdieresis":-140,"Lacutequotedblright":-140,"Lacutequoteright":-160,"Lacutey":-30,"Lacuteyacute":-30,"Lacuteydieresis":-30,"LcaronT":-110,"LcaronTcaron":-110,"LcaronTcommaaccent":-110,"LcaronV":-110,"LcaronW":-70,"LcaronY":-140,"LcaronYacute":-140,"LcaronYdieresis":-140,"Lcaronquotedblright":-140,"Lcaronquoteright":-160,"Lcarony":-30,"Lcaronyacute":-30,"Lcaronydieresis":-30,"LcommaaccentT":-110,"LcommaaccentTcaron":-110,"LcommaaccentTcommaaccent":-110,"LcommaaccentV":-110,"LcommaaccentW":-70,"LcommaaccentY":-140,"LcommaaccentYacute":-140,"LcommaaccentYdieresis":-140,"Lcommaaccentquotedblright":-140,"Lcommaaccentquoteright":-160,"Lcommaaccenty":-30,"Lcommaaccentyacute":-30,"Lcommaaccentydieresis":-30,"LslashT":-110,"LslashTcaron":-110,"LslashTcommaaccent":-110,"LslashV":-110,"LslashW":-70,"LslashY":-140,"LslashYacute":-140,"LslashYdieresis":-140,"Lslashquotedblright":-140,"Lslashquoteright":-160,"Lslashy":-30,"Lslashyacute":-30,"Lslashydieresis":-30,"OA":-20,"OAacute":-20,"OAbreve":-20,"OAcircumflex":-20,"OAdieresis":-20,"OAgrave":-20,"OAmacron":-20,"OAogonek":-20,"OAring":-20,"OAtilde":-20,"OT":-40,"OTcaron":-40,"OTcommaaccent":-40,"OV":-50,"OW":-30,"OX":-60,"OY":-70,"OYacute":-70,"OYdieresis":-70,"Ocomma":-40,"Operiod":-40,"OacuteA":-20,"OacuteAacute":-20,"OacuteAbreve":-20,"OacuteAcircumflex":-20,"OacuteAdieresis":-20,"OacuteAgrave":-20,"OacuteAmacron":-20,"OacuteAogonek":-20,"OacuteAring":-20,"OacuteAtilde":-20,"OacuteT":-40,"OacuteTcaron":-40,"OacuteTcommaaccent":-40,"OacuteV":-50,"OacuteW":-30,"OacuteX":-60,"OacuteY":-70,"OacuteYacute":-70,"OacuteYdieresis":-70,"Oacutecomma":-40,"Oacuteperiod":-40,"OcircumflexA":-20,"OcircumflexAacute":-20,"OcircumflexAbreve":-20,"OcircumflexAcircumflex":-20,"OcircumflexAdieresis":-20,"OcircumflexAgrave":-20,"OcircumflexAmacron":-20,"OcircumflexAogonek":-20,"OcircumflexAring":-20,"OcircumflexAtilde":-20,"OcircumflexT":-40,"OcircumflexTcaron":-40,"OcircumflexTcommaaccent":-40,"OcircumflexV":-50,"OcircumflexW":-30,"OcircumflexX":-60,"OcircumflexY":-70,"OcircumflexYacute":-70,"OcircumflexYdieresis":-70,"Ocircumflexcomma":-40,"Ocircumflexperiod":-40,"OdieresisA":-20,"OdieresisAacute":-20,"OdieresisAbreve":-20,"OdieresisAcircumflex":-20,"OdieresisAdieresis":-20,"OdieresisAgrave":-20,"OdieresisAmacron":-20,"OdieresisAogonek":-20,"OdieresisAring":-20,"OdieresisAtilde":-20,"OdieresisT":-40,"OdieresisTcaron":-40,"OdieresisTcommaaccent":-40,"OdieresisV":-50,"OdieresisW":-30,"OdieresisX":-60,"OdieresisY":-70,"OdieresisYacute":-70,"OdieresisYdieresis":-70,"Odieresiscomma":-40,"Odieresisperiod":-40,"OgraveA":-20,"OgraveAacute":-20,"OgraveAbreve":-20,"OgraveAcircumflex":-20,"OgraveAdieresis":-20,"OgraveAgrave":-20,"OgraveAmacron":-20,"OgraveAogonek":-20,"OgraveAring":-20,"OgraveAtilde":-20,"OgraveT":-40,"OgraveTcaron":-40,"OgraveTcommaaccent":-40,"OgraveV":-50,"OgraveW":-30,"OgraveX":-60,"OgraveY":-70,"OgraveYacute":-70,"OgraveYdieresis":-70,"Ogravecomma":-40,"Ograveperiod":-40,"OhungarumlautA":-20,"OhungarumlautAacute":-20,"OhungarumlautAbreve":-20,"OhungarumlautAcircumflex":-20,"OhungarumlautAdieresis":-20,"OhungarumlautAgrave":-20,"OhungarumlautAmacron":-20,"OhungarumlautAogonek":-20,"OhungarumlautAring":-20,"OhungarumlautAtilde":-20,"OhungarumlautT":-40,"OhungarumlautTcaron":-40,"OhungarumlautTcommaaccent":-40,"OhungarumlautV":-50,"OhungarumlautW":-30,"OhungarumlautX":-60,"OhungarumlautY":-70,"OhungarumlautYacute":-70,"OhungarumlautYdieresis":-70,"Ohungarumlautcomma":-40,"Ohungarumlautperiod":-40,"OmacronA":-20,"OmacronAacute":-20,"OmacronAbreve":-20,"OmacronAcircumflex":-20,"OmacronAdieresis":-20,"OmacronAgrave":-20,"OmacronAmacron":-20,"OmacronAogonek":-20,"OmacronAring":-20,"OmacronAtilde":-20,"OmacronT":-40,"OmacronTcaron":-40,"OmacronTcommaaccent":-40,"OmacronV":-50,"OmacronW":-30,"OmacronX":-60,"OmacronY":-70,"OmacronYacute":-70,"OmacronYdieresis":-70,"Omacroncomma":-40,"Omacronperiod":-40,"OslashA":-20,"OslashAacute":-20,"OslashAbreve":-20,"OslashAcircumflex":-20,"OslashAdieresis":-20,"OslashAgrave":-20,"OslashAmacron":-20,"OslashAogonek":-20,"OslashAring":-20,"OslashAtilde":-20,"OslashT":-40,"OslashTcaron":-40,"OslashTcommaaccent":-40,"OslashV":-50,"OslashW":-30,"OslashX":-60,"OslashY":-70,"OslashYacute":-70,"OslashYdieresis":-70,"Oslashcomma":-40,"Oslashperiod":-40,"OtildeA":-20,"OtildeAacute":-20,"OtildeAbreve":-20,"OtildeAcircumflex":-20,"OtildeAdieresis":-20,"OtildeAgrave":-20,"OtildeAmacron":-20,"OtildeAogonek":-20,"OtildeAring":-20,"OtildeAtilde":-20,"OtildeT":-40,"OtildeTcaron":-40,"OtildeTcommaaccent":-40,"OtildeV":-50,"OtildeW":-30,"OtildeX":-60,"OtildeY":-70,"OtildeYacute":-70,"OtildeYdieresis":-70,"Otildecomma":-40,"Otildeperiod":-40,"PA":-120,"PAacute":-120,"PAbreve":-120,"PAcircumflex":-120,"PAdieresis":-120,"PAgrave":-120,"PAmacron":-120,"PAogonek":-120,"PAring":-120,"PAtilde":-120,"Pa":-40,"Paacute":-40,"Pabreve":-40,"Pacircumflex":-40,"Padieresis":-40,"Pagrave":-40,"Pamacron":-40,"Paogonek":-40,"Paring":-40,"Patilde":-40,"Pcomma":-180,"Pe":-50,"Peacute":-50,"Pecaron":-50,"Pecircumflex":-50,"Pedieresis":-50,"Pedotaccent":-50,"Pegrave":-50,"Pemacron":-50,"Peogonek":-50,"Po":-50,"Poacute":-50,"Pocircumflex":-50,"Podieresis":-50,"Pograve":-50,"Pohungarumlaut":-50,"Pomacron":-50,"Poslash":-50,"Potilde":-50,"Pperiod":-180,"QU":-10,"QUacute":-10,"QUcircumflex":-10,"QUdieresis":-10,"QUgrave":-10,"QUhungarumlaut":-10,"QUmacron":-10,"QUogonek":-10,"QUring":-10,"RO":-20,"ROacute":-20,"ROcircumflex":-20,"ROdieresis":-20,"ROgrave":-20,"ROhungarumlaut":-20,"ROmacron":-20,"ROslash":-20,"ROtilde":-20,"RT":-30,"RTcaron":-30,"RTcommaaccent":-30,"RU":-40,"RUacute":-40,"RUcircumflex":-40,"RUdieresis":-40,"RUgrave":-40,"RUhungarumlaut":-40,"RUmacron":-40,"RUogonek":-40,"RUring":-40,"RV":-50,"RW":-30,"RY":-50,"RYacute":-50,"RYdieresis":-50,"RacuteO":-20,"RacuteOacute":-20,"RacuteOcircumflex":-20,"RacuteOdieresis":-20,"RacuteOgrave":-20,"RacuteOhungarumlaut":-20,"RacuteOmacron":-20,"RacuteOslash":-20,"RacuteOtilde":-20,"RacuteT":-30,"RacuteTcaron":-30,"RacuteTcommaaccent":-30,"RacuteU":-40,"RacuteUacute":-40,"RacuteUcircumflex":-40,"RacuteUdieresis":-40,"RacuteUgrave":-40,"RacuteUhungarumlaut":-40,"RacuteUmacron":-40,"RacuteUogonek":-40,"RacuteUring":-40,"RacuteV":-50,"RacuteW":-30,"RacuteY":-50,"RacuteYacute":-50,"RacuteYdieresis":-50,"RcaronO":-20,"RcaronOacute":-20,"RcaronOcircumflex":-20,"RcaronOdieresis":-20,"RcaronOgrave":-20,"RcaronOhungarumlaut":-20,"RcaronOmacron":-20,"RcaronOslash":-20,"RcaronOtilde":-20,"RcaronT":-30,"RcaronTcaron":-30,"RcaronTcommaaccent":-30,"RcaronU":-40,"RcaronUacute":-40,"RcaronUcircumflex":-40,"RcaronUdieresis":-40,"RcaronUgrave":-40,"RcaronUhungarumlaut":-40,"RcaronUmacron":-40,"RcaronUogonek":-40,"RcaronUring":-40,"RcaronV":-50,"RcaronW":-30,"RcaronY":-50,"RcaronYacute":-50,"RcaronYdieresis":-50,"RcommaaccentO":-20,"RcommaaccentOacute":-20,"RcommaaccentOcircumflex":-20,"RcommaaccentOdieresis":-20,"RcommaaccentOgrave":-20,"RcommaaccentOhungarumlaut":-20,"RcommaaccentOmacron":-20,"RcommaaccentOslash":-20,"RcommaaccentOtilde":-20,"RcommaaccentT":-30,"RcommaaccentTcaron":-30,"RcommaaccentTcommaaccent":-30,"RcommaaccentU":-40,"RcommaaccentUacute":-40,"RcommaaccentUcircumflex":-40,"RcommaaccentUdieresis":-40,"RcommaaccentUgrave":-40,"RcommaaccentUhungarumlaut":-40,"RcommaaccentUmacron":-40,"RcommaaccentUogonek":-40,"RcommaaccentUring":-40,"RcommaaccentV":-50,"RcommaaccentW":-30,"RcommaaccentY":-50,"RcommaaccentYacute":-50,"RcommaaccentYdieresis":-50,"Scomma":-20,"Speriod":-20,"Sacutecomma":-20,"Sacuteperiod":-20,"Scaroncomma":-20,"Scaronperiod":-20,"Scedillacomma":-20,"Scedillaperiod":-20,"Scommaaccentcomma":-20,"Scommaaccentperiod":-20,"TA":-120,"TAacute":-120,"TAbreve":-120,"TAcircumflex":-120,"TAdieresis":-120,"TAgrave":-120,"TAmacron":-120,"TAogonek":-120,"TAring":-120,"TAtilde":-120,"TO":-40,"TOacute":-40,"TOcircumflex":-40,"TOdieresis":-40,"TOgrave":-40,"TOhungarumlaut":-40,"TOmacron":-40,"TOslash":-40,"TOtilde":-40,"Ta":-120,"Taacute":-120,"Tabreve":-60,"Tacircumflex":-120,"Tadieresis":-120,"Tagrave":-120,"Tamacron":-60,"Taogonek":-120,"Taring":-120,"Tatilde":-60,"Tcolon":-20,"Tcomma":-120,"Te":-120,"Teacute":-120,"Tecaron":-120,"Tecircumflex":-120,"Tedieresis":-120,"Tedotaccent":-120,"Tegrave":-60,"Temacron":-60,"Teogonek":-120,"Thyphen":-140,"To":-120,"Toacute":-120,"Tocircumflex":-120,"Todieresis":-120,"Tograve":-120,"Tohungarumlaut":-120,"Tomacron":-60,"Toslash":-120,"Totilde":-60,"Tperiod":-120,"Tr":-120,"Tracute":-120,"Trcaron":-120,"Trcommaaccent":-120,"Tsemicolon":-20,"Tu":-120,"Tuacute":-120,"Tucircumflex":-120,"Tudieresis":-120,"Tugrave":-120,"Tuhungarumlaut":-120,"Tumacron":-60,"Tuogonek":-120,"Turing":-120,"Tw":-120,"Ty":-120,"Tyacute":-120,"Tydieresis":-60,"TcaronA":-120,"TcaronAacute":-120,"TcaronAbreve":-120,"TcaronAcircumflex":-120,"TcaronAdieresis":-120,"TcaronAgrave":-120,"TcaronAmacron":-120,"TcaronAogonek":-120,"TcaronAring":-120,"TcaronAtilde":-120,"TcaronO":-40,"TcaronOacute":-40,"TcaronOcircumflex":-40,"TcaronOdieresis":-40,"TcaronOgrave":-40,"TcaronOhungarumlaut":-40,"TcaronOmacron":-40,"TcaronOslash":-40,"TcaronOtilde":-40,"Tcarona":-120,"Tcaronaacute":-120,"Tcaronabreve":-60,"Tcaronacircumflex":-120,"Tcaronadieresis":-120,"Tcaronagrave":-120,"Tcaronamacron":-60,"Tcaronaogonek":-120,"Tcaronaring":-120,"Tcaronatilde":-60,"Tcaroncolon":-20,"Tcaroncomma":-120,"Tcarone":-120,"Tcaroneacute":-120,"Tcaronecaron":-120,"Tcaronecircumflex":-120,"Tcaronedieresis":-120,"Tcaronedotaccent":-120,"Tcaronegrave":-60,"Tcaronemacron":-60,"Tcaroneogonek":-120,"Tcaronhyphen":-140,"Tcarono":-120,"Tcaronoacute":-120,"Tcaronocircumflex":-120,"Tcaronodieresis":-120,"Tcaronograve":-120,"Tcaronohungarumlaut":-120,"Tcaronomacron":-60,"Tcaronoslash":-120,"Tcaronotilde":-60,"Tcaronperiod":-120,"Tcaronr":-120,"Tcaronracute":-120,"Tcaronrcaron":-120,"Tcaronrcommaaccent":-120,"Tcaronsemicolon":-20,"Tcaronu":-120,"Tcaronuacute":-120,"Tcaronucircumflex":-120,"Tcaronudieresis":-120,"Tcaronugrave":-120,"Tcaronuhungarumlaut":-120,"Tcaronumacron":-60,"Tcaronuogonek":-120,"Tcaronuring":-120,"Tcaronw":-120,"Tcarony":-120,"Tcaronyacute":-120,"Tcaronydieresis":-60,"TcommaaccentA":-120,"TcommaaccentAacute":-120,"TcommaaccentAbreve":-120,"TcommaaccentAcircumflex":-120,"TcommaaccentAdieresis":-120,"TcommaaccentAgrave":-120,"TcommaaccentAmacron":-120,"TcommaaccentAogonek":-120,"TcommaaccentAring":-120,"TcommaaccentAtilde":-120,"TcommaaccentO":-40,"TcommaaccentOacute":-40,"TcommaaccentOcircumflex":-40,"TcommaaccentOdieresis":-40,"TcommaaccentOgrave":-40,"TcommaaccentOhungarumlaut":-40,"TcommaaccentOmacron":-40,"TcommaaccentOslash":-40,"TcommaaccentOtilde":-40,"Tcommaaccenta":-120,"Tcommaaccentaacute":-120,"Tcommaaccentabreve":-60,"Tcommaaccentacircumflex":-120,"Tcommaaccentadieresis":-120,"Tcommaaccentagrave":-120,"Tcommaaccentamacron":-60,"Tcommaaccentaogonek":-120,"Tcommaaccentaring":-120,"Tcommaaccentatilde":-60,"Tcommaaccentcolon":-20,"Tcommaaccentcomma":-120,"Tcommaaccente":-120,"Tcommaaccenteacute":-120,"Tcommaaccentecaron":-120,"Tcommaaccentecircumflex":-120,"Tcommaaccentedieresis":-120,"Tcommaaccentedotaccent":-120,"Tcommaaccentegrave":-60,"Tcommaaccentemacron":-60,"Tcommaaccenteogonek":-120,"Tcommaaccenthyphen":-140,"Tcommaaccento":-120,"Tcommaaccentoacute":-120,"Tcommaaccentocircumflex":-120,"Tcommaaccentodieresis":-120,"Tcommaaccentograve":-120,"Tcommaaccentohungarumlaut":-120,"Tcommaaccentomacron":-60,"Tcommaaccentoslash":-120,"Tcommaaccentotilde":-60,"Tcommaaccentperiod":-120,"Tcommaaccentr":-120,"Tcommaaccentracute":-120,"Tcommaaccentrcaron":-120,"Tcommaaccentrcommaaccent":-120,"Tcommaaccentsemicolon":-20,"Tcommaaccentu":-120,"Tcommaaccentuacute":-120,"Tcommaaccentucircumflex":-120,"Tcommaaccentudieresis":-120,"Tcommaaccentugrave":-120,"Tcommaaccentuhungarumlaut":-120,"Tcommaaccentumacron":-60,"Tcommaaccentuogonek":-120,"Tcommaaccenturing":-120,"Tcommaaccentw":-120,"Tcommaaccenty":-120,"Tcommaaccentyacute":-120,"Tcommaaccentydieresis":-60,"UA":-40,"UAacute":-40,"UAbreve":-40,"UAcircumflex":-40,"UAdieresis":-40,"UAgrave":-40,"UAmacron":-40,"UAogonek":-40,"UAring":-40,"UAtilde":-40,"Ucomma":-40,"Uperiod":-40,"UacuteA":-40,"UacuteAacute":-40,"UacuteAbreve":-40,"UacuteAcircumflex":-40,"UacuteAdieresis":-40,"UacuteAgrave":-40,"UacuteAmacron":-40,"UacuteAogonek":-40,"UacuteAring":-40,"UacuteAtilde":-40,"Uacutecomma":-40,"Uacuteperiod":-40,"UcircumflexA":-40,"UcircumflexAacute":-40,"UcircumflexAbreve":-40,"UcircumflexAcircumflex":-40,"UcircumflexAdieresis":-40,"UcircumflexAgrave":-40,"UcircumflexAmacron":-40,"UcircumflexAogonek":-40,"UcircumflexAring":-40,"UcircumflexAtilde":-40,"Ucircumflexcomma":-40,"Ucircumflexperiod":-40,"UdieresisA":-40,"UdieresisAacute":-40,"UdieresisAbreve":-40,"UdieresisAcircumflex":-40,"UdieresisAdieresis":-40,"UdieresisAgrave":-40,"UdieresisAmacron":-40,"UdieresisAogonek":-40,"UdieresisAring":-40,"UdieresisAtilde":-40,"Udieresiscomma":-40,"Udieresisperiod":-40,"UgraveA":-40,"UgraveAacute":-40,"UgraveAbreve":-40,"UgraveAcircumflex":-40,"UgraveAdieresis":-40,"UgraveAgrave":-40,"UgraveAmacron":-40,"UgraveAogonek":-40,"UgraveAring":-40,"UgraveAtilde":-40,"Ugravecomma":-40,"Ugraveperiod":-40,"UhungarumlautA":-40,"UhungarumlautAacute":-40,"UhungarumlautAbreve":-40,"UhungarumlautAcircumflex":-40,"UhungarumlautAdieresis":-40,"UhungarumlautAgrave":-40,"UhungarumlautAmacron":-40,"UhungarumlautAogonek":-40,"UhungarumlautAring":-40,"UhungarumlautAtilde":-40,"Uhungarumlautcomma":-40,"Uhungarumlautperiod":-40,"UmacronA":-40,"UmacronAacute":-40,"UmacronAbreve":-40,"UmacronAcircumflex":-40,"UmacronAdieresis":-40,"UmacronAgrave":-40,"UmacronAmacron":-40,"UmacronAogonek":-40,"UmacronAring":-40,"UmacronAtilde":-40,"Umacroncomma":-40,"Umacronperiod":-40,"UogonekA":-40,"UogonekAacute":-40,"UogonekAbreve":-40,"UogonekAcircumflex":-40,"UogonekAdieresis":-40,"UogonekAgrave":-40,"UogonekAmacron":-40,"UogonekAogonek":-40,"UogonekAring":-40,"UogonekAtilde":-40,"Uogonekcomma":-40,"Uogonekperiod":-40,"UringA":-40,"UringAacute":-40,"UringAbreve":-40,"UringAcircumflex":-40,"UringAdieresis":-40,"UringAgrave":-40,"UringAmacron":-40,"UringAogonek":-40,"UringAring":-40,"UringAtilde":-40,"Uringcomma":-40,"Uringperiod":-40,"VA":-80,"VAacute":-80,"VAbreve":-80,"VAcircumflex":-80,"VAdieresis":-80,"VAgrave":-80,"VAmacron":-80,"VAogonek":-80,"VAring":-80,"VAtilde":-80,"VG":-40,"VGbreve":-40,"VGcommaaccent":-40,"VO":-40,"VOacute":-40,"VOcircumflex":-40,"VOdieresis":-40,"VOgrave":-40,"VOhungarumlaut":-40,"VOmacron":-40,"VOslash":-40,"VOtilde":-40,"Va":-70,"Vaacute":-70,"Vabreve":-70,"Vacircumflex":-70,"Vadieresis":-70,"Vagrave":-70,"Vamacron":-70,"Vaogonek":-70,"Varing":-70,"Vatilde":-70,"Vcolon":-40,"Vcomma":-125,"Ve":-80,"Veacute":-80,"Vecaron":-80,"Vecircumflex":-80,"Vedieresis":-80,"Vedotaccent":-80,"Vegrave":-80,"Vemacron":-80,"Veogonek":-80,"Vhyphen":-80,"Vo":-80,"Voacute":-80,"Vocircumflex":-80,"Vodieresis":-80,"Vograve":-80,"Vohungarumlaut":-80,"Vomacron":-80,"Voslash":-80,"Votilde":-80,"Vperiod":-125,"Vsemicolon":-40,"Vu":-70,"Vuacute":-70,"Vucircumflex":-70,"Vudieresis":-70,"Vugrave":-70,"Vuhungarumlaut":-70,"Vumacron":-70,"Vuogonek":-70,"Vuring":-70,"WA":-50,"WAacute":-50,"WAbreve":-50,"WAcircumflex":-50,"WAdieresis":-50,"WAgrave":-50,"WAmacron":-50,"WAogonek":-50,"WAring":-50,"WAtilde":-50,"WO":-20,"WOacute":-20,"WOcircumflex":-20,"WOdieresis":-20,"WOgrave":-20,"WOhungarumlaut":-20,"WOmacron":-20,"WOslash":-20,"WOtilde":-20,"Wa":-40,"Waacute":-40,"Wabreve":-40,"Wacircumflex":-40,"Wadieresis":-40,"Wagrave":-40,"Wamacron":-40,"Waogonek":-40,"Waring":-40,"Watilde":-40,"Wcomma":-80,"We":-30,"Weacute":-30,"Wecaron":-30,"Wecircumflex":-30,"Wedieresis":-30,"Wedotaccent":-30,"Wegrave":-30,"Wemacron":-30,"Weogonek":-30,"Whyphen":-40,"Wo":-30,"Woacute":-30,"Wocircumflex":-30,"Wodieresis":-30,"Wograve":-30,"Wohungarumlaut":-30,"Womacron":-30,"Woslash":-30,"Wotilde":-30,"Wperiod":-80,"Wu":-30,"Wuacute":-30,"Wucircumflex":-30,"Wudieresis":-30,"Wugrave":-30,"Wuhungarumlaut":-30,"Wumacron":-30,"Wuogonek":-30,"Wuring":-30,"Wy":-20,"Wyacute":-20,"Wydieresis":-20,"YA":-110,"YAacute":-110,"YAbreve":-110,"YAcircumflex":-110,"YAdieresis":-110,"YAgrave":-110,"YAmacron":-110,"YAogonek":-110,"YAring":-110,"YAtilde":-110,"YO":-85,"YOacute":-85,"YOcircumflex":-85,"YOdieresis":-85,"YOgrave":-85,"YOhungarumlaut":-85,"YOmacron":-85,"YOslash":-85,"YOtilde":-85,"Ya":-140,"Yaacute":-140,"Yabreve":-70,"Yacircumflex":-140,"Yadieresis":-140,"Yagrave":-140,"Yamacron":-70,"Yaogonek":-140,"Yaring":-140,"Yatilde":-140,"Ycolon":-60,"Ycomma":-140,"Ye":-140,"Yeacute":-140,"Yecaron":-140,"Yecircumflex":-140,"Yedieresis":-140,"Yedotaccent":-140,"Yegrave":-140,"Yemacron":-70,"Yeogonek":-140,"Yhyphen":-140,"Yi":-20,"Yiacute":-20,"Yiogonek":-20,"Yo":-140,"Yoacute":-140,"Yocircumflex":-140,"Yodieresis":-140,"Yograve":-140,"Yohungarumlaut":-140,"Yomacron":-140,"Yoslash":-140,"Yotilde":-140,"Yperiod":-140,"Ysemicolon":-60,"Yu":-110,"Yuacute":-110,"Yucircumflex":-110,"Yudieresis":-110,"Yugrave":-110,"Yuhungarumlaut":-110,"Yumacron":-110,"Yuogonek":-110,"Yuring":-110,"YacuteA":-110,"YacuteAacute":-110,"YacuteAbreve":-110,"YacuteAcircumflex":-110,"YacuteAdieresis":-110,"YacuteAgrave":-110,"YacuteAmacron":-110,"YacuteAogonek":-110,"YacuteAring":-110,"YacuteAtilde":-110,"YacuteO":-85,"YacuteOacute":-85,"YacuteOcircumflex":-85,"YacuteOdieresis":-85,"YacuteOgrave":-85,"YacuteOhungarumlaut":-85,"YacuteOmacron":-85,"YacuteOslash":-85,"YacuteOtilde":-85,"Yacutea":-140,"Yacuteaacute":-140,"Yacuteabreve":-70,"Yacuteacircumflex":-140,"Yacuteadieresis":-140,"Yacuteagrave":-140,"Yacuteamacron":-70,"Yacuteaogonek":-140,"Yacutearing":-140,"Yacuteatilde":-70,"Yacutecolon":-60,"Yacutecomma":-140,"Yacutee":-140,"Yacuteeacute":-140,"Yacuteecaron":-140,"Yacuteecircumflex":-140,"Yacuteedieresis":-140,"Yacuteedotaccent":-140,"Yacuteegrave":-140,"Yacuteemacron":-70,"Yacuteeogonek":-140,"Yacutehyphen":-140,"Yacutei":-20,"Yacuteiacute":-20,"Yacuteiogonek":-20,"Yacuteo":-140,"Yacuteoacute":-140,"Yacuteocircumflex":-140,"Yacuteodieresis":-140,"Yacuteograve":-140,"Yacuteohungarumlaut":-140,"Yacuteomacron":-70,"Yacuteoslash":-140,"Yacuteotilde":-140,"Yacuteperiod":-140,"Yacutesemicolon":-60,"Yacuteu":-110,"Yacuteuacute":-110,"Yacuteucircumflex":-110,"Yacuteudieresis":-110,"Yacuteugrave":-110,"Yacuteuhungarumlaut":-110,"Yacuteumacron":-110,"Yacuteuogonek":-110,"Yacuteuring":-110,"YdieresisA":-110,"YdieresisAacute":-110,"YdieresisAbreve":-110,"YdieresisAcircumflex":-110,"YdieresisAdieresis":-110,"YdieresisAgrave":-110,"YdieresisAmacron":-110,"YdieresisAogonek":-110,"YdieresisAring":-110,"YdieresisAtilde":-110,"YdieresisO":-85,"YdieresisOacute":-85,"YdieresisOcircumflex":-85,"YdieresisOdieresis":-85,"YdieresisOgrave":-85,"YdieresisOhungarumlaut":-85,"YdieresisOmacron":-85,"YdieresisOslash":-85,"YdieresisOtilde":-85,"Ydieresisa":-140,"Ydieresisaacute":-140,"Ydieresisabreve":-70,"Ydieresisacircumflex":-140,"Ydieresisadieresis":-140,"Ydieresisagrave":-140,"Ydieresisamacron":-70,"Ydieresisaogonek":-140,"Ydieresisaring":-140,"Ydieresisatilde":-70,"Ydieresiscolon":-60,"Ydieresiscomma":-140,"Ydieresise":-140,"Ydieresiseacute":-140,"Ydieresisecaron":-140,"Ydieresisecircumflex":-140,"Ydieresisedieresis":-140,"Ydieresisedotaccent":-140,"Ydieresisegrave":-140,"Ydieresisemacron":-70,"Ydieresiseogonek":-140,"Ydieresishyphen":-140,"Ydieresisi":-20,"Ydieresisiacute":-20,"Ydieresisiogonek":-20,"Ydieresiso":-140,"Ydieresisoacute":-140,"Ydieresisocircumflex":-140,"Ydieresisodieresis":-140,"Ydieresisograve":-140,"Ydieresisohungarumlaut":-140,"Ydieresisomacron":-140,"Ydieresisoslash":-140,"Ydieresisotilde":-140,"Ydieresisperiod":-140,"Ydieresissemicolon":-60,"Ydieresisu":-110,"Ydieresisuacute":-110,"Ydieresisucircumflex":-110,"Ydieresisudieresis":-110,"Ydieresisugrave":-110,"Ydieresisuhungarumlaut":-110,"Ydieresisumacron":-110,"Ydieresisuogonek":-110,"Ydieresisuring":-110,"av":-20,"aw":-20,"ay":-30,"ayacute":-30,"aydieresis":-30,"aacutev":-20,"aacutew":-20,"aacutey":-30,"aacuteyacute":-30,"aacuteydieresis":-30,"abrevev":-20,"abrevew":-20,"abrevey":-30,"abreveyacute":-30,"abreveydieresis":-30,"acircumflexv":-20,"acircumflexw":-20,"acircumflexy":-30,"acircumflexyacute":-30,"acircumflexydieresis":-30,"adieresisv":-20,"adieresisw":-20,"adieresisy":-30,"adieresisyacute":-30,"adieresisydieresis":-30,"agravev":-20,"agravew":-20,"agravey":-30,"agraveyacute":-30,"agraveydieresis":-30,"amacronv":-20,"amacronw":-20,"amacrony":-30,"amacronyacute":-30,"amacronydieresis":-30,"aogonekv":-20,"aogonekw":-20,"aogoneky":-30,"aogonekyacute":-30,"aogonekydieresis":-30,"aringv":-20,"aringw":-20,"aringy":-30,"aringyacute":-30,"aringydieresis":-30,"atildev":-20,"atildew":-20,"atildey":-30,"atildeyacute":-30,"atildeydieresis":-30,"bb":-10,"bcomma":-40,"bl":-20,"blacute":-20,"blcommaaccent":-20,"blslash":-20,"bperiod":-40,"bu":-20,"buacute":-20,"bucircumflex":-20,"budieresis":-20,"bugrave":-20,"buhungarumlaut":-20,"bumacron":-20,"buogonek":-20,"buring":-20,"bv":-20,"by":-20,"byacute":-20,"bydieresis":-20,"ccomma":-15,"ck":-20,"ckcommaaccent":-20,"cacutecomma":-15,"cacutek":-20,"cacutekcommaaccent":-20,"ccaroncomma":-15,"ccaronk":-20,"ccaronkcommaaccent":-20,"ccedillacomma":-15,"ccedillak":-20,"ccedillakcommaaccent":-20,"colonspace":-50,"commaquotedblright":-100,"commaquoteright":-100,"ecomma":-15,"eperiod":-15,"ev":-30,"ew":-20,"ex":-30,"ey":-20,"eyacute":-20,"eydieresis":-20,"eacutecomma":-15,"eacuteperiod":-15,"eacutev":-30,"eacutew":-20,"eacutex":-30,"eacutey":-20,"eacuteyacute":-20,"eacuteydieresis":-20,"ecaroncomma":-15,"ecaronperiod":-15,"ecaronv":-30,"ecaronw":-20,"ecaronx":-30,"ecarony":-20,"ecaronyacute":-20,"ecaronydieresis":-20,"ecircumflexcomma":-15,"ecircumflexperiod":-15,"ecircumflexv":-30,"ecircumflexw":-20,"ecircumflexx":-30,"ecircumflexy":-20,"ecircumflexyacute":-20,"ecircumflexydieresis":-20,"edieresiscomma":-15,"edieresisperiod":-15,"edieresisv":-30,"edieresisw":-20,"edieresisx":-30,"edieresisy":-20,"edieresisyacute":-20,"edieresisydieresis":-20,"edotaccentcomma":-15,"edotaccentperiod":-15,"edotaccentv":-30,"edotaccentw":-20,"edotaccentx":-30,"edotaccenty":-20,"edotaccentyacute":-20,"edotaccentydieresis":-20,"egravecomma":-15,"egraveperiod":-15,"egravev":-30,"egravew":-20,"egravex":-30,"egravey":-20,"egraveyacute":-20,"egraveydieresis":-20,"emacroncomma":-15,"emacronperiod":-15,"emacronv":-30,"emacronw":-20,"emacronx":-30,"emacrony":-20,"emacronyacute":-20,"emacronydieresis":-20,"eogonekcomma":-15,"eogonekperiod":-15,"eogonekv":-30,"eogonekw":-20,"eogonekx":-30,"eogoneky":-20,"eogonekyacute":-20,"eogonekydieresis":-20,"fa":-30,"faacute":-30,"fabreve":-30,"facircumflex":-30,"fadieresis":-30,"fagrave":-30,"famacron":-30,"faogonek":-30,"faring":-30,"fatilde":-30,"fcomma":-30,"fdotlessi":-28,"fe":-30,"feacute":-30,"fecaron":-30,"fecircumflex":-30,"fedieresis":-30,"fedotaccent":-30,"fegrave":-30,"femacron":-30,"feogonek":-30,"fo":-30,"foacute":-30,"focircumflex":-30,"fodieresis":-30,"fograve":-30,"fohungarumlaut":-30,"fomacron":-30,"foslash":-30,"fotilde":-30,"fperiod":-30,"fquotedblright":60,"fquoteright":50,"gr":-10,"gracute":-10,"grcaron":-10,"grcommaaccent":-10,"gbrever":-10,"gbreveracute":-10,"gbrevercaron":-10,"gbrevercommaaccent":-10,"gcommaaccentr":-10,"gcommaaccentracute":-10,"gcommaaccentrcaron":-10,"gcommaaccentrcommaaccent":-10,"hy":-30,"hyacute":-30,"hydieresis":-30,"ke":-20,"keacute":-20,"kecaron":-20,"kecircumflex":-20,"kedieresis":-20,"kedotaccent":-20,"kegrave":-20,"kemacron":-20,"keogonek":-20,"ko":-20,"koacute":-20,"kocircumflex":-20,"kodieresis":-20,"kograve":-20,"kohungarumlaut":-20,"komacron":-20,"koslash":-20,"kotilde":-20,"kcommaaccente":-20,"kcommaaccenteacute":-20,"kcommaaccentecaron":-20,"kcommaaccentecircumflex":-20,"kcommaaccentedieresis":-20,"kcommaaccentedotaccent":-20,"kcommaaccentegrave":-20,"kcommaaccentemacron":-20,"kcommaaccenteogonek":-20,"kcommaaccento":-20,"kcommaaccentoacute":-20,"kcommaaccentocircumflex":-20,"kcommaaccentodieresis":-20,"kcommaaccentograve":-20,"kcommaaccentohungarumlaut":-20,"kcommaaccentomacron":-20,"kcommaaccentoslash":-20,"kcommaaccentotilde":-20,"mu":-10,"muacute":-10,"mucircumflex":-10,"mudieresis":-10,"mugrave":-10,"muhungarumlaut":-10,"mumacron":-10,"muogonek":-10,"muring":-10,"my":-15,"myacute":-15,"mydieresis":-15,"nu":-10,"nuacute":-10,"nucircumflex":-10,"nudieresis":-10,"nugrave":-10,"nuhungarumlaut":-10,"numacron":-10,"nuogonek":-10,"nuring":-10,"nv":-20,"ny":-15,"nyacute":-15,"nydieresis":-15,"nacuteu":-10,"nacuteuacute":-10,"nacuteucircumflex":-10,"nacuteudieresis":-10,"nacuteugrave":-10,"nacuteuhungarumlaut":-10,"nacuteumacron":-10,"nacuteuogonek":-10,"nacuteuring":-10,"nacutev":-20,"nacutey":-15,"nacuteyacute":-15,"nacuteydieresis":-15,"ncaronu":-10,"ncaronuacute":-10,"ncaronucircumflex":-10,"ncaronudieresis":-10,"ncaronugrave":-10,"ncaronuhungarumlaut":-10,"ncaronumacron":-10,"ncaronuogonek":-10,"ncaronuring":-10,"ncaronv":-20,"ncarony":-15,"ncaronyacute":-15,"ncaronydieresis":-15,"ncommaaccentu":-10,"ncommaaccentuacute":-10,"ncommaaccentucircumflex":-10,"ncommaaccentudieresis":-10,"ncommaaccentugrave":-10,"ncommaaccentuhungarumlaut":-10,"ncommaaccentumacron":-10,"ncommaaccentuogonek":-10,"ncommaaccenturing":-10,"ncommaaccentv":-20,"ncommaaccenty":-15,"ncommaaccentyacute":-15,"ncommaaccentydieresis":-15,"ntildeu":-10,"ntildeuacute":-10,"ntildeucircumflex":-10,"ntildeudieresis":-10,"ntildeugrave":-10,"ntildeuhungarumlaut":-10,"ntildeumacron":-10,"ntildeuogonek":-10,"ntildeuring":-10,"ntildev":-20,"ntildey":-15,"ntildeyacute":-15,"ntildeydieresis":-15,"ocomma":-40,"operiod":-40,"ov":-15,"ow":-15,"ox":-30,"oy":-30,"oyacute":-30,"oydieresis":-30,"oacutecomma":-40,"oacuteperiod":-40,"oacutev":-15,"oacutew":-15,"oacutex":-30,"oacutey":-30,"oacuteyacute":-30,"oacuteydieresis":-30,"ocircumflexcomma":-40,"ocircumflexperiod":-40,"ocircumflexv":-15,"ocircumflexw":-15,"ocircumflexx":-30,"ocircumflexy":-30,"ocircumflexyacute":-30,"ocircumflexydieresis":-30,"odieresiscomma":-40,"odieresisperiod":-40,"odieresisv":-15,"odieresisw":-15,"odieresisx":-30,"odieresisy":-30,"odieresisyacute":-30,"odieresisydieresis":-30,"ogravecomma":-40,"ograveperiod":-40,"ogravev":-15,"ogravew":-15,"ogravex":-30,"ogravey":-30,"ograveyacute":-30,"ograveydieresis":-30,"ohungarumlautcomma":-40,"ohungarumlautperiod":-40,"ohungarumlautv":-15,"ohungarumlautw":-15,"ohungarumlautx":-30,"ohungarumlauty":-30,"ohungarumlautyacute":-30,"ohungarumlautydieresis":-30,"omacroncomma":-40,"omacronperiod":-40,"omacronv":-15,"omacronw":-15,"omacronx":-30,"omacrony":-30,"omacronyacute":-30,"omacronydieresis":-30,"oslasha":-55,"oslashaacute":-55,"oslashabreve":-55,"oslashacircumflex":-55,"oslashadieresis":-55,"oslashagrave":-55,"oslashamacron":-55,"oslashaogonek":-55,"oslasharing":-55,"oslashatilde":-55,"oslashb":-55,"oslashc":-55,"oslashcacute":-55,"oslashccaron":-55,"oslashccedilla":-55,"oslashcomma":-95,"oslashd":-55,"oslashdcroat":-55,"oslashe":-55,"oslasheacute":-55,"oslashecaron":-55,"oslashecircumflex":-55,"oslashedieresis":-55,"oslashedotaccent":-55,"oslashegrave":-55,"oslashemacron":-55,"oslasheogonek":-55,"oslashf":-55,"oslashg":-55,"oslashgbreve":-55,"oslashgcommaaccent":-55,"oslashh":-55,"oslashi":-55,"oslashiacute":-55,"oslashicircumflex":-55,"oslashidieresis":-55,"oslashigrave":-55,"oslashimacron":-55,"oslashiogonek":-55,"oslashj":-55,"oslashk":-55,"oslashkcommaaccent":-55,"oslashl":-55,"oslashlacute":-55,"oslashlcommaaccent":-55,"oslashlslash":-55,"oslashm":-55,"oslashn":-55,"oslashnacute":-55,"oslashncaron":-55,"oslashncommaaccent":-55,"oslashntilde":-55,"oslasho":-55,"oslashoacute":-55,"oslashocircumflex":-55,"oslashodieresis":-55,"oslashograve":-55,"oslashohungarumlaut":-55,"oslashomacron":-55,"oslashoslash":-55,"oslashotilde":-55,"oslashp":-55,"oslashperiod":-95,"oslashq":-55,"oslashr":-55,"oslashracute":-55,"oslashrcaron":-55,"oslashrcommaaccent":-55,"oslashs":-55,"oslashsacute":-55,"oslashscaron":-55,"oslashscedilla":-55,"oslashscommaaccent":-55,"oslasht":-55,"oslashtcommaaccent":-55,"oslashu":-55,"oslashuacute":-55,"oslashucircumflex":-55,"oslashudieresis":-55,"oslashugrave":-55,"oslashuhungarumlaut":-55,"oslashumacron":-55,"oslashuogonek":-55,"oslashuring":-55,"oslashv":-70,"oslashw":-70,"oslashx":-85,"oslashy":-70,"oslashyacute":-70,"oslashydieresis":-70,"oslashz":-55,"oslashzacute":-55,"oslashzcaron":-55,"oslashzdotaccent":-55,"otildecomma":-40,"otildeperiod":-40,"otildev":-15,"otildew":-15,"otildex":-30,"otildey":-30,"otildeyacute":-30,"otildeydieresis":-30,"pcomma":-35,"pperiod":-35,"py":-30,"pyacute":-30,"pydieresis":-30,"periodquotedblright":-100,"periodquoteright":-100,"periodspace":-60,"quotedblrightspace":-40,"quoteleftquoteleft":-57,"quoterightd":-50,"quoterightdcroat":-50,"quoterightquoteright":-57,"quoterightr":-50,"quoterightracute":-50,"quoterightrcaron":-50,"quoterightrcommaaccent":-50,"quoterights":-50,"quoterightsacute":-50,"quoterightscaron":-50,"quoterightscedilla":-50,"quoterightscommaaccent":-50,"quoterightspace":-70,"ra":-10,"raacute":-10,"rabreve":-10,"racircumflex":-10,"radieresis":-10,"ragrave":-10,"ramacron":-10,"raogonek":-10,"raring":-10,"ratilde":-10,"rcolon":30,"rcomma":-50,"ri":15,"riacute":15,"ricircumflex":15,"ridieresis":15,"rigrave":15,"rimacron":15,"riogonek":15,"rk":15,"rkcommaaccent":15,"rl":15,"rlacute":15,"rlcommaaccent":15,"rlslash":15,"rm":25,"rn":25,"rnacute":25,"rncaron":25,"rncommaaccent":25,"rntilde":25,"rp":30,"rperiod":-50,"rsemicolon":30,"rt":40,"rtcommaaccent":40,"ru":15,"ruacute":15,"rucircumflex":15,"rudieresis":15,"rugrave":15,"ruhungarumlaut":15,"rumacron":15,"ruogonek":15,"ruring":15,"rv":30,"ry":30,"ryacute":30,"rydieresis":30,"racutea":-10,"racuteaacute":-10,"racuteabreve":-10,"racuteacircumflex":-10,"racuteadieresis":-10,"racuteagrave":-10,"racuteamacron":-10,"racuteaogonek":-10,"racutearing":-10,"racuteatilde":-10,"racutecolon":30,"racutecomma":-50,"racutei":15,"racuteiacute":15,"racuteicircumflex":15,"racuteidieresis":15,"racuteigrave":15,"racuteimacron":15,"racuteiogonek":15,"racutek":15,"racutekcommaaccent":15,"racutel":15,"racutelacute":15,"racutelcommaaccent":15,"racutelslash":15,"racutem":25,"racuten":25,"racutenacute":25,"racutencaron":25,"racutencommaaccent":25,"racutentilde":25,"racutep":30,"racuteperiod":-50,"racutesemicolon":30,"racutet":40,"racutetcommaaccent":40,"racuteu":15,"racuteuacute":15,"racuteucircumflex":15,"racuteudieresis":15,"racuteugrave":15,"racuteuhungarumlaut":15,"racuteumacron":15,"racuteuogonek":15,"racuteuring":15,"racutev":30,"racutey":30,"racuteyacute":30,"racuteydieresis":30,"rcarona":-10,"rcaronaacute":-10,"rcaronabreve":-10,"rcaronacircumflex":-10,"rcaronadieresis":-10,"rcaronagrave":-10,"rcaronamacron":-10,"rcaronaogonek":-10,"rcaronaring":-10,"rcaronatilde":-10,"rcaroncolon":30,"rcaroncomma":-50,"rcaroni":15,"rcaroniacute":15,"rcaronicircumflex":15,"rcaronidieresis":15,"rcaronigrave":15,"rcaronimacron":15,"rcaroniogonek":15,"rcaronk":15,"rcaronkcommaaccent":15,"rcaronl":15,"rcaronlacute":15,"rcaronlcommaaccent":15,"rcaronlslash":15,"rcaronm":25,"rcaronn":25,"rcaronnacute":25,"rcaronncaron":25,"rcaronncommaaccent":25,"rcaronntilde":25,"rcaronp":30,"rcaronperiod":-50,"rcaronsemicolon":30,"rcaront":40,"rcarontcommaaccent":40,"rcaronu":15,"rcaronuacute":15,"rcaronucircumflex":15,"rcaronudieresis":15,"rcaronugrave":15,"rcaronuhungarumlaut":15,"rcaronumacron":15,"rcaronuogonek":15,"rcaronuring":15,"rcaronv":30,"rcarony":30,"rcaronyacute":30,"rcaronydieresis":30,"rcommaaccenta":-10,"rcommaaccentaacute":-10,"rcommaaccentabreve":-10,"rcommaaccentacircumflex":-10,"rcommaaccentadieresis":-10,"rcommaaccentagrave":-10,"rcommaaccentamacron":-10,"rcommaaccentaogonek":-10,"rcommaaccentaring":-10,"rcommaaccentatilde":-10,"rcommaaccentcolon":30,"rcommaaccentcomma":-50,"rcommaaccenti":15,"rcommaaccentiacute":15,"rcommaaccenticircumflex":15,"rcommaaccentidieresis":15,"rcommaaccentigrave":15,"rcommaaccentimacron":15,"rcommaaccentiogonek":15,"rcommaaccentk":15,"rcommaaccentkcommaaccent":15,"rcommaaccentl":15,"rcommaaccentlacute":15,"rcommaaccentlcommaaccent":15,"rcommaaccentlslash":15,"rcommaaccentm":25,"rcommaaccentn":25,"rcommaaccentnacute":25,"rcommaaccentncaron":25,"rcommaaccentncommaaccent":25,"rcommaaccentntilde":25,"rcommaaccentp":30,"rcommaaccentperiod":-50,"rcommaaccentsemicolon":30,"rcommaaccentt":40,"rcommaaccenttcommaaccent":40,"rcommaaccentu":15,"rcommaaccentuacute":15,"rcommaaccentucircumflex":15,"rcommaaccentudieresis":15,"rcommaaccentugrave":15,"rcommaaccentuhungarumlaut":15,"rcommaaccentumacron":15,"rcommaaccentuogonek":15,"rcommaaccenturing":15,"rcommaaccentv":30,"rcommaaccenty":30,"rcommaaccentyacute":30,"rcommaaccentydieresis":30,"scomma":-15,"speriod":-15,"sw":-30,"sacutecomma":-15,"sacuteperiod":-15,"sacutew":-30,"scaroncomma":-15,"scaronperiod":-15,"scaronw":-30,"scedillacomma":-15,"scedillaperiod":-15,"scedillaw":-30,"scommaaccentcomma":-15,"scommaaccentperiod":-15,"scommaaccentw":-30,"semicolonspace":-50,"spaceT":-50,"spaceTcaron":-50,"spaceTcommaaccent":-50,"spaceV":-50,"spaceW":-40,"spaceY":-90,"spaceYacute":-90,"spaceYdieresis":-90,"spacequotedblleft":-30,"spacequoteleft":-60,"va":-25,"vaacute":-25,"vabreve":-25,"vacircumflex":-25,"vadieresis":-25,"vagrave":-25,"vamacron":-25,"vaogonek":-25,"varing":-25,"vatilde":-25,"vcomma":-80,"ve":-25,"veacute":-25,"vecaron":-25,"vecircumflex":-25,"vedieresis":-25,"vedotaccent":-25,"vegrave":-25,"vemacron":-25,"veogonek":-25,"vo":-25,"voacute":-25,"vocircumflex":-25,"vodieresis":-25,"vograve":-25,"vohungarumlaut":-25,"vomacron":-25,"voslash":-25,"votilde":-25,"vperiod":-80,"wa":-15,"waacute":-15,"wabreve":-15,"wacircumflex":-15,"wadieresis":-15,"wagrave":-15,"wamacron":-15,"waogonek":-15,"waring":-15,"watilde":-15,"wcomma":-60,"we":-10,"weacute":-10,"wecaron":-10,"wecircumflex":-10,"wedieresis":-10,"wedotaccent":-10,"wegrave":-10,"wemacron":-10,"weogonek":-10,"wo":-10,"woacute":-10,"wocircumflex":-10,"wodieresis":-10,"wograve":-10,"wohungarumlaut":-10,"womacron":-10,"woslash":-10,"wotilde":-10,"wperiod":-60,"xe":-30,"xeacute":-30,"xecaron":-30,"xecircumflex":-30,"xedieresis":-30,"xedotaccent":-30,"xegrave":-30,"xemacron":-30,"xeogonek":-30,"ya":-20,"yaacute":-20,"yabreve":-20,"yacircumflex":-20,"yadieresis":-20,"yagrave":-20,"yamacron":-20,"yaogonek":-20,"yaring":-20,"yatilde":-20,"ycomma":-100,"ye":-20,"yeacute":-20,"yecaron":-20,"yecircumflex":-20,"yedieresis":-20,"yedotaccent":-20,"yegrave":-20,"yemacron":-20,"yeogonek":-20,"yo":-20,"yoacute":-20,"yocircumflex":-20,"yodieresis":-20,"yograve":-20,"yohungarumlaut":-20,"yomacron":-20,"yoslash":-20,"yotilde":-20,"yperiod":-100,"yacutea":-20,"yacuteaacute":-20,"yacuteabreve":-20,"yacuteacircumflex":-20,"yacuteadieresis":-20,"yacuteagrave":-20,"yacuteamacron":-20,"yacuteaogonek":-20,"yacutearing":-20,"yacuteatilde":-20,"yacutecomma":-100,"yacutee":-20,"yacuteeacute":-20,"yacuteecaron":-20,"yacuteecircumflex":-20,"yacuteedieresis":-20,"yacuteedotaccent":-20,"yacuteegrave":-20,"yacuteemacron":-20,"yacuteeogonek":-20,"yacuteo":-20,"yacuteoacute":-20,"yacuteocircumflex":-20,"yacuteodieresis":-20,"yacuteograve":-20,"yacuteohungarumlaut":-20,"yacuteomacron":-20,"yacuteoslash":-20,"yacuteotilde":-20,"yacuteperiod":-100,"ydieresisa":-20,"ydieresisaacute":-20,"ydieresisabreve":-20,"ydieresisacircumflex":-20,"ydieresisadieresis":-20,"ydieresisagrave":-20,"ydieresisamacron":-20,"ydieresisaogonek":-20,"ydieresisaring":-20,"ydieresisatilde":-20,"ydieresiscomma":-100,"ydieresise":-20,"ydieresiseacute":-20,"ydieresisecaron":-20,"ydieresisecircumflex":-20,"ydieresisedieresis":-20,"ydieresisedotaccent":-20,"ydieresisegrave":-20,"ydieresisemacron":-20,"ydieresiseogonek":-20,"ydieresiso":-20,"ydieresisoacute":-20,"ydieresisocircumflex":-20,"ydieresisodieresis":-20,"ydieresisograve":-20,"ydieresisohungarumlaut":-20,"ydieresisomacron":-20,"ydieresisoslash":-20,"ydieresisotilde":-20,"ydieresisperiod":-100,"ze":-15,"zeacute":-15,"zecaron":-15,"zecircumflex":-15,"zedieresis":-15,"zedotaccent":-15,"zegrave":-15,"zemacron":-15,"zeogonek":-15,"zo":-15,"zoacute":-15,"zocircumflex":-15,"zodieresis":-15,"zograve":-15,"zohungarumlaut":-15,"zomacron":-15,"zoslash":-15,"zotilde":-15,"zacutee":-15,"zacuteeacute":-15,"zacuteecaron":-15,"zacuteecircumflex":-15,"zacuteedieresis":-15,"zacuteedotaccent":-15,"zacuteegrave":-15,"zacuteemacron":-15,"zacuteeogonek":-15,"zacuteo":-15,"zacuteoacute":-15,"zacuteocircumflex":-15,"zacuteodieresis":-15,"zacuteograve":-15,"zacuteohungarumlaut":-15,"zacuteomacron":-15,"zacuteoslash":-15,"zacuteotilde":-15,"zcarone":-15,"zcaroneacute":-15,"zcaronecaron":-15,"zcaronecircumflex":-15,"zcaronedieresis":-15,"zcaronedotaccent":-15,"zcaronegrave":-15,"zcaronemacron":-15,"zcaroneogonek":-15,"zcarono":-15,"zcaronoacute":-15,"zcaronocircumflex":-15,"zcaronodieresis":-15,"zcaronograve":-15,"zcaronohungarumlaut":-15,"zcaronomacron":-15,"zcaronoslash":-15,"zcaronotilde":-15,"zdotaccente":-15,"zdotaccenteacute":-15,"zdotaccentecaron":-15,"zdotaccentecircumflex":-15,"zdotaccentedieresis":-15,"zdotaccentedotaccent":-15,"zdotaccentegrave":-15,"zdotaccentemacron":-15,"zdotaccenteogonek":-15,"zdotaccento":-15,"zdotaccentoacute":-15,"zdotaccentocircumflex":-15,"zdotaccentodieresis":-15,"zdotaccentograve":-15,"zdotaccentohungarumlaut":-15,"zdotaccentomacron":-15,"zdotaccentoslash":-15,"zdotaccentotilde":-15}} \ No newline at end of file diff --git a/packages/pdfkit/src/font/data/Times-Bold.json b/packages/pdfkit/src/font/data/Times-Bold.json deleted file mode 100644 index b6ba027bc..000000000 --- a/packages/pdfkit/src/font/data/Times-Bold.json +++ /dev/null @@ -1 +0,0 @@ -{"attributes":{"Comment":["Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.","Creation Date: Thu May 1 12:52:56 1997","UniqueID 43065","VMusage 41636 52661"],"FontName":"Times-Bold","FullName":"Times Bold","FamilyName":"Times","Weight":"Bold","ItalicAngle":"0","IsFixedPitch":"false","CharacterSet":"ExtendedRoman","FontBBox":"-168 -218 1000 935 ","UnderlinePosition":"-100","UnderlineThickness":"50","Version":"002.000","Notice":"Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries.","EncodingScheme":"AdobeStandardEncoding","CapHeight":"676","XHeight":"461","Ascender":"683","Descender":"-217","StdHW":"44","StdVW":"139"},"glyphWidths":{"space":250,"exclam":333,"quotedbl":555,"numbersign":500,"dollar":500,"percent":1000,"ampersand":833,"quoteright":333,"parenleft":333,"parenright":333,"asterisk":500,"plus":570,"comma":250,"hyphen":333,"period":250,"slash":278,"zero":500,"one":500,"two":500,"three":500,"four":500,"five":500,"six":500,"seven":500,"eight":500,"nine":500,"colon":333,"semicolon":333,"less":570,"equal":570,"greater":570,"question":500,"at":930,"A":722,"B":667,"C":722,"D":722,"E":667,"F":611,"G":778,"H":778,"I":389,"J":500,"K":778,"L":667,"M":944,"N":722,"O":778,"P":611,"Q":778,"R":722,"S":556,"T":667,"U":722,"V":722,"W":1000,"X":722,"Y":722,"Z":667,"bracketleft":333,"backslash":278,"bracketright":333,"asciicircum":581,"underscore":500,"quoteleft":333,"a":500,"b":556,"c":444,"d":556,"e":444,"f":333,"g":500,"h":556,"i":278,"j":333,"k":556,"l":278,"m":833,"n":556,"o":500,"p":556,"q":556,"r":444,"s":389,"t":333,"u":556,"v":500,"w":722,"x":500,"y":500,"z":444,"braceleft":394,"bar":220,"braceright":394,"asciitilde":520,"exclamdown":333,"cent":500,"sterling":500,"fraction":167,"yen":500,"florin":500,"section":500,"currency":500,"quotesingle":278,"quotedblleft":500,"guillemotleft":500,"guilsinglleft":333,"guilsinglright":333,"fi":556,"fl":556,"endash":500,"dagger":500,"daggerdbl":500,"periodcentered":250,"paragraph":540,"bullet":350,"quotesinglbase":333,"quotedblbase":500,"quotedblright":500,"guillemotright":500,"ellipsis":1000,"perthousand":1000,"questiondown":500,"grave":333,"acute":333,"circumflex":333,"tilde":333,"macron":333,"breve":333,"dotaccent":333,"dieresis":333,"ring":333,"cedilla":333,"hungarumlaut":333,"ogonek":333,"caron":333,"emdash":1000,"AE":1000,"ordfeminine":300,"Lslash":667,"Oslash":778,"OE":1000,"ordmasculine":330,"ae":722,"dotlessi":278,"lslash":278,"oslash":500,"oe":722,"germandbls":556,"Idieresis":389,"eacute":444,"abreve":500,"uhungarumlaut":556,"ecaron":444,"Ydieresis":722,"divide":570,"Yacute":722,"Acircumflex":722,"aacute":500,"Ucircumflex":722,"yacute":500,"scommaaccent":389,"ecircumflex":444,"Uring":722,"Udieresis":722,"aogonek":500,"Uacute":722,"uogonek":556,"Edieresis":667,"Dcroat":722,"commaaccent":250,"copyright":747,"Emacron":667,"ccaron":444,"aring":500,"Ncommaaccent":722,"lacute":278,"agrave":500,"Tcommaaccent":667,"Cacute":722,"atilde":500,"Edotaccent":667,"scaron":389,"scedilla":389,"iacute":278,"lozenge":494,"Rcaron":722,"Gcommaaccent":778,"ucircumflex":556,"acircumflex":500,"Amacron":722,"rcaron":444,"ccedilla":444,"Zdotaccent":667,"Thorn":611,"Omacron":778,"Racute":722,"Sacute":556,"dcaron":672,"Umacron":722,"uring":556,"threesuperior":300,"Ograve":778,"Agrave":722,"Abreve":722,"multiply":570,"uacute":556,"Tcaron":667,"partialdiff":494,"ydieresis":500,"Nacute":722,"icircumflex":278,"Ecircumflex":667,"adieresis":500,"edieresis":444,"cacute":444,"nacute":556,"umacron":556,"Ncaron":722,"Iacute":389,"plusminus":570,"brokenbar":220,"registered":747,"Gbreve":778,"Idotaccent":389,"summation":600,"Egrave":667,"racute":444,"omacron":500,"Zacute":667,"Zcaron":667,"greaterequal":549,"Eth":722,"Ccedilla":722,"lcommaaccent":278,"tcaron":416,"eogonek":444,"Uogonek":722,"Aacute":722,"Adieresis":722,"egrave":444,"zacute":444,"iogonek":278,"Oacute":778,"oacute":500,"amacron":500,"sacute":389,"idieresis":278,"Ocircumflex":778,"Ugrave":722,"Delta":612,"thorn":556,"twosuperior":300,"Odieresis":778,"mu":556,"igrave":278,"ohungarumlaut":500,"Eogonek":667,"dcroat":556,"threequarters":750,"Scedilla":556,"lcaron":394,"Kcommaaccent":778,"Lacute":667,"trademark":1000,"edotaccent":444,"Igrave":389,"Imacron":389,"Lcaron":667,"onehalf":750,"lessequal":549,"ocircumflex":500,"ntilde":556,"Uhungarumlaut":722,"Eacute":667,"emacron":444,"gbreve":500,"onequarter":750,"Scaron":556,"Scommaaccent":556,"Ohungarumlaut":778,"degree":400,"ograve":500,"Ccaron":722,"ugrave":556,"radical":549,"Dcaron":722,"rcommaaccent":444,"Ntilde":722,"otilde":500,"Rcommaaccent":722,"Lcommaaccent":667,"Atilde":722,"Aogonek":722,"Aring":722,"Otilde":778,"zdotaccent":444,"Ecaron":667,"Iogonek":389,"kcommaaccent":556,"minus":570,"Icircumflex":389,"ncaron":556,"tcommaaccent":333,"logicalnot":570,"odieresis":500,"udieresis":556,"notequal":549,"gcommaaccent":500,"eth":500,"zcaron":444,"ncommaaccent":556,"onesuperior":300,"imacron":278,"Euro":500},"kernPairs":{"AC":-55,"ACacute":-55,"ACcaron":-55,"ACcedilla":-55,"AG":-55,"AGbreve":-55,"AGcommaaccent":-55,"AO":-45,"AOacute":-45,"AOcircumflex":-45,"AOdieresis":-45,"AOgrave":-45,"AOhungarumlaut":-45,"AOmacron":-45,"AOslash":-45,"AOtilde":-45,"AQ":-45,"AT":-95,"ATcaron":-95,"ATcommaaccent":-95,"AU":-50,"AUacute":-50,"AUcircumflex":-50,"AUdieresis":-50,"AUgrave":-50,"AUhungarumlaut":-50,"AUmacron":-50,"AUogonek":-50,"AUring":-50,"AV":-145,"AW":-130,"AY":-100,"AYacute":-100,"AYdieresis":-100,"Ap":-25,"Aquoteright":-74,"Au":-50,"Auacute":-50,"Aucircumflex":-50,"Audieresis":-50,"Augrave":-50,"Auhungarumlaut":-50,"Aumacron":-50,"Auogonek":-50,"Auring":-50,"Av":-100,"Aw":-90,"Ay":-74,"Ayacute":-74,"Aydieresis":-74,"AacuteC":-55,"AacuteCacute":-55,"AacuteCcaron":-55,"AacuteCcedilla":-55,"AacuteG":-55,"AacuteGbreve":-55,"AacuteGcommaaccent":-55,"AacuteO":-45,"AacuteOacute":-45,"AacuteOcircumflex":-45,"AacuteOdieresis":-45,"AacuteOgrave":-45,"AacuteOhungarumlaut":-45,"AacuteOmacron":-45,"AacuteOslash":-45,"AacuteOtilde":-45,"AacuteQ":-45,"AacuteT":-95,"AacuteTcaron":-95,"AacuteTcommaaccent":-95,"AacuteU":-50,"AacuteUacute":-50,"AacuteUcircumflex":-50,"AacuteUdieresis":-50,"AacuteUgrave":-50,"AacuteUhungarumlaut":-50,"AacuteUmacron":-50,"AacuteUogonek":-50,"AacuteUring":-50,"AacuteV":-145,"AacuteW":-130,"AacuteY":-100,"AacuteYacute":-100,"AacuteYdieresis":-100,"Aacutep":-25,"Aacutequoteright":-74,"Aacuteu":-50,"Aacuteuacute":-50,"Aacuteucircumflex":-50,"Aacuteudieresis":-50,"Aacuteugrave":-50,"Aacuteuhungarumlaut":-50,"Aacuteumacron":-50,"Aacuteuogonek":-50,"Aacuteuring":-50,"Aacutev":-100,"Aacutew":-90,"Aacutey":-74,"Aacuteyacute":-74,"Aacuteydieresis":-74,"AbreveC":-55,"AbreveCacute":-55,"AbreveCcaron":-55,"AbreveCcedilla":-55,"AbreveG":-55,"AbreveGbreve":-55,"AbreveGcommaaccent":-55,"AbreveO":-45,"AbreveOacute":-45,"AbreveOcircumflex":-45,"AbreveOdieresis":-45,"AbreveOgrave":-45,"AbreveOhungarumlaut":-45,"AbreveOmacron":-45,"AbreveOslash":-45,"AbreveOtilde":-45,"AbreveQ":-45,"AbreveT":-95,"AbreveTcaron":-95,"AbreveTcommaaccent":-95,"AbreveU":-50,"AbreveUacute":-50,"AbreveUcircumflex":-50,"AbreveUdieresis":-50,"AbreveUgrave":-50,"AbreveUhungarumlaut":-50,"AbreveUmacron":-50,"AbreveUogonek":-50,"AbreveUring":-50,"AbreveV":-145,"AbreveW":-130,"AbreveY":-100,"AbreveYacute":-100,"AbreveYdieresis":-100,"Abrevep":-25,"Abrevequoteright":-74,"Abreveu":-50,"Abreveuacute":-50,"Abreveucircumflex":-50,"Abreveudieresis":-50,"Abreveugrave":-50,"Abreveuhungarumlaut":-50,"Abreveumacron":-50,"Abreveuogonek":-50,"Abreveuring":-50,"Abrevev":-100,"Abrevew":-90,"Abrevey":-74,"Abreveyacute":-74,"Abreveydieresis":-74,"AcircumflexC":-55,"AcircumflexCacute":-55,"AcircumflexCcaron":-55,"AcircumflexCcedilla":-55,"AcircumflexG":-55,"AcircumflexGbreve":-55,"AcircumflexGcommaaccent":-55,"AcircumflexO":-45,"AcircumflexOacute":-45,"AcircumflexOcircumflex":-45,"AcircumflexOdieresis":-45,"AcircumflexOgrave":-45,"AcircumflexOhungarumlaut":-45,"AcircumflexOmacron":-45,"AcircumflexOslash":-45,"AcircumflexOtilde":-45,"AcircumflexQ":-45,"AcircumflexT":-95,"AcircumflexTcaron":-95,"AcircumflexTcommaaccent":-95,"AcircumflexU":-50,"AcircumflexUacute":-50,"AcircumflexUcircumflex":-50,"AcircumflexUdieresis":-50,"AcircumflexUgrave":-50,"AcircumflexUhungarumlaut":-50,"AcircumflexUmacron":-50,"AcircumflexUogonek":-50,"AcircumflexUring":-50,"AcircumflexV":-145,"AcircumflexW":-130,"AcircumflexY":-100,"AcircumflexYacute":-100,"AcircumflexYdieresis":-100,"Acircumflexp":-25,"Acircumflexquoteright":-74,"Acircumflexu":-50,"Acircumflexuacute":-50,"Acircumflexucircumflex":-50,"Acircumflexudieresis":-50,"Acircumflexugrave":-50,"Acircumflexuhungarumlaut":-50,"Acircumflexumacron":-50,"Acircumflexuogonek":-50,"Acircumflexuring":-50,"Acircumflexv":-100,"Acircumflexw":-90,"Acircumflexy":-74,"Acircumflexyacute":-74,"Acircumflexydieresis":-74,"AdieresisC":-55,"AdieresisCacute":-55,"AdieresisCcaron":-55,"AdieresisCcedilla":-55,"AdieresisG":-55,"AdieresisGbreve":-55,"AdieresisGcommaaccent":-55,"AdieresisO":-45,"AdieresisOacute":-45,"AdieresisOcircumflex":-45,"AdieresisOdieresis":-45,"AdieresisOgrave":-45,"AdieresisOhungarumlaut":-45,"AdieresisOmacron":-45,"AdieresisOslash":-45,"AdieresisOtilde":-45,"AdieresisQ":-45,"AdieresisT":-95,"AdieresisTcaron":-95,"AdieresisTcommaaccent":-95,"AdieresisU":-50,"AdieresisUacute":-50,"AdieresisUcircumflex":-50,"AdieresisUdieresis":-50,"AdieresisUgrave":-50,"AdieresisUhungarumlaut":-50,"AdieresisUmacron":-50,"AdieresisUogonek":-50,"AdieresisUring":-50,"AdieresisV":-145,"AdieresisW":-130,"AdieresisY":-100,"AdieresisYacute":-100,"AdieresisYdieresis":-100,"Adieresisp":-25,"Adieresisquoteright":-74,"Adieresisu":-50,"Adieresisuacute":-50,"Adieresisucircumflex":-50,"Adieresisudieresis":-50,"Adieresisugrave":-50,"Adieresisuhungarumlaut":-50,"Adieresisumacron":-50,"Adieresisuogonek":-50,"Adieresisuring":-50,"Adieresisv":-100,"Adieresisw":-90,"Adieresisy":-74,"Adieresisyacute":-74,"Adieresisydieresis":-74,"AgraveC":-55,"AgraveCacute":-55,"AgraveCcaron":-55,"AgraveCcedilla":-55,"AgraveG":-55,"AgraveGbreve":-55,"AgraveGcommaaccent":-55,"AgraveO":-45,"AgraveOacute":-45,"AgraveOcircumflex":-45,"AgraveOdieresis":-45,"AgraveOgrave":-45,"AgraveOhungarumlaut":-45,"AgraveOmacron":-45,"AgraveOslash":-45,"AgraveOtilde":-45,"AgraveQ":-45,"AgraveT":-95,"AgraveTcaron":-95,"AgraveTcommaaccent":-95,"AgraveU":-50,"AgraveUacute":-50,"AgraveUcircumflex":-50,"AgraveUdieresis":-50,"AgraveUgrave":-50,"AgraveUhungarumlaut":-50,"AgraveUmacron":-50,"AgraveUogonek":-50,"AgraveUring":-50,"AgraveV":-145,"AgraveW":-130,"AgraveY":-100,"AgraveYacute":-100,"AgraveYdieresis":-100,"Agravep":-25,"Agravequoteright":-74,"Agraveu":-50,"Agraveuacute":-50,"Agraveucircumflex":-50,"Agraveudieresis":-50,"Agraveugrave":-50,"Agraveuhungarumlaut":-50,"Agraveumacron":-50,"Agraveuogonek":-50,"Agraveuring":-50,"Agravev":-100,"Agravew":-90,"Agravey":-74,"Agraveyacute":-74,"Agraveydieresis":-74,"AmacronC":-55,"AmacronCacute":-55,"AmacronCcaron":-55,"AmacronCcedilla":-55,"AmacronG":-55,"AmacronGbreve":-55,"AmacronGcommaaccent":-55,"AmacronO":-45,"AmacronOacute":-45,"AmacronOcircumflex":-45,"AmacronOdieresis":-45,"AmacronOgrave":-45,"AmacronOhungarumlaut":-45,"AmacronOmacron":-45,"AmacronOslash":-45,"AmacronOtilde":-45,"AmacronQ":-45,"AmacronT":-95,"AmacronTcaron":-95,"AmacronTcommaaccent":-95,"AmacronU":-50,"AmacronUacute":-50,"AmacronUcircumflex":-50,"AmacronUdieresis":-50,"AmacronUgrave":-50,"AmacronUhungarumlaut":-50,"AmacronUmacron":-50,"AmacronUogonek":-50,"AmacronUring":-50,"AmacronV":-145,"AmacronW":-130,"AmacronY":-100,"AmacronYacute":-100,"AmacronYdieresis":-100,"Amacronp":-25,"Amacronquoteright":-74,"Amacronu":-50,"Amacronuacute":-50,"Amacronucircumflex":-50,"Amacronudieresis":-50,"Amacronugrave":-50,"Amacronuhungarumlaut":-50,"Amacronumacron":-50,"Amacronuogonek":-50,"Amacronuring":-50,"Amacronv":-100,"Amacronw":-90,"Amacrony":-74,"Amacronyacute":-74,"Amacronydieresis":-74,"AogonekC":-55,"AogonekCacute":-55,"AogonekCcaron":-55,"AogonekCcedilla":-55,"AogonekG":-55,"AogonekGbreve":-55,"AogonekGcommaaccent":-55,"AogonekO":-45,"AogonekOacute":-45,"AogonekOcircumflex":-45,"AogonekOdieresis":-45,"AogonekOgrave":-45,"AogonekOhungarumlaut":-45,"AogonekOmacron":-45,"AogonekOslash":-45,"AogonekOtilde":-45,"AogonekQ":-45,"AogonekT":-95,"AogonekTcaron":-95,"AogonekTcommaaccent":-95,"AogonekU":-50,"AogonekUacute":-50,"AogonekUcircumflex":-50,"AogonekUdieresis":-50,"AogonekUgrave":-50,"AogonekUhungarumlaut":-50,"AogonekUmacron":-50,"AogonekUogonek":-50,"AogonekUring":-50,"AogonekV":-145,"AogonekW":-130,"AogonekY":-100,"AogonekYacute":-100,"AogonekYdieresis":-100,"Aogonekp":-25,"Aogonekquoteright":-74,"Aogoneku":-50,"Aogonekuacute":-50,"Aogonekucircumflex":-50,"Aogonekudieresis":-50,"Aogonekugrave":-50,"Aogonekuhungarumlaut":-50,"Aogonekumacron":-50,"Aogonekuogonek":-50,"Aogonekuring":-50,"Aogonekv":-100,"Aogonekw":-90,"Aogoneky":-34,"Aogonekyacute":-34,"Aogonekydieresis":-34,"AringC":-55,"AringCacute":-55,"AringCcaron":-55,"AringCcedilla":-55,"AringG":-55,"AringGbreve":-55,"AringGcommaaccent":-55,"AringO":-45,"AringOacute":-45,"AringOcircumflex":-45,"AringOdieresis":-45,"AringOgrave":-45,"AringOhungarumlaut":-45,"AringOmacron":-45,"AringOslash":-45,"AringOtilde":-45,"AringQ":-45,"AringT":-95,"AringTcaron":-95,"AringTcommaaccent":-95,"AringU":-50,"AringUacute":-50,"AringUcircumflex":-50,"AringUdieresis":-50,"AringUgrave":-50,"AringUhungarumlaut":-50,"AringUmacron":-50,"AringUogonek":-50,"AringUring":-50,"AringV":-145,"AringW":-130,"AringY":-100,"AringYacute":-100,"AringYdieresis":-100,"Aringp":-25,"Aringquoteright":-74,"Aringu":-50,"Aringuacute":-50,"Aringucircumflex":-50,"Aringudieresis":-50,"Aringugrave":-50,"Aringuhungarumlaut":-50,"Aringumacron":-50,"Aringuogonek":-50,"Aringuring":-50,"Aringv":-100,"Aringw":-90,"Aringy":-74,"Aringyacute":-74,"Aringydieresis":-74,"AtildeC":-55,"AtildeCacute":-55,"AtildeCcaron":-55,"AtildeCcedilla":-55,"AtildeG":-55,"AtildeGbreve":-55,"AtildeGcommaaccent":-55,"AtildeO":-45,"AtildeOacute":-45,"AtildeOcircumflex":-45,"AtildeOdieresis":-45,"AtildeOgrave":-45,"AtildeOhungarumlaut":-45,"AtildeOmacron":-45,"AtildeOslash":-45,"AtildeOtilde":-45,"AtildeQ":-45,"AtildeT":-95,"AtildeTcaron":-95,"AtildeTcommaaccent":-95,"AtildeU":-50,"AtildeUacute":-50,"AtildeUcircumflex":-50,"AtildeUdieresis":-50,"AtildeUgrave":-50,"AtildeUhungarumlaut":-50,"AtildeUmacron":-50,"AtildeUogonek":-50,"AtildeUring":-50,"AtildeV":-145,"AtildeW":-130,"AtildeY":-100,"AtildeYacute":-100,"AtildeYdieresis":-100,"Atildep":-25,"Atildequoteright":-74,"Atildeu":-50,"Atildeuacute":-50,"Atildeucircumflex":-50,"Atildeudieresis":-50,"Atildeugrave":-50,"Atildeuhungarumlaut":-50,"Atildeumacron":-50,"Atildeuogonek":-50,"Atildeuring":-50,"Atildev":-100,"Atildew":-90,"Atildey":-74,"Atildeyacute":-74,"Atildeydieresis":-74,"BA":-30,"BAacute":-30,"BAbreve":-30,"BAcircumflex":-30,"BAdieresis":-30,"BAgrave":-30,"BAmacron":-30,"BAogonek":-30,"BAring":-30,"BAtilde":-30,"BU":-10,"BUacute":-10,"BUcircumflex":-10,"BUdieresis":-10,"BUgrave":-10,"BUhungarumlaut":-10,"BUmacron":-10,"BUogonek":-10,"BUring":-10,"DA":-35,"DAacute":-35,"DAbreve":-35,"DAcircumflex":-35,"DAdieresis":-35,"DAgrave":-35,"DAmacron":-35,"DAogonek":-35,"DAring":-35,"DAtilde":-35,"DV":-40,"DW":-40,"DY":-40,"DYacute":-40,"DYdieresis":-40,"Dperiod":-20,"DcaronA":-35,"DcaronAacute":-35,"DcaronAbreve":-35,"DcaronAcircumflex":-35,"DcaronAdieresis":-35,"DcaronAgrave":-35,"DcaronAmacron":-35,"DcaronAogonek":-35,"DcaronAring":-35,"DcaronAtilde":-35,"DcaronV":-40,"DcaronW":-40,"DcaronY":-40,"DcaronYacute":-40,"DcaronYdieresis":-40,"Dcaronperiod":-20,"DcroatA":-35,"DcroatAacute":-35,"DcroatAbreve":-35,"DcroatAcircumflex":-35,"DcroatAdieresis":-35,"DcroatAgrave":-35,"DcroatAmacron":-35,"DcroatAogonek":-35,"DcroatAring":-35,"DcroatAtilde":-35,"DcroatV":-40,"DcroatW":-40,"DcroatY":-40,"DcroatYacute":-40,"DcroatYdieresis":-40,"Dcroatperiod":-20,"FA":-90,"FAacute":-90,"FAbreve":-90,"FAcircumflex":-90,"FAdieresis":-90,"FAgrave":-90,"FAmacron":-90,"FAogonek":-90,"FAring":-90,"FAtilde":-90,"Fa":-25,"Faacute":-25,"Fabreve":-25,"Facircumflex":-25,"Fadieresis":-25,"Fagrave":-25,"Famacron":-25,"Faogonek":-25,"Faring":-25,"Fatilde":-25,"Fcomma":-92,"Fe":-25,"Feacute":-25,"Fecaron":-25,"Fecircumflex":-25,"Fedieresis":-25,"Fedotaccent":-25,"Fegrave":-25,"Femacron":-25,"Feogonek":-25,"Fo":-25,"Foacute":-25,"Focircumflex":-25,"Fodieresis":-25,"Fograve":-25,"Fohungarumlaut":-25,"Fomacron":-25,"Foslash":-25,"Fotilde":-25,"Fperiod":-110,"JA":-30,"JAacute":-30,"JAbreve":-30,"JAcircumflex":-30,"JAdieresis":-30,"JAgrave":-30,"JAmacron":-30,"JAogonek":-30,"JAring":-30,"JAtilde":-30,"Ja":-15,"Jaacute":-15,"Jabreve":-15,"Jacircumflex":-15,"Jadieresis":-15,"Jagrave":-15,"Jamacron":-15,"Jaogonek":-15,"Jaring":-15,"Jatilde":-15,"Je":-15,"Jeacute":-15,"Jecaron":-15,"Jecircumflex":-15,"Jedieresis":-15,"Jedotaccent":-15,"Jegrave":-15,"Jemacron":-15,"Jeogonek":-15,"Jo":-15,"Joacute":-15,"Jocircumflex":-15,"Jodieresis":-15,"Jograve":-15,"Johungarumlaut":-15,"Jomacron":-15,"Joslash":-15,"Jotilde":-15,"Jperiod":-20,"Ju":-15,"Juacute":-15,"Jucircumflex":-15,"Judieresis":-15,"Jugrave":-15,"Juhungarumlaut":-15,"Jumacron":-15,"Juogonek":-15,"Juring":-15,"KO":-30,"KOacute":-30,"KOcircumflex":-30,"KOdieresis":-30,"KOgrave":-30,"KOhungarumlaut":-30,"KOmacron":-30,"KOslash":-30,"KOtilde":-30,"Ke":-25,"Keacute":-25,"Kecaron":-25,"Kecircumflex":-25,"Kedieresis":-25,"Kedotaccent":-25,"Kegrave":-25,"Kemacron":-25,"Keogonek":-25,"Ko":-25,"Koacute":-25,"Kocircumflex":-25,"Kodieresis":-25,"Kograve":-25,"Kohungarumlaut":-25,"Komacron":-25,"Koslash":-25,"Kotilde":-25,"Ku":-15,"Kuacute":-15,"Kucircumflex":-15,"Kudieresis":-15,"Kugrave":-15,"Kuhungarumlaut":-15,"Kumacron":-15,"Kuogonek":-15,"Kuring":-15,"Ky":-45,"Kyacute":-45,"Kydieresis":-45,"KcommaaccentO":-30,"KcommaaccentOacute":-30,"KcommaaccentOcircumflex":-30,"KcommaaccentOdieresis":-30,"KcommaaccentOgrave":-30,"KcommaaccentOhungarumlaut":-30,"KcommaaccentOmacron":-30,"KcommaaccentOslash":-30,"KcommaaccentOtilde":-30,"Kcommaaccente":-25,"Kcommaaccenteacute":-25,"Kcommaaccentecaron":-25,"Kcommaaccentecircumflex":-25,"Kcommaaccentedieresis":-25,"Kcommaaccentedotaccent":-25,"Kcommaaccentegrave":-25,"Kcommaaccentemacron":-25,"Kcommaaccenteogonek":-25,"Kcommaaccento":-25,"Kcommaaccentoacute":-25,"Kcommaaccentocircumflex":-25,"Kcommaaccentodieresis":-25,"Kcommaaccentograve":-25,"Kcommaaccentohungarumlaut":-25,"Kcommaaccentomacron":-25,"Kcommaaccentoslash":-25,"Kcommaaccentotilde":-25,"Kcommaaccentu":-15,"Kcommaaccentuacute":-15,"Kcommaaccentucircumflex":-15,"Kcommaaccentudieresis":-15,"Kcommaaccentugrave":-15,"Kcommaaccentuhungarumlaut":-15,"Kcommaaccentumacron":-15,"Kcommaaccentuogonek":-15,"Kcommaaccenturing":-15,"Kcommaaccenty":-45,"Kcommaaccentyacute":-45,"Kcommaaccentydieresis":-45,"LT":-92,"LTcaron":-92,"LTcommaaccent":-92,"LV":-92,"LW":-92,"LY":-92,"LYacute":-92,"LYdieresis":-92,"Lquotedblright":-20,"Lquoteright":-110,"Ly":-55,"Lyacute":-55,"Lydieresis":-55,"LacuteT":-92,"LacuteTcaron":-92,"LacuteTcommaaccent":-92,"LacuteV":-92,"LacuteW":-92,"LacuteY":-92,"LacuteYacute":-92,"LacuteYdieresis":-92,"Lacutequotedblright":-20,"Lacutequoteright":-110,"Lacutey":-55,"Lacuteyacute":-55,"Lacuteydieresis":-55,"LcommaaccentT":-92,"LcommaaccentTcaron":-92,"LcommaaccentTcommaaccent":-92,"LcommaaccentV":-92,"LcommaaccentW":-92,"LcommaaccentY":-92,"LcommaaccentYacute":-92,"LcommaaccentYdieresis":-92,"Lcommaaccentquotedblright":-20,"Lcommaaccentquoteright":-110,"Lcommaaccenty":-55,"Lcommaaccentyacute":-55,"Lcommaaccentydieresis":-55,"LslashT":-92,"LslashTcaron":-92,"LslashTcommaaccent":-92,"LslashV":-92,"LslashW":-92,"LslashY":-92,"LslashYacute":-92,"LslashYdieresis":-92,"Lslashquotedblright":-20,"Lslashquoteright":-110,"Lslashy":-55,"Lslashyacute":-55,"Lslashydieresis":-55,"NA":-20,"NAacute":-20,"NAbreve":-20,"NAcircumflex":-20,"NAdieresis":-20,"NAgrave":-20,"NAmacron":-20,"NAogonek":-20,"NAring":-20,"NAtilde":-20,"NacuteA":-20,"NacuteAacute":-20,"NacuteAbreve":-20,"NacuteAcircumflex":-20,"NacuteAdieresis":-20,"NacuteAgrave":-20,"NacuteAmacron":-20,"NacuteAogonek":-20,"NacuteAring":-20,"NacuteAtilde":-20,"NcaronA":-20,"NcaronAacute":-20,"NcaronAbreve":-20,"NcaronAcircumflex":-20,"NcaronAdieresis":-20,"NcaronAgrave":-20,"NcaronAmacron":-20,"NcaronAogonek":-20,"NcaronAring":-20,"NcaronAtilde":-20,"NcommaaccentA":-20,"NcommaaccentAacute":-20,"NcommaaccentAbreve":-20,"NcommaaccentAcircumflex":-20,"NcommaaccentAdieresis":-20,"NcommaaccentAgrave":-20,"NcommaaccentAmacron":-20,"NcommaaccentAogonek":-20,"NcommaaccentAring":-20,"NcommaaccentAtilde":-20,"NtildeA":-20,"NtildeAacute":-20,"NtildeAbreve":-20,"NtildeAcircumflex":-20,"NtildeAdieresis":-20,"NtildeAgrave":-20,"NtildeAmacron":-20,"NtildeAogonek":-20,"NtildeAring":-20,"NtildeAtilde":-20,"OA":-40,"OAacute":-40,"OAbreve":-40,"OAcircumflex":-40,"OAdieresis":-40,"OAgrave":-40,"OAmacron":-40,"OAogonek":-40,"OAring":-40,"OAtilde":-40,"OT":-40,"OTcaron":-40,"OTcommaaccent":-40,"OV":-50,"OW":-50,"OX":-40,"OY":-50,"OYacute":-50,"OYdieresis":-50,"OacuteA":-40,"OacuteAacute":-40,"OacuteAbreve":-40,"OacuteAcircumflex":-40,"OacuteAdieresis":-40,"OacuteAgrave":-40,"OacuteAmacron":-40,"OacuteAogonek":-40,"OacuteAring":-40,"OacuteAtilde":-40,"OacuteT":-40,"OacuteTcaron":-40,"OacuteTcommaaccent":-40,"OacuteV":-50,"OacuteW":-50,"OacuteX":-40,"OacuteY":-50,"OacuteYacute":-50,"OacuteYdieresis":-50,"OcircumflexA":-40,"OcircumflexAacute":-40,"OcircumflexAbreve":-40,"OcircumflexAcircumflex":-40,"OcircumflexAdieresis":-40,"OcircumflexAgrave":-40,"OcircumflexAmacron":-40,"OcircumflexAogonek":-40,"OcircumflexAring":-40,"OcircumflexAtilde":-40,"OcircumflexT":-40,"OcircumflexTcaron":-40,"OcircumflexTcommaaccent":-40,"OcircumflexV":-50,"OcircumflexW":-50,"OcircumflexX":-40,"OcircumflexY":-50,"OcircumflexYacute":-50,"OcircumflexYdieresis":-50,"OdieresisA":-40,"OdieresisAacute":-40,"OdieresisAbreve":-40,"OdieresisAcircumflex":-40,"OdieresisAdieresis":-40,"OdieresisAgrave":-40,"OdieresisAmacron":-40,"OdieresisAogonek":-40,"OdieresisAring":-40,"OdieresisAtilde":-40,"OdieresisT":-40,"OdieresisTcaron":-40,"OdieresisTcommaaccent":-40,"OdieresisV":-50,"OdieresisW":-50,"OdieresisX":-40,"OdieresisY":-50,"OdieresisYacute":-50,"OdieresisYdieresis":-50,"OgraveA":-40,"OgraveAacute":-40,"OgraveAbreve":-40,"OgraveAcircumflex":-40,"OgraveAdieresis":-40,"OgraveAgrave":-40,"OgraveAmacron":-40,"OgraveAogonek":-40,"OgraveAring":-40,"OgraveAtilde":-40,"OgraveT":-40,"OgraveTcaron":-40,"OgraveTcommaaccent":-40,"OgraveV":-50,"OgraveW":-50,"OgraveX":-40,"OgraveY":-50,"OgraveYacute":-50,"OgraveYdieresis":-50,"OhungarumlautA":-40,"OhungarumlautAacute":-40,"OhungarumlautAbreve":-40,"OhungarumlautAcircumflex":-40,"OhungarumlautAdieresis":-40,"OhungarumlautAgrave":-40,"OhungarumlautAmacron":-40,"OhungarumlautAogonek":-40,"OhungarumlautAring":-40,"OhungarumlautAtilde":-40,"OhungarumlautT":-40,"OhungarumlautTcaron":-40,"OhungarumlautTcommaaccent":-40,"OhungarumlautV":-50,"OhungarumlautW":-50,"OhungarumlautX":-40,"OhungarumlautY":-50,"OhungarumlautYacute":-50,"OhungarumlautYdieresis":-50,"OmacronA":-40,"OmacronAacute":-40,"OmacronAbreve":-40,"OmacronAcircumflex":-40,"OmacronAdieresis":-40,"OmacronAgrave":-40,"OmacronAmacron":-40,"OmacronAogonek":-40,"OmacronAring":-40,"OmacronAtilde":-40,"OmacronT":-40,"OmacronTcaron":-40,"OmacronTcommaaccent":-40,"OmacronV":-50,"OmacronW":-50,"OmacronX":-40,"OmacronY":-50,"OmacronYacute":-50,"OmacronYdieresis":-50,"OslashA":-40,"OslashAacute":-40,"OslashAbreve":-40,"OslashAcircumflex":-40,"OslashAdieresis":-40,"OslashAgrave":-40,"OslashAmacron":-40,"OslashAogonek":-40,"OslashAring":-40,"OslashAtilde":-40,"OslashT":-40,"OslashTcaron":-40,"OslashTcommaaccent":-40,"OslashV":-50,"OslashW":-50,"OslashX":-40,"OslashY":-50,"OslashYacute":-50,"OslashYdieresis":-50,"OtildeA":-40,"OtildeAacute":-40,"OtildeAbreve":-40,"OtildeAcircumflex":-40,"OtildeAdieresis":-40,"OtildeAgrave":-40,"OtildeAmacron":-40,"OtildeAogonek":-40,"OtildeAring":-40,"OtildeAtilde":-40,"OtildeT":-40,"OtildeTcaron":-40,"OtildeTcommaaccent":-40,"OtildeV":-50,"OtildeW":-50,"OtildeX":-40,"OtildeY":-50,"OtildeYacute":-50,"OtildeYdieresis":-50,"PA":-74,"PAacute":-74,"PAbreve":-74,"PAcircumflex":-74,"PAdieresis":-74,"PAgrave":-74,"PAmacron":-74,"PAogonek":-74,"PAring":-74,"PAtilde":-74,"Pa":-10,"Paacute":-10,"Pabreve":-10,"Pacircumflex":-10,"Padieresis":-10,"Pagrave":-10,"Pamacron":-10,"Paogonek":-10,"Paring":-10,"Patilde":-10,"Pcomma":-92,"Pe":-20,"Peacute":-20,"Pecaron":-20,"Pecircumflex":-20,"Pedieresis":-20,"Pedotaccent":-20,"Pegrave":-20,"Pemacron":-20,"Peogonek":-20,"Po":-20,"Poacute":-20,"Pocircumflex":-20,"Podieresis":-20,"Pograve":-20,"Pohungarumlaut":-20,"Pomacron":-20,"Poslash":-20,"Potilde":-20,"Pperiod":-110,"QU":-10,"QUacute":-10,"QUcircumflex":-10,"QUdieresis":-10,"QUgrave":-10,"QUhungarumlaut":-10,"QUmacron":-10,"QUogonek":-10,"QUring":-10,"Qperiod":-20,"RO":-30,"ROacute":-30,"ROcircumflex":-30,"ROdieresis":-30,"ROgrave":-30,"ROhungarumlaut":-30,"ROmacron":-30,"ROslash":-30,"ROtilde":-30,"RT":-40,"RTcaron":-40,"RTcommaaccent":-40,"RU":-30,"RUacute":-30,"RUcircumflex":-30,"RUdieresis":-30,"RUgrave":-30,"RUhungarumlaut":-30,"RUmacron":-30,"RUogonek":-30,"RUring":-30,"RV":-55,"RW":-35,"RY":-35,"RYacute":-35,"RYdieresis":-35,"RacuteO":-30,"RacuteOacute":-30,"RacuteOcircumflex":-30,"RacuteOdieresis":-30,"RacuteOgrave":-30,"RacuteOhungarumlaut":-30,"RacuteOmacron":-30,"RacuteOslash":-30,"RacuteOtilde":-30,"RacuteT":-40,"RacuteTcaron":-40,"RacuteTcommaaccent":-40,"RacuteU":-30,"RacuteUacute":-30,"RacuteUcircumflex":-30,"RacuteUdieresis":-30,"RacuteUgrave":-30,"RacuteUhungarumlaut":-30,"RacuteUmacron":-30,"RacuteUogonek":-30,"RacuteUring":-30,"RacuteV":-55,"RacuteW":-35,"RacuteY":-35,"RacuteYacute":-35,"RacuteYdieresis":-35,"RcaronO":-30,"RcaronOacute":-30,"RcaronOcircumflex":-30,"RcaronOdieresis":-30,"RcaronOgrave":-30,"RcaronOhungarumlaut":-30,"RcaronOmacron":-30,"RcaronOslash":-30,"RcaronOtilde":-30,"RcaronT":-40,"RcaronTcaron":-40,"RcaronTcommaaccent":-40,"RcaronU":-30,"RcaronUacute":-30,"RcaronUcircumflex":-30,"RcaronUdieresis":-30,"RcaronUgrave":-30,"RcaronUhungarumlaut":-30,"RcaronUmacron":-30,"RcaronUogonek":-30,"RcaronUring":-30,"RcaronV":-55,"RcaronW":-35,"RcaronY":-35,"RcaronYacute":-35,"RcaronYdieresis":-35,"RcommaaccentO":-30,"RcommaaccentOacute":-30,"RcommaaccentOcircumflex":-30,"RcommaaccentOdieresis":-30,"RcommaaccentOgrave":-30,"RcommaaccentOhungarumlaut":-30,"RcommaaccentOmacron":-30,"RcommaaccentOslash":-30,"RcommaaccentOtilde":-30,"RcommaaccentT":-40,"RcommaaccentTcaron":-40,"RcommaaccentTcommaaccent":-40,"RcommaaccentU":-30,"RcommaaccentUacute":-30,"RcommaaccentUcircumflex":-30,"RcommaaccentUdieresis":-30,"RcommaaccentUgrave":-30,"RcommaaccentUhungarumlaut":-30,"RcommaaccentUmacron":-30,"RcommaaccentUogonek":-30,"RcommaaccentUring":-30,"RcommaaccentV":-55,"RcommaaccentW":-35,"RcommaaccentY":-35,"RcommaaccentYacute":-35,"RcommaaccentYdieresis":-35,"TA":-90,"TAacute":-90,"TAbreve":-90,"TAcircumflex":-90,"TAdieresis":-90,"TAgrave":-90,"TAmacron":-90,"TAogonek":-90,"TAring":-90,"TAtilde":-90,"TO":-18,"TOacute":-18,"TOcircumflex":-18,"TOdieresis":-18,"TOgrave":-18,"TOhungarumlaut":-18,"TOmacron":-18,"TOslash":-18,"TOtilde":-18,"Ta":-92,"Taacute":-92,"Tabreve":-52,"Tacircumflex":-52,"Tadieresis":-52,"Tagrave":-52,"Tamacron":-52,"Taogonek":-92,"Taring":-92,"Tatilde":-52,"Tcolon":-74,"Tcomma":-74,"Te":-92,"Teacute":-92,"Tecaron":-92,"Tecircumflex":-92,"Tedieresis":-52,"Tedotaccent":-92,"Tegrave":-52,"Temacron":-52,"Teogonek":-92,"Thyphen":-92,"Ti":-18,"Tiacute":-18,"Tiogonek":-18,"To":-92,"Toacute":-92,"Tocircumflex":-92,"Todieresis":-92,"Tograve":-92,"Tohungarumlaut":-92,"Tomacron":-92,"Toslash":-92,"Totilde":-92,"Tperiod":-90,"Tr":-74,"Tracute":-74,"Trcaron":-74,"Trcommaaccent":-74,"Tsemicolon":-74,"Tu":-92,"Tuacute":-92,"Tucircumflex":-92,"Tudieresis":-92,"Tugrave":-92,"Tuhungarumlaut":-92,"Tumacron":-92,"Tuogonek":-92,"Turing":-92,"Tw":-74,"Ty":-34,"Tyacute":-34,"Tydieresis":-34,"TcaronA":-90,"TcaronAacute":-90,"TcaronAbreve":-90,"TcaronAcircumflex":-90,"TcaronAdieresis":-90,"TcaronAgrave":-90,"TcaronAmacron":-90,"TcaronAogonek":-90,"TcaronAring":-90,"TcaronAtilde":-90,"TcaronO":-18,"TcaronOacute":-18,"TcaronOcircumflex":-18,"TcaronOdieresis":-18,"TcaronOgrave":-18,"TcaronOhungarumlaut":-18,"TcaronOmacron":-18,"TcaronOslash":-18,"TcaronOtilde":-18,"Tcarona":-92,"Tcaronaacute":-92,"Tcaronabreve":-52,"Tcaronacircumflex":-52,"Tcaronadieresis":-52,"Tcaronagrave":-52,"Tcaronamacron":-52,"Tcaronaogonek":-92,"Tcaronaring":-92,"Tcaronatilde":-52,"Tcaroncolon":-74,"Tcaroncomma":-74,"Tcarone":-92,"Tcaroneacute":-92,"Tcaronecaron":-92,"Tcaronecircumflex":-92,"Tcaronedieresis":-52,"Tcaronedotaccent":-92,"Tcaronegrave":-52,"Tcaronemacron":-52,"Tcaroneogonek":-92,"Tcaronhyphen":-92,"Tcaroni":-18,"Tcaroniacute":-18,"Tcaroniogonek":-18,"Tcarono":-92,"Tcaronoacute":-92,"Tcaronocircumflex":-92,"Tcaronodieresis":-92,"Tcaronograve":-92,"Tcaronohungarumlaut":-92,"Tcaronomacron":-92,"Tcaronoslash":-92,"Tcaronotilde":-92,"Tcaronperiod":-90,"Tcaronr":-74,"Tcaronracute":-74,"Tcaronrcaron":-74,"Tcaronrcommaaccent":-74,"Tcaronsemicolon":-74,"Tcaronu":-92,"Tcaronuacute":-92,"Tcaronucircumflex":-92,"Tcaronudieresis":-92,"Tcaronugrave":-92,"Tcaronuhungarumlaut":-92,"Tcaronumacron":-92,"Tcaronuogonek":-92,"Tcaronuring":-92,"Tcaronw":-74,"Tcarony":-34,"Tcaronyacute":-34,"Tcaronydieresis":-34,"TcommaaccentA":-90,"TcommaaccentAacute":-90,"TcommaaccentAbreve":-90,"TcommaaccentAcircumflex":-90,"TcommaaccentAdieresis":-90,"TcommaaccentAgrave":-90,"TcommaaccentAmacron":-90,"TcommaaccentAogonek":-90,"TcommaaccentAring":-90,"TcommaaccentAtilde":-90,"TcommaaccentO":-18,"TcommaaccentOacute":-18,"TcommaaccentOcircumflex":-18,"TcommaaccentOdieresis":-18,"TcommaaccentOgrave":-18,"TcommaaccentOhungarumlaut":-18,"TcommaaccentOmacron":-18,"TcommaaccentOslash":-18,"TcommaaccentOtilde":-18,"Tcommaaccenta":-92,"Tcommaaccentaacute":-92,"Tcommaaccentabreve":-52,"Tcommaaccentacircumflex":-52,"Tcommaaccentadieresis":-52,"Tcommaaccentagrave":-52,"Tcommaaccentamacron":-52,"Tcommaaccentaogonek":-92,"Tcommaaccentaring":-92,"Tcommaaccentatilde":-52,"Tcommaaccentcolon":-74,"Tcommaaccentcomma":-74,"Tcommaaccente":-92,"Tcommaaccenteacute":-92,"Tcommaaccentecaron":-92,"Tcommaaccentecircumflex":-92,"Tcommaaccentedieresis":-52,"Tcommaaccentedotaccent":-92,"Tcommaaccentegrave":-52,"Tcommaaccentemacron":-52,"Tcommaaccenteogonek":-92,"Tcommaaccenthyphen":-92,"Tcommaaccenti":-18,"Tcommaaccentiacute":-18,"Tcommaaccentiogonek":-18,"Tcommaaccento":-92,"Tcommaaccentoacute":-92,"Tcommaaccentocircumflex":-92,"Tcommaaccentodieresis":-92,"Tcommaaccentograve":-92,"Tcommaaccentohungarumlaut":-92,"Tcommaaccentomacron":-92,"Tcommaaccentoslash":-92,"Tcommaaccentotilde":-92,"Tcommaaccentperiod":-90,"Tcommaaccentr":-74,"Tcommaaccentracute":-74,"Tcommaaccentrcaron":-74,"Tcommaaccentrcommaaccent":-74,"Tcommaaccentsemicolon":-74,"Tcommaaccentu":-92,"Tcommaaccentuacute":-92,"Tcommaaccentucircumflex":-92,"Tcommaaccentudieresis":-92,"Tcommaaccentugrave":-92,"Tcommaaccentuhungarumlaut":-92,"Tcommaaccentumacron":-92,"Tcommaaccentuogonek":-92,"Tcommaaccenturing":-92,"Tcommaaccentw":-74,"Tcommaaccenty":-34,"Tcommaaccentyacute":-34,"Tcommaaccentydieresis":-34,"UA":-60,"UAacute":-60,"UAbreve":-60,"UAcircumflex":-60,"UAdieresis":-60,"UAgrave":-60,"UAmacron":-60,"UAogonek":-60,"UAring":-60,"UAtilde":-60,"Ucomma":-50,"Uperiod":-50,"UacuteA":-60,"UacuteAacute":-60,"UacuteAbreve":-60,"UacuteAcircumflex":-60,"UacuteAdieresis":-60,"UacuteAgrave":-60,"UacuteAmacron":-60,"UacuteAogonek":-60,"UacuteAring":-60,"UacuteAtilde":-60,"Uacutecomma":-50,"Uacuteperiod":-50,"UcircumflexA":-60,"UcircumflexAacute":-60,"UcircumflexAbreve":-60,"UcircumflexAcircumflex":-60,"UcircumflexAdieresis":-60,"UcircumflexAgrave":-60,"UcircumflexAmacron":-60,"UcircumflexAogonek":-60,"UcircumflexAring":-60,"UcircumflexAtilde":-60,"Ucircumflexcomma":-50,"Ucircumflexperiod":-50,"UdieresisA":-60,"UdieresisAacute":-60,"UdieresisAbreve":-60,"UdieresisAcircumflex":-60,"UdieresisAdieresis":-60,"UdieresisAgrave":-60,"UdieresisAmacron":-60,"UdieresisAogonek":-60,"UdieresisAring":-60,"UdieresisAtilde":-60,"Udieresiscomma":-50,"Udieresisperiod":-50,"UgraveA":-60,"UgraveAacute":-60,"UgraveAbreve":-60,"UgraveAcircumflex":-60,"UgraveAdieresis":-60,"UgraveAgrave":-60,"UgraveAmacron":-60,"UgraveAogonek":-60,"UgraveAring":-60,"UgraveAtilde":-60,"Ugravecomma":-50,"Ugraveperiod":-50,"UhungarumlautA":-60,"UhungarumlautAacute":-60,"UhungarumlautAbreve":-60,"UhungarumlautAcircumflex":-60,"UhungarumlautAdieresis":-60,"UhungarumlautAgrave":-60,"UhungarumlautAmacron":-60,"UhungarumlautAogonek":-60,"UhungarumlautAring":-60,"UhungarumlautAtilde":-60,"Uhungarumlautcomma":-50,"Uhungarumlautperiod":-50,"UmacronA":-60,"UmacronAacute":-60,"UmacronAbreve":-60,"UmacronAcircumflex":-60,"UmacronAdieresis":-60,"UmacronAgrave":-60,"UmacronAmacron":-60,"UmacronAogonek":-60,"UmacronAring":-60,"UmacronAtilde":-60,"Umacroncomma":-50,"Umacronperiod":-50,"UogonekA":-60,"UogonekAacute":-60,"UogonekAbreve":-60,"UogonekAcircumflex":-60,"UogonekAdieresis":-60,"UogonekAgrave":-60,"UogonekAmacron":-60,"UogonekAogonek":-60,"UogonekAring":-60,"UogonekAtilde":-60,"Uogonekcomma":-50,"Uogonekperiod":-50,"UringA":-60,"UringAacute":-60,"UringAbreve":-60,"UringAcircumflex":-60,"UringAdieresis":-60,"UringAgrave":-60,"UringAmacron":-60,"UringAogonek":-60,"UringAring":-60,"UringAtilde":-60,"Uringcomma":-50,"Uringperiod":-50,"VA":-135,"VAacute":-135,"VAbreve":-135,"VAcircumflex":-135,"VAdieresis":-135,"VAgrave":-135,"VAmacron":-135,"VAogonek":-135,"VAring":-135,"VAtilde":-135,"VG":-30,"VGbreve":-30,"VGcommaaccent":-30,"VO":-45,"VOacute":-45,"VOcircumflex":-45,"VOdieresis":-45,"VOgrave":-45,"VOhungarumlaut":-45,"VOmacron":-45,"VOslash":-45,"VOtilde":-45,"Va":-92,"Vaacute":-92,"Vabreve":-92,"Vacircumflex":-92,"Vadieresis":-92,"Vagrave":-92,"Vamacron":-92,"Vaogonek":-92,"Varing":-92,"Vatilde":-92,"Vcolon":-92,"Vcomma":-129,"Ve":-100,"Veacute":-100,"Vecaron":-100,"Vecircumflex":-100,"Vedieresis":-100,"Vedotaccent":-100,"Vegrave":-100,"Vemacron":-100,"Veogonek":-100,"Vhyphen":-74,"Vi":-37,"Viacute":-37,"Vicircumflex":-37,"Vidieresis":-37,"Vigrave":-37,"Vimacron":-37,"Viogonek":-37,"Vo":-100,"Voacute":-100,"Vocircumflex":-100,"Vodieresis":-100,"Vograve":-100,"Vohungarumlaut":-100,"Vomacron":-100,"Voslash":-100,"Votilde":-100,"Vperiod":-145,"Vsemicolon":-92,"Vu":-92,"Vuacute":-92,"Vucircumflex":-92,"Vudieresis":-92,"Vugrave":-92,"Vuhungarumlaut":-92,"Vumacron":-92,"Vuogonek":-92,"Vuring":-92,"WA":-120,"WAacute":-120,"WAbreve":-120,"WAcircumflex":-120,"WAdieresis":-120,"WAgrave":-120,"WAmacron":-120,"WAogonek":-120,"WAring":-120,"WAtilde":-120,"WO":-10,"WOacute":-10,"WOcircumflex":-10,"WOdieresis":-10,"WOgrave":-10,"WOhungarumlaut":-10,"WOmacron":-10,"WOslash":-10,"WOtilde":-10,"Wa":-65,"Waacute":-65,"Wabreve":-65,"Wacircumflex":-65,"Wadieresis":-65,"Wagrave":-65,"Wamacron":-65,"Waogonek":-65,"Waring":-65,"Watilde":-65,"Wcolon":-55,"Wcomma":-92,"We":-65,"Weacute":-65,"Wecaron":-65,"Wecircumflex":-65,"Wedieresis":-65,"Wedotaccent":-65,"Wegrave":-65,"Wemacron":-65,"Weogonek":-65,"Whyphen":-37,"Wi":-18,"Wiacute":-18,"Wiogonek":-18,"Wo":-75,"Woacute":-75,"Wocircumflex":-75,"Wodieresis":-75,"Wograve":-75,"Wohungarumlaut":-75,"Womacron":-75,"Woslash":-75,"Wotilde":-75,"Wperiod":-92,"Wsemicolon":-55,"Wu":-50,"Wuacute":-50,"Wucircumflex":-50,"Wudieresis":-50,"Wugrave":-50,"Wuhungarumlaut":-50,"Wumacron":-50,"Wuogonek":-50,"Wuring":-50,"Wy":-60,"Wyacute":-60,"Wydieresis":-60,"YA":-110,"YAacute":-110,"YAbreve":-110,"YAcircumflex":-110,"YAdieresis":-110,"YAgrave":-110,"YAmacron":-110,"YAogonek":-110,"YAring":-110,"YAtilde":-110,"YO":-35,"YOacute":-35,"YOcircumflex":-35,"YOdieresis":-35,"YOgrave":-35,"YOhungarumlaut":-35,"YOmacron":-35,"YOslash":-35,"YOtilde":-35,"Ya":-85,"Yaacute":-85,"Yabreve":-85,"Yacircumflex":-85,"Yadieresis":-85,"Yagrave":-85,"Yamacron":-85,"Yaogonek":-85,"Yaring":-85,"Yatilde":-85,"Ycolon":-92,"Ycomma":-92,"Ye":-111,"Yeacute":-111,"Yecaron":-111,"Yecircumflex":-111,"Yedieresis":-71,"Yedotaccent":-111,"Yegrave":-71,"Yemacron":-71,"Yeogonek":-111,"Yhyphen":-92,"Yi":-37,"Yiacute":-37,"Yiogonek":-37,"Yo":-111,"Yoacute":-111,"Yocircumflex":-111,"Yodieresis":-111,"Yograve":-111,"Yohungarumlaut":-111,"Yomacron":-111,"Yoslash":-111,"Yotilde":-111,"Yperiod":-92,"Ysemicolon":-92,"Yu":-92,"Yuacute":-92,"Yucircumflex":-92,"Yudieresis":-92,"Yugrave":-92,"Yuhungarumlaut":-92,"Yumacron":-92,"Yuogonek":-92,"Yuring":-92,"YacuteA":-110,"YacuteAacute":-110,"YacuteAbreve":-110,"YacuteAcircumflex":-110,"YacuteAdieresis":-110,"YacuteAgrave":-110,"YacuteAmacron":-110,"YacuteAogonek":-110,"YacuteAring":-110,"YacuteAtilde":-110,"YacuteO":-35,"YacuteOacute":-35,"YacuteOcircumflex":-35,"YacuteOdieresis":-35,"YacuteOgrave":-35,"YacuteOhungarumlaut":-35,"YacuteOmacron":-35,"YacuteOslash":-35,"YacuteOtilde":-35,"Yacutea":-85,"Yacuteaacute":-85,"Yacuteabreve":-85,"Yacuteacircumflex":-85,"Yacuteadieresis":-85,"Yacuteagrave":-85,"Yacuteamacron":-85,"Yacuteaogonek":-85,"Yacutearing":-85,"Yacuteatilde":-85,"Yacutecolon":-92,"Yacutecomma":-92,"Yacutee":-111,"Yacuteeacute":-111,"Yacuteecaron":-111,"Yacuteecircumflex":-111,"Yacuteedieresis":-71,"Yacuteedotaccent":-111,"Yacuteegrave":-71,"Yacuteemacron":-71,"Yacuteeogonek":-111,"Yacutehyphen":-92,"Yacutei":-37,"Yacuteiacute":-37,"Yacuteiogonek":-37,"Yacuteo":-111,"Yacuteoacute":-111,"Yacuteocircumflex":-111,"Yacuteodieresis":-111,"Yacuteograve":-111,"Yacuteohungarumlaut":-111,"Yacuteomacron":-111,"Yacuteoslash":-111,"Yacuteotilde":-111,"Yacuteperiod":-92,"Yacutesemicolon":-92,"Yacuteu":-92,"Yacuteuacute":-92,"Yacuteucircumflex":-92,"Yacuteudieresis":-92,"Yacuteugrave":-92,"Yacuteuhungarumlaut":-92,"Yacuteumacron":-92,"Yacuteuogonek":-92,"Yacuteuring":-92,"YdieresisA":-110,"YdieresisAacute":-110,"YdieresisAbreve":-110,"YdieresisAcircumflex":-110,"YdieresisAdieresis":-110,"YdieresisAgrave":-110,"YdieresisAmacron":-110,"YdieresisAogonek":-110,"YdieresisAring":-110,"YdieresisAtilde":-110,"YdieresisO":-35,"YdieresisOacute":-35,"YdieresisOcircumflex":-35,"YdieresisOdieresis":-35,"YdieresisOgrave":-35,"YdieresisOhungarumlaut":-35,"YdieresisOmacron":-35,"YdieresisOslash":-35,"YdieresisOtilde":-35,"Ydieresisa":-85,"Ydieresisaacute":-85,"Ydieresisabreve":-85,"Ydieresisacircumflex":-85,"Ydieresisadieresis":-85,"Ydieresisagrave":-85,"Ydieresisamacron":-85,"Ydieresisaogonek":-85,"Ydieresisaring":-85,"Ydieresisatilde":-85,"Ydieresiscolon":-92,"Ydieresiscomma":-92,"Ydieresise":-111,"Ydieresiseacute":-111,"Ydieresisecaron":-111,"Ydieresisecircumflex":-111,"Ydieresisedieresis":-71,"Ydieresisedotaccent":-111,"Ydieresisegrave":-71,"Ydieresisemacron":-71,"Ydieresiseogonek":-111,"Ydieresishyphen":-92,"Ydieresisi":-37,"Ydieresisiacute":-37,"Ydieresisiogonek":-37,"Ydieresiso":-111,"Ydieresisoacute":-111,"Ydieresisocircumflex":-111,"Ydieresisodieresis":-111,"Ydieresisograve":-111,"Ydieresisohungarumlaut":-111,"Ydieresisomacron":-111,"Ydieresisoslash":-111,"Ydieresisotilde":-111,"Ydieresisperiod":-92,"Ydieresissemicolon":-92,"Ydieresisu":-92,"Ydieresisuacute":-92,"Ydieresisucircumflex":-92,"Ydieresisudieresis":-92,"Ydieresisugrave":-92,"Ydieresisuhungarumlaut":-92,"Ydieresisumacron":-92,"Ydieresisuogonek":-92,"Ydieresisuring":-92,"av":-25,"aacutev":-25,"abrevev":-25,"acircumflexv":-25,"adieresisv":-25,"agravev":-25,"amacronv":-25,"aogonekv":-25,"aringv":-25,"atildev":-25,"bb":-10,"bperiod":-40,"bu":-20,"buacute":-20,"bucircumflex":-20,"budieresis":-20,"bugrave":-20,"buhungarumlaut":-20,"bumacron":-20,"buogonek":-20,"buring":-20,"bv":-15,"commaquotedblright":-45,"commaquoteright":-55,"dw":-15,"dcroatw":-15,"ev":-15,"eacutev":-15,"ecaronv":-15,"ecircumflexv":-15,"edieresisv":-15,"edotaccentv":-15,"egravev":-15,"emacronv":-15,"eogonekv":-15,"fcomma":-15,"fdotlessi":-35,"fi":-25,"fo":-25,"foacute":-25,"focircumflex":-25,"fodieresis":-25,"fograve":-25,"fohungarumlaut":-25,"fomacron":-25,"foslash":-25,"fotilde":-25,"fperiod":-15,"fquotedblright":50,"fquoteright":55,"gperiod":-15,"gbreveperiod":-15,"gcommaaccentperiod":-15,"hy":-15,"hyacute":-15,"hydieresis":-15,"iv":-10,"iacutev":-10,"icircumflexv":-10,"idieresisv":-10,"igravev":-10,"imacronv":-10,"iogonekv":-10,"ke":-10,"keacute":-10,"kecaron":-10,"kecircumflex":-10,"kedieresis":-10,"kedotaccent":-10,"kegrave":-10,"kemacron":-10,"keogonek":-10,"ko":-15,"koacute":-15,"kocircumflex":-15,"kodieresis":-15,"kograve":-15,"kohungarumlaut":-15,"komacron":-15,"koslash":-15,"kotilde":-15,"ky":-15,"kyacute":-15,"kydieresis":-15,"kcommaaccente":-10,"kcommaaccenteacute":-10,"kcommaaccentecaron":-10,"kcommaaccentecircumflex":-10,"kcommaaccentedieresis":-10,"kcommaaccentedotaccent":-10,"kcommaaccentegrave":-10,"kcommaaccentemacron":-10,"kcommaaccenteogonek":-10,"kcommaaccento":-15,"kcommaaccentoacute":-15,"kcommaaccentocircumflex":-15,"kcommaaccentodieresis":-15,"kcommaaccentograve":-15,"kcommaaccentohungarumlaut":-15,"kcommaaccentomacron":-15,"kcommaaccentoslash":-15,"kcommaaccentotilde":-15,"kcommaaccenty":-15,"kcommaaccentyacute":-15,"kcommaaccentydieresis":-15,"nv":-40,"nacutev":-40,"ncaronv":-40,"ncommaaccentv":-40,"ntildev":-40,"ov":-10,"ow":-10,"oacutev":-10,"oacutew":-10,"ocircumflexv":-10,"ocircumflexw":-10,"odieresisv":-10,"odieresisw":-10,"ogravev":-10,"ogravew":-10,"ohungarumlautv":-10,"ohungarumlautw":-10,"omacronv":-10,"omacronw":-10,"oslashv":-10,"oslashw":-10,"otildev":-10,"otildew":-10,"periodquotedblright":-55,"periodquoteright":-55,"quotedblleftA":-10,"quotedblleftAacute":-10,"quotedblleftAbreve":-10,"quotedblleftAcircumflex":-10,"quotedblleftAdieresis":-10,"quotedblleftAgrave":-10,"quotedblleftAmacron":-10,"quotedblleftAogonek":-10,"quotedblleftAring":-10,"quotedblleftAtilde":-10,"quoteleftA":-10,"quoteleftAacute":-10,"quoteleftAbreve":-10,"quoteleftAcircumflex":-10,"quoteleftAdieresis":-10,"quoteleftAgrave":-10,"quoteleftAmacron":-10,"quoteleftAogonek":-10,"quoteleftAring":-10,"quoteleftAtilde":-10,"quoteleftquoteleft":-63,"quoterightd":-20,"quoterightdcroat":-20,"quoterightquoteright":-63,"quoterightr":-20,"quoterightracute":-20,"quoterightrcaron":-20,"quoterightrcommaaccent":-20,"quoterights":-37,"quoterightsacute":-37,"quoterightscaron":-37,"quoterightscedilla":-37,"quoterightscommaaccent":-37,"quoterightspace":-74,"quoterightv":-20,"rc":-18,"rcacute":-18,"rccaron":-18,"rccedilla":-18,"rcomma":-92,"re":-18,"reacute":-18,"recaron":-18,"recircumflex":-18,"redieresis":-18,"redotaccent":-18,"regrave":-18,"remacron":-18,"reogonek":-18,"rg":-10,"rgbreve":-10,"rgcommaaccent":-10,"rhyphen":-37,"rn":-15,"rnacute":-15,"rncaron":-15,"rncommaaccent":-15,"rntilde":-15,"ro":-18,"roacute":-18,"rocircumflex":-18,"rodieresis":-18,"rograve":-18,"rohungarumlaut":-18,"romacron":-18,"roslash":-18,"rotilde":-18,"rp":-10,"rperiod":-100,"rq":-18,"rv":-10,"racutec":-18,"racutecacute":-18,"racuteccaron":-18,"racuteccedilla":-18,"racutecomma":-92,"racutee":-18,"racuteeacute":-18,"racuteecaron":-18,"racuteecircumflex":-18,"racuteedieresis":-18,"racuteedotaccent":-18,"racuteegrave":-18,"racuteemacron":-18,"racuteeogonek":-18,"racuteg":-10,"racutegbreve":-10,"racutegcommaaccent":-10,"racutehyphen":-37,"racuten":-15,"racutenacute":-15,"racutencaron":-15,"racutencommaaccent":-15,"racutentilde":-15,"racuteo":-18,"racuteoacute":-18,"racuteocircumflex":-18,"racuteodieresis":-18,"racuteograve":-18,"racuteohungarumlaut":-18,"racuteomacron":-18,"racuteoslash":-18,"racuteotilde":-18,"racutep":-10,"racuteperiod":-100,"racuteq":-18,"racutev":-10,"rcaronc":-18,"rcaroncacute":-18,"rcaronccaron":-18,"rcaronccedilla":-18,"rcaroncomma":-92,"rcarone":-18,"rcaroneacute":-18,"rcaronecaron":-18,"rcaronecircumflex":-18,"rcaronedieresis":-18,"rcaronedotaccent":-18,"rcaronegrave":-18,"rcaronemacron":-18,"rcaroneogonek":-18,"rcarong":-10,"rcarongbreve":-10,"rcarongcommaaccent":-10,"rcaronhyphen":-37,"rcaronn":-15,"rcaronnacute":-15,"rcaronncaron":-15,"rcaronncommaaccent":-15,"rcaronntilde":-15,"rcarono":-18,"rcaronoacute":-18,"rcaronocircumflex":-18,"rcaronodieresis":-18,"rcaronograve":-18,"rcaronohungarumlaut":-18,"rcaronomacron":-18,"rcaronoslash":-18,"rcaronotilde":-18,"rcaronp":-10,"rcaronperiod":-100,"rcaronq":-18,"rcaronv":-10,"rcommaaccentc":-18,"rcommaaccentcacute":-18,"rcommaaccentccaron":-18,"rcommaaccentccedilla":-18,"rcommaaccentcomma":-92,"rcommaaccente":-18,"rcommaaccenteacute":-18,"rcommaaccentecaron":-18,"rcommaaccentecircumflex":-18,"rcommaaccentedieresis":-18,"rcommaaccentedotaccent":-18,"rcommaaccentegrave":-18,"rcommaaccentemacron":-18,"rcommaaccenteogonek":-18,"rcommaaccentg":-10,"rcommaaccentgbreve":-10,"rcommaaccentgcommaaccent":-10,"rcommaaccenthyphen":-37,"rcommaaccentn":-15,"rcommaaccentnacute":-15,"rcommaaccentncaron":-15,"rcommaaccentncommaaccent":-15,"rcommaaccentntilde":-15,"rcommaaccento":-18,"rcommaaccentoacute":-18,"rcommaaccentocircumflex":-18,"rcommaaccentodieresis":-18,"rcommaaccentograve":-18,"rcommaaccentohungarumlaut":-18,"rcommaaccentomacron":-18,"rcommaaccentoslash":-18,"rcommaaccentotilde":-18,"rcommaaccentp":-10,"rcommaaccentperiod":-100,"rcommaaccentq":-18,"rcommaaccentv":-10,"spaceA":-55,"spaceAacute":-55,"spaceAbreve":-55,"spaceAcircumflex":-55,"spaceAdieresis":-55,"spaceAgrave":-55,"spaceAmacron":-55,"spaceAogonek":-55,"spaceAring":-55,"spaceAtilde":-55,"spaceT":-30,"spaceTcaron":-30,"spaceTcommaaccent":-30,"spaceV":-45,"spaceW":-30,"spaceY":-55,"spaceYacute":-55,"spaceYdieresis":-55,"va":-10,"vaacute":-10,"vabreve":-10,"vacircumflex":-10,"vadieresis":-10,"vagrave":-10,"vamacron":-10,"vaogonek":-10,"varing":-10,"vatilde":-10,"vcomma":-55,"ve":-10,"veacute":-10,"vecaron":-10,"vecircumflex":-10,"vedieresis":-10,"vedotaccent":-10,"vegrave":-10,"vemacron":-10,"veogonek":-10,"vo":-10,"voacute":-10,"vocircumflex":-10,"vodieresis":-10,"vograve":-10,"vohungarumlaut":-10,"vomacron":-10,"voslash":-10,"votilde":-10,"vperiod":-70,"wcomma":-55,"wo":-10,"woacute":-10,"wocircumflex":-10,"wodieresis":-10,"wograve":-10,"wohungarumlaut":-10,"womacron":-10,"woslash":-10,"wotilde":-10,"wperiod":-70,"ycomma":-55,"ye":-10,"yeacute":-10,"yecaron":-10,"yecircumflex":-10,"yedieresis":-10,"yedotaccent":-10,"yegrave":-10,"yemacron":-10,"yeogonek":-10,"yo":-25,"yoacute":-25,"yocircumflex":-25,"yodieresis":-25,"yograve":-25,"yohungarumlaut":-25,"yomacron":-25,"yoslash":-25,"yotilde":-25,"yperiod":-70,"yacutecomma":-55,"yacutee":-10,"yacuteeacute":-10,"yacuteecaron":-10,"yacuteecircumflex":-10,"yacuteedieresis":-10,"yacuteedotaccent":-10,"yacuteegrave":-10,"yacuteemacron":-10,"yacuteeogonek":-10,"yacuteo":-25,"yacuteoacute":-25,"yacuteocircumflex":-25,"yacuteodieresis":-25,"yacuteograve":-25,"yacuteohungarumlaut":-25,"yacuteomacron":-25,"yacuteoslash":-25,"yacuteotilde":-25,"yacuteperiod":-70,"ydieresiscomma":-55,"ydieresise":-10,"ydieresiseacute":-10,"ydieresisecaron":-10,"ydieresisecircumflex":-10,"ydieresisedieresis":-10,"ydieresisedotaccent":-10,"ydieresisegrave":-10,"ydieresisemacron":-10,"ydieresiseogonek":-10,"ydieresiso":-25,"ydieresisoacute":-25,"ydieresisocircumflex":-25,"ydieresisodieresis":-25,"ydieresisograve":-25,"ydieresisohungarumlaut":-25,"ydieresisomacron":-25,"ydieresisoslash":-25,"ydieresisotilde":-25,"ydieresisperiod":-70}} \ No newline at end of file diff --git a/packages/pdfkit/src/font/data/Times-BoldItalic.json b/packages/pdfkit/src/font/data/Times-BoldItalic.json deleted file mode 100644 index 902869543..000000000 --- a/packages/pdfkit/src/font/data/Times-BoldItalic.json +++ /dev/null @@ -1 +0,0 @@ -{"attributes":{"Comment":["Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.","Creation Date: Thu May 1 13:04:06 1997","UniqueID 43066","VMusage 45874 56899"],"FontName":"Times-BoldItalic","FullName":"Times Bold Italic","FamilyName":"Times","Weight":"Bold","ItalicAngle":"-15","IsFixedPitch":"false","CharacterSet":"ExtendedRoman","FontBBox":"-200 -218 996 921","UnderlinePosition":"-100","UnderlineThickness":"50","Version":"002.000","Notice":"Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries.","EncodingScheme":"AdobeStandardEncoding","CapHeight":"669","XHeight":"462","Ascender":"683","Descender":"-217","StdHW":"42","StdVW":"121"},"glyphWidths":{"space":250,"exclam":389,"quotedbl":555,"numbersign":500,"dollar":500,"percent":833,"ampersand":778,"quoteright":333,"parenleft":333,"parenright":333,"asterisk":500,"plus":570,"comma":250,"hyphen":333,"period":250,"slash":278,"zero":500,"one":500,"two":500,"three":500,"four":500,"five":500,"six":500,"seven":500,"eight":500,"nine":500,"colon":333,"semicolon":333,"less":570,"equal":570,"greater":570,"question":500,"at":832,"A":667,"B":667,"C":667,"D":722,"E":667,"F":667,"G":722,"H":778,"I":389,"J":500,"K":667,"L":611,"M":889,"N":722,"O":722,"P":611,"Q":722,"R":667,"S":556,"T":611,"U":722,"V":667,"W":889,"X":667,"Y":611,"Z":611,"bracketleft":333,"backslash":278,"bracketright":333,"asciicircum":570,"underscore":500,"quoteleft":333,"a":500,"b":500,"c":444,"d":500,"e":444,"f":333,"g":500,"h":556,"i":278,"j":278,"k":500,"l":278,"m":778,"n":556,"o":500,"p":500,"q":500,"r":389,"s":389,"t":278,"u":556,"v":444,"w":667,"x":500,"y":444,"z":389,"braceleft":348,"bar":220,"braceright":348,"asciitilde":570,"exclamdown":389,"cent":500,"sterling":500,"fraction":167,"yen":500,"florin":500,"section":500,"currency":500,"quotesingle":278,"quotedblleft":500,"guillemotleft":500,"guilsinglleft":333,"guilsinglright":333,"fi":556,"fl":556,"endash":500,"dagger":500,"daggerdbl":500,"periodcentered":250,"paragraph":500,"bullet":350,"quotesinglbase":333,"quotedblbase":500,"quotedblright":500,"guillemotright":500,"ellipsis":1000,"perthousand":1000,"questiondown":500,"grave":333,"acute":333,"circumflex":333,"tilde":333,"macron":333,"breve":333,"dotaccent":333,"dieresis":333,"ring":333,"cedilla":333,"hungarumlaut":333,"ogonek":333,"caron":333,"emdash":1000,"AE":944,"ordfeminine":266,"Lslash":611,"Oslash":722,"OE":944,"ordmasculine":300,"ae":722,"dotlessi":278,"lslash":278,"oslash":500,"oe":722,"germandbls":500,"Idieresis":389,"eacute":444,"abreve":500,"uhungarumlaut":556,"ecaron":444,"Ydieresis":611,"divide":570,"Yacute":611,"Acircumflex":667,"aacute":500,"Ucircumflex":722,"yacute":444,"scommaaccent":389,"ecircumflex":444,"Uring":722,"Udieresis":722,"aogonek":500,"Uacute":722,"uogonek":556,"Edieresis":667,"Dcroat":722,"commaaccent":250,"copyright":747,"Emacron":667,"ccaron":444,"aring":500,"Ncommaaccent":722,"lacute":278,"agrave":500,"Tcommaaccent":611,"Cacute":667,"atilde":500,"Edotaccent":667,"scaron":389,"scedilla":389,"iacute":278,"lozenge":494,"Rcaron":667,"Gcommaaccent":722,"ucircumflex":556,"acircumflex":500,"Amacron":667,"rcaron":389,"ccedilla":444,"Zdotaccent":611,"Thorn":611,"Omacron":722,"Racute":667,"Sacute":556,"dcaron":608,"Umacron":722,"uring":556,"threesuperior":300,"Ograve":722,"Agrave":667,"Abreve":667,"multiply":570,"uacute":556,"Tcaron":611,"partialdiff":494,"ydieresis":444,"Nacute":722,"icircumflex":278,"Ecircumflex":667,"adieresis":500,"edieresis":444,"cacute":444,"nacute":556,"umacron":556,"Ncaron":722,"Iacute":389,"plusminus":570,"brokenbar":220,"registered":747,"Gbreve":722,"Idotaccent":389,"summation":600,"Egrave":667,"racute":389,"omacron":500,"Zacute":611,"Zcaron":611,"greaterequal":549,"Eth":722,"Ccedilla":667,"lcommaaccent":278,"tcaron":366,"eogonek":444,"Uogonek":722,"Aacute":667,"Adieresis":667,"egrave":444,"zacute":389,"iogonek":278,"Oacute":722,"oacute":500,"amacron":500,"sacute":389,"idieresis":278,"Ocircumflex":722,"Ugrave":722,"Delta":612,"thorn":500,"twosuperior":300,"Odieresis":722,"mu":576,"igrave":278,"ohungarumlaut":500,"Eogonek":667,"dcroat":500,"threequarters":750,"Scedilla":556,"lcaron":382,"Kcommaaccent":667,"Lacute":611,"trademark":1000,"edotaccent":444,"Igrave":389,"Imacron":389,"Lcaron":611,"onehalf":750,"lessequal":549,"ocircumflex":500,"ntilde":556,"Uhungarumlaut":722,"Eacute":667,"emacron":444,"gbreve":500,"onequarter":750,"Scaron":556,"Scommaaccent":556,"Ohungarumlaut":722,"degree":400,"ograve":500,"Ccaron":667,"ugrave":556,"radical":549,"Dcaron":722,"rcommaaccent":389,"Ntilde":722,"otilde":500,"Rcommaaccent":667,"Lcommaaccent":611,"Atilde":667,"Aogonek":667,"Aring":667,"Otilde":722,"zdotaccent":389,"Ecaron":667,"Iogonek":389,"kcommaaccent":500,"minus":606,"Icircumflex":389,"ncaron":556,"tcommaaccent":278,"logicalnot":606,"odieresis":500,"udieresis":556,"notequal":549,"gcommaaccent":500,"eth":500,"zcaron":389,"ncommaaccent":556,"onesuperior":300,"imacron":278,"Euro":500},"kernPairs":{"AC":-65,"ACacute":-65,"ACcaron":-65,"ACcedilla":-65,"AG":-60,"AGbreve":-60,"AGcommaaccent":-60,"AO":-50,"AOacute":-50,"AOcircumflex":-50,"AOdieresis":-50,"AOgrave":-50,"AOhungarumlaut":-50,"AOmacron":-50,"AOslash":-50,"AOtilde":-50,"AQ":-55,"AT":-55,"ATcaron":-55,"ATcommaaccent":-55,"AU":-50,"AUacute":-50,"AUcircumflex":-50,"AUdieresis":-50,"AUgrave":-50,"AUhungarumlaut":-50,"AUmacron":-50,"AUogonek":-50,"AUring":-50,"AV":-95,"AW":-100,"AY":-70,"AYacute":-70,"AYdieresis":-70,"Aquoteright":-74,"Au":-30,"Auacute":-30,"Aucircumflex":-30,"Audieresis":-30,"Augrave":-30,"Auhungarumlaut":-30,"Aumacron":-30,"Auogonek":-30,"Auring":-30,"Av":-74,"Aw":-74,"Ay":-74,"Ayacute":-74,"Aydieresis":-74,"AacuteC":-65,"AacuteCacute":-65,"AacuteCcaron":-65,"AacuteCcedilla":-65,"AacuteG":-60,"AacuteGbreve":-60,"AacuteGcommaaccent":-60,"AacuteO":-50,"AacuteOacute":-50,"AacuteOcircumflex":-50,"AacuteOdieresis":-50,"AacuteOgrave":-50,"AacuteOhungarumlaut":-50,"AacuteOmacron":-50,"AacuteOslash":-50,"AacuteOtilde":-50,"AacuteQ":-55,"AacuteT":-55,"AacuteTcaron":-55,"AacuteTcommaaccent":-55,"AacuteU":-50,"AacuteUacute":-50,"AacuteUcircumflex":-50,"AacuteUdieresis":-50,"AacuteUgrave":-50,"AacuteUhungarumlaut":-50,"AacuteUmacron":-50,"AacuteUogonek":-50,"AacuteUring":-50,"AacuteV":-95,"AacuteW":-100,"AacuteY":-70,"AacuteYacute":-70,"AacuteYdieresis":-70,"Aacutequoteright":-74,"Aacuteu":-30,"Aacuteuacute":-30,"Aacuteucircumflex":-30,"Aacuteudieresis":-30,"Aacuteugrave":-30,"Aacuteuhungarumlaut":-30,"Aacuteumacron":-30,"Aacuteuogonek":-30,"Aacuteuring":-30,"Aacutev":-74,"Aacutew":-74,"Aacutey":-74,"Aacuteyacute":-74,"Aacuteydieresis":-74,"AbreveC":-65,"AbreveCacute":-65,"AbreveCcaron":-65,"AbreveCcedilla":-65,"AbreveG":-60,"AbreveGbreve":-60,"AbreveGcommaaccent":-60,"AbreveO":-50,"AbreveOacute":-50,"AbreveOcircumflex":-50,"AbreveOdieresis":-50,"AbreveOgrave":-50,"AbreveOhungarumlaut":-50,"AbreveOmacron":-50,"AbreveOslash":-50,"AbreveOtilde":-50,"AbreveQ":-55,"AbreveT":-55,"AbreveTcaron":-55,"AbreveTcommaaccent":-55,"AbreveU":-50,"AbreveUacute":-50,"AbreveUcircumflex":-50,"AbreveUdieresis":-50,"AbreveUgrave":-50,"AbreveUhungarumlaut":-50,"AbreveUmacron":-50,"AbreveUogonek":-50,"AbreveUring":-50,"AbreveV":-95,"AbreveW":-100,"AbreveY":-70,"AbreveYacute":-70,"AbreveYdieresis":-70,"Abrevequoteright":-74,"Abreveu":-30,"Abreveuacute":-30,"Abreveucircumflex":-30,"Abreveudieresis":-30,"Abreveugrave":-30,"Abreveuhungarumlaut":-30,"Abreveumacron":-30,"Abreveuogonek":-30,"Abreveuring":-30,"Abrevev":-74,"Abrevew":-74,"Abrevey":-74,"Abreveyacute":-74,"Abreveydieresis":-74,"AcircumflexC":-65,"AcircumflexCacute":-65,"AcircumflexCcaron":-65,"AcircumflexCcedilla":-65,"AcircumflexG":-60,"AcircumflexGbreve":-60,"AcircumflexGcommaaccent":-60,"AcircumflexO":-50,"AcircumflexOacute":-50,"AcircumflexOcircumflex":-50,"AcircumflexOdieresis":-50,"AcircumflexOgrave":-50,"AcircumflexOhungarumlaut":-50,"AcircumflexOmacron":-50,"AcircumflexOslash":-50,"AcircumflexOtilde":-50,"AcircumflexQ":-55,"AcircumflexT":-55,"AcircumflexTcaron":-55,"AcircumflexTcommaaccent":-55,"AcircumflexU":-50,"AcircumflexUacute":-50,"AcircumflexUcircumflex":-50,"AcircumflexUdieresis":-50,"AcircumflexUgrave":-50,"AcircumflexUhungarumlaut":-50,"AcircumflexUmacron":-50,"AcircumflexUogonek":-50,"AcircumflexUring":-50,"AcircumflexV":-95,"AcircumflexW":-100,"AcircumflexY":-70,"AcircumflexYacute":-70,"AcircumflexYdieresis":-70,"Acircumflexquoteright":-74,"Acircumflexu":-30,"Acircumflexuacute":-30,"Acircumflexucircumflex":-30,"Acircumflexudieresis":-30,"Acircumflexugrave":-30,"Acircumflexuhungarumlaut":-30,"Acircumflexumacron":-30,"Acircumflexuogonek":-30,"Acircumflexuring":-30,"Acircumflexv":-74,"Acircumflexw":-74,"Acircumflexy":-74,"Acircumflexyacute":-74,"Acircumflexydieresis":-74,"AdieresisC":-65,"AdieresisCacute":-65,"AdieresisCcaron":-65,"AdieresisCcedilla":-65,"AdieresisG":-60,"AdieresisGbreve":-60,"AdieresisGcommaaccent":-60,"AdieresisO":-50,"AdieresisOacute":-50,"AdieresisOcircumflex":-50,"AdieresisOdieresis":-50,"AdieresisOgrave":-50,"AdieresisOhungarumlaut":-50,"AdieresisOmacron":-50,"AdieresisOslash":-50,"AdieresisOtilde":-50,"AdieresisQ":-55,"AdieresisT":-55,"AdieresisTcaron":-55,"AdieresisTcommaaccent":-55,"AdieresisU":-50,"AdieresisUacute":-50,"AdieresisUcircumflex":-50,"AdieresisUdieresis":-50,"AdieresisUgrave":-50,"AdieresisUhungarumlaut":-50,"AdieresisUmacron":-50,"AdieresisUogonek":-50,"AdieresisUring":-50,"AdieresisV":-95,"AdieresisW":-100,"AdieresisY":-70,"AdieresisYacute":-70,"AdieresisYdieresis":-70,"Adieresisquoteright":-74,"Adieresisu":-30,"Adieresisuacute":-30,"Adieresisucircumflex":-30,"Adieresisudieresis":-30,"Adieresisugrave":-30,"Adieresisuhungarumlaut":-30,"Adieresisumacron":-30,"Adieresisuogonek":-30,"Adieresisuring":-30,"Adieresisv":-74,"Adieresisw":-74,"Adieresisy":-74,"Adieresisyacute":-74,"Adieresisydieresis":-74,"AgraveC":-65,"AgraveCacute":-65,"AgraveCcaron":-65,"AgraveCcedilla":-65,"AgraveG":-60,"AgraveGbreve":-60,"AgraveGcommaaccent":-60,"AgraveO":-50,"AgraveOacute":-50,"AgraveOcircumflex":-50,"AgraveOdieresis":-50,"AgraveOgrave":-50,"AgraveOhungarumlaut":-50,"AgraveOmacron":-50,"AgraveOslash":-50,"AgraveOtilde":-50,"AgraveQ":-55,"AgraveT":-55,"AgraveTcaron":-55,"AgraveTcommaaccent":-55,"AgraveU":-50,"AgraveUacute":-50,"AgraveUcircumflex":-50,"AgraveUdieresis":-50,"AgraveUgrave":-50,"AgraveUhungarumlaut":-50,"AgraveUmacron":-50,"AgraveUogonek":-50,"AgraveUring":-50,"AgraveV":-95,"AgraveW":-100,"AgraveY":-70,"AgraveYacute":-70,"AgraveYdieresis":-70,"Agravequoteright":-74,"Agraveu":-30,"Agraveuacute":-30,"Agraveucircumflex":-30,"Agraveudieresis":-30,"Agraveugrave":-30,"Agraveuhungarumlaut":-30,"Agraveumacron":-30,"Agraveuogonek":-30,"Agraveuring":-30,"Agravev":-74,"Agravew":-74,"Agravey":-74,"Agraveyacute":-74,"Agraveydieresis":-74,"AmacronC":-65,"AmacronCacute":-65,"AmacronCcaron":-65,"AmacronCcedilla":-65,"AmacronG":-60,"AmacronGbreve":-60,"AmacronGcommaaccent":-60,"AmacronO":-50,"AmacronOacute":-50,"AmacronOcircumflex":-50,"AmacronOdieresis":-50,"AmacronOgrave":-50,"AmacronOhungarumlaut":-50,"AmacronOmacron":-50,"AmacronOslash":-50,"AmacronOtilde":-50,"AmacronQ":-55,"AmacronT":-55,"AmacronTcaron":-55,"AmacronTcommaaccent":-55,"AmacronU":-50,"AmacronUacute":-50,"AmacronUcircumflex":-50,"AmacronUdieresis":-50,"AmacronUgrave":-50,"AmacronUhungarumlaut":-50,"AmacronUmacron":-50,"AmacronUogonek":-50,"AmacronUring":-50,"AmacronV":-95,"AmacronW":-100,"AmacronY":-70,"AmacronYacute":-70,"AmacronYdieresis":-70,"Amacronquoteright":-74,"Amacronu":-30,"Amacronuacute":-30,"Amacronucircumflex":-30,"Amacronudieresis":-30,"Amacronugrave":-30,"Amacronuhungarumlaut":-30,"Amacronumacron":-30,"Amacronuogonek":-30,"Amacronuring":-30,"Amacronv":-74,"Amacronw":-74,"Amacrony":-74,"Amacronyacute":-74,"Amacronydieresis":-74,"AogonekC":-65,"AogonekCacute":-65,"AogonekCcaron":-65,"AogonekCcedilla":-65,"AogonekG":-60,"AogonekGbreve":-60,"AogonekGcommaaccent":-60,"AogonekO":-50,"AogonekOacute":-50,"AogonekOcircumflex":-50,"AogonekOdieresis":-50,"AogonekOgrave":-50,"AogonekOhungarumlaut":-50,"AogonekOmacron":-50,"AogonekOslash":-50,"AogonekOtilde":-50,"AogonekQ":-55,"AogonekT":-55,"AogonekTcaron":-55,"AogonekTcommaaccent":-55,"AogonekU":-50,"AogonekUacute":-50,"AogonekUcircumflex":-50,"AogonekUdieresis":-50,"AogonekUgrave":-50,"AogonekUhungarumlaut":-50,"AogonekUmacron":-50,"AogonekUogonek":-50,"AogonekUring":-50,"AogonekV":-95,"AogonekW":-100,"AogonekY":-70,"AogonekYacute":-70,"AogonekYdieresis":-70,"Aogonekquoteright":-74,"Aogoneku":-30,"Aogonekuacute":-30,"Aogonekucircumflex":-30,"Aogonekudieresis":-30,"Aogonekugrave":-30,"Aogonekuhungarumlaut":-30,"Aogonekumacron":-30,"Aogonekuogonek":-30,"Aogonekuring":-30,"Aogonekv":-74,"Aogonekw":-74,"Aogoneky":-34,"Aogonekyacute":-34,"Aogonekydieresis":-34,"AringC":-65,"AringCacute":-65,"AringCcaron":-65,"AringCcedilla":-65,"AringG":-60,"AringGbreve":-60,"AringGcommaaccent":-60,"AringO":-50,"AringOacute":-50,"AringOcircumflex":-50,"AringOdieresis":-50,"AringOgrave":-50,"AringOhungarumlaut":-50,"AringOmacron":-50,"AringOslash":-50,"AringOtilde":-50,"AringQ":-55,"AringT":-55,"AringTcaron":-55,"AringTcommaaccent":-55,"AringU":-50,"AringUacute":-50,"AringUcircumflex":-50,"AringUdieresis":-50,"AringUgrave":-50,"AringUhungarumlaut":-50,"AringUmacron":-50,"AringUogonek":-50,"AringUring":-50,"AringV":-95,"AringW":-100,"AringY":-70,"AringYacute":-70,"AringYdieresis":-70,"Aringquoteright":-74,"Aringu":-30,"Aringuacute":-30,"Aringucircumflex":-30,"Aringudieresis":-30,"Aringugrave":-30,"Aringuhungarumlaut":-30,"Aringumacron":-30,"Aringuogonek":-30,"Aringuring":-30,"Aringv":-74,"Aringw":-74,"Aringy":-74,"Aringyacute":-74,"Aringydieresis":-74,"AtildeC":-65,"AtildeCacute":-65,"AtildeCcaron":-65,"AtildeCcedilla":-65,"AtildeG":-60,"AtildeGbreve":-60,"AtildeGcommaaccent":-60,"AtildeO":-50,"AtildeOacute":-50,"AtildeOcircumflex":-50,"AtildeOdieresis":-50,"AtildeOgrave":-50,"AtildeOhungarumlaut":-50,"AtildeOmacron":-50,"AtildeOslash":-50,"AtildeOtilde":-50,"AtildeQ":-55,"AtildeT":-55,"AtildeTcaron":-55,"AtildeTcommaaccent":-55,"AtildeU":-50,"AtildeUacute":-50,"AtildeUcircumflex":-50,"AtildeUdieresis":-50,"AtildeUgrave":-50,"AtildeUhungarumlaut":-50,"AtildeUmacron":-50,"AtildeUogonek":-50,"AtildeUring":-50,"AtildeV":-95,"AtildeW":-100,"AtildeY":-70,"AtildeYacute":-70,"AtildeYdieresis":-70,"Atildequoteright":-74,"Atildeu":-30,"Atildeuacute":-30,"Atildeucircumflex":-30,"Atildeudieresis":-30,"Atildeugrave":-30,"Atildeuhungarumlaut":-30,"Atildeumacron":-30,"Atildeuogonek":-30,"Atildeuring":-30,"Atildev":-74,"Atildew":-74,"Atildey":-74,"Atildeyacute":-74,"Atildeydieresis":-74,"BA":-25,"BAacute":-25,"BAbreve":-25,"BAcircumflex":-25,"BAdieresis":-25,"BAgrave":-25,"BAmacron":-25,"BAogonek":-25,"BAring":-25,"BAtilde":-25,"BU":-10,"BUacute":-10,"BUcircumflex":-10,"BUdieresis":-10,"BUgrave":-10,"BUhungarumlaut":-10,"BUmacron":-10,"BUogonek":-10,"BUring":-10,"DA":-25,"DAacute":-25,"DAbreve":-25,"DAcircumflex":-25,"DAdieresis":-25,"DAgrave":-25,"DAmacron":-25,"DAogonek":-25,"DAring":-25,"DAtilde":-25,"DV":-50,"DW":-40,"DY":-50,"DYacute":-50,"DYdieresis":-50,"DcaronA":-25,"DcaronAacute":-25,"DcaronAbreve":-25,"DcaronAcircumflex":-25,"DcaronAdieresis":-25,"DcaronAgrave":-25,"DcaronAmacron":-25,"DcaronAogonek":-25,"DcaronAring":-25,"DcaronAtilde":-25,"DcaronV":-50,"DcaronW":-40,"DcaronY":-50,"DcaronYacute":-50,"DcaronYdieresis":-50,"DcroatA":-25,"DcroatAacute":-25,"DcroatAbreve":-25,"DcroatAcircumflex":-25,"DcroatAdieresis":-25,"DcroatAgrave":-25,"DcroatAmacron":-25,"DcroatAogonek":-25,"DcroatAring":-25,"DcroatAtilde":-25,"DcroatV":-50,"DcroatW":-40,"DcroatY":-50,"DcroatYacute":-50,"DcroatYdieresis":-50,"FA":-100,"FAacute":-100,"FAbreve":-100,"FAcircumflex":-100,"FAdieresis":-100,"FAgrave":-100,"FAmacron":-100,"FAogonek":-100,"FAring":-100,"FAtilde":-100,"Fa":-95,"Faacute":-95,"Fabreve":-95,"Facircumflex":-95,"Fadieresis":-95,"Fagrave":-95,"Famacron":-95,"Faogonek":-95,"Faring":-95,"Fatilde":-95,"Fcomma":-129,"Fe":-100,"Feacute":-100,"Fecaron":-100,"Fecircumflex":-100,"Fedieresis":-100,"Fedotaccent":-100,"Fegrave":-100,"Femacron":-100,"Feogonek":-100,"Fi":-40,"Fiacute":-40,"Ficircumflex":-40,"Fidieresis":-40,"Figrave":-40,"Fimacron":-40,"Fiogonek":-40,"Fo":-70,"Foacute":-70,"Focircumflex":-70,"Fodieresis":-70,"Fograve":-70,"Fohungarumlaut":-70,"Fomacron":-70,"Foslash":-70,"Fotilde":-70,"Fperiod":-129,"Fr":-50,"Fracute":-50,"Frcaron":-50,"Frcommaaccent":-50,"JA":-25,"JAacute":-25,"JAbreve":-25,"JAcircumflex":-25,"JAdieresis":-25,"JAgrave":-25,"JAmacron":-25,"JAogonek":-25,"JAring":-25,"JAtilde":-25,"Ja":-40,"Jaacute":-40,"Jabreve":-40,"Jacircumflex":-40,"Jadieresis":-40,"Jagrave":-40,"Jamacron":-40,"Jaogonek":-40,"Jaring":-40,"Jatilde":-40,"Jcomma":-10,"Je":-40,"Jeacute":-40,"Jecaron":-40,"Jecircumflex":-40,"Jedieresis":-40,"Jedotaccent":-40,"Jegrave":-40,"Jemacron":-40,"Jeogonek":-40,"Jo":-40,"Joacute":-40,"Jocircumflex":-40,"Jodieresis":-40,"Jograve":-40,"Johungarumlaut":-40,"Jomacron":-40,"Joslash":-40,"Jotilde":-40,"Jperiod":-10,"Ju":-40,"Juacute":-40,"Jucircumflex":-40,"Judieresis":-40,"Jugrave":-40,"Juhungarumlaut":-40,"Jumacron":-40,"Juogonek":-40,"Juring":-40,"KO":-30,"KOacute":-30,"KOcircumflex":-30,"KOdieresis":-30,"KOgrave":-30,"KOhungarumlaut":-30,"KOmacron":-30,"KOslash":-30,"KOtilde":-30,"Ke":-25,"Keacute":-25,"Kecaron":-25,"Kecircumflex":-25,"Kedieresis":-25,"Kedotaccent":-25,"Kegrave":-25,"Kemacron":-25,"Keogonek":-25,"Ko":-25,"Koacute":-25,"Kocircumflex":-25,"Kodieresis":-25,"Kograve":-25,"Kohungarumlaut":-25,"Komacron":-25,"Koslash":-25,"Kotilde":-25,"Ku":-20,"Kuacute":-20,"Kucircumflex":-20,"Kudieresis":-20,"Kugrave":-20,"Kuhungarumlaut":-20,"Kumacron":-20,"Kuogonek":-20,"Kuring":-20,"Ky":-20,"Kyacute":-20,"Kydieresis":-20,"KcommaaccentO":-30,"KcommaaccentOacute":-30,"KcommaaccentOcircumflex":-30,"KcommaaccentOdieresis":-30,"KcommaaccentOgrave":-30,"KcommaaccentOhungarumlaut":-30,"KcommaaccentOmacron":-30,"KcommaaccentOslash":-30,"KcommaaccentOtilde":-30,"Kcommaaccente":-25,"Kcommaaccenteacute":-25,"Kcommaaccentecaron":-25,"Kcommaaccentecircumflex":-25,"Kcommaaccentedieresis":-25,"Kcommaaccentedotaccent":-25,"Kcommaaccentegrave":-25,"Kcommaaccentemacron":-25,"Kcommaaccenteogonek":-25,"Kcommaaccento":-25,"Kcommaaccentoacute":-25,"Kcommaaccentocircumflex":-25,"Kcommaaccentodieresis":-25,"Kcommaaccentograve":-25,"Kcommaaccentohungarumlaut":-25,"Kcommaaccentomacron":-25,"Kcommaaccentoslash":-25,"Kcommaaccentotilde":-25,"Kcommaaccentu":-20,"Kcommaaccentuacute":-20,"Kcommaaccentucircumflex":-20,"Kcommaaccentudieresis":-20,"Kcommaaccentugrave":-20,"Kcommaaccentuhungarumlaut":-20,"Kcommaaccentumacron":-20,"Kcommaaccentuogonek":-20,"Kcommaaccenturing":-20,"Kcommaaccenty":-20,"Kcommaaccentyacute":-20,"Kcommaaccentydieresis":-20,"LT":-18,"LTcaron":-18,"LTcommaaccent":-18,"LV":-37,"LW":-37,"LY":-37,"LYacute":-37,"LYdieresis":-37,"Lquoteright":-55,"Ly":-37,"Lyacute":-37,"Lydieresis":-37,"LacuteT":-18,"LacuteTcaron":-18,"LacuteTcommaaccent":-18,"LacuteV":-37,"LacuteW":-37,"LacuteY":-37,"LacuteYacute":-37,"LacuteYdieresis":-37,"Lacutequoteright":-55,"Lacutey":-37,"Lacuteyacute":-37,"Lacuteydieresis":-37,"LcommaaccentT":-18,"LcommaaccentTcaron":-18,"LcommaaccentTcommaaccent":-18,"LcommaaccentV":-37,"LcommaaccentW":-37,"LcommaaccentY":-37,"LcommaaccentYacute":-37,"LcommaaccentYdieresis":-37,"Lcommaaccentquoteright":-55,"Lcommaaccenty":-37,"Lcommaaccentyacute":-37,"Lcommaaccentydieresis":-37,"LslashT":-18,"LslashTcaron":-18,"LslashTcommaaccent":-18,"LslashV":-37,"LslashW":-37,"LslashY":-37,"LslashYacute":-37,"LslashYdieresis":-37,"Lslashquoteright":-55,"Lslashy":-37,"Lslashyacute":-37,"Lslashydieresis":-37,"NA":-30,"NAacute":-30,"NAbreve":-30,"NAcircumflex":-30,"NAdieresis":-30,"NAgrave":-30,"NAmacron":-30,"NAogonek":-30,"NAring":-30,"NAtilde":-30,"NacuteA":-30,"NacuteAacute":-30,"NacuteAbreve":-30,"NacuteAcircumflex":-30,"NacuteAdieresis":-30,"NacuteAgrave":-30,"NacuteAmacron":-30,"NacuteAogonek":-30,"NacuteAring":-30,"NacuteAtilde":-30,"NcaronA":-30,"NcaronAacute":-30,"NcaronAbreve":-30,"NcaronAcircumflex":-30,"NcaronAdieresis":-30,"NcaronAgrave":-30,"NcaronAmacron":-30,"NcaronAogonek":-30,"NcaronAring":-30,"NcaronAtilde":-30,"NcommaaccentA":-30,"NcommaaccentAacute":-30,"NcommaaccentAbreve":-30,"NcommaaccentAcircumflex":-30,"NcommaaccentAdieresis":-30,"NcommaaccentAgrave":-30,"NcommaaccentAmacron":-30,"NcommaaccentAogonek":-30,"NcommaaccentAring":-30,"NcommaaccentAtilde":-30,"NtildeA":-30,"NtildeAacute":-30,"NtildeAbreve":-30,"NtildeAcircumflex":-30,"NtildeAdieresis":-30,"NtildeAgrave":-30,"NtildeAmacron":-30,"NtildeAogonek":-30,"NtildeAring":-30,"NtildeAtilde":-30,"OA":-40,"OAacute":-40,"OAbreve":-40,"OAcircumflex":-40,"OAdieresis":-40,"OAgrave":-40,"OAmacron":-40,"OAogonek":-40,"OAring":-40,"OAtilde":-40,"OT":-40,"OTcaron":-40,"OTcommaaccent":-40,"OV":-50,"OW":-50,"OX":-40,"OY":-50,"OYacute":-50,"OYdieresis":-50,"OacuteA":-40,"OacuteAacute":-40,"OacuteAbreve":-40,"OacuteAcircumflex":-40,"OacuteAdieresis":-40,"OacuteAgrave":-40,"OacuteAmacron":-40,"OacuteAogonek":-40,"OacuteAring":-40,"OacuteAtilde":-40,"OacuteT":-40,"OacuteTcaron":-40,"OacuteTcommaaccent":-40,"OacuteV":-50,"OacuteW":-50,"OacuteX":-40,"OacuteY":-50,"OacuteYacute":-50,"OacuteYdieresis":-50,"OcircumflexA":-40,"OcircumflexAacute":-40,"OcircumflexAbreve":-40,"OcircumflexAcircumflex":-40,"OcircumflexAdieresis":-40,"OcircumflexAgrave":-40,"OcircumflexAmacron":-40,"OcircumflexAogonek":-40,"OcircumflexAring":-40,"OcircumflexAtilde":-40,"OcircumflexT":-40,"OcircumflexTcaron":-40,"OcircumflexTcommaaccent":-40,"OcircumflexV":-50,"OcircumflexW":-50,"OcircumflexX":-40,"OcircumflexY":-50,"OcircumflexYacute":-50,"OcircumflexYdieresis":-50,"OdieresisA":-40,"OdieresisAacute":-40,"OdieresisAbreve":-40,"OdieresisAcircumflex":-40,"OdieresisAdieresis":-40,"OdieresisAgrave":-40,"OdieresisAmacron":-40,"OdieresisAogonek":-40,"OdieresisAring":-40,"OdieresisAtilde":-40,"OdieresisT":-40,"OdieresisTcaron":-40,"OdieresisTcommaaccent":-40,"OdieresisV":-50,"OdieresisW":-50,"OdieresisX":-40,"OdieresisY":-50,"OdieresisYacute":-50,"OdieresisYdieresis":-50,"OgraveA":-40,"OgraveAacute":-40,"OgraveAbreve":-40,"OgraveAcircumflex":-40,"OgraveAdieresis":-40,"OgraveAgrave":-40,"OgraveAmacron":-40,"OgraveAogonek":-40,"OgraveAring":-40,"OgraveAtilde":-40,"OgraveT":-40,"OgraveTcaron":-40,"OgraveTcommaaccent":-40,"OgraveV":-50,"OgraveW":-50,"OgraveX":-40,"OgraveY":-50,"OgraveYacute":-50,"OgraveYdieresis":-50,"OhungarumlautA":-40,"OhungarumlautAacute":-40,"OhungarumlautAbreve":-40,"OhungarumlautAcircumflex":-40,"OhungarumlautAdieresis":-40,"OhungarumlautAgrave":-40,"OhungarumlautAmacron":-40,"OhungarumlautAogonek":-40,"OhungarumlautAring":-40,"OhungarumlautAtilde":-40,"OhungarumlautT":-40,"OhungarumlautTcaron":-40,"OhungarumlautTcommaaccent":-40,"OhungarumlautV":-50,"OhungarumlautW":-50,"OhungarumlautX":-40,"OhungarumlautY":-50,"OhungarumlautYacute":-50,"OhungarumlautYdieresis":-50,"OmacronA":-40,"OmacronAacute":-40,"OmacronAbreve":-40,"OmacronAcircumflex":-40,"OmacronAdieresis":-40,"OmacronAgrave":-40,"OmacronAmacron":-40,"OmacronAogonek":-40,"OmacronAring":-40,"OmacronAtilde":-40,"OmacronT":-40,"OmacronTcaron":-40,"OmacronTcommaaccent":-40,"OmacronV":-50,"OmacronW":-50,"OmacronX":-40,"OmacronY":-50,"OmacronYacute":-50,"OmacronYdieresis":-50,"OslashA":-40,"OslashAacute":-40,"OslashAbreve":-40,"OslashAcircumflex":-40,"OslashAdieresis":-40,"OslashAgrave":-40,"OslashAmacron":-40,"OslashAogonek":-40,"OslashAring":-40,"OslashAtilde":-40,"OslashT":-40,"OslashTcaron":-40,"OslashTcommaaccent":-40,"OslashV":-50,"OslashW":-50,"OslashX":-40,"OslashY":-50,"OslashYacute":-50,"OslashYdieresis":-50,"OtildeA":-40,"OtildeAacute":-40,"OtildeAbreve":-40,"OtildeAcircumflex":-40,"OtildeAdieresis":-40,"OtildeAgrave":-40,"OtildeAmacron":-40,"OtildeAogonek":-40,"OtildeAring":-40,"OtildeAtilde":-40,"OtildeT":-40,"OtildeTcaron":-40,"OtildeTcommaaccent":-40,"OtildeV":-50,"OtildeW":-50,"OtildeX":-40,"OtildeY":-50,"OtildeYacute":-50,"OtildeYdieresis":-50,"PA":-85,"PAacute":-85,"PAbreve":-85,"PAcircumflex":-85,"PAdieresis":-85,"PAgrave":-85,"PAmacron":-85,"PAogonek":-85,"PAring":-85,"PAtilde":-85,"Pa":-40,"Paacute":-40,"Pabreve":-40,"Pacircumflex":-40,"Padieresis":-40,"Pagrave":-40,"Pamacron":-40,"Paogonek":-40,"Paring":-40,"Patilde":-40,"Pcomma":-129,"Pe":-50,"Peacute":-50,"Pecaron":-50,"Pecircumflex":-50,"Pedieresis":-50,"Pedotaccent":-50,"Pegrave":-50,"Pemacron":-50,"Peogonek":-50,"Po":-55,"Poacute":-55,"Pocircumflex":-55,"Podieresis":-55,"Pograve":-55,"Pohungarumlaut":-55,"Pomacron":-55,"Poslash":-55,"Potilde":-55,"Pperiod":-129,"QU":-10,"QUacute":-10,"QUcircumflex":-10,"QUdieresis":-10,"QUgrave":-10,"QUhungarumlaut":-10,"QUmacron":-10,"QUogonek":-10,"QUring":-10,"RO":-40,"ROacute":-40,"ROcircumflex":-40,"ROdieresis":-40,"ROgrave":-40,"ROhungarumlaut":-40,"ROmacron":-40,"ROslash":-40,"ROtilde":-40,"RT":-30,"RTcaron":-30,"RTcommaaccent":-30,"RU":-40,"RUacute":-40,"RUcircumflex":-40,"RUdieresis":-40,"RUgrave":-40,"RUhungarumlaut":-40,"RUmacron":-40,"RUogonek":-40,"RUring":-40,"RV":-18,"RW":-18,"RY":-18,"RYacute":-18,"RYdieresis":-18,"RacuteO":-40,"RacuteOacute":-40,"RacuteOcircumflex":-40,"RacuteOdieresis":-40,"RacuteOgrave":-40,"RacuteOhungarumlaut":-40,"RacuteOmacron":-40,"RacuteOslash":-40,"RacuteOtilde":-40,"RacuteT":-30,"RacuteTcaron":-30,"RacuteTcommaaccent":-30,"RacuteU":-40,"RacuteUacute":-40,"RacuteUcircumflex":-40,"RacuteUdieresis":-40,"RacuteUgrave":-40,"RacuteUhungarumlaut":-40,"RacuteUmacron":-40,"RacuteUogonek":-40,"RacuteUring":-40,"RacuteV":-18,"RacuteW":-18,"RacuteY":-18,"RacuteYacute":-18,"RacuteYdieresis":-18,"RcaronO":-40,"RcaronOacute":-40,"RcaronOcircumflex":-40,"RcaronOdieresis":-40,"RcaronOgrave":-40,"RcaronOhungarumlaut":-40,"RcaronOmacron":-40,"RcaronOslash":-40,"RcaronOtilde":-40,"RcaronT":-30,"RcaronTcaron":-30,"RcaronTcommaaccent":-30,"RcaronU":-40,"RcaronUacute":-40,"RcaronUcircumflex":-40,"RcaronUdieresis":-40,"RcaronUgrave":-40,"RcaronUhungarumlaut":-40,"RcaronUmacron":-40,"RcaronUogonek":-40,"RcaronUring":-40,"RcaronV":-18,"RcaronW":-18,"RcaronY":-18,"RcaronYacute":-18,"RcaronYdieresis":-18,"RcommaaccentO":-40,"RcommaaccentOacute":-40,"RcommaaccentOcircumflex":-40,"RcommaaccentOdieresis":-40,"RcommaaccentOgrave":-40,"RcommaaccentOhungarumlaut":-40,"RcommaaccentOmacron":-40,"RcommaaccentOslash":-40,"RcommaaccentOtilde":-40,"RcommaaccentT":-30,"RcommaaccentTcaron":-30,"RcommaaccentTcommaaccent":-30,"RcommaaccentU":-40,"RcommaaccentUacute":-40,"RcommaaccentUcircumflex":-40,"RcommaaccentUdieresis":-40,"RcommaaccentUgrave":-40,"RcommaaccentUhungarumlaut":-40,"RcommaaccentUmacron":-40,"RcommaaccentUogonek":-40,"RcommaaccentUring":-40,"RcommaaccentV":-18,"RcommaaccentW":-18,"RcommaaccentY":-18,"RcommaaccentYacute":-18,"RcommaaccentYdieresis":-18,"TA":-55,"TAacute":-55,"TAbreve":-55,"TAcircumflex":-55,"TAdieresis":-55,"TAgrave":-55,"TAmacron":-55,"TAogonek":-55,"TAring":-55,"TAtilde":-55,"TO":-18,"TOacute":-18,"TOcircumflex":-18,"TOdieresis":-18,"TOgrave":-18,"TOhungarumlaut":-18,"TOmacron":-18,"TOslash":-18,"TOtilde":-18,"Ta":-92,"Taacute":-92,"Tabreve":-92,"Tacircumflex":-92,"Tadieresis":-92,"Tagrave":-92,"Tamacron":-92,"Taogonek":-92,"Taring":-92,"Tatilde":-92,"Tcolon":-74,"Tcomma":-92,"Te":-92,"Teacute":-92,"Tecaron":-92,"Tecircumflex":-92,"Tedieresis":-52,"Tedotaccent":-92,"Tegrave":-52,"Temacron":-52,"Teogonek":-92,"Thyphen":-92,"Ti":-37,"Tiacute":-37,"Tiogonek":-37,"To":-95,"Toacute":-95,"Tocircumflex":-95,"Todieresis":-95,"Tograve":-95,"Tohungarumlaut":-95,"Tomacron":-95,"Toslash":-95,"Totilde":-95,"Tperiod":-92,"Tr":-37,"Tracute":-37,"Trcaron":-37,"Trcommaaccent":-37,"Tsemicolon":-74,"Tu":-37,"Tuacute":-37,"Tucircumflex":-37,"Tudieresis":-37,"Tugrave":-37,"Tuhungarumlaut":-37,"Tumacron":-37,"Tuogonek":-37,"Turing":-37,"Tw":-37,"Ty":-37,"Tyacute":-37,"Tydieresis":-37,"TcaronA":-55,"TcaronAacute":-55,"TcaronAbreve":-55,"TcaronAcircumflex":-55,"TcaronAdieresis":-55,"TcaronAgrave":-55,"TcaronAmacron":-55,"TcaronAogonek":-55,"TcaronAring":-55,"TcaronAtilde":-55,"TcaronO":-18,"TcaronOacute":-18,"TcaronOcircumflex":-18,"TcaronOdieresis":-18,"TcaronOgrave":-18,"TcaronOhungarumlaut":-18,"TcaronOmacron":-18,"TcaronOslash":-18,"TcaronOtilde":-18,"Tcarona":-92,"Tcaronaacute":-92,"Tcaronabreve":-92,"Tcaronacircumflex":-92,"Tcaronadieresis":-92,"Tcaronagrave":-92,"Tcaronamacron":-92,"Tcaronaogonek":-92,"Tcaronaring":-92,"Tcaronatilde":-92,"Tcaroncolon":-74,"Tcaroncomma":-92,"Tcarone":-92,"Tcaroneacute":-92,"Tcaronecaron":-92,"Tcaronecircumflex":-92,"Tcaronedieresis":-52,"Tcaronedotaccent":-92,"Tcaronegrave":-52,"Tcaronemacron":-52,"Tcaroneogonek":-92,"Tcaronhyphen":-92,"Tcaroni":-37,"Tcaroniacute":-37,"Tcaroniogonek":-37,"Tcarono":-95,"Tcaronoacute":-95,"Tcaronocircumflex":-95,"Tcaronodieresis":-95,"Tcaronograve":-95,"Tcaronohungarumlaut":-95,"Tcaronomacron":-95,"Tcaronoslash":-95,"Tcaronotilde":-95,"Tcaronperiod":-92,"Tcaronr":-37,"Tcaronracute":-37,"Tcaronrcaron":-37,"Tcaronrcommaaccent":-37,"Tcaronsemicolon":-74,"Tcaronu":-37,"Tcaronuacute":-37,"Tcaronucircumflex":-37,"Tcaronudieresis":-37,"Tcaronugrave":-37,"Tcaronuhungarumlaut":-37,"Tcaronumacron":-37,"Tcaronuogonek":-37,"Tcaronuring":-37,"Tcaronw":-37,"Tcarony":-37,"Tcaronyacute":-37,"Tcaronydieresis":-37,"TcommaaccentA":-55,"TcommaaccentAacute":-55,"TcommaaccentAbreve":-55,"TcommaaccentAcircumflex":-55,"TcommaaccentAdieresis":-55,"TcommaaccentAgrave":-55,"TcommaaccentAmacron":-55,"TcommaaccentAogonek":-55,"TcommaaccentAring":-55,"TcommaaccentAtilde":-55,"TcommaaccentO":-18,"TcommaaccentOacute":-18,"TcommaaccentOcircumflex":-18,"TcommaaccentOdieresis":-18,"TcommaaccentOgrave":-18,"TcommaaccentOhungarumlaut":-18,"TcommaaccentOmacron":-18,"TcommaaccentOslash":-18,"TcommaaccentOtilde":-18,"Tcommaaccenta":-92,"Tcommaaccentaacute":-92,"Tcommaaccentabreve":-92,"Tcommaaccentacircumflex":-92,"Tcommaaccentadieresis":-92,"Tcommaaccentagrave":-92,"Tcommaaccentamacron":-92,"Tcommaaccentaogonek":-92,"Tcommaaccentaring":-92,"Tcommaaccentatilde":-92,"Tcommaaccentcolon":-74,"Tcommaaccentcomma":-92,"Tcommaaccente":-92,"Tcommaaccenteacute":-92,"Tcommaaccentecaron":-92,"Tcommaaccentecircumflex":-92,"Tcommaaccentedieresis":-52,"Tcommaaccentedotaccent":-92,"Tcommaaccentegrave":-52,"Tcommaaccentemacron":-52,"Tcommaaccenteogonek":-92,"Tcommaaccenthyphen":-92,"Tcommaaccenti":-37,"Tcommaaccentiacute":-37,"Tcommaaccentiogonek":-37,"Tcommaaccento":-95,"Tcommaaccentoacute":-95,"Tcommaaccentocircumflex":-95,"Tcommaaccentodieresis":-95,"Tcommaaccentograve":-95,"Tcommaaccentohungarumlaut":-95,"Tcommaaccentomacron":-95,"Tcommaaccentoslash":-95,"Tcommaaccentotilde":-95,"Tcommaaccentperiod":-92,"Tcommaaccentr":-37,"Tcommaaccentracute":-37,"Tcommaaccentrcaron":-37,"Tcommaaccentrcommaaccent":-37,"Tcommaaccentsemicolon":-74,"Tcommaaccentu":-37,"Tcommaaccentuacute":-37,"Tcommaaccentucircumflex":-37,"Tcommaaccentudieresis":-37,"Tcommaaccentugrave":-37,"Tcommaaccentuhungarumlaut":-37,"Tcommaaccentumacron":-37,"Tcommaaccentuogonek":-37,"Tcommaaccenturing":-37,"Tcommaaccentw":-37,"Tcommaaccenty":-37,"Tcommaaccentyacute":-37,"Tcommaaccentydieresis":-37,"UA":-45,"UAacute":-45,"UAbreve":-45,"UAcircumflex":-45,"UAdieresis":-45,"UAgrave":-45,"UAmacron":-45,"UAogonek":-45,"UAring":-45,"UAtilde":-45,"UacuteA":-45,"UacuteAacute":-45,"UacuteAbreve":-45,"UacuteAcircumflex":-45,"UacuteAdieresis":-45,"UacuteAgrave":-45,"UacuteAmacron":-45,"UacuteAogonek":-45,"UacuteAring":-45,"UacuteAtilde":-45,"UcircumflexA":-45,"UcircumflexAacute":-45,"UcircumflexAbreve":-45,"UcircumflexAcircumflex":-45,"UcircumflexAdieresis":-45,"UcircumflexAgrave":-45,"UcircumflexAmacron":-45,"UcircumflexAogonek":-45,"UcircumflexAring":-45,"UcircumflexAtilde":-45,"UdieresisA":-45,"UdieresisAacute":-45,"UdieresisAbreve":-45,"UdieresisAcircumflex":-45,"UdieresisAdieresis":-45,"UdieresisAgrave":-45,"UdieresisAmacron":-45,"UdieresisAogonek":-45,"UdieresisAring":-45,"UdieresisAtilde":-45,"UgraveA":-45,"UgraveAacute":-45,"UgraveAbreve":-45,"UgraveAcircumflex":-45,"UgraveAdieresis":-45,"UgraveAgrave":-45,"UgraveAmacron":-45,"UgraveAogonek":-45,"UgraveAring":-45,"UgraveAtilde":-45,"UhungarumlautA":-45,"UhungarumlautAacute":-45,"UhungarumlautAbreve":-45,"UhungarumlautAcircumflex":-45,"UhungarumlautAdieresis":-45,"UhungarumlautAgrave":-45,"UhungarumlautAmacron":-45,"UhungarumlautAogonek":-45,"UhungarumlautAring":-45,"UhungarumlautAtilde":-45,"UmacronA":-45,"UmacronAacute":-45,"UmacronAbreve":-45,"UmacronAcircumflex":-45,"UmacronAdieresis":-45,"UmacronAgrave":-45,"UmacronAmacron":-45,"UmacronAogonek":-45,"UmacronAring":-45,"UmacronAtilde":-45,"UogonekA":-45,"UogonekAacute":-45,"UogonekAbreve":-45,"UogonekAcircumflex":-45,"UogonekAdieresis":-45,"UogonekAgrave":-45,"UogonekAmacron":-45,"UogonekAogonek":-45,"UogonekAring":-45,"UogonekAtilde":-45,"UringA":-45,"UringAacute":-45,"UringAbreve":-45,"UringAcircumflex":-45,"UringAdieresis":-45,"UringAgrave":-45,"UringAmacron":-45,"UringAogonek":-45,"UringAring":-45,"UringAtilde":-45,"VA":-85,"VAacute":-85,"VAbreve":-85,"VAcircumflex":-85,"VAdieresis":-85,"VAgrave":-85,"VAmacron":-85,"VAogonek":-85,"VAring":-85,"VAtilde":-85,"VG":-10,"VGbreve":-10,"VGcommaaccent":-10,"VO":-30,"VOacute":-30,"VOcircumflex":-30,"VOdieresis":-30,"VOgrave":-30,"VOhungarumlaut":-30,"VOmacron":-30,"VOslash":-30,"VOtilde":-30,"Va":-111,"Vaacute":-111,"Vabreve":-111,"Vacircumflex":-111,"Vadieresis":-111,"Vagrave":-111,"Vamacron":-111,"Vaogonek":-111,"Varing":-111,"Vatilde":-111,"Vcolon":-74,"Vcomma":-129,"Ve":-111,"Veacute":-111,"Vecaron":-111,"Vecircumflex":-111,"Vedieresis":-71,"Vedotaccent":-111,"Vegrave":-71,"Vemacron":-71,"Veogonek":-111,"Vhyphen":-70,"Vi":-55,"Viacute":-55,"Viogonek":-55,"Vo":-111,"Voacute":-111,"Vocircumflex":-111,"Vodieresis":-111,"Vograve":-111,"Vohungarumlaut":-111,"Vomacron":-111,"Voslash":-111,"Votilde":-111,"Vperiod":-129,"Vsemicolon":-74,"Vu":-55,"Vuacute":-55,"Vucircumflex":-55,"Vudieresis":-55,"Vugrave":-55,"Vuhungarumlaut":-55,"Vumacron":-55,"Vuogonek":-55,"Vuring":-55,"WA":-74,"WAacute":-74,"WAbreve":-74,"WAcircumflex":-74,"WAdieresis":-74,"WAgrave":-74,"WAmacron":-74,"WAogonek":-74,"WAring":-74,"WAtilde":-74,"WO":-15,"WOacute":-15,"WOcircumflex":-15,"WOdieresis":-15,"WOgrave":-15,"WOhungarumlaut":-15,"WOmacron":-15,"WOslash":-15,"WOtilde":-15,"Wa":-85,"Waacute":-85,"Wabreve":-85,"Wacircumflex":-85,"Wadieresis":-85,"Wagrave":-85,"Wamacron":-85,"Waogonek":-85,"Waring":-85,"Watilde":-85,"Wcolon":-55,"Wcomma":-74,"We":-90,"Weacute":-90,"Wecaron":-90,"Wecircumflex":-90,"Wedieresis":-50,"Wedotaccent":-90,"Wegrave":-50,"Wemacron":-50,"Weogonek":-90,"Whyphen":-50,"Wi":-37,"Wiacute":-37,"Wiogonek":-37,"Wo":-80,"Woacute":-80,"Wocircumflex":-80,"Wodieresis":-80,"Wograve":-80,"Wohungarumlaut":-80,"Womacron":-80,"Woslash":-80,"Wotilde":-80,"Wperiod":-74,"Wsemicolon":-55,"Wu":-55,"Wuacute":-55,"Wucircumflex":-55,"Wudieresis":-55,"Wugrave":-55,"Wuhungarumlaut":-55,"Wumacron":-55,"Wuogonek":-55,"Wuring":-55,"Wy":-55,"Wyacute":-55,"Wydieresis":-55,"YA":-74,"YAacute":-74,"YAbreve":-74,"YAcircumflex":-74,"YAdieresis":-74,"YAgrave":-74,"YAmacron":-74,"YAogonek":-74,"YAring":-74,"YAtilde":-74,"YO":-25,"YOacute":-25,"YOcircumflex":-25,"YOdieresis":-25,"YOgrave":-25,"YOhungarumlaut":-25,"YOmacron":-25,"YOslash":-25,"YOtilde":-25,"Ya":-92,"Yaacute":-92,"Yabreve":-92,"Yacircumflex":-92,"Yadieresis":-92,"Yagrave":-92,"Yamacron":-92,"Yaogonek":-92,"Yaring":-92,"Yatilde":-92,"Ycolon":-92,"Ycomma":-92,"Ye":-111,"Yeacute":-111,"Yecaron":-111,"Yecircumflex":-71,"Yedieresis":-71,"Yedotaccent":-111,"Yegrave":-71,"Yemacron":-71,"Yeogonek":-111,"Yhyphen":-92,"Yi":-55,"Yiacute":-55,"Yiogonek":-55,"Yo":-111,"Yoacute":-111,"Yocircumflex":-111,"Yodieresis":-111,"Yograve":-111,"Yohungarumlaut":-111,"Yomacron":-111,"Yoslash":-111,"Yotilde":-111,"Yperiod":-74,"Ysemicolon":-92,"Yu":-92,"Yuacute":-92,"Yucircumflex":-92,"Yudieresis":-92,"Yugrave":-92,"Yuhungarumlaut":-92,"Yumacron":-92,"Yuogonek":-92,"Yuring":-92,"YacuteA":-74,"YacuteAacute":-74,"YacuteAbreve":-74,"YacuteAcircumflex":-74,"YacuteAdieresis":-74,"YacuteAgrave":-74,"YacuteAmacron":-74,"YacuteAogonek":-74,"YacuteAring":-74,"YacuteAtilde":-74,"YacuteO":-25,"YacuteOacute":-25,"YacuteOcircumflex":-25,"YacuteOdieresis":-25,"YacuteOgrave":-25,"YacuteOhungarumlaut":-25,"YacuteOmacron":-25,"YacuteOslash":-25,"YacuteOtilde":-25,"Yacutea":-92,"Yacuteaacute":-92,"Yacuteabreve":-92,"Yacuteacircumflex":-92,"Yacuteadieresis":-92,"Yacuteagrave":-92,"Yacuteamacron":-92,"Yacuteaogonek":-92,"Yacutearing":-92,"Yacuteatilde":-92,"Yacutecolon":-92,"Yacutecomma":-92,"Yacutee":-111,"Yacuteeacute":-111,"Yacuteecaron":-111,"Yacuteecircumflex":-71,"Yacuteedieresis":-71,"Yacuteedotaccent":-111,"Yacuteegrave":-71,"Yacuteemacron":-71,"Yacuteeogonek":-111,"Yacutehyphen":-92,"Yacutei":-55,"Yacuteiacute":-55,"Yacuteiogonek":-55,"Yacuteo":-111,"Yacuteoacute":-111,"Yacuteocircumflex":-111,"Yacuteodieresis":-111,"Yacuteograve":-111,"Yacuteohungarumlaut":-111,"Yacuteomacron":-111,"Yacuteoslash":-111,"Yacuteotilde":-111,"Yacuteperiod":-74,"Yacutesemicolon":-92,"Yacuteu":-92,"Yacuteuacute":-92,"Yacuteucircumflex":-92,"Yacuteudieresis":-92,"Yacuteugrave":-92,"Yacuteuhungarumlaut":-92,"Yacuteumacron":-92,"Yacuteuogonek":-92,"Yacuteuring":-92,"YdieresisA":-74,"YdieresisAacute":-74,"YdieresisAbreve":-74,"YdieresisAcircumflex":-74,"YdieresisAdieresis":-74,"YdieresisAgrave":-74,"YdieresisAmacron":-74,"YdieresisAogonek":-74,"YdieresisAring":-74,"YdieresisAtilde":-74,"YdieresisO":-25,"YdieresisOacute":-25,"YdieresisOcircumflex":-25,"YdieresisOdieresis":-25,"YdieresisOgrave":-25,"YdieresisOhungarumlaut":-25,"YdieresisOmacron":-25,"YdieresisOslash":-25,"YdieresisOtilde":-25,"Ydieresisa":-92,"Ydieresisaacute":-92,"Ydieresisabreve":-92,"Ydieresisacircumflex":-92,"Ydieresisadieresis":-92,"Ydieresisagrave":-92,"Ydieresisamacron":-92,"Ydieresisaogonek":-92,"Ydieresisaring":-92,"Ydieresisatilde":-92,"Ydieresiscolon":-92,"Ydieresiscomma":-92,"Ydieresise":-111,"Ydieresiseacute":-111,"Ydieresisecaron":-111,"Ydieresisecircumflex":-71,"Ydieresisedieresis":-71,"Ydieresisedotaccent":-111,"Ydieresisegrave":-71,"Ydieresisemacron":-71,"Ydieresiseogonek":-111,"Ydieresishyphen":-92,"Ydieresisi":-55,"Ydieresisiacute":-55,"Ydieresisiogonek":-55,"Ydieresiso":-111,"Ydieresisoacute":-111,"Ydieresisocircumflex":-111,"Ydieresisodieresis":-111,"Ydieresisograve":-111,"Ydieresisohungarumlaut":-111,"Ydieresisomacron":-111,"Ydieresisoslash":-111,"Ydieresisotilde":-111,"Ydieresisperiod":-74,"Ydieresissemicolon":-92,"Ydieresisu":-92,"Ydieresisuacute":-92,"Ydieresisucircumflex":-92,"Ydieresisudieresis":-92,"Ydieresisugrave":-92,"Ydieresisuhungarumlaut":-92,"Ydieresisumacron":-92,"Ydieresisuogonek":-92,"Ydieresisuring":-92,"bb":-10,"bperiod":-40,"bu":-20,"buacute":-20,"bucircumflex":-20,"budieresis":-20,"bugrave":-20,"buhungarumlaut":-20,"bumacron":-20,"buogonek":-20,"buring":-20,"ch":-10,"ck":-10,"ckcommaaccent":-10,"cacuteh":-10,"cacutek":-10,"cacutekcommaaccent":-10,"ccaronh":-10,"ccaronk":-10,"ccaronkcommaaccent":-10,"ccedillah":-10,"ccedillak":-10,"ccedillakcommaaccent":-10,"commaquotedblright":-95,"commaquoteright":-95,"eb":-10,"eacuteb":-10,"ecaronb":-10,"ecircumflexb":-10,"edieresisb":-10,"edotaccentb":-10,"egraveb":-10,"emacronb":-10,"eogonekb":-10,"fcomma":-10,"fdotlessi":-30,"fe":-10,"feacute":-10,"fedotaccent":-10,"feogonek":-10,"ff":-18,"fo":-10,"foacute":-10,"focircumflex":-10,"fograve":-10,"fohungarumlaut":-10,"foslash":-10,"fotilde":-10,"fperiod":-10,"fquoteright":55,"ke":-30,"keacute":-30,"kecaron":-30,"kecircumflex":-30,"kedieresis":-30,"kedotaccent":-30,"kegrave":-30,"kemacron":-30,"keogonek":-30,"ko":-10,"koacute":-10,"kocircumflex":-10,"kodieresis":-10,"kograve":-10,"kohungarumlaut":-10,"komacron":-10,"koslash":-10,"kotilde":-10,"kcommaaccente":-30,"kcommaaccenteacute":-30,"kcommaaccentecaron":-30,"kcommaaccentecircumflex":-30,"kcommaaccentedieresis":-30,"kcommaaccentedotaccent":-30,"kcommaaccentegrave":-30,"kcommaaccentemacron":-30,"kcommaaccenteogonek":-30,"kcommaaccento":-10,"kcommaaccentoacute":-10,"kcommaaccentocircumflex":-10,"kcommaaccentodieresis":-10,"kcommaaccentograve":-10,"kcommaaccentohungarumlaut":-10,"kcommaaccentomacron":-10,"kcommaaccentoslash":-10,"kcommaaccentotilde":-10,"nv":-40,"nacutev":-40,"ncaronv":-40,"ncommaaccentv":-40,"ntildev":-40,"ov":-15,"ow":-25,"ox":-10,"oy":-10,"oyacute":-10,"oydieresis":-10,"oacutev":-15,"oacutew":-25,"oacutex":-10,"oacutey":-10,"oacuteyacute":-10,"oacuteydieresis":-10,"ocircumflexv":-15,"ocircumflexw":-25,"ocircumflexx":-10,"ocircumflexy":-10,"ocircumflexyacute":-10,"ocircumflexydieresis":-10,"odieresisv":-15,"odieresisw":-25,"odieresisx":-10,"odieresisy":-10,"odieresisyacute":-10,"odieresisydieresis":-10,"ogravev":-15,"ogravew":-25,"ogravex":-10,"ogravey":-10,"ograveyacute":-10,"ograveydieresis":-10,"ohungarumlautv":-15,"ohungarumlautw":-25,"ohungarumlautx":-10,"ohungarumlauty":-10,"ohungarumlautyacute":-10,"ohungarumlautydieresis":-10,"omacronv":-15,"omacronw":-25,"omacronx":-10,"omacrony":-10,"omacronyacute":-10,"omacronydieresis":-10,"oslashv":-15,"oslashw":-25,"oslashx":-10,"oslashy":-10,"oslashyacute":-10,"oslashydieresis":-10,"otildev":-15,"otildew":-25,"otildex":-10,"otildey":-10,"otildeyacute":-10,"otildeydieresis":-10,"periodquotedblright":-95,"periodquoteright":-95,"quoteleftquoteleft":-74,"quoterightd":-15,"quoterightdcroat":-15,"quoterightquoteright":-74,"quoterightr":-15,"quoterightracute":-15,"quoterightrcaron":-15,"quoterightrcommaaccent":-15,"quoterights":-74,"quoterightsacute":-74,"quoterightscaron":-74,"quoterightscedilla":-74,"quoterightscommaaccent":-74,"quoterightspace":-74,"quoterightt":-37,"quoterighttcommaaccent":-37,"quoterightv":-15,"rcomma":-65,"rperiod":-65,"racutecomma":-65,"racuteperiod":-65,"rcaroncomma":-65,"rcaronperiod":-65,"rcommaaccentcomma":-65,"rcommaaccentperiod":-65,"spaceA":-37,"spaceAacute":-37,"spaceAbreve":-37,"spaceAcircumflex":-37,"spaceAdieresis":-37,"spaceAgrave":-37,"spaceAmacron":-37,"spaceAogonek":-37,"spaceAring":-37,"spaceAtilde":-37,"spaceV":-70,"spaceW":-70,"spaceY":-70,"spaceYacute":-70,"spaceYdieresis":-70,"vcomma":-37,"ve":-15,"veacute":-15,"vecaron":-15,"vecircumflex":-15,"vedieresis":-15,"vedotaccent":-15,"vegrave":-15,"vemacron":-15,"veogonek":-15,"vo":-15,"voacute":-15,"vocircumflex":-15,"vodieresis":-15,"vograve":-15,"vohungarumlaut":-15,"vomacron":-15,"voslash":-15,"votilde":-15,"vperiod":-37,"wa":-10,"waacute":-10,"wabreve":-10,"wacircumflex":-10,"wadieresis":-10,"wagrave":-10,"wamacron":-10,"waogonek":-10,"waring":-10,"watilde":-10,"wcomma":-37,"we":-10,"weacute":-10,"wecaron":-10,"wecircumflex":-10,"wedieresis":-10,"wedotaccent":-10,"wegrave":-10,"wemacron":-10,"weogonek":-10,"wo":-15,"woacute":-15,"wocircumflex":-15,"wodieresis":-15,"wograve":-15,"wohungarumlaut":-15,"womacron":-15,"woslash":-15,"wotilde":-15,"wperiod":-37,"xe":-10,"xeacute":-10,"xecaron":-10,"xecircumflex":-10,"xedieresis":-10,"xedotaccent":-10,"xegrave":-10,"xemacron":-10,"xeogonek":-10,"ycomma":-37,"yperiod":-37,"yacutecomma":-37,"yacuteperiod":-37,"ydieresiscomma":-37,"ydieresisperiod":-37}} \ No newline at end of file diff --git a/packages/pdfkit/src/font/data/Times-Italic.json b/packages/pdfkit/src/font/data/Times-Italic.json deleted file mode 100644 index 5bf745905..000000000 --- a/packages/pdfkit/src/font/data/Times-Italic.json +++ /dev/null @@ -1 +0,0 @@ -{"attributes":{"Comment":["Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.","Creation Date: Thu May 1 12:56:55 1997","UniqueID 43067","VMusage 47727 58752"],"FontName":"Times-Italic","FullName":"Times Italic","FamilyName":"Times","Weight":"Medium","ItalicAngle":"-15.5","IsFixedPitch":"false","CharacterSet":"ExtendedRoman","FontBBox":"-169 -217 1010 883 ","UnderlinePosition":"-100","UnderlineThickness":"50","Version":"002.000","Notice":"Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries.","EncodingScheme":"AdobeStandardEncoding","CapHeight":"653","XHeight":"441","Ascender":"683","Descender":"-217","StdHW":"32","StdVW":"76"},"glyphWidths":{"space":250,"exclam":333,"quotedbl":420,"numbersign":500,"dollar":500,"percent":833,"ampersand":778,"quoteright":333,"parenleft":333,"parenright":333,"asterisk":500,"plus":675,"comma":250,"hyphen":333,"period":250,"slash":278,"zero":500,"one":500,"two":500,"three":500,"four":500,"five":500,"six":500,"seven":500,"eight":500,"nine":500,"colon":333,"semicolon":333,"less":675,"equal":675,"greater":675,"question":500,"at":920,"A":611,"B":611,"C":667,"D":722,"E":611,"F":611,"G":722,"H":722,"I":333,"J":444,"K":667,"L":556,"M":833,"N":667,"O":722,"P":611,"Q":722,"R":611,"S":500,"T":556,"U":722,"V":611,"W":833,"X":611,"Y":556,"Z":556,"bracketleft":389,"backslash":278,"bracketright":389,"asciicircum":422,"underscore":500,"quoteleft":333,"a":500,"b":500,"c":444,"d":500,"e":444,"f":278,"g":500,"h":500,"i":278,"j":278,"k":444,"l":278,"m":722,"n":500,"o":500,"p":500,"q":500,"r":389,"s":389,"t":278,"u":500,"v":444,"w":667,"x":444,"y":444,"z":389,"braceleft":400,"bar":275,"braceright":400,"asciitilde":541,"exclamdown":389,"cent":500,"sterling":500,"fraction":167,"yen":500,"florin":500,"section":500,"currency":500,"quotesingle":214,"quotedblleft":556,"guillemotleft":500,"guilsinglleft":333,"guilsinglright":333,"fi":500,"fl":500,"endash":500,"dagger":500,"daggerdbl":500,"periodcentered":250,"paragraph":523,"bullet":350,"quotesinglbase":333,"quotedblbase":556,"quotedblright":556,"guillemotright":500,"ellipsis":889,"perthousand":1000,"questiondown":500,"grave":333,"acute":333,"circumflex":333,"tilde":333,"macron":333,"breve":333,"dotaccent":333,"dieresis":333,"ring":333,"cedilla":333,"hungarumlaut":333,"ogonek":333,"caron":333,"emdash":889,"AE":889,"ordfeminine":276,"Lslash":556,"Oslash":722,"OE":944,"ordmasculine":310,"ae":667,"dotlessi":278,"lslash":278,"oslash":500,"oe":667,"germandbls":500,"Idieresis":333,"eacute":444,"abreve":500,"uhungarumlaut":500,"ecaron":444,"Ydieresis":556,"divide":675,"Yacute":556,"Acircumflex":611,"aacute":500,"Ucircumflex":722,"yacute":444,"scommaaccent":389,"ecircumflex":444,"Uring":722,"Udieresis":722,"aogonek":500,"Uacute":722,"uogonek":500,"Edieresis":611,"Dcroat":722,"commaaccent":250,"copyright":760,"Emacron":611,"ccaron":444,"aring":500,"Ncommaaccent":667,"lacute":278,"agrave":500,"Tcommaaccent":556,"Cacute":667,"atilde":500,"Edotaccent":611,"scaron":389,"scedilla":389,"iacute":278,"lozenge":471,"Rcaron":611,"Gcommaaccent":722,"ucircumflex":500,"acircumflex":500,"Amacron":611,"rcaron":389,"ccedilla":444,"Zdotaccent":556,"Thorn":611,"Omacron":722,"Racute":611,"Sacute":500,"dcaron":544,"Umacron":722,"uring":500,"threesuperior":300,"Ograve":722,"Agrave":611,"Abreve":611,"multiply":675,"uacute":500,"Tcaron":556,"partialdiff":476,"ydieresis":444,"Nacute":667,"icircumflex":278,"Ecircumflex":611,"adieresis":500,"edieresis":444,"cacute":444,"nacute":500,"umacron":500,"Ncaron":667,"Iacute":333,"plusminus":675,"brokenbar":275,"registered":760,"Gbreve":722,"Idotaccent":333,"summation":600,"Egrave":611,"racute":389,"omacron":500,"Zacute":556,"Zcaron":556,"greaterequal":549,"Eth":722,"Ccedilla":667,"lcommaaccent":278,"tcaron":300,"eogonek":444,"Uogonek":722,"Aacute":611,"Adieresis":611,"egrave":444,"zacute":389,"iogonek":278,"Oacute":722,"oacute":500,"amacron":500,"sacute":389,"idieresis":278,"Ocircumflex":722,"Ugrave":722,"Delta":612,"thorn":500,"twosuperior":300,"Odieresis":722,"mu":500,"igrave":278,"ohungarumlaut":500,"Eogonek":611,"dcroat":500,"threequarters":750,"Scedilla":500,"lcaron":300,"Kcommaaccent":667,"Lacute":556,"trademark":980,"edotaccent":444,"Igrave":333,"Imacron":333,"Lcaron":611,"onehalf":750,"lessequal":549,"ocircumflex":500,"ntilde":500,"Uhungarumlaut":722,"Eacute":611,"emacron":444,"gbreve":500,"onequarter":750,"Scaron":500,"Scommaaccent":500,"Ohungarumlaut":722,"degree":400,"ograve":500,"Ccaron":667,"ugrave":500,"radical":453,"Dcaron":722,"rcommaaccent":389,"Ntilde":667,"otilde":500,"Rcommaaccent":611,"Lcommaaccent":556,"Atilde":611,"Aogonek":611,"Aring":611,"Otilde":722,"zdotaccent":389,"Ecaron":611,"Iogonek":333,"kcommaaccent":444,"minus":675,"Icircumflex":333,"ncaron":500,"tcommaaccent":278,"logicalnot":675,"odieresis":500,"udieresis":500,"notequal":549,"gcommaaccent":500,"eth":500,"zcaron":389,"ncommaaccent":500,"onesuperior":300,"imacron":278,"Euro":500},"kernPairs":{"AC":-30,"ACacute":-30,"ACcaron":-30,"ACcedilla":-30,"AG":-35,"AGbreve":-35,"AGcommaaccent":-35,"AO":-40,"AOacute":-40,"AOcircumflex":-40,"AOdieresis":-40,"AOgrave":-40,"AOhungarumlaut":-40,"AOmacron":-40,"AOslash":-40,"AOtilde":-40,"AQ":-40,"AT":-37,"ATcaron":-37,"ATcommaaccent":-37,"AU":-50,"AUacute":-50,"AUcircumflex":-50,"AUdieresis":-50,"AUgrave":-50,"AUhungarumlaut":-50,"AUmacron":-50,"AUogonek":-50,"AUring":-50,"AV":-105,"AW":-95,"AY":-55,"AYacute":-55,"AYdieresis":-55,"Aquoteright":-37,"Au":-20,"Auacute":-20,"Aucircumflex":-20,"Audieresis":-20,"Augrave":-20,"Auhungarumlaut":-20,"Aumacron":-20,"Auogonek":-20,"Auring":-20,"Av":-55,"Aw":-55,"Ay":-55,"Ayacute":-55,"Aydieresis":-55,"AacuteC":-30,"AacuteCacute":-30,"AacuteCcaron":-30,"AacuteCcedilla":-30,"AacuteG":-35,"AacuteGbreve":-35,"AacuteGcommaaccent":-35,"AacuteO":-40,"AacuteOacute":-40,"AacuteOcircumflex":-40,"AacuteOdieresis":-40,"AacuteOgrave":-40,"AacuteOhungarumlaut":-40,"AacuteOmacron":-40,"AacuteOslash":-40,"AacuteOtilde":-40,"AacuteQ":-40,"AacuteT":-37,"AacuteTcaron":-37,"AacuteTcommaaccent":-37,"AacuteU":-50,"AacuteUacute":-50,"AacuteUcircumflex":-50,"AacuteUdieresis":-50,"AacuteUgrave":-50,"AacuteUhungarumlaut":-50,"AacuteUmacron":-50,"AacuteUogonek":-50,"AacuteUring":-50,"AacuteV":-105,"AacuteW":-95,"AacuteY":-55,"AacuteYacute":-55,"AacuteYdieresis":-55,"Aacutequoteright":-37,"Aacuteu":-20,"Aacuteuacute":-20,"Aacuteucircumflex":-20,"Aacuteudieresis":-20,"Aacuteugrave":-20,"Aacuteuhungarumlaut":-20,"Aacuteumacron":-20,"Aacuteuogonek":-20,"Aacuteuring":-20,"Aacutev":-55,"Aacutew":-55,"Aacutey":-55,"Aacuteyacute":-55,"Aacuteydieresis":-55,"AbreveC":-30,"AbreveCacute":-30,"AbreveCcaron":-30,"AbreveCcedilla":-30,"AbreveG":-35,"AbreveGbreve":-35,"AbreveGcommaaccent":-35,"AbreveO":-40,"AbreveOacute":-40,"AbreveOcircumflex":-40,"AbreveOdieresis":-40,"AbreveOgrave":-40,"AbreveOhungarumlaut":-40,"AbreveOmacron":-40,"AbreveOslash":-40,"AbreveOtilde":-40,"AbreveQ":-40,"AbreveT":-37,"AbreveTcaron":-37,"AbreveTcommaaccent":-37,"AbreveU":-50,"AbreveUacute":-50,"AbreveUcircumflex":-50,"AbreveUdieresis":-50,"AbreveUgrave":-50,"AbreveUhungarumlaut":-50,"AbreveUmacron":-50,"AbreveUogonek":-50,"AbreveUring":-50,"AbreveV":-105,"AbreveW":-95,"AbreveY":-55,"AbreveYacute":-55,"AbreveYdieresis":-55,"Abrevequoteright":-37,"Abreveu":-20,"Abreveuacute":-20,"Abreveucircumflex":-20,"Abreveudieresis":-20,"Abreveugrave":-20,"Abreveuhungarumlaut":-20,"Abreveumacron":-20,"Abreveuogonek":-20,"Abreveuring":-20,"Abrevev":-55,"Abrevew":-55,"Abrevey":-55,"Abreveyacute":-55,"Abreveydieresis":-55,"AcircumflexC":-30,"AcircumflexCacute":-30,"AcircumflexCcaron":-30,"AcircumflexCcedilla":-30,"AcircumflexG":-35,"AcircumflexGbreve":-35,"AcircumflexGcommaaccent":-35,"AcircumflexO":-40,"AcircumflexOacute":-40,"AcircumflexOcircumflex":-40,"AcircumflexOdieresis":-40,"AcircumflexOgrave":-40,"AcircumflexOhungarumlaut":-40,"AcircumflexOmacron":-40,"AcircumflexOslash":-40,"AcircumflexOtilde":-40,"AcircumflexQ":-40,"AcircumflexT":-37,"AcircumflexTcaron":-37,"AcircumflexTcommaaccent":-37,"AcircumflexU":-50,"AcircumflexUacute":-50,"AcircumflexUcircumflex":-50,"AcircumflexUdieresis":-50,"AcircumflexUgrave":-50,"AcircumflexUhungarumlaut":-50,"AcircumflexUmacron":-50,"AcircumflexUogonek":-50,"AcircumflexUring":-50,"AcircumflexV":-105,"AcircumflexW":-95,"AcircumflexY":-55,"AcircumflexYacute":-55,"AcircumflexYdieresis":-55,"Acircumflexquoteright":-37,"Acircumflexu":-20,"Acircumflexuacute":-20,"Acircumflexucircumflex":-20,"Acircumflexudieresis":-20,"Acircumflexugrave":-20,"Acircumflexuhungarumlaut":-20,"Acircumflexumacron":-20,"Acircumflexuogonek":-20,"Acircumflexuring":-20,"Acircumflexv":-55,"Acircumflexw":-55,"Acircumflexy":-55,"Acircumflexyacute":-55,"Acircumflexydieresis":-55,"AdieresisC":-30,"AdieresisCacute":-30,"AdieresisCcaron":-30,"AdieresisCcedilla":-30,"AdieresisG":-35,"AdieresisGbreve":-35,"AdieresisGcommaaccent":-35,"AdieresisO":-40,"AdieresisOacute":-40,"AdieresisOcircumflex":-40,"AdieresisOdieresis":-40,"AdieresisOgrave":-40,"AdieresisOhungarumlaut":-40,"AdieresisOmacron":-40,"AdieresisOslash":-40,"AdieresisOtilde":-40,"AdieresisQ":-40,"AdieresisT":-37,"AdieresisTcaron":-37,"AdieresisTcommaaccent":-37,"AdieresisU":-50,"AdieresisUacute":-50,"AdieresisUcircumflex":-50,"AdieresisUdieresis":-50,"AdieresisUgrave":-50,"AdieresisUhungarumlaut":-50,"AdieresisUmacron":-50,"AdieresisUogonek":-50,"AdieresisUring":-50,"AdieresisV":-105,"AdieresisW":-95,"AdieresisY":-55,"AdieresisYacute":-55,"AdieresisYdieresis":-55,"Adieresisquoteright":-37,"Adieresisu":-20,"Adieresisuacute":-20,"Adieresisucircumflex":-20,"Adieresisudieresis":-20,"Adieresisugrave":-20,"Adieresisuhungarumlaut":-20,"Adieresisumacron":-20,"Adieresisuogonek":-20,"Adieresisuring":-20,"Adieresisv":-55,"Adieresisw":-55,"Adieresisy":-55,"Adieresisyacute":-55,"Adieresisydieresis":-55,"AgraveC":-30,"AgraveCacute":-30,"AgraveCcaron":-30,"AgraveCcedilla":-30,"AgraveG":-35,"AgraveGbreve":-35,"AgraveGcommaaccent":-35,"AgraveO":-40,"AgraveOacute":-40,"AgraveOcircumflex":-40,"AgraveOdieresis":-40,"AgraveOgrave":-40,"AgraveOhungarumlaut":-40,"AgraveOmacron":-40,"AgraveOslash":-40,"AgraveOtilde":-40,"AgraveQ":-40,"AgraveT":-37,"AgraveTcaron":-37,"AgraveTcommaaccent":-37,"AgraveU":-50,"AgraveUacute":-50,"AgraveUcircumflex":-50,"AgraveUdieresis":-50,"AgraveUgrave":-50,"AgraveUhungarumlaut":-50,"AgraveUmacron":-50,"AgraveUogonek":-50,"AgraveUring":-50,"AgraveV":-105,"AgraveW":-95,"AgraveY":-55,"AgraveYacute":-55,"AgraveYdieresis":-55,"Agravequoteright":-37,"Agraveu":-20,"Agraveuacute":-20,"Agraveucircumflex":-20,"Agraveudieresis":-20,"Agraveugrave":-20,"Agraveuhungarumlaut":-20,"Agraveumacron":-20,"Agraveuogonek":-20,"Agraveuring":-20,"Agravev":-55,"Agravew":-55,"Agravey":-55,"Agraveyacute":-55,"Agraveydieresis":-55,"AmacronC":-30,"AmacronCacute":-30,"AmacronCcaron":-30,"AmacronCcedilla":-30,"AmacronG":-35,"AmacronGbreve":-35,"AmacronGcommaaccent":-35,"AmacronO":-40,"AmacronOacute":-40,"AmacronOcircumflex":-40,"AmacronOdieresis":-40,"AmacronOgrave":-40,"AmacronOhungarumlaut":-40,"AmacronOmacron":-40,"AmacronOslash":-40,"AmacronOtilde":-40,"AmacronQ":-40,"AmacronT":-37,"AmacronTcaron":-37,"AmacronTcommaaccent":-37,"AmacronU":-50,"AmacronUacute":-50,"AmacronUcircumflex":-50,"AmacronUdieresis":-50,"AmacronUgrave":-50,"AmacronUhungarumlaut":-50,"AmacronUmacron":-50,"AmacronUogonek":-50,"AmacronUring":-50,"AmacronV":-105,"AmacronW":-95,"AmacronY":-55,"AmacronYacute":-55,"AmacronYdieresis":-55,"Amacronquoteright":-37,"Amacronu":-20,"Amacronuacute":-20,"Amacronucircumflex":-20,"Amacronudieresis":-20,"Amacronugrave":-20,"Amacronuhungarumlaut":-20,"Amacronumacron":-20,"Amacronuogonek":-20,"Amacronuring":-20,"Amacronv":-55,"Amacronw":-55,"Amacrony":-55,"Amacronyacute":-55,"Amacronydieresis":-55,"AogonekC":-30,"AogonekCacute":-30,"AogonekCcaron":-30,"AogonekCcedilla":-30,"AogonekG":-35,"AogonekGbreve":-35,"AogonekGcommaaccent":-35,"AogonekO":-40,"AogonekOacute":-40,"AogonekOcircumflex":-40,"AogonekOdieresis":-40,"AogonekOgrave":-40,"AogonekOhungarumlaut":-40,"AogonekOmacron":-40,"AogonekOslash":-40,"AogonekOtilde":-40,"AogonekQ":-40,"AogonekT":-37,"AogonekTcaron":-37,"AogonekTcommaaccent":-37,"AogonekU":-50,"AogonekUacute":-50,"AogonekUcircumflex":-50,"AogonekUdieresis":-50,"AogonekUgrave":-50,"AogonekUhungarumlaut":-50,"AogonekUmacron":-50,"AogonekUogonek":-50,"AogonekUring":-50,"AogonekV":-105,"AogonekW":-95,"AogonekY":-55,"AogonekYacute":-55,"AogonekYdieresis":-55,"Aogonekquoteright":-37,"Aogoneku":-20,"Aogonekuacute":-20,"Aogonekucircumflex":-20,"Aogonekudieresis":-20,"Aogonekugrave":-20,"Aogonekuhungarumlaut":-20,"Aogonekumacron":-20,"Aogonekuogonek":-20,"Aogonekuring":-20,"Aogonekv":-55,"Aogonekw":-55,"Aogoneky":-55,"Aogonekyacute":-55,"Aogonekydieresis":-55,"AringC":-30,"AringCacute":-30,"AringCcaron":-30,"AringCcedilla":-30,"AringG":-35,"AringGbreve":-35,"AringGcommaaccent":-35,"AringO":-40,"AringOacute":-40,"AringOcircumflex":-40,"AringOdieresis":-40,"AringOgrave":-40,"AringOhungarumlaut":-40,"AringOmacron":-40,"AringOslash":-40,"AringOtilde":-40,"AringQ":-40,"AringT":-37,"AringTcaron":-37,"AringTcommaaccent":-37,"AringU":-50,"AringUacute":-50,"AringUcircumflex":-50,"AringUdieresis":-50,"AringUgrave":-50,"AringUhungarumlaut":-50,"AringUmacron":-50,"AringUogonek":-50,"AringUring":-50,"AringV":-105,"AringW":-95,"AringY":-55,"AringYacute":-55,"AringYdieresis":-55,"Aringquoteright":-37,"Aringu":-20,"Aringuacute":-20,"Aringucircumflex":-20,"Aringudieresis":-20,"Aringugrave":-20,"Aringuhungarumlaut":-20,"Aringumacron":-20,"Aringuogonek":-20,"Aringuring":-20,"Aringv":-55,"Aringw":-55,"Aringy":-55,"Aringyacute":-55,"Aringydieresis":-55,"AtildeC":-30,"AtildeCacute":-30,"AtildeCcaron":-30,"AtildeCcedilla":-30,"AtildeG":-35,"AtildeGbreve":-35,"AtildeGcommaaccent":-35,"AtildeO":-40,"AtildeOacute":-40,"AtildeOcircumflex":-40,"AtildeOdieresis":-40,"AtildeOgrave":-40,"AtildeOhungarumlaut":-40,"AtildeOmacron":-40,"AtildeOslash":-40,"AtildeOtilde":-40,"AtildeQ":-40,"AtildeT":-37,"AtildeTcaron":-37,"AtildeTcommaaccent":-37,"AtildeU":-50,"AtildeUacute":-50,"AtildeUcircumflex":-50,"AtildeUdieresis":-50,"AtildeUgrave":-50,"AtildeUhungarumlaut":-50,"AtildeUmacron":-50,"AtildeUogonek":-50,"AtildeUring":-50,"AtildeV":-105,"AtildeW":-95,"AtildeY":-55,"AtildeYacute":-55,"AtildeYdieresis":-55,"Atildequoteright":-37,"Atildeu":-20,"Atildeuacute":-20,"Atildeucircumflex":-20,"Atildeudieresis":-20,"Atildeugrave":-20,"Atildeuhungarumlaut":-20,"Atildeumacron":-20,"Atildeuogonek":-20,"Atildeuring":-20,"Atildev":-55,"Atildew":-55,"Atildey":-55,"Atildeyacute":-55,"Atildeydieresis":-55,"BA":-25,"BAacute":-25,"BAbreve":-25,"BAcircumflex":-25,"BAdieresis":-25,"BAgrave":-25,"BAmacron":-25,"BAogonek":-25,"BAring":-25,"BAtilde":-25,"BU":-10,"BUacute":-10,"BUcircumflex":-10,"BUdieresis":-10,"BUgrave":-10,"BUhungarumlaut":-10,"BUmacron":-10,"BUogonek":-10,"BUring":-10,"DA":-35,"DAacute":-35,"DAbreve":-35,"DAcircumflex":-35,"DAdieresis":-35,"DAgrave":-35,"DAmacron":-35,"DAogonek":-35,"DAring":-35,"DAtilde":-35,"DV":-40,"DW":-40,"DY":-40,"DYacute":-40,"DYdieresis":-40,"DcaronA":-35,"DcaronAacute":-35,"DcaronAbreve":-35,"DcaronAcircumflex":-35,"DcaronAdieresis":-35,"DcaronAgrave":-35,"DcaronAmacron":-35,"DcaronAogonek":-35,"DcaronAring":-35,"DcaronAtilde":-35,"DcaronV":-40,"DcaronW":-40,"DcaronY":-40,"DcaronYacute":-40,"DcaronYdieresis":-40,"DcroatA":-35,"DcroatAacute":-35,"DcroatAbreve":-35,"DcroatAcircumflex":-35,"DcroatAdieresis":-35,"DcroatAgrave":-35,"DcroatAmacron":-35,"DcroatAogonek":-35,"DcroatAring":-35,"DcroatAtilde":-35,"DcroatV":-40,"DcroatW":-40,"DcroatY":-40,"DcroatYacute":-40,"DcroatYdieresis":-40,"FA":-115,"FAacute":-115,"FAbreve":-115,"FAcircumflex":-115,"FAdieresis":-115,"FAgrave":-115,"FAmacron":-115,"FAogonek":-115,"FAring":-115,"FAtilde":-115,"Fa":-75,"Faacute":-75,"Fabreve":-75,"Facircumflex":-75,"Fadieresis":-75,"Fagrave":-75,"Famacron":-75,"Faogonek":-75,"Faring":-75,"Fatilde":-75,"Fcomma":-135,"Fe":-75,"Feacute":-75,"Fecaron":-75,"Fecircumflex":-75,"Fedieresis":-75,"Fedotaccent":-75,"Fegrave":-75,"Femacron":-75,"Feogonek":-75,"Fi":-45,"Fiacute":-45,"Ficircumflex":-45,"Fidieresis":-45,"Figrave":-45,"Fimacron":-45,"Fiogonek":-45,"Fo":-105,"Foacute":-105,"Focircumflex":-105,"Fodieresis":-105,"Fograve":-105,"Fohungarumlaut":-105,"Fomacron":-105,"Foslash":-105,"Fotilde":-105,"Fperiod":-135,"Fr":-55,"Fracute":-55,"Frcaron":-55,"Frcommaaccent":-55,"JA":-40,"JAacute":-40,"JAbreve":-40,"JAcircumflex":-40,"JAdieresis":-40,"JAgrave":-40,"JAmacron":-40,"JAogonek":-40,"JAring":-40,"JAtilde":-40,"Ja":-35,"Jaacute":-35,"Jabreve":-35,"Jacircumflex":-35,"Jadieresis":-35,"Jagrave":-35,"Jamacron":-35,"Jaogonek":-35,"Jaring":-35,"Jatilde":-35,"Jcomma":-25,"Je":-25,"Jeacute":-25,"Jecaron":-25,"Jecircumflex":-25,"Jedieresis":-25,"Jedotaccent":-25,"Jegrave":-25,"Jemacron":-25,"Jeogonek":-25,"Jo":-25,"Joacute":-25,"Jocircumflex":-25,"Jodieresis":-25,"Jograve":-25,"Johungarumlaut":-25,"Jomacron":-25,"Joslash":-25,"Jotilde":-25,"Jperiod":-25,"Ju":-35,"Juacute":-35,"Jucircumflex":-35,"Judieresis":-35,"Jugrave":-35,"Juhungarumlaut":-35,"Jumacron":-35,"Juogonek":-35,"Juring":-35,"KO":-50,"KOacute":-50,"KOcircumflex":-50,"KOdieresis":-50,"KOgrave":-50,"KOhungarumlaut":-50,"KOmacron":-50,"KOslash":-50,"KOtilde":-50,"Ke":-35,"Keacute":-35,"Kecaron":-35,"Kecircumflex":-35,"Kedieresis":-35,"Kedotaccent":-35,"Kegrave":-35,"Kemacron":-35,"Keogonek":-35,"Ko":-40,"Koacute":-40,"Kocircumflex":-40,"Kodieresis":-40,"Kograve":-40,"Kohungarumlaut":-40,"Komacron":-40,"Koslash":-40,"Kotilde":-40,"Ku":-40,"Kuacute":-40,"Kucircumflex":-40,"Kudieresis":-40,"Kugrave":-40,"Kuhungarumlaut":-40,"Kumacron":-40,"Kuogonek":-40,"Kuring":-40,"Ky":-40,"Kyacute":-40,"Kydieresis":-40,"KcommaaccentO":-50,"KcommaaccentOacute":-50,"KcommaaccentOcircumflex":-50,"KcommaaccentOdieresis":-50,"KcommaaccentOgrave":-50,"KcommaaccentOhungarumlaut":-50,"KcommaaccentOmacron":-50,"KcommaaccentOslash":-50,"KcommaaccentOtilde":-50,"Kcommaaccente":-35,"Kcommaaccenteacute":-35,"Kcommaaccentecaron":-35,"Kcommaaccentecircumflex":-35,"Kcommaaccentedieresis":-35,"Kcommaaccentedotaccent":-35,"Kcommaaccentegrave":-35,"Kcommaaccentemacron":-35,"Kcommaaccenteogonek":-35,"Kcommaaccento":-40,"Kcommaaccentoacute":-40,"Kcommaaccentocircumflex":-40,"Kcommaaccentodieresis":-40,"Kcommaaccentograve":-40,"Kcommaaccentohungarumlaut":-40,"Kcommaaccentomacron":-40,"Kcommaaccentoslash":-40,"Kcommaaccentotilde":-40,"Kcommaaccentu":-40,"Kcommaaccentuacute":-40,"Kcommaaccentucircumflex":-40,"Kcommaaccentudieresis":-40,"Kcommaaccentugrave":-40,"Kcommaaccentuhungarumlaut":-40,"Kcommaaccentumacron":-40,"Kcommaaccentuogonek":-40,"Kcommaaccenturing":-40,"Kcommaaccenty":-40,"Kcommaaccentyacute":-40,"Kcommaaccentydieresis":-40,"LT":-20,"LTcaron":-20,"LTcommaaccent":-20,"LV":-55,"LW":-55,"LY":-20,"LYacute":-20,"LYdieresis":-20,"Lquoteright":-37,"Ly":-30,"Lyacute":-30,"Lydieresis":-30,"LacuteT":-20,"LacuteTcaron":-20,"LacuteTcommaaccent":-20,"LacuteV":-55,"LacuteW":-55,"LacuteY":-20,"LacuteYacute":-20,"LacuteYdieresis":-20,"Lacutequoteright":-37,"Lacutey":-30,"Lacuteyacute":-30,"Lacuteydieresis":-30,"LcommaaccentT":-20,"LcommaaccentTcaron":-20,"LcommaaccentTcommaaccent":-20,"LcommaaccentV":-55,"LcommaaccentW":-55,"LcommaaccentY":-20,"LcommaaccentYacute":-20,"LcommaaccentYdieresis":-20,"Lcommaaccentquoteright":-37,"Lcommaaccenty":-30,"Lcommaaccentyacute":-30,"Lcommaaccentydieresis":-30,"LslashT":-20,"LslashTcaron":-20,"LslashTcommaaccent":-20,"LslashV":-55,"LslashW":-55,"LslashY":-20,"LslashYacute":-20,"LslashYdieresis":-20,"Lslashquoteright":-37,"Lslashy":-30,"Lslashyacute":-30,"Lslashydieresis":-30,"NA":-27,"NAacute":-27,"NAbreve":-27,"NAcircumflex":-27,"NAdieresis":-27,"NAgrave":-27,"NAmacron":-27,"NAogonek":-27,"NAring":-27,"NAtilde":-27,"NacuteA":-27,"NacuteAacute":-27,"NacuteAbreve":-27,"NacuteAcircumflex":-27,"NacuteAdieresis":-27,"NacuteAgrave":-27,"NacuteAmacron":-27,"NacuteAogonek":-27,"NacuteAring":-27,"NacuteAtilde":-27,"NcaronA":-27,"NcaronAacute":-27,"NcaronAbreve":-27,"NcaronAcircumflex":-27,"NcaronAdieresis":-27,"NcaronAgrave":-27,"NcaronAmacron":-27,"NcaronAogonek":-27,"NcaronAring":-27,"NcaronAtilde":-27,"NcommaaccentA":-27,"NcommaaccentAacute":-27,"NcommaaccentAbreve":-27,"NcommaaccentAcircumflex":-27,"NcommaaccentAdieresis":-27,"NcommaaccentAgrave":-27,"NcommaaccentAmacron":-27,"NcommaaccentAogonek":-27,"NcommaaccentAring":-27,"NcommaaccentAtilde":-27,"NtildeA":-27,"NtildeAacute":-27,"NtildeAbreve":-27,"NtildeAcircumflex":-27,"NtildeAdieresis":-27,"NtildeAgrave":-27,"NtildeAmacron":-27,"NtildeAogonek":-27,"NtildeAring":-27,"NtildeAtilde":-27,"OA":-55,"OAacute":-55,"OAbreve":-55,"OAcircumflex":-55,"OAdieresis":-55,"OAgrave":-55,"OAmacron":-55,"OAogonek":-55,"OAring":-55,"OAtilde":-55,"OT":-40,"OTcaron":-40,"OTcommaaccent":-40,"OV":-50,"OW":-50,"OX":-40,"OY":-50,"OYacute":-50,"OYdieresis":-50,"OacuteA":-55,"OacuteAacute":-55,"OacuteAbreve":-55,"OacuteAcircumflex":-55,"OacuteAdieresis":-55,"OacuteAgrave":-55,"OacuteAmacron":-55,"OacuteAogonek":-55,"OacuteAring":-55,"OacuteAtilde":-55,"OacuteT":-40,"OacuteTcaron":-40,"OacuteTcommaaccent":-40,"OacuteV":-50,"OacuteW":-50,"OacuteX":-40,"OacuteY":-50,"OacuteYacute":-50,"OacuteYdieresis":-50,"OcircumflexA":-55,"OcircumflexAacute":-55,"OcircumflexAbreve":-55,"OcircumflexAcircumflex":-55,"OcircumflexAdieresis":-55,"OcircumflexAgrave":-55,"OcircumflexAmacron":-55,"OcircumflexAogonek":-55,"OcircumflexAring":-55,"OcircumflexAtilde":-55,"OcircumflexT":-40,"OcircumflexTcaron":-40,"OcircumflexTcommaaccent":-40,"OcircumflexV":-50,"OcircumflexW":-50,"OcircumflexX":-40,"OcircumflexY":-50,"OcircumflexYacute":-50,"OcircumflexYdieresis":-50,"OdieresisA":-55,"OdieresisAacute":-55,"OdieresisAbreve":-55,"OdieresisAcircumflex":-55,"OdieresisAdieresis":-55,"OdieresisAgrave":-55,"OdieresisAmacron":-55,"OdieresisAogonek":-55,"OdieresisAring":-55,"OdieresisAtilde":-55,"OdieresisT":-40,"OdieresisTcaron":-40,"OdieresisTcommaaccent":-40,"OdieresisV":-50,"OdieresisW":-50,"OdieresisX":-40,"OdieresisY":-50,"OdieresisYacute":-50,"OdieresisYdieresis":-50,"OgraveA":-55,"OgraveAacute":-55,"OgraveAbreve":-55,"OgraveAcircumflex":-55,"OgraveAdieresis":-55,"OgraveAgrave":-55,"OgraveAmacron":-55,"OgraveAogonek":-55,"OgraveAring":-55,"OgraveAtilde":-55,"OgraveT":-40,"OgraveTcaron":-40,"OgraveTcommaaccent":-40,"OgraveV":-50,"OgraveW":-50,"OgraveX":-40,"OgraveY":-50,"OgraveYacute":-50,"OgraveYdieresis":-50,"OhungarumlautA":-55,"OhungarumlautAacute":-55,"OhungarumlautAbreve":-55,"OhungarumlautAcircumflex":-55,"OhungarumlautAdieresis":-55,"OhungarumlautAgrave":-55,"OhungarumlautAmacron":-55,"OhungarumlautAogonek":-55,"OhungarumlautAring":-55,"OhungarumlautAtilde":-55,"OhungarumlautT":-40,"OhungarumlautTcaron":-40,"OhungarumlautTcommaaccent":-40,"OhungarumlautV":-50,"OhungarumlautW":-50,"OhungarumlautX":-40,"OhungarumlautY":-50,"OhungarumlautYacute":-50,"OhungarumlautYdieresis":-50,"OmacronA":-55,"OmacronAacute":-55,"OmacronAbreve":-55,"OmacronAcircumflex":-55,"OmacronAdieresis":-55,"OmacronAgrave":-55,"OmacronAmacron":-55,"OmacronAogonek":-55,"OmacronAring":-55,"OmacronAtilde":-55,"OmacronT":-40,"OmacronTcaron":-40,"OmacronTcommaaccent":-40,"OmacronV":-50,"OmacronW":-50,"OmacronX":-40,"OmacronY":-50,"OmacronYacute":-50,"OmacronYdieresis":-50,"OslashA":-55,"OslashAacute":-55,"OslashAbreve":-55,"OslashAcircumflex":-55,"OslashAdieresis":-55,"OslashAgrave":-55,"OslashAmacron":-55,"OslashAogonek":-55,"OslashAring":-55,"OslashAtilde":-55,"OslashT":-40,"OslashTcaron":-40,"OslashTcommaaccent":-40,"OslashV":-50,"OslashW":-50,"OslashX":-40,"OslashY":-50,"OslashYacute":-50,"OslashYdieresis":-50,"OtildeA":-55,"OtildeAacute":-55,"OtildeAbreve":-55,"OtildeAcircumflex":-55,"OtildeAdieresis":-55,"OtildeAgrave":-55,"OtildeAmacron":-55,"OtildeAogonek":-55,"OtildeAring":-55,"OtildeAtilde":-55,"OtildeT":-40,"OtildeTcaron":-40,"OtildeTcommaaccent":-40,"OtildeV":-50,"OtildeW":-50,"OtildeX":-40,"OtildeY":-50,"OtildeYacute":-50,"OtildeYdieresis":-50,"PA":-90,"PAacute":-90,"PAbreve":-90,"PAcircumflex":-90,"PAdieresis":-90,"PAgrave":-90,"PAmacron":-90,"PAogonek":-90,"PAring":-90,"PAtilde":-90,"Pa":-80,"Paacute":-80,"Pabreve":-80,"Pacircumflex":-80,"Padieresis":-80,"Pagrave":-80,"Pamacron":-80,"Paogonek":-80,"Paring":-80,"Patilde":-80,"Pcomma":-135,"Pe":-80,"Peacute":-80,"Pecaron":-80,"Pecircumflex":-80,"Pedieresis":-80,"Pedotaccent":-80,"Pegrave":-80,"Pemacron":-80,"Peogonek":-80,"Po":-80,"Poacute":-80,"Pocircumflex":-80,"Podieresis":-80,"Pograve":-80,"Pohungarumlaut":-80,"Pomacron":-80,"Poslash":-80,"Potilde":-80,"Pperiod":-135,"QU":-10,"QUacute":-10,"QUcircumflex":-10,"QUdieresis":-10,"QUgrave":-10,"QUhungarumlaut":-10,"QUmacron":-10,"QUogonek":-10,"QUring":-10,"RO":-40,"ROacute":-40,"ROcircumflex":-40,"ROdieresis":-40,"ROgrave":-40,"ROhungarumlaut":-40,"ROmacron":-40,"ROslash":-40,"ROtilde":-40,"RU":-40,"RUacute":-40,"RUcircumflex":-40,"RUdieresis":-40,"RUgrave":-40,"RUhungarumlaut":-40,"RUmacron":-40,"RUogonek":-40,"RUring":-40,"RV":-18,"RW":-18,"RY":-18,"RYacute":-18,"RYdieresis":-18,"RacuteO":-40,"RacuteOacute":-40,"RacuteOcircumflex":-40,"RacuteOdieresis":-40,"RacuteOgrave":-40,"RacuteOhungarumlaut":-40,"RacuteOmacron":-40,"RacuteOslash":-40,"RacuteOtilde":-40,"RacuteU":-40,"RacuteUacute":-40,"RacuteUcircumflex":-40,"RacuteUdieresis":-40,"RacuteUgrave":-40,"RacuteUhungarumlaut":-40,"RacuteUmacron":-40,"RacuteUogonek":-40,"RacuteUring":-40,"RacuteV":-18,"RacuteW":-18,"RacuteY":-18,"RacuteYacute":-18,"RacuteYdieresis":-18,"RcaronO":-40,"RcaronOacute":-40,"RcaronOcircumflex":-40,"RcaronOdieresis":-40,"RcaronOgrave":-40,"RcaronOhungarumlaut":-40,"RcaronOmacron":-40,"RcaronOslash":-40,"RcaronOtilde":-40,"RcaronU":-40,"RcaronUacute":-40,"RcaronUcircumflex":-40,"RcaronUdieresis":-40,"RcaronUgrave":-40,"RcaronUhungarumlaut":-40,"RcaronUmacron":-40,"RcaronUogonek":-40,"RcaronUring":-40,"RcaronV":-18,"RcaronW":-18,"RcaronY":-18,"RcaronYacute":-18,"RcaronYdieresis":-18,"RcommaaccentO":-40,"RcommaaccentOacute":-40,"RcommaaccentOcircumflex":-40,"RcommaaccentOdieresis":-40,"RcommaaccentOgrave":-40,"RcommaaccentOhungarumlaut":-40,"RcommaaccentOmacron":-40,"RcommaaccentOslash":-40,"RcommaaccentOtilde":-40,"RcommaaccentU":-40,"RcommaaccentUacute":-40,"RcommaaccentUcircumflex":-40,"RcommaaccentUdieresis":-40,"RcommaaccentUgrave":-40,"RcommaaccentUhungarumlaut":-40,"RcommaaccentUmacron":-40,"RcommaaccentUogonek":-40,"RcommaaccentUring":-40,"RcommaaccentV":-18,"RcommaaccentW":-18,"RcommaaccentY":-18,"RcommaaccentYacute":-18,"RcommaaccentYdieresis":-18,"TA":-50,"TAacute":-50,"TAbreve":-50,"TAcircumflex":-50,"TAdieresis":-50,"TAgrave":-50,"TAmacron":-50,"TAogonek":-50,"TAring":-50,"TAtilde":-50,"TO":-18,"TOacute":-18,"TOcircumflex":-18,"TOdieresis":-18,"TOgrave":-18,"TOhungarumlaut":-18,"TOmacron":-18,"TOslash":-18,"TOtilde":-18,"Ta":-92,"Taacute":-92,"Tabreve":-92,"Tacircumflex":-92,"Tadieresis":-92,"Tagrave":-92,"Tamacron":-92,"Taogonek":-92,"Taring":-92,"Tatilde":-92,"Tcolon":-55,"Tcomma":-74,"Te":-92,"Teacute":-92,"Tecaron":-92,"Tecircumflex":-52,"Tedieresis":-52,"Tedotaccent":-92,"Tegrave":-52,"Temacron":-52,"Teogonek":-92,"Thyphen":-74,"Ti":-55,"Tiacute":-55,"Tiogonek":-55,"To":-92,"Toacute":-92,"Tocircumflex":-92,"Todieresis":-92,"Tograve":-92,"Tohungarumlaut":-92,"Tomacron":-92,"Toslash":-92,"Totilde":-92,"Tperiod":-74,"Tr":-55,"Tracute":-55,"Trcaron":-55,"Trcommaaccent":-55,"Tsemicolon":-65,"Tu":-55,"Tuacute":-55,"Tucircumflex":-55,"Tudieresis":-55,"Tugrave":-55,"Tuhungarumlaut":-55,"Tumacron":-55,"Tuogonek":-55,"Turing":-55,"Tw":-74,"Ty":-74,"Tyacute":-74,"Tydieresis":-34,"TcaronA":-50,"TcaronAacute":-50,"TcaronAbreve":-50,"TcaronAcircumflex":-50,"TcaronAdieresis":-50,"TcaronAgrave":-50,"TcaronAmacron":-50,"TcaronAogonek":-50,"TcaronAring":-50,"TcaronAtilde":-50,"TcaronO":-18,"TcaronOacute":-18,"TcaronOcircumflex":-18,"TcaronOdieresis":-18,"TcaronOgrave":-18,"TcaronOhungarumlaut":-18,"TcaronOmacron":-18,"TcaronOslash":-18,"TcaronOtilde":-18,"Tcarona":-92,"Tcaronaacute":-92,"Tcaronabreve":-92,"Tcaronacircumflex":-92,"Tcaronadieresis":-92,"Tcaronagrave":-92,"Tcaronamacron":-92,"Tcaronaogonek":-92,"Tcaronaring":-92,"Tcaronatilde":-92,"Tcaroncolon":-55,"Tcaroncomma":-74,"Tcarone":-92,"Tcaroneacute":-92,"Tcaronecaron":-92,"Tcaronecircumflex":-52,"Tcaronedieresis":-52,"Tcaronedotaccent":-92,"Tcaronegrave":-52,"Tcaronemacron":-52,"Tcaroneogonek":-92,"Tcaronhyphen":-74,"Tcaroni":-55,"Tcaroniacute":-55,"Tcaroniogonek":-55,"Tcarono":-92,"Tcaronoacute":-92,"Tcaronocircumflex":-92,"Tcaronodieresis":-92,"Tcaronograve":-92,"Tcaronohungarumlaut":-92,"Tcaronomacron":-92,"Tcaronoslash":-92,"Tcaronotilde":-92,"Tcaronperiod":-74,"Tcaronr":-55,"Tcaronracute":-55,"Tcaronrcaron":-55,"Tcaronrcommaaccent":-55,"Tcaronsemicolon":-65,"Tcaronu":-55,"Tcaronuacute":-55,"Tcaronucircumflex":-55,"Tcaronudieresis":-55,"Tcaronugrave":-55,"Tcaronuhungarumlaut":-55,"Tcaronumacron":-55,"Tcaronuogonek":-55,"Tcaronuring":-55,"Tcaronw":-74,"Tcarony":-74,"Tcaronyacute":-74,"Tcaronydieresis":-34,"TcommaaccentA":-50,"TcommaaccentAacute":-50,"TcommaaccentAbreve":-50,"TcommaaccentAcircumflex":-50,"TcommaaccentAdieresis":-50,"TcommaaccentAgrave":-50,"TcommaaccentAmacron":-50,"TcommaaccentAogonek":-50,"TcommaaccentAring":-50,"TcommaaccentAtilde":-50,"TcommaaccentO":-18,"TcommaaccentOacute":-18,"TcommaaccentOcircumflex":-18,"TcommaaccentOdieresis":-18,"TcommaaccentOgrave":-18,"TcommaaccentOhungarumlaut":-18,"TcommaaccentOmacron":-18,"TcommaaccentOslash":-18,"TcommaaccentOtilde":-18,"Tcommaaccenta":-92,"Tcommaaccentaacute":-92,"Tcommaaccentabreve":-92,"Tcommaaccentacircumflex":-92,"Tcommaaccentadieresis":-92,"Tcommaaccentagrave":-92,"Tcommaaccentamacron":-92,"Tcommaaccentaogonek":-92,"Tcommaaccentaring":-92,"Tcommaaccentatilde":-92,"Tcommaaccentcolon":-55,"Tcommaaccentcomma":-74,"Tcommaaccente":-92,"Tcommaaccenteacute":-92,"Tcommaaccentecaron":-92,"Tcommaaccentecircumflex":-52,"Tcommaaccentedieresis":-52,"Tcommaaccentedotaccent":-92,"Tcommaaccentegrave":-52,"Tcommaaccentemacron":-52,"Tcommaaccenteogonek":-92,"Tcommaaccenthyphen":-74,"Tcommaaccenti":-55,"Tcommaaccentiacute":-55,"Tcommaaccentiogonek":-55,"Tcommaaccento":-92,"Tcommaaccentoacute":-92,"Tcommaaccentocircumflex":-92,"Tcommaaccentodieresis":-92,"Tcommaaccentograve":-92,"Tcommaaccentohungarumlaut":-92,"Tcommaaccentomacron":-92,"Tcommaaccentoslash":-92,"Tcommaaccentotilde":-92,"Tcommaaccentperiod":-74,"Tcommaaccentr":-55,"Tcommaaccentracute":-55,"Tcommaaccentrcaron":-55,"Tcommaaccentrcommaaccent":-55,"Tcommaaccentsemicolon":-65,"Tcommaaccentu":-55,"Tcommaaccentuacute":-55,"Tcommaaccentucircumflex":-55,"Tcommaaccentudieresis":-55,"Tcommaaccentugrave":-55,"Tcommaaccentuhungarumlaut":-55,"Tcommaaccentumacron":-55,"Tcommaaccentuogonek":-55,"Tcommaaccenturing":-55,"Tcommaaccentw":-74,"Tcommaaccenty":-74,"Tcommaaccentyacute":-74,"Tcommaaccentydieresis":-34,"UA":-40,"UAacute":-40,"UAbreve":-40,"UAcircumflex":-40,"UAdieresis":-40,"UAgrave":-40,"UAmacron":-40,"UAogonek":-40,"UAring":-40,"UAtilde":-40,"Ucomma":-25,"Uperiod":-25,"UacuteA":-40,"UacuteAacute":-40,"UacuteAbreve":-40,"UacuteAcircumflex":-40,"UacuteAdieresis":-40,"UacuteAgrave":-40,"UacuteAmacron":-40,"UacuteAogonek":-40,"UacuteAring":-40,"UacuteAtilde":-40,"Uacutecomma":-25,"Uacuteperiod":-25,"UcircumflexA":-40,"UcircumflexAacute":-40,"UcircumflexAbreve":-40,"UcircumflexAcircumflex":-40,"UcircumflexAdieresis":-40,"UcircumflexAgrave":-40,"UcircumflexAmacron":-40,"UcircumflexAogonek":-40,"UcircumflexAring":-40,"UcircumflexAtilde":-40,"Ucircumflexcomma":-25,"Ucircumflexperiod":-25,"UdieresisA":-40,"UdieresisAacute":-40,"UdieresisAbreve":-40,"UdieresisAcircumflex":-40,"UdieresisAdieresis":-40,"UdieresisAgrave":-40,"UdieresisAmacron":-40,"UdieresisAogonek":-40,"UdieresisAring":-40,"UdieresisAtilde":-40,"Udieresiscomma":-25,"Udieresisperiod":-25,"UgraveA":-40,"UgraveAacute":-40,"UgraveAbreve":-40,"UgraveAcircumflex":-40,"UgraveAdieresis":-40,"UgraveAgrave":-40,"UgraveAmacron":-40,"UgraveAogonek":-40,"UgraveAring":-40,"UgraveAtilde":-40,"Ugravecomma":-25,"Ugraveperiod":-25,"UhungarumlautA":-40,"UhungarumlautAacute":-40,"UhungarumlautAbreve":-40,"UhungarumlautAcircumflex":-40,"UhungarumlautAdieresis":-40,"UhungarumlautAgrave":-40,"UhungarumlautAmacron":-40,"UhungarumlautAogonek":-40,"UhungarumlautAring":-40,"UhungarumlautAtilde":-40,"Uhungarumlautcomma":-25,"Uhungarumlautperiod":-25,"UmacronA":-40,"UmacronAacute":-40,"UmacronAbreve":-40,"UmacronAcircumflex":-40,"UmacronAdieresis":-40,"UmacronAgrave":-40,"UmacronAmacron":-40,"UmacronAogonek":-40,"UmacronAring":-40,"UmacronAtilde":-40,"Umacroncomma":-25,"Umacronperiod":-25,"UogonekA":-40,"UogonekAacute":-40,"UogonekAbreve":-40,"UogonekAcircumflex":-40,"UogonekAdieresis":-40,"UogonekAgrave":-40,"UogonekAmacron":-40,"UogonekAogonek":-40,"UogonekAring":-40,"UogonekAtilde":-40,"Uogonekcomma":-25,"Uogonekperiod":-25,"UringA":-40,"UringAacute":-40,"UringAbreve":-40,"UringAcircumflex":-40,"UringAdieresis":-40,"UringAgrave":-40,"UringAmacron":-40,"UringAogonek":-40,"UringAring":-40,"UringAtilde":-40,"Uringcomma":-25,"Uringperiod":-25,"VA":-60,"VAacute":-60,"VAbreve":-60,"VAcircumflex":-60,"VAdieresis":-60,"VAgrave":-60,"VAmacron":-60,"VAogonek":-60,"VAring":-60,"VAtilde":-60,"VO":-30,"VOacute":-30,"VOcircumflex":-30,"VOdieresis":-30,"VOgrave":-30,"VOhungarumlaut":-30,"VOmacron":-30,"VOslash":-30,"VOtilde":-30,"Va":-111,"Vaacute":-111,"Vabreve":-111,"Vacircumflex":-111,"Vadieresis":-111,"Vagrave":-111,"Vamacron":-111,"Vaogonek":-111,"Varing":-111,"Vatilde":-111,"Vcolon":-65,"Vcomma":-129,"Ve":-111,"Veacute":-111,"Vecaron":-111,"Vecircumflex":-111,"Vedieresis":-71,"Vedotaccent":-111,"Vegrave":-71,"Vemacron":-71,"Veogonek":-111,"Vhyphen":-55,"Vi":-74,"Viacute":-74,"Vicircumflex":-34,"Vidieresis":-34,"Vigrave":-34,"Vimacron":-34,"Viogonek":-74,"Vo":-111,"Voacute":-111,"Vocircumflex":-111,"Vodieresis":-111,"Vograve":-111,"Vohungarumlaut":-111,"Vomacron":-111,"Voslash":-111,"Votilde":-111,"Vperiod":-129,"Vsemicolon":-74,"Vu":-74,"Vuacute":-74,"Vucircumflex":-74,"Vudieresis":-74,"Vugrave":-74,"Vuhungarumlaut":-74,"Vumacron":-74,"Vuogonek":-74,"Vuring":-74,"WA":-60,"WAacute":-60,"WAbreve":-60,"WAcircumflex":-60,"WAdieresis":-60,"WAgrave":-60,"WAmacron":-60,"WAogonek":-60,"WAring":-60,"WAtilde":-60,"WO":-25,"WOacute":-25,"WOcircumflex":-25,"WOdieresis":-25,"WOgrave":-25,"WOhungarumlaut":-25,"WOmacron":-25,"WOslash":-25,"WOtilde":-25,"Wa":-92,"Waacute":-92,"Wabreve":-92,"Wacircumflex":-92,"Wadieresis":-92,"Wagrave":-92,"Wamacron":-92,"Waogonek":-92,"Waring":-92,"Watilde":-92,"Wcolon":-65,"Wcomma":-92,"We":-92,"Weacute":-92,"Wecaron":-92,"Wecircumflex":-92,"Wedieresis":-52,"Wedotaccent":-92,"Wegrave":-52,"Wemacron":-52,"Weogonek":-92,"Whyphen":-37,"Wi":-55,"Wiacute":-55,"Wiogonek":-55,"Wo":-92,"Woacute":-92,"Wocircumflex":-92,"Wodieresis":-92,"Wograve":-92,"Wohungarumlaut":-92,"Womacron":-92,"Woslash":-92,"Wotilde":-92,"Wperiod":-92,"Wsemicolon":-65,"Wu":-55,"Wuacute":-55,"Wucircumflex":-55,"Wudieresis":-55,"Wugrave":-55,"Wuhungarumlaut":-55,"Wumacron":-55,"Wuogonek":-55,"Wuring":-55,"Wy":-70,"Wyacute":-70,"Wydieresis":-70,"YA":-50,"YAacute":-50,"YAbreve":-50,"YAcircumflex":-50,"YAdieresis":-50,"YAgrave":-50,"YAmacron":-50,"YAogonek":-50,"YAring":-50,"YAtilde":-50,"YO":-15,"YOacute":-15,"YOcircumflex":-15,"YOdieresis":-15,"YOgrave":-15,"YOhungarumlaut":-15,"YOmacron":-15,"YOslash":-15,"YOtilde":-15,"Ya":-92,"Yaacute":-92,"Yabreve":-92,"Yacircumflex":-92,"Yadieresis":-92,"Yagrave":-92,"Yamacron":-92,"Yaogonek":-92,"Yaring":-92,"Yatilde":-92,"Ycolon":-65,"Ycomma":-92,"Ye":-92,"Yeacute":-92,"Yecaron":-92,"Yecircumflex":-92,"Yedieresis":-52,"Yedotaccent":-92,"Yegrave":-52,"Yemacron":-52,"Yeogonek":-92,"Yhyphen":-74,"Yi":-74,"Yiacute":-74,"Yicircumflex":-34,"Yidieresis":-34,"Yigrave":-34,"Yimacron":-34,"Yiogonek":-74,"Yo":-92,"Yoacute":-92,"Yocircumflex":-92,"Yodieresis":-92,"Yograve":-92,"Yohungarumlaut":-92,"Yomacron":-92,"Yoslash":-92,"Yotilde":-92,"Yperiod":-92,"Ysemicolon":-65,"Yu":-92,"Yuacute":-92,"Yucircumflex":-92,"Yudieresis":-92,"Yugrave":-92,"Yuhungarumlaut":-92,"Yumacron":-92,"Yuogonek":-92,"Yuring":-92,"YacuteA":-50,"YacuteAacute":-50,"YacuteAbreve":-50,"YacuteAcircumflex":-50,"YacuteAdieresis":-50,"YacuteAgrave":-50,"YacuteAmacron":-50,"YacuteAogonek":-50,"YacuteAring":-50,"YacuteAtilde":-50,"YacuteO":-15,"YacuteOacute":-15,"YacuteOcircumflex":-15,"YacuteOdieresis":-15,"YacuteOgrave":-15,"YacuteOhungarumlaut":-15,"YacuteOmacron":-15,"YacuteOslash":-15,"YacuteOtilde":-15,"Yacutea":-92,"Yacuteaacute":-92,"Yacuteabreve":-92,"Yacuteacircumflex":-92,"Yacuteadieresis":-92,"Yacuteagrave":-92,"Yacuteamacron":-92,"Yacuteaogonek":-92,"Yacutearing":-92,"Yacuteatilde":-92,"Yacutecolon":-65,"Yacutecomma":-92,"Yacutee":-92,"Yacuteeacute":-92,"Yacuteecaron":-92,"Yacuteecircumflex":-92,"Yacuteedieresis":-52,"Yacuteedotaccent":-92,"Yacuteegrave":-52,"Yacuteemacron":-52,"Yacuteeogonek":-92,"Yacutehyphen":-74,"Yacutei":-74,"Yacuteiacute":-74,"Yacuteicircumflex":-34,"Yacuteidieresis":-34,"Yacuteigrave":-34,"Yacuteimacron":-34,"Yacuteiogonek":-74,"Yacuteo":-92,"Yacuteoacute":-92,"Yacuteocircumflex":-92,"Yacuteodieresis":-92,"Yacuteograve":-92,"Yacuteohungarumlaut":-92,"Yacuteomacron":-92,"Yacuteoslash":-92,"Yacuteotilde":-92,"Yacuteperiod":-92,"Yacutesemicolon":-65,"Yacuteu":-92,"Yacuteuacute":-92,"Yacuteucircumflex":-92,"Yacuteudieresis":-92,"Yacuteugrave":-92,"Yacuteuhungarumlaut":-92,"Yacuteumacron":-92,"Yacuteuogonek":-92,"Yacuteuring":-92,"YdieresisA":-50,"YdieresisAacute":-50,"YdieresisAbreve":-50,"YdieresisAcircumflex":-50,"YdieresisAdieresis":-50,"YdieresisAgrave":-50,"YdieresisAmacron":-50,"YdieresisAogonek":-50,"YdieresisAring":-50,"YdieresisAtilde":-50,"YdieresisO":-15,"YdieresisOacute":-15,"YdieresisOcircumflex":-15,"YdieresisOdieresis":-15,"YdieresisOgrave":-15,"YdieresisOhungarumlaut":-15,"YdieresisOmacron":-15,"YdieresisOslash":-15,"YdieresisOtilde":-15,"Ydieresisa":-92,"Ydieresisaacute":-92,"Ydieresisabreve":-92,"Ydieresisacircumflex":-92,"Ydieresisadieresis":-92,"Ydieresisagrave":-92,"Ydieresisamacron":-92,"Ydieresisaogonek":-92,"Ydieresisaring":-92,"Ydieresisatilde":-92,"Ydieresiscolon":-65,"Ydieresiscomma":-92,"Ydieresise":-92,"Ydieresiseacute":-92,"Ydieresisecaron":-92,"Ydieresisecircumflex":-92,"Ydieresisedieresis":-52,"Ydieresisedotaccent":-92,"Ydieresisegrave":-52,"Ydieresisemacron":-52,"Ydieresiseogonek":-92,"Ydieresishyphen":-74,"Ydieresisi":-74,"Ydieresisiacute":-74,"Ydieresisicircumflex":-34,"Ydieresisidieresis":-34,"Ydieresisigrave":-34,"Ydieresisimacron":-34,"Ydieresisiogonek":-74,"Ydieresiso":-92,"Ydieresisoacute":-92,"Ydieresisocircumflex":-92,"Ydieresisodieresis":-92,"Ydieresisograve":-92,"Ydieresisohungarumlaut":-92,"Ydieresisomacron":-92,"Ydieresisoslash":-92,"Ydieresisotilde":-92,"Ydieresisperiod":-92,"Ydieresissemicolon":-65,"Ydieresisu":-92,"Ydieresisuacute":-92,"Ydieresisucircumflex":-92,"Ydieresisudieresis":-92,"Ydieresisugrave":-92,"Ydieresisuhungarumlaut":-92,"Ydieresisumacron":-92,"Ydieresisuogonek":-92,"Ydieresisuring":-92,"ag":-10,"agbreve":-10,"agcommaaccent":-10,"aacuteg":-10,"aacutegbreve":-10,"aacutegcommaaccent":-10,"abreveg":-10,"abrevegbreve":-10,"abrevegcommaaccent":-10,"acircumflexg":-10,"acircumflexgbreve":-10,"acircumflexgcommaaccent":-10,"adieresisg":-10,"adieresisgbreve":-10,"adieresisgcommaaccent":-10,"agraveg":-10,"agravegbreve":-10,"agravegcommaaccent":-10,"amacrong":-10,"amacrongbreve":-10,"amacrongcommaaccent":-10,"aogonekg":-10,"aogonekgbreve":-10,"aogonekgcommaaccent":-10,"aringg":-10,"aringgbreve":-10,"aringgcommaaccent":-10,"atildeg":-10,"atildegbreve":-10,"atildegcommaaccent":-10,"bperiod":-40,"bu":-20,"buacute":-20,"bucircumflex":-20,"budieresis":-20,"bugrave":-20,"buhungarumlaut":-20,"bumacron":-20,"buogonek":-20,"buring":-20,"ch":-15,"ck":-20,"ckcommaaccent":-20,"cacuteh":-15,"cacutek":-20,"cacutekcommaaccent":-20,"ccaronh":-15,"ccaronk":-20,"ccaronkcommaaccent":-20,"ccedillah":-15,"ccedillak":-20,"ccedillakcommaaccent":-20,"commaquotedblright":-140,"commaquoteright":-140,"ecomma":-10,"eg":-40,"egbreve":-40,"egcommaaccent":-40,"eperiod":-15,"ev":-15,"ew":-15,"ex":-20,"ey":-30,"eyacute":-30,"eydieresis":-30,"eacutecomma":-10,"eacuteg":-40,"eacutegbreve":-40,"eacutegcommaaccent":-40,"eacuteperiod":-15,"eacutev":-15,"eacutew":-15,"eacutex":-20,"eacutey":-30,"eacuteyacute":-30,"eacuteydieresis":-30,"ecaroncomma":-10,"ecarong":-40,"ecarongbreve":-40,"ecarongcommaaccent":-40,"ecaronperiod":-15,"ecaronv":-15,"ecaronw":-15,"ecaronx":-20,"ecarony":-30,"ecaronyacute":-30,"ecaronydieresis":-30,"ecircumflexcomma":-10,"ecircumflexg":-40,"ecircumflexgbreve":-40,"ecircumflexgcommaaccent":-40,"ecircumflexperiod":-15,"ecircumflexv":-15,"ecircumflexw":-15,"ecircumflexx":-20,"ecircumflexy":-30,"ecircumflexyacute":-30,"ecircumflexydieresis":-30,"edieresiscomma":-10,"edieresisg":-40,"edieresisgbreve":-40,"edieresisgcommaaccent":-40,"edieresisperiod":-15,"edieresisv":-15,"edieresisw":-15,"edieresisx":-20,"edieresisy":-30,"edieresisyacute":-30,"edieresisydieresis":-30,"edotaccentcomma":-10,"edotaccentg":-40,"edotaccentgbreve":-40,"edotaccentgcommaaccent":-40,"edotaccentperiod":-15,"edotaccentv":-15,"edotaccentw":-15,"edotaccentx":-20,"edotaccenty":-30,"edotaccentyacute":-30,"edotaccentydieresis":-30,"egravecomma":-10,"egraveg":-40,"egravegbreve":-40,"egravegcommaaccent":-40,"egraveperiod":-15,"egravev":-15,"egravew":-15,"egravex":-20,"egravey":-30,"egraveyacute":-30,"egraveydieresis":-30,"emacroncomma":-10,"emacrong":-40,"emacrongbreve":-40,"emacrongcommaaccent":-40,"emacronperiod":-15,"emacronv":-15,"emacronw":-15,"emacronx":-20,"emacrony":-30,"emacronyacute":-30,"emacronydieresis":-30,"eogonekcomma":-10,"eogonekg":-40,"eogonekgbreve":-40,"eogonekgcommaaccent":-40,"eogonekperiod":-15,"eogonekv":-15,"eogonekw":-15,"eogonekx":-20,"eogoneky":-30,"eogonekyacute":-30,"eogonekydieresis":-30,"fcomma":-10,"fdotlessi":-60,"ff":-18,"fi":-20,"fiogonek":-20,"fperiod":-15,"fquoteright":92,"gcomma":-10,"ge":-10,"geacute":-10,"gecaron":-10,"gecircumflex":-10,"gedieresis":-10,"gedotaccent":-10,"gegrave":-10,"gemacron":-10,"geogonek":-10,"gg":-10,"ggbreve":-10,"ggcommaaccent":-10,"gperiod":-15,"gbrevecomma":-10,"gbrevee":-10,"gbreveeacute":-10,"gbreveecaron":-10,"gbreveecircumflex":-10,"gbreveedieresis":-10,"gbreveedotaccent":-10,"gbreveegrave":-10,"gbreveemacron":-10,"gbreveeogonek":-10,"gbreveg":-10,"gbrevegbreve":-10,"gbrevegcommaaccent":-10,"gbreveperiod":-15,"gcommaaccentcomma":-10,"gcommaaccente":-10,"gcommaaccenteacute":-10,"gcommaaccentecaron":-10,"gcommaaccentecircumflex":-10,"gcommaaccentedieresis":-10,"gcommaaccentedotaccent":-10,"gcommaaccentegrave":-10,"gcommaaccentemacron":-10,"gcommaaccenteogonek":-10,"gcommaaccentg":-10,"gcommaaccentgbreve":-10,"gcommaaccentgcommaaccent":-10,"gcommaaccentperiod":-15,"ke":-10,"keacute":-10,"kecaron":-10,"kecircumflex":-10,"kedieresis":-10,"kedotaccent":-10,"kegrave":-10,"kemacron":-10,"keogonek":-10,"ko":-10,"koacute":-10,"kocircumflex":-10,"kodieresis":-10,"kograve":-10,"kohungarumlaut":-10,"komacron":-10,"koslash":-10,"kotilde":-10,"ky":-10,"kyacute":-10,"kydieresis":-10,"kcommaaccente":-10,"kcommaaccenteacute":-10,"kcommaaccentecaron":-10,"kcommaaccentecircumflex":-10,"kcommaaccentedieresis":-10,"kcommaaccentedotaccent":-10,"kcommaaccentegrave":-10,"kcommaaccentemacron":-10,"kcommaaccenteogonek":-10,"kcommaaccento":-10,"kcommaaccentoacute":-10,"kcommaaccentocircumflex":-10,"kcommaaccentodieresis":-10,"kcommaaccentograve":-10,"kcommaaccentohungarumlaut":-10,"kcommaaccentomacron":-10,"kcommaaccentoslash":-10,"kcommaaccentotilde":-10,"kcommaaccenty":-10,"kcommaaccentyacute":-10,"kcommaaccentydieresis":-10,"nv":-40,"nacutev":-40,"ncaronv":-40,"ncommaaccentv":-40,"ntildev":-40,"og":-10,"ogbreve":-10,"ogcommaaccent":-10,"ov":-10,"oacuteg":-10,"oacutegbreve":-10,"oacutegcommaaccent":-10,"oacutev":-10,"ocircumflexg":-10,"ocircumflexgbreve":-10,"ocircumflexgcommaaccent":-10,"ocircumflexv":-10,"odieresisg":-10,"odieresisgbreve":-10,"odieresisgcommaaccent":-10,"odieresisv":-10,"ograveg":-10,"ogravegbreve":-10,"ogravegcommaaccent":-10,"ogravev":-10,"ohungarumlautg":-10,"ohungarumlautgbreve":-10,"ohungarumlautgcommaaccent":-10,"ohungarumlautv":-10,"omacrong":-10,"omacrongbreve":-10,"omacrongcommaaccent":-10,"omacronv":-10,"oslashg":-10,"oslashgbreve":-10,"oslashgcommaaccent":-10,"oslashv":-10,"otildeg":-10,"otildegbreve":-10,"otildegcommaaccent":-10,"otildev":-10,"periodquotedblright":-140,"periodquoteright":-140,"quoteleftquoteleft":-111,"quoterightd":-25,"quoterightdcroat":-25,"quoterightquoteright":-111,"quoterightr":-25,"quoterightracute":-25,"quoterightrcaron":-25,"quoterightrcommaaccent":-25,"quoterights":-40,"quoterightsacute":-40,"quoterightscaron":-40,"quoterightscedilla":-40,"quoterightscommaaccent":-40,"quoterightspace":-111,"quoterightt":-30,"quoterighttcommaaccent":-30,"quoterightv":-10,"ra":-15,"raacute":-15,"rabreve":-15,"racircumflex":-15,"radieresis":-15,"ragrave":-15,"ramacron":-15,"raogonek":-15,"raring":-15,"ratilde":-15,"rc":-37,"rcacute":-37,"rccaron":-37,"rccedilla":-37,"rcomma":-111,"rd":-37,"rdcroat":-37,"re":-37,"reacute":-37,"recaron":-37,"recircumflex":-37,"redieresis":-37,"redotaccent":-37,"regrave":-37,"remacron":-37,"reogonek":-37,"rg":-37,"rgbreve":-37,"rgcommaaccent":-37,"rhyphen":-20,"ro":-45,"roacute":-45,"rocircumflex":-45,"rodieresis":-45,"rograve":-45,"rohungarumlaut":-45,"romacron":-45,"roslash":-45,"rotilde":-45,"rperiod":-111,"rq":-37,"rs":-10,"rsacute":-10,"rscaron":-10,"rscedilla":-10,"rscommaaccent":-10,"racutea":-15,"racuteaacute":-15,"racuteabreve":-15,"racuteacircumflex":-15,"racuteadieresis":-15,"racuteagrave":-15,"racuteamacron":-15,"racuteaogonek":-15,"racutearing":-15,"racuteatilde":-15,"racutec":-37,"racutecacute":-37,"racuteccaron":-37,"racuteccedilla":-37,"racutecomma":-111,"racuted":-37,"racutedcroat":-37,"racutee":-37,"racuteeacute":-37,"racuteecaron":-37,"racuteecircumflex":-37,"racuteedieresis":-37,"racuteedotaccent":-37,"racuteegrave":-37,"racuteemacron":-37,"racuteeogonek":-37,"racuteg":-37,"racutegbreve":-37,"racutegcommaaccent":-37,"racutehyphen":-20,"racuteo":-45,"racuteoacute":-45,"racuteocircumflex":-45,"racuteodieresis":-45,"racuteograve":-45,"racuteohungarumlaut":-45,"racuteomacron":-45,"racuteoslash":-45,"racuteotilde":-45,"racuteperiod":-111,"racuteq":-37,"racutes":-10,"racutesacute":-10,"racutescaron":-10,"racutescedilla":-10,"racutescommaaccent":-10,"rcarona":-15,"rcaronaacute":-15,"rcaronabreve":-15,"rcaronacircumflex":-15,"rcaronadieresis":-15,"rcaronagrave":-15,"rcaronamacron":-15,"rcaronaogonek":-15,"rcaronaring":-15,"rcaronatilde":-15,"rcaronc":-37,"rcaroncacute":-37,"rcaronccaron":-37,"rcaronccedilla":-37,"rcaroncomma":-111,"rcarond":-37,"rcarondcroat":-37,"rcarone":-37,"rcaroneacute":-37,"rcaronecaron":-37,"rcaronecircumflex":-37,"rcaronedieresis":-37,"rcaronedotaccent":-37,"rcaronegrave":-37,"rcaronemacron":-37,"rcaroneogonek":-37,"rcarong":-37,"rcarongbreve":-37,"rcarongcommaaccent":-37,"rcaronhyphen":-20,"rcarono":-45,"rcaronoacute":-45,"rcaronocircumflex":-45,"rcaronodieresis":-45,"rcaronograve":-45,"rcaronohungarumlaut":-45,"rcaronomacron":-45,"rcaronoslash":-45,"rcaronotilde":-45,"rcaronperiod":-111,"rcaronq":-37,"rcarons":-10,"rcaronsacute":-10,"rcaronscaron":-10,"rcaronscedilla":-10,"rcaronscommaaccent":-10,"rcommaaccenta":-15,"rcommaaccentaacute":-15,"rcommaaccentabreve":-15,"rcommaaccentacircumflex":-15,"rcommaaccentadieresis":-15,"rcommaaccentagrave":-15,"rcommaaccentamacron":-15,"rcommaaccentaogonek":-15,"rcommaaccentaring":-15,"rcommaaccentatilde":-15,"rcommaaccentc":-37,"rcommaaccentcacute":-37,"rcommaaccentccaron":-37,"rcommaaccentccedilla":-37,"rcommaaccentcomma":-111,"rcommaaccentd":-37,"rcommaaccentdcroat":-37,"rcommaaccente":-37,"rcommaaccenteacute":-37,"rcommaaccentecaron":-37,"rcommaaccentecircumflex":-37,"rcommaaccentedieresis":-37,"rcommaaccentedotaccent":-37,"rcommaaccentegrave":-37,"rcommaaccentemacron":-37,"rcommaaccenteogonek":-37,"rcommaaccentg":-37,"rcommaaccentgbreve":-37,"rcommaaccentgcommaaccent":-37,"rcommaaccenthyphen":-20,"rcommaaccento":-45,"rcommaaccentoacute":-45,"rcommaaccentocircumflex":-45,"rcommaaccentodieresis":-45,"rcommaaccentograve":-45,"rcommaaccentohungarumlaut":-45,"rcommaaccentomacron":-45,"rcommaaccentoslash":-45,"rcommaaccentotilde":-45,"rcommaaccentperiod":-111,"rcommaaccentq":-37,"rcommaaccents":-10,"rcommaaccentsacute":-10,"rcommaaccentscaron":-10,"rcommaaccentscedilla":-10,"rcommaaccentscommaaccent":-10,"spaceA":-18,"spaceAacute":-18,"spaceAbreve":-18,"spaceAcircumflex":-18,"spaceAdieresis":-18,"spaceAgrave":-18,"spaceAmacron":-18,"spaceAogonek":-18,"spaceAring":-18,"spaceAtilde":-18,"spaceT":-18,"spaceTcaron":-18,"spaceTcommaaccent":-18,"spaceV":-35,"spaceW":-40,"spaceY":-75,"spaceYacute":-75,"spaceYdieresis":-75,"vcomma":-74,"vperiod":-74,"wcomma":-74,"wperiod":-74,"ycomma":-55,"yperiod":-55,"yacutecomma":-55,"yacuteperiod":-55,"ydieresiscomma":-55,"ydieresisperiod":-55}} \ No newline at end of file diff --git a/packages/pdfkit/src/font/data/Times-Roman.json b/packages/pdfkit/src/font/data/Times-Roman.json deleted file mode 100644 index 7371741c3..000000000 --- a/packages/pdfkit/src/font/data/Times-Roman.json +++ /dev/null @@ -1 +0,0 @@ -{"attributes":{"Comment":["Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.","Creation Date: Thu May 1 12:49:17 1997","UniqueID 43068","VMusage 43909 54934"],"FontName":"Times-Roman","FullName":"Times Roman","FamilyName":"Times","Weight":"Roman","ItalicAngle":"0","IsFixedPitch":"false","CharacterSet":"ExtendedRoman","FontBBox":"-168 -218 1000 898 ","UnderlinePosition":"-100","UnderlineThickness":"50","Version":"002.000","Notice":"Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries.","EncodingScheme":"AdobeStandardEncoding","CapHeight":"662","XHeight":"450","Ascender":"683","Descender":"-217","StdHW":"28","StdVW":"84"},"glyphWidths":{"space":250,"exclam":333,"quotedbl":408,"numbersign":500,"dollar":500,"percent":833,"ampersand":778,"quoteright":333,"parenleft":333,"parenright":333,"asterisk":500,"plus":564,"comma":250,"hyphen":333,"period":250,"slash":278,"zero":500,"one":500,"two":500,"three":500,"four":500,"five":500,"six":500,"seven":500,"eight":500,"nine":500,"colon":278,"semicolon":278,"less":564,"equal":564,"greater":564,"question":444,"at":921,"A":722,"B":667,"C":667,"D":722,"E":611,"F":556,"G":722,"H":722,"I":333,"J":389,"K":722,"L":611,"M":889,"N":722,"O":722,"P":556,"Q":722,"R":667,"S":556,"T":611,"U":722,"V":722,"W":944,"X":722,"Y":722,"Z":611,"bracketleft":333,"backslash":278,"bracketright":333,"asciicircum":469,"underscore":500,"quoteleft":333,"a":444,"b":500,"c":444,"d":500,"e":444,"f":333,"g":500,"h":500,"i":278,"j":278,"k":500,"l":278,"m":778,"n":500,"o":500,"p":500,"q":500,"r":333,"s":389,"t":278,"u":500,"v":500,"w":722,"x":500,"y":500,"z":444,"braceleft":480,"bar":200,"braceright":480,"asciitilde":541,"exclamdown":333,"cent":500,"sterling":500,"fraction":167,"yen":500,"florin":500,"section":500,"currency":500,"quotesingle":180,"quotedblleft":444,"guillemotleft":500,"guilsinglleft":333,"guilsinglright":333,"fi":556,"fl":556,"endash":500,"dagger":500,"daggerdbl":500,"periodcentered":250,"paragraph":453,"bullet":350,"quotesinglbase":333,"quotedblbase":444,"quotedblright":444,"guillemotright":500,"ellipsis":1000,"perthousand":1000,"questiondown":444,"grave":333,"acute":333,"circumflex":333,"tilde":333,"macron":333,"breve":333,"dotaccent":333,"dieresis":333,"ring":333,"cedilla":333,"hungarumlaut":333,"ogonek":333,"caron":333,"emdash":1000,"AE":889,"ordfeminine":276,"Lslash":611,"Oslash":722,"OE":889,"ordmasculine":310,"ae":667,"dotlessi":278,"lslash":278,"oslash":500,"oe":722,"germandbls":500,"Idieresis":333,"eacute":444,"abreve":444,"uhungarumlaut":500,"ecaron":444,"Ydieresis":722,"divide":564,"Yacute":722,"Acircumflex":722,"aacute":444,"Ucircumflex":722,"yacute":500,"scommaaccent":389,"ecircumflex":444,"Uring":722,"Udieresis":722,"aogonek":444,"Uacute":722,"uogonek":500,"Edieresis":611,"Dcroat":722,"commaaccent":250,"copyright":760,"Emacron":611,"ccaron":444,"aring":444,"Ncommaaccent":722,"lacute":278,"agrave":444,"Tcommaaccent":611,"Cacute":667,"atilde":444,"Edotaccent":611,"scaron":389,"scedilla":389,"iacute":278,"lozenge":471,"Rcaron":667,"Gcommaaccent":722,"ucircumflex":500,"acircumflex":444,"Amacron":722,"rcaron":333,"ccedilla":444,"Zdotaccent":611,"Thorn":556,"Omacron":722,"Racute":667,"Sacute":556,"dcaron":588,"Umacron":722,"uring":500,"threesuperior":300,"Ograve":722,"Agrave":722,"Abreve":722,"multiply":564,"uacute":500,"Tcaron":611,"partialdiff":476,"ydieresis":500,"Nacute":722,"icircumflex":278,"Ecircumflex":611,"adieresis":444,"edieresis":444,"cacute":444,"nacute":500,"umacron":500,"Ncaron":722,"Iacute":333,"plusminus":564,"brokenbar":200,"registered":760,"Gbreve":722,"Idotaccent":333,"summation":600,"Egrave":611,"racute":333,"omacron":500,"Zacute":611,"Zcaron":611,"greaterequal":549,"Eth":722,"Ccedilla":667,"lcommaaccent":278,"tcaron":326,"eogonek":444,"Uogonek":722,"Aacute":722,"Adieresis":722,"egrave":444,"zacute":444,"iogonek":278,"Oacute":722,"oacute":500,"amacron":444,"sacute":389,"idieresis":278,"Ocircumflex":722,"Ugrave":722,"Delta":612,"thorn":500,"twosuperior":300,"Odieresis":722,"mu":500,"igrave":278,"ohungarumlaut":500,"Eogonek":611,"dcroat":500,"threequarters":750,"Scedilla":556,"lcaron":344,"Kcommaaccent":722,"Lacute":611,"trademark":980,"edotaccent":444,"Igrave":333,"Imacron":333,"Lcaron":611,"onehalf":750,"lessequal":549,"ocircumflex":500,"ntilde":500,"Uhungarumlaut":722,"Eacute":611,"emacron":444,"gbreve":500,"onequarter":750,"Scaron":556,"Scommaaccent":556,"Ohungarumlaut":722,"degree":400,"ograve":500,"Ccaron":667,"ugrave":500,"radical":453,"Dcaron":722,"rcommaaccent":333,"Ntilde":722,"otilde":500,"Rcommaaccent":667,"Lcommaaccent":611,"Atilde":722,"Aogonek":722,"Aring":722,"Otilde":722,"zdotaccent":444,"Ecaron":611,"Iogonek":333,"kcommaaccent":500,"minus":564,"Icircumflex":333,"ncaron":500,"tcommaaccent":278,"logicalnot":564,"odieresis":500,"udieresis":500,"notequal":549,"gcommaaccent":500,"eth":500,"zcaron":444,"ncommaaccent":500,"onesuperior":300,"imacron":278,"Euro":500},"kernPairs":{"AC":-40,"ACacute":-40,"ACcaron":-40,"ACcedilla":-40,"AG":-40,"AGbreve":-40,"AGcommaaccent":-40,"AO":-55,"AOacute":-55,"AOcircumflex":-55,"AOdieresis":-55,"AOgrave":-55,"AOhungarumlaut":-55,"AOmacron":-55,"AOslash":-55,"AOtilde":-55,"AQ":-55,"AT":-111,"ATcaron":-111,"ATcommaaccent":-111,"AU":-55,"AUacute":-55,"AUcircumflex":-55,"AUdieresis":-55,"AUgrave":-55,"AUhungarumlaut":-55,"AUmacron":-55,"AUogonek":-55,"AUring":-55,"AV":-135,"AW":-90,"AY":-105,"AYacute":-105,"AYdieresis":-105,"Aquoteright":-111,"Av":-74,"Aw":-92,"Ay":-92,"Ayacute":-92,"Aydieresis":-92,"AacuteC":-40,"AacuteCacute":-40,"AacuteCcaron":-40,"AacuteCcedilla":-40,"AacuteG":-40,"AacuteGbreve":-40,"AacuteGcommaaccent":-40,"AacuteO":-55,"AacuteOacute":-55,"AacuteOcircumflex":-55,"AacuteOdieresis":-55,"AacuteOgrave":-55,"AacuteOhungarumlaut":-55,"AacuteOmacron":-55,"AacuteOslash":-55,"AacuteOtilde":-55,"AacuteQ":-55,"AacuteT":-111,"AacuteTcaron":-111,"AacuteTcommaaccent":-111,"AacuteU":-55,"AacuteUacute":-55,"AacuteUcircumflex":-55,"AacuteUdieresis":-55,"AacuteUgrave":-55,"AacuteUhungarumlaut":-55,"AacuteUmacron":-55,"AacuteUogonek":-55,"AacuteUring":-55,"AacuteV":-135,"AacuteW":-90,"AacuteY":-105,"AacuteYacute":-105,"AacuteYdieresis":-105,"Aacutequoteright":-111,"Aacutev":-74,"Aacutew":-92,"Aacutey":-92,"Aacuteyacute":-92,"Aacuteydieresis":-92,"AbreveC":-40,"AbreveCacute":-40,"AbreveCcaron":-40,"AbreveCcedilla":-40,"AbreveG":-40,"AbreveGbreve":-40,"AbreveGcommaaccent":-40,"AbreveO":-55,"AbreveOacute":-55,"AbreveOcircumflex":-55,"AbreveOdieresis":-55,"AbreveOgrave":-55,"AbreveOhungarumlaut":-55,"AbreveOmacron":-55,"AbreveOslash":-55,"AbreveOtilde":-55,"AbreveQ":-55,"AbreveT":-111,"AbreveTcaron":-111,"AbreveTcommaaccent":-111,"AbreveU":-55,"AbreveUacute":-55,"AbreveUcircumflex":-55,"AbreveUdieresis":-55,"AbreveUgrave":-55,"AbreveUhungarumlaut":-55,"AbreveUmacron":-55,"AbreveUogonek":-55,"AbreveUring":-55,"AbreveV":-135,"AbreveW":-90,"AbreveY":-105,"AbreveYacute":-105,"AbreveYdieresis":-105,"Abrevequoteright":-111,"Abrevev":-74,"Abrevew":-92,"Abrevey":-92,"Abreveyacute":-92,"Abreveydieresis":-92,"AcircumflexC":-40,"AcircumflexCacute":-40,"AcircumflexCcaron":-40,"AcircumflexCcedilla":-40,"AcircumflexG":-40,"AcircumflexGbreve":-40,"AcircumflexGcommaaccent":-40,"AcircumflexO":-55,"AcircumflexOacute":-55,"AcircumflexOcircumflex":-55,"AcircumflexOdieresis":-55,"AcircumflexOgrave":-55,"AcircumflexOhungarumlaut":-55,"AcircumflexOmacron":-55,"AcircumflexOslash":-55,"AcircumflexOtilde":-55,"AcircumflexQ":-55,"AcircumflexT":-111,"AcircumflexTcaron":-111,"AcircumflexTcommaaccent":-111,"AcircumflexU":-55,"AcircumflexUacute":-55,"AcircumflexUcircumflex":-55,"AcircumflexUdieresis":-55,"AcircumflexUgrave":-55,"AcircumflexUhungarumlaut":-55,"AcircumflexUmacron":-55,"AcircumflexUogonek":-55,"AcircumflexUring":-55,"AcircumflexV":-135,"AcircumflexW":-90,"AcircumflexY":-105,"AcircumflexYacute":-105,"AcircumflexYdieresis":-105,"Acircumflexquoteright":-111,"Acircumflexv":-74,"Acircumflexw":-92,"Acircumflexy":-92,"Acircumflexyacute":-92,"Acircumflexydieresis":-92,"AdieresisC":-40,"AdieresisCacute":-40,"AdieresisCcaron":-40,"AdieresisCcedilla":-40,"AdieresisG":-40,"AdieresisGbreve":-40,"AdieresisGcommaaccent":-40,"AdieresisO":-55,"AdieresisOacute":-55,"AdieresisOcircumflex":-55,"AdieresisOdieresis":-55,"AdieresisOgrave":-55,"AdieresisOhungarumlaut":-55,"AdieresisOmacron":-55,"AdieresisOslash":-55,"AdieresisOtilde":-55,"AdieresisQ":-55,"AdieresisT":-111,"AdieresisTcaron":-111,"AdieresisTcommaaccent":-111,"AdieresisU":-55,"AdieresisUacute":-55,"AdieresisUcircumflex":-55,"AdieresisUdieresis":-55,"AdieresisUgrave":-55,"AdieresisUhungarumlaut":-55,"AdieresisUmacron":-55,"AdieresisUogonek":-55,"AdieresisUring":-55,"AdieresisV":-135,"AdieresisW":-90,"AdieresisY":-105,"AdieresisYacute":-105,"AdieresisYdieresis":-105,"Adieresisquoteright":-111,"Adieresisv":-74,"Adieresisw":-92,"Adieresisy":-92,"Adieresisyacute":-92,"Adieresisydieresis":-92,"AgraveC":-40,"AgraveCacute":-40,"AgraveCcaron":-40,"AgraveCcedilla":-40,"AgraveG":-40,"AgraveGbreve":-40,"AgraveGcommaaccent":-40,"AgraveO":-55,"AgraveOacute":-55,"AgraveOcircumflex":-55,"AgraveOdieresis":-55,"AgraveOgrave":-55,"AgraveOhungarumlaut":-55,"AgraveOmacron":-55,"AgraveOslash":-55,"AgraveOtilde":-55,"AgraveQ":-55,"AgraveT":-111,"AgraveTcaron":-111,"AgraveTcommaaccent":-111,"AgraveU":-55,"AgraveUacute":-55,"AgraveUcircumflex":-55,"AgraveUdieresis":-55,"AgraveUgrave":-55,"AgraveUhungarumlaut":-55,"AgraveUmacron":-55,"AgraveUogonek":-55,"AgraveUring":-55,"AgraveV":-135,"AgraveW":-90,"AgraveY":-105,"AgraveYacute":-105,"AgraveYdieresis":-105,"Agravequoteright":-111,"Agravev":-74,"Agravew":-92,"Agravey":-92,"Agraveyacute":-92,"Agraveydieresis":-92,"AmacronC":-40,"AmacronCacute":-40,"AmacronCcaron":-40,"AmacronCcedilla":-40,"AmacronG":-40,"AmacronGbreve":-40,"AmacronGcommaaccent":-40,"AmacronO":-55,"AmacronOacute":-55,"AmacronOcircumflex":-55,"AmacronOdieresis":-55,"AmacronOgrave":-55,"AmacronOhungarumlaut":-55,"AmacronOmacron":-55,"AmacronOslash":-55,"AmacronOtilde":-55,"AmacronQ":-55,"AmacronT":-111,"AmacronTcaron":-111,"AmacronTcommaaccent":-111,"AmacronU":-55,"AmacronUacute":-55,"AmacronUcircumflex":-55,"AmacronUdieresis":-55,"AmacronUgrave":-55,"AmacronUhungarumlaut":-55,"AmacronUmacron":-55,"AmacronUogonek":-55,"AmacronUring":-55,"AmacronV":-135,"AmacronW":-90,"AmacronY":-105,"AmacronYacute":-105,"AmacronYdieresis":-105,"Amacronquoteright":-111,"Amacronv":-74,"Amacronw":-92,"Amacrony":-92,"Amacronyacute":-92,"Amacronydieresis":-92,"AogonekC":-40,"AogonekCacute":-40,"AogonekCcaron":-40,"AogonekCcedilla":-40,"AogonekG":-40,"AogonekGbreve":-40,"AogonekGcommaaccent":-40,"AogonekO":-55,"AogonekOacute":-55,"AogonekOcircumflex":-55,"AogonekOdieresis":-55,"AogonekOgrave":-55,"AogonekOhungarumlaut":-55,"AogonekOmacron":-55,"AogonekOslash":-55,"AogonekOtilde":-55,"AogonekQ":-55,"AogonekT":-111,"AogonekTcaron":-111,"AogonekTcommaaccent":-111,"AogonekU":-55,"AogonekUacute":-55,"AogonekUcircumflex":-55,"AogonekUdieresis":-55,"AogonekUgrave":-55,"AogonekUhungarumlaut":-55,"AogonekUmacron":-55,"AogonekUogonek":-55,"AogonekUring":-55,"AogonekV":-135,"AogonekW":-90,"AogonekY":-105,"AogonekYacute":-105,"AogonekYdieresis":-105,"Aogonekquoteright":-111,"Aogonekv":-74,"Aogonekw":-52,"Aogoneky":-52,"Aogonekyacute":-52,"Aogonekydieresis":-52,"AringC":-40,"AringCacute":-40,"AringCcaron":-40,"AringCcedilla":-40,"AringG":-40,"AringGbreve":-40,"AringGcommaaccent":-40,"AringO":-55,"AringOacute":-55,"AringOcircumflex":-55,"AringOdieresis":-55,"AringOgrave":-55,"AringOhungarumlaut":-55,"AringOmacron":-55,"AringOslash":-55,"AringOtilde":-55,"AringQ":-55,"AringT":-111,"AringTcaron":-111,"AringTcommaaccent":-111,"AringU":-55,"AringUacute":-55,"AringUcircumflex":-55,"AringUdieresis":-55,"AringUgrave":-55,"AringUhungarumlaut":-55,"AringUmacron":-55,"AringUogonek":-55,"AringUring":-55,"AringV":-135,"AringW":-90,"AringY":-105,"AringYacute":-105,"AringYdieresis":-105,"Aringquoteright":-111,"Aringv":-74,"Aringw":-92,"Aringy":-92,"Aringyacute":-92,"Aringydieresis":-92,"AtildeC":-40,"AtildeCacute":-40,"AtildeCcaron":-40,"AtildeCcedilla":-40,"AtildeG":-40,"AtildeGbreve":-40,"AtildeGcommaaccent":-40,"AtildeO":-55,"AtildeOacute":-55,"AtildeOcircumflex":-55,"AtildeOdieresis":-55,"AtildeOgrave":-55,"AtildeOhungarumlaut":-55,"AtildeOmacron":-55,"AtildeOslash":-55,"AtildeOtilde":-55,"AtildeQ":-55,"AtildeT":-111,"AtildeTcaron":-111,"AtildeTcommaaccent":-111,"AtildeU":-55,"AtildeUacute":-55,"AtildeUcircumflex":-55,"AtildeUdieresis":-55,"AtildeUgrave":-55,"AtildeUhungarumlaut":-55,"AtildeUmacron":-55,"AtildeUogonek":-55,"AtildeUring":-55,"AtildeV":-135,"AtildeW":-90,"AtildeY":-105,"AtildeYacute":-105,"AtildeYdieresis":-105,"Atildequoteright":-111,"Atildev":-74,"Atildew":-92,"Atildey":-92,"Atildeyacute":-92,"Atildeydieresis":-92,"BA":-35,"BAacute":-35,"BAbreve":-35,"BAcircumflex":-35,"BAdieresis":-35,"BAgrave":-35,"BAmacron":-35,"BAogonek":-35,"BAring":-35,"BAtilde":-35,"BU":-10,"BUacute":-10,"BUcircumflex":-10,"BUdieresis":-10,"BUgrave":-10,"BUhungarumlaut":-10,"BUmacron":-10,"BUogonek":-10,"BUring":-10,"DA":-40,"DAacute":-40,"DAbreve":-40,"DAcircumflex":-40,"DAdieresis":-40,"DAgrave":-40,"DAmacron":-40,"DAogonek":-40,"DAring":-40,"DAtilde":-40,"DV":-40,"DW":-30,"DY":-55,"DYacute":-55,"DYdieresis":-55,"DcaronA":-40,"DcaronAacute":-40,"DcaronAbreve":-40,"DcaronAcircumflex":-40,"DcaronAdieresis":-40,"DcaronAgrave":-40,"DcaronAmacron":-40,"DcaronAogonek":-40,"DcaronAring":-40,"DcaronAtilde":-40,"DcaronV":-40,"DcaronW":-30,"DcaronY":-55,"DcaronYacute":-55,"DcaronYdieresis":-55,"DcroatA":-40,"DcroatAacute":-40,"DcroatAbreve":-40,"DcroatAcircumflex":-40,"DcroatAdieresis":-40,"DcroatAgrave":-40,"DcroatAmacron":-40,"DcroatAogonek":-40,"DcroatAring":-40,"DcroatAtilde":-40,"DcroatV":-40,"DcroatW":-30,"DcroatY":-55,"DcroatYacute":-55,"DcroatYdieresis":-55,"FA":-74,"FAacute":-74,"FAbreve":-74,"FAcircumflex":-74,"FAdieresis":-74,"FAgrave":-74,"FAmacron":-74,"FAogonek":-74,"FAring":-74,"FAtilde":-74,"Fa":-15,"Faacute":-15,"Fabreve":-15,"Facircumflex":-15,"Fadieresis":-15,"Fagrave":-15,"Famacron":-15,"Faogonek":-15,"Faring":-15,"Fatilde":-15,"Fcomma":-80,"Fo":-15,"Foacute":-15,"Focircumflex":-15,"Fodieresis":-15,"Fograve":-15,"Fohungarumlaut":-15,"Fomacron":-15,"Foslash":-15,"Fotilde":-15,"Fperiod":-80,"JA":-60,"JAacute":-60,"JAbreve":-60,"JAcircumflex":-60,"JAdieresis":-60,"JAgrave":-60,"JAmacron":-60,"JAogonek":-60,"JAring":-60,"JAtilde":-60,"KO":-30,"KOacute":-30,"KOcircumflex":-30,"KOdieresis":-30,"KOgrave":-30,"KOhungarumlaut":-30,"KOmacron":-30,"KOslash":-30,"KOtilde":-30,"Ke":-25,"Keacute":-25,"Kecaron":-25,"Kecircumflex":-25,"Kedieresis":-25,"Kedotaccent":-25,"Kegrave":-25,"Kemacron":-25,"Keogonek":-25,"Ko":-35,"Koacute":-35,"Kocircumflex":-35,"Kodieresis":-35,"Kograve":-35,"Kohungarumlaut":-35,"Komacron":-35,"Koslash":-35,"Kotilde":-35,"Ku":-15,"Kuacute":-15,"Kucircumflex":-15,"Kudieresis":-15,"Kugrave":-15,"Kuhungarumlaut":-15,"Kumacron":-15,"Kuogonek":-15,"Kuring":-15,"Ky":-25,"Kyacute":-25,"Kydieresis":-25,"KcommaaccentO":-30,"KcommaaccentOacute":-30,"KcommaaccentOcircumflex":-30,"KcommaaccentOdieresis":-30,"KcommaaccentOgrave":-30,"KcommaaccentOhungarumlaut":-30,"KcommaaccentOmacron":-30,"KcommaaccentOslash":-30,"KcommaaccentOtilde":-30,"Kcommaaccente":-25,"Kcommaaccenteacute":-25,"Kcommaaccentecaron":-25,"Kcommaaccentecircumflex":-25,"Kcommaaccentedieresis":-25,"Kcommaaccentedotaccent":-25,"Kcommaaccentegrave":-25,"Kcommaaccentemacron":-25,"Kcommaaccenteogonek":-25,"Kcommaaccento":-35,"Kcommaaccentoacute":-35,"Kcommaaccentocircumflex":-35,"Kcommaaccentodieresis":-35,"Kcommaaccentograve":-35,"Kcommaaccentohungarumlaut":-35,"Kcommaaccentomacron":-35,"Kcommaaccentoslash":-35,"Kcommaaccentotilde":-35,"Kcommaaccentu":-15,"Kcommaaccentuacute":-15,"Kcommaaccentucircumflex":-15,"Kcommaaccentudieresis":-15,"Kcommaaccentugrave":-15,"Kcommaaccentuhungarumlaut":-15,"Kcommaaccentumacron":-15,"Kcommaaccentuogonek":-15,"Kcommaaccenturing":-15,"Kcommaaccenty":-25,"Kcommaaccentyacute":-25,"Kcommaaccentydieresis":-25,"LT":-92,"LTcaron":-92,"LTcommaaccent":-92,"LV":-100,"LW":-74,"LY":-100,"LYacute":-100,"LYdieresis":-100,"Lquoteright":-92,"Ly":-55,"Lyacute":-55,"Lydieresis":-55,"LacuteT":-92,"LacuteTcaron":-92,"LacuteTcommaaccent":-92,"LacuteV":-100,"LacuteW":-74,"LacuteY":-100,"LacuteYacute":-100,"LacuteYdieresis":-100,"Lacutequoteright":-92,"Lacutey":-55,"Lacuteyacute":-55,"Lacuteydieresis":-55,"Lcaronquoteright":-92,"Lcarony":-55,"Lcaronyacute":-55,"Lcaronydieresis":-55,"LcommaaccentT":-92,"LcommaaccentTcaron":-92,"LcommaaccentTcommaaccent":-92,"LcommaaccentV":-100,"LcommaaccentW":-74,"LcommaaccentY":-100,"LcommaaccentYacute":-100,"LcommaaccentYdieresis":-100,"Lcommaaccentquoteright":-92,"Lcommaaccenty":-55,"Lcommaaccentyacute":-55,"Lcommaaccentydieresis":-55,"LslashT":-92,"LslashTcaron":-92,"LslashTcommaaccent":-92,"LslashV":-100,"LslashW":-74,"LslashY":-100,"LslashYacute":-100,"LslashYdieresis":-100,"Lslashquoteright":-92,"Lslashy":-55,"Lslashyacute":-55,"Lslashydieresis":-55,"NA":-35,"NAacute":-35,"NAbreve":-35,"NAcircumflex":-35,"NAdieresis":-35,"NAgrave":-35,"NAmacron":-35,"NAogonek":-35,"NAring":-35,"NAtilde":-35,"NacuteA":-35,"NacuteAacute":-35,"NacuteAbreve":-35,"NacuteAcircumflex":-35,"NacuteAdieresis":-35,"NacuteAgrave":-35,"NacuteAmacron":-35,"NacuteAogonek":-35,"NacuteAring":-35,"NacuteAtilde":-35,"NcaronA":-35,"NcaronAacute":-35,"NcaronAbreve":-35,"NcaronAcircumflex":-35,"NcaronAdieresis":-35,"NcaronAgrave":-35,"NcaronAmacron":-35,"NcaronAogonek":-35,"NcaronAring":-35,"NcaronAtilde":-35,"NcommaaccentA":-35,"NcommaaccentAacute":-35,"NcommaaccentAbreve":-35,"NcommaaccentAcircumflex":-35,"NcommaaccentAdieresis":-35,"NcommaaccentAgrave":-35,"NcommaaccentAmacron":-35,"NcommaaccentAogonek":-35,"NcommaaccentAring":-35,"NcommaaccentAtilde":-35,"NtildeA":-35,"NtildeAacute":-35,"NtildeAbreve":-35,"NtildeAcircumflex":-35,"NtildeAdieresis":-35,"NtildeAgrave":-35,"NtildeAmacron":-35,"NtildeAogonek":-35,"NtildeAring":-35,"NtildeAtilde":-35,"OA":-35,"OAacute":-35,"OAbreve":-35,"OAcircumflex":-35,"OAdieresis":-35,"OAgrave":-35,"OAmacron":-35,"OAogonek":-35,"OAring":-35,"OAtilde":-35,"OT":-40,"OTcaron":-40,"OTcommaaccent":-40,"OV":-50,"OW":-35,"OX":-40,"OY":-50,"OYacute":-50,"OYdieresis":-50,"OacuteA":-35,"OacuteAacute":-35,"OacuteAbreve":-35,"OacuteAcircumflex":-35,"OacuteAdieresis":-35,"OacuteAgrave":-35,"OacuteAmacron":-35,"OacuteAogonek":-35,"OacuteAring":-35,"OacuteAtilde":-35,"OacuteT":-40,"OacuteTcaron":-40,"OacuteTcommaaccent":-40,"OacuteV":-50,"OacuteW":-35,"OacuteX":-40,"OacuteY":-50,"OacuteYacute":-50,"OacuteYdieresis":-50,"OcircumflexA":-35,"OcircumflexAacute":-35,"OcircumflexAbreve":-35,"OcircumflexAcircumflex":-35,"OcircumflexAdieresis":-35,"OcircumflexAgrave":-35,"OcircumflexAmacron":-35,"OcircumflexAogonek":-35,"OcircumflexAring":-35,"OcircumflexAtilde":-35,"OcircumflexT":-40,"OcircumflexTcaron":-40,"OcircumflexTcommaaccent":-40,"OcircumflexV":-50,"OcircumflexW":-35,"OcircumflexX":-40,"OcircumflexY":-50,"OcircumflexYacute":-50,"OcircumflexYdieresis":-50,"OdieresisA":-35,"OdieresisAacute":-35,"OdieresisAbreve":-35,"OdieresisAcircumflex":-35,"OdieresisAdieresis":-35,"OdieresisAgrave":-35,"OdieresisAmacron":-35,"OdieresisAogonek":-35,"OdieresisAring":-35,"OdieresisAtilde":-35,"OdieresisT":-40,"OdieresisTcaron":-40,"OdieresisTcommaaccent":-40,"OdieresisV":-50,"OdieresisW":-35,"OdieresisX":-40,"OdieresisY":-50,"OdieresisYacute":-50,"OdieresisYdieresis":-50,"OgraveA":-35,"OgraveAacute":-35,"OgraveAbreve":-35,"OgraveAcircumflex":-35,"OgraveAdieresis":-35,"OgraveAgrave":-35,"OgraveAmacron":-35,"OgraveAogonek":-35,"OgraveAring":-35,"OgraveAtilde":-35,"OgraveT":-40,"OgraveTcaron":-40,"OgraveTcommaaccent":-40,"OgraveV":-50,"OgraveW":-35,"OgraveX":-40,"OgraveY":-50,"OgraveYacute":-50,"OgraveYdieresis":-50,"OhungarumlautA":-35,"OhungarumlautAacute":-35,"OhungarumlautAbreve":-35,"OhungarumlautAcircumflex":-35,"OhungarumlautAdieresis":-35,"OhungarumlautAgrave":-35,"OhungarumlautAmacron":-35,"OhungarumlautAogonek":-35,"OhungarumlautAring":-35,"OhungarumlautAtilde":-35,"OhungarumlautT":-40,"OhungarumlautTcaron":-40,"OhungarumlautTcommaaccent":-40,"OhungarumlautV":-50,"OhungarumlautW":-35,"OhungarumlautX":-40,"OhungarumlautY":-50,"OhungarumlautYacute":-50,"OhungarumlautYdieresis":-50,"OmacronA":-35,"OmacronAacute":-35,"OmacronAbreve":-35,"OmacronAcircumflex":-35,"OmacronAdieresis":-35,"OmacronAgrave":-35,"OmacronAmacron":-35,"OmacronAogonek":-35,"OmacronAring":-35,"OmacronAtilde":-35,"OmacronT":-40,"OmacronTcaron":-40,"OmacronTcommaaccent":-40,"OmacronV":-50,"OmacronW":-35,"OmacronX":-40,"OmacronY":-50,"OmacronYacute":-50,"OmacronYdieresis":-50,"OslashA":-35,"OslashAacute":-35,"OslashAbreve":-35,"OslashAcircumflex":-35,"OslashAdieresis":-35,"OslashAgrave":-35,"OslashAmacron":-35,"OslashAogonek":-35,"OslashAring":-35,"OslashAtilde":-35,"OslashT":-40,"OslashTcaron":-40,"OslashTcommaaccent":-40,"OslashV":-50,"OslashW":-35,"OslashX":-40,"OslashY":-50,"OslashYacute":-50,"OslashYdieresis":-50,"OtildeA":-35,"OtildeAacute":-35,"OtildeAbreve":-35,"OtildeAcircumflex":-35,"OtildeAdieresis":-35,"OtildeAgrave":-35,"OtildeAmacron":-35,"OtildeAogonek":-35,"OtildeAring":-35,"OtildeAtilde":-35,"OtildeT":-40,"OtildeTcaron":-40,"OtildeTcommaaccent":-40,"OtildeV":-50,"OtildeW":-35,"OtildeX":-40,"OtildeY":-50,"OtildeYacute":-50,"OtildeYdieresis":-50,"PA":-92,"PAacute":-92,"PAbreve":-92,"PAcircumflex":-92,"PAdieresis":-92,"PAgrave":-92,"PAmacron":-92,"PAogonek":-92,"PAring":-92,"PAtilde":-92,"Pa":-15,"Paacute":-15,"Pabreve":-15,"Pacircumflex":-15,"Padieresis":-15,"Pagrave":-15,"Pamacron":-15,"Paogonek":-15,"Paring":-15,"Patilde":-15,"Pcomma":-111,"Pperiod":-111,"QU":-10,"QUacute":-10,"QUcircumflex":-10,"QUdieresis":-10,"QUgrave":-10,"QUhungarumlaut":-10,"QUmacron":-10,"QUogonek":-10,"QUring":-10,"RO":-40,"ROacute":-40,"ROcircumflex":-40,"ROdieresis":-40,"ROgrave":-40,"ROhungarumlaut":-40,"ROmacron":-40,"ROslash":-40,"ROtilde":-40,"RT":-60,"RTcaron":-60,"RTcommaaccent":-60,"RU":-40,"RUacute":-40,"RUcircumflex":-40,"RUdieresis":-40,"RUgrave":-40,"RUhungarumlaut":-40,"RUmacron":-40,"RUogonek":-40,"RUring":-40,"RV":-80,"RW":-55,"RY":-65,"RYacute":-65,"RYdieresis":-65,"RacuteO":-40,"RacuteOacute":-40,"RacuteOcircumflex":-40,"RacuteOdieresis":-40,"RacuteOgrave":-40,"RacuteOhungarumlaut":-40,"RacuteOmacron":-40,"RacuteOslash":-40,"RacuteOtilde":-40,"RacuteT":-60,"RacuteTcaron":-60,"RacuteTcommaaccent":-60,"RacuteU":-40,"RacuteUacute":-40,"RacuteUcircumflex":-40,"RacuteUdieresis":-40,"RacuteUgrave":-40,"RacuteUhungarumlaut":-40,"RacuteUmacron":-40,"RacuteUogonek":-40,"RacuteUring":-40,"RacuteV":-80,"RacuteW":-55,"RacuteY":-65,"RacuteYacute":-65,"RacuteYdieresis":-65,"RcaronO":-40,"RcaronOacute":-40,"RcaronOcircumflex":-40,"RcaronOdieresis":-40,"RcaronOgrave":-40,"RcaronOhungarumlaut":-40,"RcaronOmacron":-40,"RcaronOslash":-40,"RcaronOtilde":-40,"RcaronT":-60,"RcaronTcaron":-60,"RcaronTcommaaccent":-60,"RcaronU":-40,"RcaronUacute":-40,"RcaronUcircumflex":-40,"RcaronUdieresis":-40,"RcaronUgrave":-40,"RcaronUhungarumlaut":-40,"RcaronUmacron":-40,"RcaronUogonek":-40,"RcaronUring":-40,"RcaronV":-80,"RcaronW":-55,"RcaronY":-65,"RcaronYacute":-65,"RcaronYdieresis":-65,"RcommaaccentO":-40,"RcommaaccentOacute":-40,"RcommaaccentOcircumflex":-40,"RcommaaccentOdieresis":-40,"RcommaaccentOgrave":-40,"RcommaaccentOhungarumlaut":-40,"RcommaaccentOmacron":-40,"RcommaaccentOslash":-40,"RcommaaccentOtilde":-40,"RcommaaccentT":-60,"RcommaaccentTcaron":-60,"RcommaaccentTcommaaccent":-60,"RcommaaccentU":-40,"RcommaaccentUacute":-40,"RcommaaccentUcircumflex":-40,"RcommaaccentUdieresis":-40,"RcommaaccentUgrave":-40,"RcommaaccentUhungarumlaut":-40,"RcommaaccentUmacron":-40,"RcommaaccentUogonek":-40,"RcommaaccentUring":-40,"RcommaaccentV":-80,"RcommaaccentW":-55,"RcommaaccentY":-65,"RcommaaccentYacute":-65,"RcommaaccentYdieresis":-65,"TA":-93,"TAacute":-93,"TAbreve":-93,"TAcircumflex":-93,"TAdieresis":-93,"TAgrave":-93,"TAmacron":-93,"TAogonek":-93,"TAring":-93,"TAtilde":-93,"TO":-18,"TOacute":-18,"TOcircumflex":-18,"TOdieresis":-18,"TOgrave":-18,"TOhungarumlaut":-18,"TOmacron":-18,"TOslash":-18,"TOtilde":-18,"Ta":-80,"Taacute":-80,"Tabreve":-80,"Tacircumflex":-80,"Tadieresis":-40,"Tagrave":-40,"Tamacron":-40,"Taogonek":-80,"Taring":-80,"Tatilde":-40,"Tcolon":-50,"Tcomma":-74,"Te":-70,"Teacute":-70,"Tecaron":-70,"Tecircumflex":-70,"Tedieresis":-30,"Tedotaccent":-70,"Tegrave":-70,"Temacron":-30,"Teogonek":-70,"Thyphen":-92,"Ti":-35,"Tiacute":-35,"Tiogonek":-35,"To":-80,"Toacute":-80,"Tocircumflex":-80,"Todieresis":-80,"Tograve":-80,"Tohungarumlaut":-80,"Tomacron":-80,"Toslash":-80,"Totilde":-80,"Tperiod":-74,"Tr":-35,"Tracute":-35,"Trcaron":-35,"Trcommaaccent":-35,"Tsemicolon":-55,"Tu":-45,"Tuacute":-45,"Tucircumflex":-45,"Tudieresis":-45,"Tugrave":-45,"Tuhungarumlaut":-45,"Tumacron":-45,"Tuogonek":-45,"Turing":-45,"Tw":-80,"Ty":-80,"Tyacute":-80,"Tydieresis":-80,"TcaronA":-93,"TcaronAacute":-93,"TcaronAbreve":-93,"TcaronAcircumflex":-93,"TcaronAdieresis":-93,"TcaronAgrave":-93,"TcaronAmacron":-93,"TcaronAogonek":-93,"TcaronAring":-93,"TcaronAtilde":-93,"TcaronO":-18,"TcaronOacute":-18,"TcaronOcircumflex":-18,"TcaronOdieresis":-18,"TcaronOgrave":-18,"TcaronOhungarumlaut":-18,"TcaronOmacron":-18,"TcaronOslash":-18,"TcaronOtilde":-18,"Tcarona":-80,"Tcaronaacute":-80,"Tcaronabreve":-80,"Tcaronacircumflex":-80,"Tcaronadieresis":-40,"Tcaronagrave":-40,"Tcaronamacron":-40,"Tcaronaogonek":-80,"Tcaronaring":-80,"Tcaronatilde":-40,"Tcaroncolon":-50,"Tcaroncomma":-74,"Tcarone":-70,"Tcaroneacute":-70,"Tcaronecaron":-70,"Tcaronecircumflex":-30,"Tcaronedieresis":-30,"Tcaronedotaccent":-70,"Tcaronegrave":-70,"Tcaronemacron":-30,"Tcaroneogonek":-70,"Tcaronhyphen":-92,"Tcaroni":-35,"Tcaroniacute":-35,"Tcaroniogonek":-35,"Tcarono":-80,"Tcaronoacute":-80,"Tcaronocircumflex":-80,"Tcaronodieresis":-80,"Tcaronograve":-80,"Tcaronohungarumlaut":-80,"Tcaronomacron":-80,"Tcaronoslash":-80,"Tcaronotilde":-80,"Tcaronperiod":-74,"Tcaronr":-35,"Tcaronracute":-35,"Tcaronrcaron":-35,"Tcaronrcommaaccent":-35,"Tcaronsemicolon":-55,"Tcaronu":-45,"Tcaronuacute":-45,"Tcaronucircumflex":-45,"Tcaronudieresis":-45,"Tcaronugrave":-45,"Tcaronuhungarumlaut":-45,"Tcaronumacron":-45,"Tcaronuogonek":-45,"Tcaronuring":-45,"Tcaronw":-80,"Tcarony":-80,"Tcaronyacute":-80,"Tcaronydieresis":-80,"TcommaaccentA":-93,"TcommaaccentAacute":-93,"TcommaaccentAbreve":-93,"TcommaaccentAcircumflex":-93,"TcommaaccentAdieresis":-93,"TcommaaccentAgrave":-93,"TcommaaccentAmacron":-93,"TcommaaccentAogonek":-93,"TcommaaccentAring":-93,"TcommaaccentAtilde":-93,"TcommaaccentO":-18,"TcommaaccentOacute":-18,"TcommaaccentOcircumflex":-18,"TcommaaccentOdieresis":-18,"TcommaaccentOgrave":-18,"TcommaaccentOhungarumlaut":-18,"TcommaaccentOmacron":-18,"TcommaaccentOslash":-18,"TcommaaccentOtilde":-18,"Tcommaaccenta":-80,"Tcommaaccentaacute":-80,"Tcommaaccentabreve":-80,"Tcommaaccentacircumflex":-80,"Tcommaaccentadieresis":-40,"Tcommaaccentagrave":-40,"Tcommaaccentamacron":-40,"Tcommaaccentaogonek":-80,"Tcommaaccentaring":-80,"Tcommaaccentatilde":-40,"Tcommaaccentcolon":-50,"Tcommaaccentcomma":-74,"Tcommaaccente":-70,"Tcommaaccenteacute":-70,"Tcommaaccentecaron":-70,"Tcommaaccentecircumflex":-30,"Tcommaaccentedieresis":-30,"Tcommaaccentedotaccent":-70,"Tcommaaccentegrave":-30,"Tcommaaccentemacron":-70,"Tcommaaccenteogonek":-70,"Tcommaaccenthyphen":-92,"Tcommaaccenti":-35,"Tcommaaccentiacute":-35,"Tcommaaccentiogonek":-35,"Tcommaaccento":-80,"Tcommaaccentoacute":-80,"Tcommaaccentocircumflex":-80,"Tcommaaccentodieresis":-80,"Tcommaaccentograve":-80,"Tcommaaccentohungarumlaut":-80,"Tcommaaccentomacron":-80,"Tcommaaccentoslash":-80,"Tcommaaccentotilde":-80,"Tcommaaccentperiod":-74,"Tcommaaccentr":-35,"Tcommaaccentracute":-35,"Tcommaaccentrcaron":-35,"Tcommaaccentrcommaaccent":-35,"Tcommaaccentsemicolon":-55,"Tcommaaccentu":-45,"Tcommaaccentuacute":-45,"Tcommaaccentucircumflex":-45,"Tcommaaccentudieresis":-45,"Tcommaaccentugrave":-45,"Tcommaaccentuhungarumlaut":-45,"Tcommaaccentumacron":-45,"Tcommaaccentuogonek":-45,"Tcommaaccenturing":-45,"Tcommaaccentw":-80,"Tcommaaccenty":-80,"Tcommaaccentyacute":-80,"Tcommaaccentydieresis":-80,"UA":-40,"UAacute":-40,"UAbreve":-40,"UAcircumflex":-40,"UAdieresis":-40,"UAgrave":-40,"UAmacron":-40,"UAogonek":-40,"UAring":-40,"UAtilde":-40,"UacuteA":-40,"UacuteAacute":-40,"UacuteAbreve":-40,"UacuteAcircumflex":-40,"UacuteAdieresis":-40,"UacuteAgrave":-40,"UacuteAmacron":-40,"UacuteAogonek":-40,"UacuteAring":-40,"UacuteAtilde":-40,"UcircumflexA":-40,"UcircumflexAacute":-40,"UcircumflexAbreve":-40,"UcircumflexAcircumflex":-40,"UcircumflexAdieresis":-40,"UcircumflexAgrave":-40,"UcircumflexAmacron":-40,"UcircumflexAogonek":-40,"UcircumflexAring":-40,"UcircumflexAtilde":-40,"UdieresisA":-40,"UdieresisAacute":-40,"UdieresisAbreve":-40,"UdieresisAcircumflex":-40,"UdieresisAdieresis":-40,"UdieresisAgrave":-40,"UdieresisAmacron":-40,"UdieresisAogonek":-40,"UdieresisAring":-40,"UdieresisAtilde":-40,"UgraveA":-40,"UgraveAacute":-40,"UgraveAbreve":-40,"UgraveAcircumflex":-40,"UgraveAdieresis":-40,"UgraveAgrave":-40,"UgraveAmacron":-40,"UgraveAogonek":-40,"UgraveAring":-40,"UgraveAtilde":-40,"UhungarumlautA":-40,"UhungarumlautAacute":-40,"UhungarumlautAbreve":-40,"UhungarumlautAcircumflex":-40,"UhungarumlautAdieresis":-40,"UhungarumlautAgrave":-40,"UhungarumlautAmacron":-40,"UhungarumlautAogonek":-40,"UhungarumlautAring":-40,"UhungarumlautAtilde":-40,"UmacronA":-40,"UmacronAacute":-40,"UmacronAbreve":-40,"UmacronAcircumflex":-40,"UmacronAdieresis":-40,"UmacronAgrave":-40,"UmacronAmacron":-40,"UmacronAogonek":-40,"UmacronAring":-40,"UmacronAtilde":-40,"UogonekA":-40,"UogonekAacute":-40,"UogonekAbreve":-40,"UogonekAcircumflex":-40,"UogonekAdieresis":-40,"UogonekAgrave":-40,"UogonekAmacron":-40,"UogonekAogonek":-40,"UogonekAring":-40,"UogonekAtilde":-40,"UringA":-40,"UringAacute":-40,"UringAbreve":-40,"UringAcircumflex":-40,"UringAdieresis":-40,"UringAgrave":-40,"UringAmacron":-40,"UringAogonek":-40,"UringAring":-40,"UringAtilde":-40,"VA":-135,"VAacute":-135,"VAbreve":-135,"VAcircumflex":-135,"VAdieresis":-135,"VAgrave":-135,"VAmacron":-135,"VAogonek":-135,"VAring":-135,"VAtilde":-135,"VG":-15,"VGbreve":-15,"VGcommaaccent":-15,"VO":-40,"VOacute":-40,"VOcircumflex":-40,"VOdieresis":-40,"VOgrave":-40,"VOhungarumlaut":-40,"VOmacron":-40,"VOslash":-40,"VOtilde":-40,"Va":-111,"Vaacute":-111,"Vabreve":-111,"Vacircumflex":-71,"Vadieresis":-71,"Vagrave":-71,"Vamacron":-71,"Vaogonek":-111,"Varing":-111,"Vatilde":-71,"Vcolon":-74,"Vcomma":-129,"Ve":-111,"Veacute":-111,"Vecaron":-71,"Vecircumflex":-71,"Vedieresis":-71,"Vedotaccent":-111,"Vegrave":-71,"Vemacron":-71,"Veogonek":-111,"Vhyphen":-100,"Vi":-60,"Viacute":-60,"Vicircumflex":-20,"Vidieresis":-20,"Vigrave":-20,"Vimacron":-20,"Viogonek":-60,"Vo":-129,"Voacute":-129,"Vocircumflex":-129,"Vodieresis":-89,"Vograve":-89,"Vohungarumlaut":-129,"Vomacron":-89,"Voslash":-129,"Votilde":-89,"Vperiod":-129,"Vsemicolon":-74,"Vu":-75,"Vuacute":-75,"Vucircumflex":-75,"Vudieresis":-75,"Vugrave":-75,"Vuhungarumlaut":-75,"Vumacron":-75,"Vuogonek":-75,"Vuring":-75,"WA":-120,"WAacute":-120,"WAbreve":-120,"WAcircumflex":-120,"WAdieresis":-120,"WAgrave":-120,"WAmacron":-120,"WAogonek":-120,"WAring":-120,"WAtilde":-120,"WO":-10,"WOacute":-10,"WOcircumflex":-10,"WOdieresis":-10,"WOgrave":-10,"WOhungarumlaut":-10,"WOmacron":-10,"WOslash":-10,"WOtilde":-10,"Wa":-80,"Waacute":-80,"Wabreve":-80,"Wacircumflex":-80,"Wadieresis":-80,"Wagrave":-80,"Wamacron":-80,"Waogonek":-80,"Waring":-80,"Watilde":-80,"Wcolon":-37,"Wcomma":-92,"We":-80,"Weacute":-80,"Wecaron":-80,"Wecircumflex":-80,"Wedieresis":-40,"Wedotaccent":-80,"Wegrave":-40,"Wemacron":-40,"Weogonek":-80,"Whyphen":-65,"Wi":-40,"Wiacute":-40,"Wiogonek":-40,"Wo":-80,"Woacute":-80,"Wocircumflex":-80,"Wodieresis":-80,"Wograve":-80,"Wohungarumlaut":-80,"Womacron":-80,"Woslash":-80,"Wotilde":-80,"Wperiod":-92,"Wsemicolon":-37,"Wu":-50,"Wuacute":-50,"Wucircumflex":-50,"Wudieresis":-50,"Wugrave":-50,"Wuhungarumlaut":-50,"Wumacron":-50,"Wuogonek":-50,"Wuring":-50,"Wy":-73,"Wyacute":-73,"Wydieresis":-73,"YA":-120,"YAacute":-120,"YAbreve":-120,"YAcircumflex":-120,"YAdieresis":-120,"YAgrave":-120,"YAmacron":-120,"YAogonek":-120,"YAring":-120,"YAtilde":-120,"YO":-30,"YOacute":-30,"YOcircumflex":-30,"YOdieresis":-30,"YOgrave":-30,"YOhungarumlaut":-30,"YOmacron":-30,"YOslash":-30,"YOtilde":-30,"Ya":-100,"Yaacute":-100,"Yabreve":-100,"Yacircumflex":-100,"Yadieresis":-60,"Yagrave":-60,"Yamacron":-60,"Yaogonek":-100,"Yaring":-100,"Yatilde":-60,"Ycolon":-92,"Ycomma":-129,"Ye":-100,"Yeacute":-100,"Yecaron":-100,"Yecircumflex":-100,"Yedieresis":-60,"Yedotaccent":-100,"Yegrave":-60,"Yemacron":-60,"Yeogonek":-100,"Yhyphen":-111,"Yi":-55,"Yiacute":-55,"Yiogonek":-55,"Yo":-110,"Yoacute":-110,"Yocircumflex":-110,"Yodieresis":-70,"Yograve":-70,"Yohungarumlaut":-110,"Yomacron":-70,"Yoslash":-110,"Yotilde":-70,"Yperiod":-129,"Ysemicolon":-92,"Yu":-111,"Yuacute":-111,"Yucircumflex":-111,"Yudieresis":-71,"Yugrave":-71,"Yuhungarumlaut":-111,"Yumacron":-71,"Yuogonek":-111,"Yuring":-111,"YacuteA":-120,"YacuteAacute":-120,"YacuteAbreve":-120,"YacuteAcircumflex":-120,"YacuteAdieresis":-120,"YacuteAgrave":-120,"YacuteAmacron":-120,"YacuteAogonek":-120,"YacuteAring":-120,"YacuteAtilde":-120,"YacuteO":-30,"YacuteOacute":-30,"YacuteOcircumflex":-30,"YacuteOdieresis":-30,"YacuteOgrave":-30,"YacuteOhungarumlaut":-30,"YacuteOmacron":-30,"YacuteOslash":-30,"YacuteOtilde":-30,"Yacutea":-100,"Yacuteaacute":-100,"Yacuteabreve":-100,"Yacuteacircumflex":-100,"Yacuteadieresis":-60,"Yacuteagrave":-60,"Yacuteamacron":-60,"Yacuteaogonek":-100,"Yacutearing":-100,"Yacuteatilde":-60,"Yacutecolon":-92,"Yacutecomma":-129,"Yacutee":-100,"Yacuteeacute":-100,"Yacuteecaron":-100,"Yacuteecircumflex":-100,"Yacuteedieresis":-60,"Yacuteedotaccent":-100,"Yacuteegrave":-60,"Yacuteemacron":-60,"Yacuteeogonek":-100,"Yacutehyphen":-111,"Yacutei":-55,"Yacuteiacute":-55,"Yacuteiogonek":-55,"Yacuteo":-110,"Yacuteoacute":-110,"Yacuteocircumflex":-110,"Yacuteodieresis":-70,"Yacuteograve":-70,"Yacuteohungarumlaut":-110,"Yacuteomacron":-70,"Yacuteoslash":-110,"Yacuteotilde":-70,"Yacuteperiod":-129,"Yacutesemicolon":-92,"Yacuteu":-111,"Yacuteuacute":-111,"Yacuteucircumflex":-111,"Yacuteudieresis":-71,"Yacuteugrave":-71,"Yacuteuhungarumlaut":-111,"Yacuteumacron":-71,"Yacuteuogonek":-111,"Yacuteuring":-111,"YdieresisA":-120,"YdieresisAacute":-120,"YdieresisAbreve":-120,"YdieresisAcircumflex":-120,"YdieresisAdieresis":-120,"YdieresisAgrave":-120,"YdieresisAmacron":-120,"YdieresisAogonek":-120,"YdieresisAring":-120,"YdieresisAtilde":-120,"YdieresisO":-30,"YdieresisOacute":-30,"YdieresisOcircumflex":-30,"YdieresisOdieresis":-30,"YdieresisOgrave":-30,"YdieresisOhungarumlaut":-30,"YdieresisOmacron":-30,"YdieresisOslash":-30,"YdieresisOtilde":-30,"Ydieresisa":-100,"Ydieresisaacute":-100,"Ydieresisabreve":-100,"Ydieresisacircumflex":-100,"Ydieresisadieresis":-60,"Ydieresisagrave":-60,"Ydieresisamacron":-60,"Ydieresisaogonek":-100,"Ydieresisaring":-100,"Ydieresisatilde":-100,"Ydieresiscolon":-92,"Ydieresiscomma":-129,"Ydieresise":-100,"Ydieresiseacute":-100,"Ydieresisecaron":-100,"Ydieresisecircumflex":-100,"Ydieresisedieresis":-60,"Ydieresisedotaccent":-100,"Ydieresisegrave":-60,"Ydieresisemacron":-60,"Ydieresiseogonek":-100,"Ydieresishyphen":-111,"Ydieresisi":-55,"Ydieresisiacute":-55,"Ydieresisiogonek":-55,"Ydieresiso":-110,"Ydieresisoacute":-110,"Ydieresisocircumflex":-110,"Ydieresisodieresis":-70,"Ydieresisograve":-70,"Ydieresisohungarumlaut":-110,"Ydieresisomacron":-70,"Ydieresisoslash":-110,"Ydieresisotilde":-70,"Ydieresisperiod":-129,"Ydieresissemicolon":-92,"Ydieresisu":-111,"Ydieresisuacute":-111,"Ydieresisucircumflex":-111,"Ydieresisudieresis":-71,"Ydieresisugrave":-71,"Ydieresisuhungarumlaut":-111,"Ydieresisumacron":-71,"Ydieresisuogonek":-111,"Ydieresisuring":-111,"av":-20,"aw":-15,"aacutev":-20,"aacutew":-15,"abrevev":-20,"abrevew":-15,"acircumflexv":-20,"acircumflexw":-15,"adieresisv":-20,"adieresisw":-15,"agravev":-20,"agravew":-15,"amacronv":-20,"amacronw":-15,"aogonekv":-20,"aogonekw":-15,"aringv":-20,"aringw":-15,"atildev":-20,"atildew":-15,"bperiod":-40,"bu":-20,"buacute":-20,"bucircumflex":-20,"budieresis":-20,"bugrave":-20,"buhungarumlaut":-20,"bumacron":-20,"buogonek":-20,"buring":-20,"bv":-15,"cy":-15,"cyacute":-15,"cydieresis":-15,"cacutey":-15,"cacuteyacute":-15,"cacuteydieresis":-15,"ccarony":-15,"ccaronyacute":-15,"ccaronydieresis":-15,"ccedillay":-15,"ccedillayacute":-15,"ccedillaydieresis":-15,"commaquotedblright":-70,"commaquoteright":-70,"eg":-15,"egbreve":-15,"egcommaaccent":-15,"ev":-25,"ew":-25,"ex":-15,"ey":-15,"eyacute":-15,"eydieresis":-15,"eacuteg":-15,"eacutegbreve":-15,"eacutegcommaaccent":-15,"eacutev":-25,"eacutew":-25,"eacutex":-15,"eacutey":-15,"eacuteyacute":-15,"eacuteydieresis":-15,"ecarong":-15,"ecarongbreve":-15,"ecarongcommaaccent":-15,"ecaronv":-25,"ecaronw":-25,"ecaronx":-15,"ecarony":-15,"ecaronyacute":-15,"ecaronydieresis":-15,"ecircumflexg":-15,"ecircumflexgbreve":-15,"ecircumflexgcommaaccent":-15,"ecircumflexv":-25,"ecircumflexw":-25,"ecircumflexx":-15,"ecircumflexy":-15,"ecircumflexyacute":-15,"ecircumflexydieresis":-15,"edieresisg":-15,"edieresisgbreve":-15,"edieresisgcommaaccent":-15,"edieresisv":-25,"edieresisw":-25,"edieresisx":-15,"edieresisy":-15,"edieresisyacute":-15,"edieresisydieresis":-15,"edotaccentg":-15,"edotaccentgbreve":-15,"edotaccentgcommaaccent":-15,"edotaccentv":-25,"edotaccentw":-25,"edotaccentx":-15,"edotaccenty":-15,"edotaccentyacute":-15,"edotaccentydieresis":-15,"egraveg":-15,"egravegbreve":-15,"egravegcommaaccent":-15,"egravev":-25,"egravew":-25,"egravex":-15,"egravey":-15,"egraveyacute":-15,"egraveydieresis":-15,"emacrong":-15,"emacrongbreve":-15,"emacrongcommaaccent":-15,"emacronv":-25,"emacronw":-25,"emacronx":-15,"emacrony":-15,"emacronyacute":-15,"emacronydieresis":-15,"eogonekg":-15,"eogonekgbreve":-15,"eogonekgcommaaccent":-15,"eogonekv":-25,"eogonekw":-25,"eogonekx":-15,"eogoneky":-15,"eogonekyacute":-15,"eogonekydieresis":-15,"fa":-10,"faacute":-10,"fabreve":-10,"facircumflex":-10,"fadieresis":-10,"fagrave":-10,"famacron":-10,"faogonek":-10,"faring":-10,"fatilde":-10,"fdotlessi":-50,"ff":-25,"fi":-20,"fiacute":-20,"fquoteright":55,"ga":-5,"gaacute":-5,"gabreve":-5,"gacircumflex":-5,"gadieresis":-5,"gagrave":-5,"gamacron":-5,"gaogonek":-5,"garing":-5,"gatilde":-5,"gbrevea":-5,"gbreveaacute":-5,"gbreveabreve":-5,"gbreveacircumflex":-5,"gbreveadieresis":-5,"gbreveagrave":-5,"gbreveamacron":-5,"gbreveaogonek":-5,"gbrevearing":-5,"gbreveatilde":-5,"gcommaaccenta":-5,"gcommaaccentaacute":-5,"gcommaaccentabreve":-5,"gcommaaccentacircumflex":-5,"gcommaaccentadieresis":-5,"gcommaaccentagrave":-5,"gcommaaccentamacron":-5,"gcommaaccentaogonek":-5,"gcommaaccentaring":-5,"gcommaaccentatilde":-5,"hy":-5,"hyacute":-5,"hydieresis":-5,"iv":-25,"iacutev":-25,"icircumflexv":-25,"idieresisv":-25,"igravev":-25,"imacronv":-25,"iogonekv":-25,"ke":-10,"keacute":-10,"kecaron":-10,"kecircumflex":-10,"kedieresis":-10,"kedotaccent":-10,"kegrave":-10,"kemacron":-10,"keogonek":-10,"ko":-10,"koacute":-10,"kocircumflex":-10,"kodieresis":-10,"kograve":-10,"kohungarumlaut":-10,"komacron":-10,"koslash":-10,"kotilde":-10,"ky":-15,"kyacute":-15,"kydieresis":-15,"kcommaaccente":-10,"kcommaaccenteacute":-10,"kcommaaccentecaron":-10,"kcommaaccentecircumflex":-10,"kcommaaccentedieresis":-10,"kcommaaccentedotaccent":-10,"kcommaaccentegrave":-10,"kcommaaccentemacron":-10,"kcommaaccenteogonek":-10,"kcommaaccento":-10,"kcommaaccentoacute":-10,"kcommaaccentocircumflex":-10,"kcommaaccentodieresis":-10,"kcommaaccentograve":-10,"kcommaaccentohungarumlaut":-10,"kcommaaccentomacron":-10,"kcommaaccentoslash":-10,"kcommaaccentotilde":-10,"kcommaaccenty":-15,"kcommaaccentyacute":-15,"kcommaaccentydieresis":-15,"lw":-10,"lacutew":-10,"lcommaaccentw":-10,"lslashw":-10,"nv":-40,"ny":-15,"nyacute":-15,"nydieresis":-15,"nacutev":-40,"nacutey":-15,"nacuteyacute":-15,"nacuteydieresis":-15,"ncaronv":-40,"ncarony":-15,"ncaronyacute":-15,"ncaronydieresis":-15,"ncommaaccentv":-40,"ncommaaccenty":-15,"ncommaaccentyacute":-15,"ncommaaccentydieresis":-15,"ntildev":-40,"ntildey":-15,"ntildeyacute":-15,"ntildeydieresis":-15,"ov":-15,"ow":-25,"oy":-10,"oyacute":-10,"oydieresis":-10,"oacutev":-15,"oacutew":-25,"oacutey":-10,"oacuteyacute":-10,"oacuteydieresis":-10,"ocircumflexv":-15,"ocircumflexw":-25,"ocircumflexy":-10,"ocircumflexyacute":-10,"ocircumflexydieresis":-10,"odieresisv":-15,"odieresisw":-25,"odieresisy":-10,"odieresisyacute":-10,"odieresisydieresis":-10,"ogravev":-15,"ogravew":-25,"ogravey":-10,"ograveyacute":-10,"ograveydieresis":-10,"ohungarumlautv":-15,"ohungarumlautw":-25,"ohungarumlauty":-10,"ohungarumlautyacute":-10,"ohungarumlautydieresis":-10,"omacronv":-15,"omacronw":-25,"omacrony":-10,"omacronyacute":-10,"omacronydieresis":-10,"oslashv":-15,"oslashw":-25,"oslashy":-10,"oslashyacute":-10,"oslashydieresis":-10,"otildev":-15,"otildew":-25,"otildey":-10,"otildeyacute":-10,"otildeydieresis":-10,"py":-10,"pyacute":-10,"pydieresis":-10,"periodquotedblright":-70,"periodquoteright":-70,"quotedblleftA":-80,"quotedblleftAacute":-80,"quotedblleftAbreve":-80,"quotedblleftAcircumflex":-80,"quotedblleftAdieresis":-80,"quotedblleftAgrave":-80,"quotedblleftAmacron":-80,"quotedblleftAogonek":-80,"quotedblleftAring":-80,"quotedblleftAtilde":-80,"quoteleftA":-80,"quoteleftAacute":-80,"quoteleftAbreve":-80,"quoteleftAcircumflex":-80,"quoteleftAdieresis":-80,"quoteleftAgrave":-80,"quoteleftAmacron":-80,"quoteleftAogonek":-80,"quoteleftAring":-80,"quoteleftAtilde":-80,"quoteleftquoteleft":-74,"quoterightd":-50,"quoterightdcroat":-50,"quoterightl":-10,"quoterightlacute":-10,"quoterightlcommaaccent":-10,"quoterightlslash":-10,"quoterightquoteright":-74,"quoterightr":-50,"quoterightracute":-50,"quoterightrcaron":-50,"quoterightrcommaaccent":-50,"quoterights":-55,"quoterightsacute":-55,"quoterightscaron":-55,"quoterightscedilla":-55,"quoterightscommaaccent":-55,"quoterightspace":-74,"quoterightt":-18,"quoterighttcommaaccent":-18,"quoterightv":-50,"rcomma":-40,"rg":-18,"rgbreve":-18,"rgcommaaccent":-18,"rhyphen":-20,"rperiod":-55,"racutecomma":-40,"racuteg":-18,"racutegbreve":-18,"racutegcommaaccent":-18,"racutehyphen":-20,"racuteperiod":-55,"rcaroncomma":-40,"rcarong":-18,"rcarongbreve":-18,"rcarongcommaaccent":-18,"rcaronhyphen":-20,"rcaronperiod":-55,"rcommaaccentcomma":-40,"rcommaaccentg":-18,"rcommaaccentgbreve":-18,"rcommaaccentgcommaaccent":-18,"rcommaaccenthyphen":-20,"rcommaaccentperiod":-55,"spaceA":-55,"spaceAacute":-55,"spaceAbreve":-55,"spaceAcircumflex":-55,"spaceAdieresis":-55,"spaceAgrave":-55,"spaceAmacron":-55,"spaceAogonek":-55,"spaceAring":-55,"spaceAtilde":-55,"spaceT":-18,"spaceTcaron":-18,"spaceTcommaaccent":-18,"spaceV":-50,"spaceW":-30,"spaceY":-90,"spaceYacute":-90,"spaceYdieresis":-90,"va":-25,"vaacute":-25,"vabreve":-25,"vacircumflex":-25,"vadieresis":-25,"vagrave":-25,"vamacron":-25,"vaogonek":-25,"varing":-25,"vatilde":-25,"vcomma":-65,"ve":-15,"veacute":-15,"vecaron":-15,"vecircumflex":-15,"vedieresis":-15,"vedotaccent":-15,"vegrave":-15,"vemacron":-15,"veogonek":-15,"vo":-20,"voacute":-20,"vocircumflex":-20,"vodieresis":-20,"vograve":-20,"vohungarumlaut":-20,"vomacron":-20,"voslash":-20,"votilde":-20,"vperiod":-65,"wa":-10,"waacute":-10,"wabreve":-10,"wacircumflex":-10,"wadieresis":-10,"wagrave":-10,"wamacron":-10,"waogonek":-10,"waring":-10,"watilde":-10,"wcomma":-65,"wo":-10,"woacute":-10,"wocircumflex":-10,"wodieresis":-10,"wograve":-10,"wohungarumlaut":-10,"womacron":-10,"woslash":-10,"wotilde":-10,"wperiod":-65,"xe":-15,"xeacute":-15,"xecaron":-15,"xecircumflex":-15,"xedieresis":-15,"xedotaccent":-15,"xegrave":-15,"xemacron":-15,"xeogonek":-15,"ycomma":-65,"yperiod":-65,"yacutecomma":-65,"yacuteperiod":-65,"ydieresiscomma":-65,"ydieresisperiod":-65}} \ No newline at end of file diff --git a/packages/pdfkit/src/font/data/index.json b/packages/pdfkit/src/font/data/index.json deleted file mode 100644 index 750141e45..000000000 --- a/packages/pdfkit/src/font/data/index.json +++ /dev/null @@ -1 +0,0 @@ -{"attributes":[{"Comment":["Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.","Creation Date: Thu May 1 12:43:52 1997","UniqueID 43052","VMusage 37169 48194"],"FontName":"Helvetica-Bold","FullName":"Helvetica Bold","FamilyName":"Helvetica","Weight":"Bold","ItalicAngle":"0","IsFixedPitch":"false","CharacterSet":"ExtendedRoman","FontBBox":"-170 -228 1003 962 ","UnderlinePosition":"-100","UnderlineThickness":"50","Version":"002.000","Notice":"Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries.","EncodingScheme":"AdobeStandardEncoding","CapHeight":"718","XHeight":"532","Ascender":"718","Descender":"-207","StdHW":"118","StdVW":"140"},{"Comment":["Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.","Creation Date: Thu May 1 12:45:12 1997","UniqueID 43053","VMusage 14482 68586"],"FontName":"Helvetica-BoldOblique","FullName":"Helvetica Bold Oblique","FamilyName":"Helvetica","Weight":"Bold","ItalicAngle":"-12","IsFixedPitch":"false","CharacterSet":"ExtendedRoman","FontBBox":"-174 -228 1114 962","UnderlinePosition":"-100","UnderlineThickness":"50","Version":"002.000","Notice":"Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries.","EncodingScheme":"AdobeStandardEncoding","CapHeight":"718","XHeight":"532","Ascender":"718","Descender":"-207","StdHW":"118","StdVW":"140"},{"Comment":["Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.","Creation Date: Thu May 1 12:44:31 1997","UniqueID 43055","VMusage 14960 69346"],"FontName":"Helvetica-Oblique","FullName":"Helvetica Oblique","FamilyName":"Helvetica","Weight":"Medium","ItalicAngle":"-12","IsFixedPitch":"false","CharacterSet":"ExtendedRoman","FontBBox":"-170 -225 1116 931 ","UnderlinePosition":"-100","UnderlineThickness":"50","Version":"002.000","Notice":"Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries.","EncodingScheme":"AdobeStandardEncoding","CapHeight":"718","XHeight":"523","Ascender":"718","Descender":"-207","StdHW":"76","StdVW":"88"},{"Comment":["Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.","Creation Date: Thu May 1 12:38:23 1997","UniqueID 43054","VMusage 37069 48094"],"FontName":"Helvetica","FullName":"Helvetica","FamilyName":"Helvetica","Weight":"Medium","ItalicAngle":"0","IsFixedPitch":"false","CharacterSet":"ExtendedRoman","FontBBox":"-166 -225 1000 931 ","UnderlinePosition":"-100","UnderlineThickness":"50","Version":"002.000","Notice":"Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries.","EncodingScheme":"AdobeStandardEncoding","CapHeight":"718","XHeight":"523","Ascender":"718","Descender":"-207","StdHW":"76","StdVW":"88"},{"Comment":["Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.","Creation Date: Thu May 1 12:52:56 1997","UniqueID 43065","VMusage 41636 52661"],"FontName":"Times-Bold","FullName":"Times Bold","FamilyName":"Times","Weight":"Bold","ItalicAngle":"0","IsFixedPitch":"false","CharacterSet":"ExtendedRoman","FontBBox":"-168 -218 1000 935 ","UnderlinePosition":"-100","UnderlineThickness":"50","Version":"002.000","Notice":"Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries.","EncodingScheme":"AdobeStandardEncoding","CapHeight":"676","XHeight":"461","Ascender":"683","Descender":"-217","StdHW":"44","StdVW":"139"},{"Comment":["Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.","Creation Date: Thu May 1 13:04:06 1997","UniqueID 43066","VMusage 45874 56899"],"FontName":"Times-BoldItalic","FullName":"Times Bold Italic","FamilyName":"Times","Weight":"Bold","ItalicAngle":"-15","IsFixedPitch":"false","CharacterSet":"ExtendedRoman","FontBBox":"-200 -218 996 921","UnderlinePosition":"-100","UnderlineThickness":"50","Version":"002.000","Notice":"Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries.","EncodingScheme":"AdobeStandardEncoding","CapHeight":"669","XHeight":"462","Ascender":"683","Descender":"-217","StdHW":"42","StdVW":"121"},{"Comment":["Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.","Creation Date: Thu May 1 12:56:55 1997","UniqueID 43067","VMusage 47727 58752"],"FontName":"Times-Italic","FullName":"Times Italic","FamilyName":"Times","Weight":"Medium","ItalicAngle":"-15.5","IsFixedPitch":"false","CharacterSet":"ExtendedRoman","FontBBox":"-169 -217 1010 883 ","UnderlinePosition":"-100","UnderlineThickness":"50","Version":"002.000","Notice":"Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries.","EncodingScheme":"AdobeStandardEncoding","CapHeight":"653","XHeight":"441","Ascender":"683","Descender":"-217","StdHW":"32","StdVW":"76"},{"Comment":["Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.","Creation Date: Thu May 1 12:49:17 1997","UniqueID 43068","VMusage 43909 54934"],"FontName":"Times-Roman","FullName":"Times Roman","FamilyName":"Times","Weight":"Roman","ItalicAngle":"0","IsFixedPitch":"false","CharacterSet":"ExtendedRoman","FontBBox":"-168 -218 1000 898 ","UnderlinePosition":"-100","UnderlineThickness":"50","Version":"002.000","Notice":"Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries.","EncodingScheme":"AdobeStandardEncoding","CapHeight":"662","XHeight":"450","Ascender":"683","Descender":"-217","StdHW":"28","StdVW":"84"},{"Comment":["Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.","Creation Date: Mon Jun 23 16:28:00 1997","UniqueID 43048","VMusage 41139 52164"],"FontName":"Courier-Bold","FullName":"Courier Bold","FamilyName":"Courier","Weight":"Bold","ItalicAngle":"0","IsFixedPitch":"true","CharacterSet":"ExtendedRoman","FontBBox":"-113 -250 749 801 ","UnderlinePosition":"-100","UnderlineThickness":"50","Version":"003.000","Notice":"Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.","EncodingScheme":"AdobeStandardEncoding","CapHeight":"562","XHeight":"439","Ascender":"629","Descender":"-157","StdHW":"84","StdVW":"106"},{"Comment":["Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.","Creation Date: Mon Jun 23 16:28:46 1997","UniqueID 43049","VMusage 17529 79244"],"FontName":"Courier-BoldOblique","FullName":"Courier Bold Oblique","FamilyName":"Courier","Weight":"Bold","ItalicAngle":"-12","IsFixedPitch":"true","CharacterSet":"ExtendedRoman","FontBBox":"-57 -250 869 801","UnderlinePosition":"-100","UnderlineThickness":"50","Version":"003.000","Notice":"Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.","EncodingScheme":"AdobeStandardEncoding","CapHeight":"562","XHeight":"439","Ascender":"629","Descender":"-157","StdHW":"84","StdVW":"106"},{"Comment":["Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.","Creation Date: Thu May 1 17:37:52 1997","UniqueID 43051","VMusage 16248 75829"],"FontName":"Courier-Oblique","FullName":"Courier Oblique","FamilyName":"Courier","Weight":"Medium","ItalicAngle":"-12","IsFixedPitch":"true","CharacterSet":"ExtendedRoman","FontBBox":"-27 -250 849 805 ","UnderlinePosition":"-100","UnderlineThickness":"50","Version":"003.000","Notice":"Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.","EncodingScheme":"AdobeStandardEncoding","CapHeight":"562","XHeight":"426","Ascender":"629","Descender":"-157","StdHW":"51","StdVW":"51"},{"Comment":["Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.","Creation Date: Thu May 1 17:27:09 1997","UniqueID 43050","VMusage 39754 50779"],"FontName":"Courier","FullName":"Courier","FamilyName":"Courier","Weight":"Medium","ItalicAngle":"0","IsFixedPitch":"true","CharacterSet":"ExtendedRoman","FontBBox":"-23 -250 715 805 ","UnderlinePosition":"-100","UnderlineThickness":"50","Version":"003.000","Notice":"Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.","EncodingScheme":"AdobeStandardEncoding","CapHeight":"562","XHeight":"426","Ascender":"629","Descender":"-157","StdHW":"51","StdVW":"51"}],"glyphWidths":{"space":[278,278,278,278,250,250,250,250,600,600,600,600],"exclam":[333,333,278,278,333,389,333,333,600,600,600,600],"quotedbl":[474,474,355,355,555,555,420,408,600,600,600,600],"numbersign":[556,556,556,556,500,500,500,500,600,600,600,600],"dollar":[556,556,556,556,500,500,500,500,600,600,600,600],"percent":[889,889,889,889,1000,833,833,833,600,600,600,600],"ampersand":[722,722,667,667,833,778,778,778,600,600,600,600],"quoteright":[278,278,222,222,333,333,333,333,600,600,600,600],"parenleft":[333,333,333,333,333,333,333,333,600,600,600,600],"parenright":[333,333,333,333,333,333,333,333,600,600,600,600],"asterisk":[389,389,389,389,500,500,500,500,600,600,600,600],"plus":[584,584,584,584,570,570,675,564,600,600,600,600],"comma":[278,278,278,278,250,250,250,250,600,600,600,600],"hyphen":[333,333,333,333,333,333,333,333,600,600,600,600],"period":[278,278,278,278,250,250,250,250,600,600,600,600],"slash":[278,278,278,278,278,278,278,278,600,600,600,600],"zero":[556,556,556,556,500,500,500,500,600,600,600,600],"one":[556,556,556,556,500,500,500,500,600,600,600,600],"two":[556,556,556,556,500,500,500,500,600,600,600,600],"three":[556,556,556,556,500,500,500,500,600,600,600,600],"four":[556,556,556,556,500,500,500,500,600,600,600,600],"five":[556,556,556,556,500,500,500,500,600,600,600,600],"six":[556,556,556,556,500,500,500,500,600,600,600,600],"seven":[556,556,556,556,500,500,500,500,600,600,600,600],"eight":[556,556,556,556,500,500,500,500,600,600,600,600],"nine":[556,556,556,556,500,500,500,500,600,600,600,600],"colon":[333,333,278,278,333,333,333,278,600,600,600,600],"semicolon":[333,333,278,278,333,333,333,278,600,600,600,600],"less":[584,584,584,584,570,570,675,564,600,600,600,600],"equal":[584,584,584,584,570,570,675,564,600,600,600,600],"greater":[584,584,584,584,570,570,675,564,600,600,600,600],"question":[611,611,556,556,500,500,500,444,600,600,600,600],"at":[975,975,1015,1015,930,832,920,921,600,600,600,600],"A":[722,722,667,667,722,667,611,722,600,600,600,600],"B":[722,722,667,667,667,667,611,667,600,600,600,600],"C":[722,722,722,722,722,667,667,667,600,600,600,600],"D":[722,722,722,722,722,722,722,722,600,600,600,600],"E":[667,667,667,667,667,667,611,611,600,600,600,600],"F":[611,611,611,611,611,667,611,556,600,600,600,600],"G":[778,778,778,778,778,722,722,722,600,600,600,600],"H":[722,722,722,722,778,778,722,722,600,600,600,600],"I":[278,278,278,278,389,389,333,333,600,600,600,600],"J":[556,556,500,500,500,500,444,389,600,600,600,600],"K":[722,722,667,667,778,667,667,722,600,600,600,600],"L":[611,611,556,556,667,611,556,611,600,600,600,600],"M":[833,833,833,833,944,889,833,889,600,600,600,600],"N":[722,722,722,722,722,722,667,722,600,600,600,600],"O":[778,778,778,778,778,722,722,722,600,600,600,600],"P":[667,667,667,667,611,611,611,556,600,600,600,600],"Q":[778,778,778,778,778,722,722,722,600,600,600,600],"R":[722,722,722,722,722,667,611,667,600,600,600,600],"S":[667,667,667,667,556,556,500,556,600,600,600,600],"T":[611,611,611,611,667,611,556,611,600,600,600,600],"U":[722,722,722,722,722,722,722,722,600,600,600,600],"V":[667,667,667,667,722,667,611,722,600,600,600,600],"W":[944,944,944,944,1000,889,833,944,600,600,600,600],"X":[667,667,667,667,722,667,611,722,600,600,600,600],"Y":[667,667,667,667,722,611,556,722,600,600,600,600],"Z":[611,611,611,611,667,611,556,611,600,600,600,600],"bracketleft":[333,333,278,278,333,333,389,333,600,600,600,600],"backslash":[278,278,278,278,278,278,278,278,600,600,600,600],"bracketright":[333,333,278,278,333,333,389,333,600,600,600,600],"asciicircum":[584,584,469,469,581,570,422,469,600,600,600,600],"underscore":[556,556,556,556,500,500,500,500,600,600,600,600],"quoteleft":[278,278,222,222,333,333,333,333,600,600,600,600],"a":[556,556,556,556,500,500,500,444,600,600,600,600],"b":[611,611,556,556,556,500,500,500,600,600,600,600],"c":[556,556,500,500,444,444,444,444,600,600,600,600],"d":[611,611,556,556,556,500,500,500,600,600,600,600],"e":[556,556,556,556,444,444,444,444,600,600,600,600],"f":[333,333,278,278,333,333,278,333,600,600,600,600],"g":[611,611,556,556,500,500,500,500,600,600,600,600],"h":[611,611,556,556,556,556,500,500,600,600,600,600],"i":[278,278,222,222,278,278,278,278,600,600,600,600],"j":[278,278,222,222,333,278,278,278,600,600,600,600],"k":[556,556,500,500,556,500,444,500,600,600,600,600],"l":[278,278,222,222,278,278,278,278,600,600,600,600],"m":[889,889,833,833,833,778,722,778,600,600,600,600],"n":[611,611,556,556,556,556,500,500,600,600,600,600],"o":[611,611,556,556,500,500,500,500,600,600,600,600],"p":[611,611,556,556,556,500,500,500,600,600,600,600],"q":[611,611,556,556,556,500,500,500,600,600,600,600],"r":[389,389,333,333,444,389,389,333,600,600,600,600],"s":[556,556,500,500,389,389,389,389,600,600,600,600],"t":[333,333,278,278,333,278,278,278,600,600,600,600],"u":[611,611,556,556,556,556,500,500,600,600,600,600],"v":[556,556,500,500,500,444,444,500,600,600,600,600],"w":[778,778,722,722,722,667,667,722,600,600,600,600],"x":[556,556,500,500,500,500,444,500,600,600,600,600],"y":[556,556,500,500,500,444,444,500,600,600,600,600],"z":[500,500,500,500,444,389,389,444,600,600,600,600],"braceleft":[389,389,334,334,394,348,400,480,600,600,600,600],"bar":[280,280,260,260,220,220,275,200,600,600,600,600],"braceright":[389,389,334,334,394,348,400,480,600,600,600,600],"asciitilde":[584,584,584,584,520,570,541,541,600,600,600,600],"exclamdown":[333,333,333,333,333,389,389,333,600,600,600,600],"cent":[556,556,556,556,500,500,500,500,600,600,600,600],"sterling":[556,556,556,556,500,500,500,500,600,600,600,600],"fraction":[167,167,167,167,167,167,167,167,600,600,600,600],"yen":[556,556,556,556,500,500,500,500,600,600,600,600],"florin":[556,556,556,556,500,500,500,500,600,600,600,600],"section":[556,556,556,556,500,500,500,500,600,600,600,600],"currency":[556,556,556,556,500,500,500,500,600,600,600,600],"quotesingle":[238,238,191,191,278,278,214,180,600,600,600,600],"quotedblleft":[500,500,333,333,500,500,556,444,600,600,600,600],"guillemotleft":[556,556,556,556,500,500,500,500,600,600,600,600],"guilsinglleft":[333,333,333,333,333,333,333,333,600,600,600,600],"guilsinglright":[333,333,333,333,333,333,333,333,600,600,600,600],"fi":[611,611,500,500,556,556,500,556,600,600,600,600],"fl":[611,611,500,500,556,556,500,556,600,600,600,600],"endash":[556,556,556,556,500,500,500,500,600,600,600,600],"dagger":[556,556,556,556,500,500,500,500,600,600,600,600],"daggerdbl":[556,556,556,556,500,500,500,500,600,600,600,600],"periodcentered":[278,278,278,278,250,250,250,250,600,600,600,600],"paragraph":[556,556,537,537,540,500,523,453,600,600,600,600],"bullet":[350,350,350,350,350,350,350,350,600,600,600,600],"quotesinglbase":[278,278,222,222,333,333,333,333,600,600,600,600],"quotedblbase":[500,500,333,333,500,500,556,444,600,600,600,600],"quotedblright":[500,500,333,333,500,500,556,444,600,600,600,600],"guillemotright":[556,556,556,556,500,500,500,500,600,600,600,600],"ellipsis":[1000,1000,1000,1000,1000,1000,889,1000,600,600,600,600],"perthousand":[1000,1000,1000,1000,1000,1000,1000,1000,600,600,600,600],"questiondown":[611,611,611,611,500,500,500,444,600,600,600,600],"grave":[333,333,333,333,333,333,333,333,600,600,600,600],"acute":[333,333,333,333,333,333,333,333,600,600,600,600],"circumflex":[333,333,333,333,333,333,333,333,600,600,600,600],"tilde":[333,333,333,333,333,333,333,333,600,600,600,600],"macron":[333,333,333,333,333,333,333,333,600,600,600,600],"breve":[333,333,333,333,333,333,333,333,600,600,600,600],"dotaccent":[333,333,333,333,333,333,333,333,600,600,600,600],"dieresis":[333,333,333,333,333,333,333,333,600,600,600,600],"ring":[333,333,333,333,333,333,333,333,600,600,600,600],"cedilla":[333,333,333,333,333,333,333,333,600,600,600,600],"hungarumlaut":[333,333,333,333,333,333,333,333,600,600,600,600],"ogonek":[333,333,333,333,333,333,333,333,600,600,600,600],"caron":[333,333,333,333,333,333,333,333,600,600,600,600],"emdash":[1000,1000,1000,1000,1000,1000,889,1000,600,600,600,600],"AE":[1000,1000,1000,1000,1000,944,889,889,600,600,600,600],"ordfeminine":[370,370,370,370,300,266,276,276,600,600,600,600],"Lslash":[611,611,556,556,667,611,556,611,600,600,600,600],"Oslash":[778,778,778,778,778,722,722,722,600,600,600,600],"OE":[1000,1000,1000,1000,1000,944,944,889,600,600,600,600],"ordmasculine":[365,365,365,365,330,300,310,310,600,600,600,600],"ae":[889,889,889,889,722,722,667,667,600,600,600,600],"dotlessi":[278,278,278,278,278,278,278,278,600,600,600,600],"lslash":[278,278,222,222,278,278,278,278,600,600,600,600],"oslash":[611,611,611,611,500,500,500,500,600,600,600,600],"oe":[944,944,944,944,722,722,667,722,600,600,600,600],"germandbls":[611,611,611,611,556,500,500,500,600,600,600,600],"Idieresis":[278,278,278,278,389,389,333,333,600,600,600,600],"eacute":[556,556,556,556,444,444,444,444,600,600,600,600],"abreve":[556,556,556,556,500,500,500,444,600,600,600,600],"uhungarumlaut":[611,611,556,556,556,556,500,500,600,600,600,600],"ecaron":[556,556,556,556,444,444,444,444,600,600,600,600],"Ydieresis":[667,667,667,667,722,611,556,722,600,600,600,600],"divide":[584,584,584,584,570,570,675,564,600,600,600,600],"Yacute":[667,667,667,667,722,611,556,722,600,600,600,600],"Acircumflex":[722,722,667,667,722,667,611,722,600,600,600,600],"aacute":[556,556,556,556,500,500,500,444,600,600,600,600],"Ucircumflex":[722,722,722,722,722,722,722,722,600,600,600,600],"yacute":[556,556,500,500,500,444,444,500,600,600,600,600],"scommaaccent":[556,556,500,500,389,389,389,389,600,600,600,600],"ecircumflex":[556,556,556,556,444,444,444,444,600,600,600,600],"Uring":[722,722,722,722,722,722,722,722,600,600,600,600],"Udieresis":[722,722,722,722,722,722,722,722,600,600,600,600],"aogonek":[556,556,556,556,500,500,500,444,600,600,600,600],"Uacute":[722,722,722,722,722,722,722,722,600,600,600,600],"uogonek":[611,611,556,556,556,556,500,500,600,600,600,600],"Edieresis":[667,667,667,667,667,667,611,611,600,600,600,600],"Dcroat":[722,722,722,722,722,722,722,722,600,600,600,600],"commaaccent":[250,250,250,250,250,250,250,250,600,600,600,600],"copyright":[737,737,737,737,747,747,760,760,600,600,600,600],"Emacron":[667,667,667,667,667,667,611,611,600,600,600,600],"ccaron":[556,556,500,500,444,444,444,444,600,600,600,600],"aring":[556,556,556,556,500,500,500,444,600,600,600,600],"Ncommaaccent":[722,722,722,722,722,722,667,722,600,600,600,600],"lacute":[278,278,222,222,278,278,278,278,600,600,600,600],"agrave":[556,556,556,556,500,500,500,444,600,600,600,600],"Tcommaaccent":[611,611,611,611,667,611,556,611,600,600,600,600],"Cacute":[722,722,722,722,722,667,667,667,600,600,600,600],"atilde":[556,556,556,556,500,500,500,444,600,600,600,600],"Edotaccent":[667,667,667,667,667,667,611,611,600,600,600,600],"scaron":[556,556,500,500,389,389,389,389,600,600,600,600],"scedilla":[556,556,500,500,389,389,389,389,600,600,600,600],"iacute":[278,278,278,278,278,278,278,278,600,600,600,600],"lozenge":[494,494,471,471,494,494,471,471,600,600,600,600],"Rcaron":[722,722,722,722,722,667,611,667,600,600,600,600],"Gcommaaccent":[778,778,778,778,778,722,722,722,600,600,600,600],"ucircumflex":[611,611,556,556,556,556,500,500,600,600,600,600],"acircumflex":[556,556,556,556,500,500,500,444,600,600,600,600],"Amacron":[722,722,667,667,722,667,611,722,600,600,600,600],"rcaron":[389,389,333,333,444,389,389,333,600,600,600,600],"ccedilla":[556,556,500,500,444,444,444,444,600,600,600,600],"Zdotaccent":[611,611,611,611,667,611,556,611,600,600,600,600],"Thorn":[667,667,667,667,611,611,611,556,600,600,600,600],"Omacron":[778,778,778,778,778,722,722,722,600,600,600,600],"Racute":[722,722,722,722,722,667,611,667,600,600,600,600],"Sacute":[667,667,667,667,556,556,500,556,600,600,600,600],"dcaron":[743,743,643,643,672,608,544,588,600,600,600,600],"Umacron":[722,722,722,722,722,722,722,722,600,600,600,600],"uring":[611,611,556,556,556,556,500,500,600,600,600,600],"threesuperior":[333,333,333,333,300,300,300,300,600,600,600,600],"Ograve":[778,778,778,778,778,722,722,722,600,600,600,600],"Agrave":[722,722,667,667,722,667,611,722,600,600,600,600],"Abreve":[722,722,667,667,722,667,611,722,600,600,600,600],"multiply":[584,584,584,584,570,570,675,564,600,600,600,600],"uacute":[611,611,556,556,556,556,500,500,600,600,600,600],"Tcaron":[611,611,611,611,667,611,556,611,600,600,600,600],"partialdiff":[494,494,476,476,494,494,476,476,600,600,600,600],"ydieresis":[556,556,500,500,500,444,444,500,600,600,600,600],"Nacute":[722,722,722,722,722,722,667,722,600,600,600,600],"icircumflex":[278,278,278,278,278,278,278,278,600,600,600,600],"Ecircumflex":[667,667,667,667,667,667,611,611,600,600,600,600],"adieresis":[556,556,556,556,500,500,500,444,600,600,600,600],"edieresis":[556,556,556,556,444,444,444,444,600,600,600,600],"cacute":[556,556,500,500,444,444,444,444,600,600,600,600],"nacute":[611,611,556,556,556,556,500,500,600,600,600,600],"umacron":[611,611,556,556,556,556,500,500,600,600,600,600],"Ncaron":[722,722,722,722,722,722,667,722,600,600,600,600],"Iacute":[278,278,278,278,389,389,333,333,600,600,600,600],"plusminus":[584,584,584,584,570,570,675,564,600,600,600,600],"brokenbar":[280,280,260,260,220,220,275,200,600,600,600,600],"registered":[737,737,737,737,747,747,760,760,600,600,600,600],"Gbreve":[778,778,778,778,778,722,722,722,600,600,600,600],"Idotaccent":[278,278,278,278,389,389,333,333,600,600,600,600],"summation":[600,600,600,600,600,600,600,600,600,600,600,600],"Egrave":[667,667,667,667,667,667,611,611,600,600,600,600],"racute":[389,389,333,333,444,389,389,333,600,600,600,600],"omacron":[611,611,556,556,500,500,500,500,600,600,600,600],"Zacute":[611,611,611,611,667,611,556,611,600,600,600,600],"Zcaron":[611,611,611,611,667,611,556,611,600,600,600,600],"greaterequal":[549,549,549,549,549,549,549,549,600,600,600,600],"Eth":[722,722,722,722,722,722,722,722,600,600,600,600],"Ccedilla":[722,722,722,722,722,667,667,667,600,600,600,600],"lcommaaccent":[278,278,222,222,278,278,278,278,600,600,600,600],"tcaron":[389,389,317,317,416,366,300,326,600,600,600,600],"eogonek":[556,556,556,556,444,444,444,444,600,600,600,600],"Uogonek":[722,722,722,722,722,722,722,722,600,600,600,600],"Aacute":[722,722,667,667,722,667,611,722,600,600,600,600],"Adieresis":[722,722,667,667,722,667,611,722,600,600,600,600],"egrave":[556,556,556,556,444,444,444,444,600,600,600,600],"zacute":[500,500,500,500,444,389,389,444,600,600,600,600],"iogonek":[278,278,222,222,278,278,278,278,600,600,600,600],"Oacute":[778,778,778,778,778,722,722,722,600,600,600,600],"oacute":[611,611,556,556,500,500,500,500,600,600,600,600],"amacron":[556,556,556,556,500,500,500,444,600,600,600,600],"sacute":[556,556,500,500,389,389,389,389,600,600,600,600],"idieresis":[278,278,278,278,278,278,278,278,600,600,600,600],"Ocircumflex":[778,778,778,778,778,722,722,722,600,600,600,600],"Ugrave":[722,722,722,722,722,722,722,722,600,600,600,600],"Delta":[612,612,612,612,612,612,612,612,600,600,600,600],"thorn":[611,611,556,556,556,500,500,500,600,600,600,600],"twosuperior":[333,333,333,333,300,300,300,300,600,600,600,600],"Odieresis":[778,778,778,778,778,722,722,722,600,600,600,600],"mu":[611,611,556,556,556,576,500,500,600,600,600,600],"igrave":[278,278,278,278,278,278,278,278,600,600,600,600],"ohungarumlaut":[611,611,556,556,500,500,500,500,600,600,600,600],"Eogonek":[667,667,667,667,667,667,611,611,600,600,600,600],"dcroat":[611,611,556,556,556,500,500,500,600,600,600,600],"threequarters":[834,834,834,834,750,750,750,750,600,600,600,600],"Scedilla":[667,667,667,667,556,556,500,556,600,600,600,600],"lcaron":[400,400,299,299,394,382,300,344,600,600,600,600],"Kcommaaccent":[722,722,667,667,778,667,667,722,600,600,600,600],"Lacute":[611,611,556,556,667,611,556,611,600,600,600,600],"trademark":[1000,1000,1000,1000,1000,1000,980,980,600,600,600,600],"edotaccent":[556,556,556,556,444,444,444,444,600,600,600,600],"Igrave":[278,278,278,278,389,389,333,333,600,600,600,600],"Imacron":[278,278,278,278,389,389,333,333,600,600,600,600],"Lcaron":[611,611,556,556,667,611,611,611,600,600,600,600],"onehalf":[834,834,834,834,750,750,750,750,600,600,600,600],"lessequal":[549,549,549,549,549,549,549,549,600,600,600,600],"ocircumflex":[611,611,556,556,500,500,500,500,600,600,600,600],"ntilde":[611,611,556,556,556,556,500,500,600,600,600,600],"Uhungarumlaut":[722,722,722,722,722,722,722,722,600,600,600,600],"Eacute":[667,667,667,667,667,667,611,611,600,600,600,600],"emacron":[556,556,556,556,444,444,444,444,600,600,600,600],"gbreve":[611,611,556,556,500,500,500,500,600,600,600,600],"onequarter":[834,834,834,834,750,750,750,750,600,600,600,600],"Scaron":[667,667,667,667,556,556,500,556,600,600,600,600],"Scommaaccent":[667,667,667,667,556,556,500,556,600,600,600,600],"Ohungarumlaut":[778,778,778,778,778,722,722,722,600,600,600,600],"degree":[400,400,400,400,400,400,400,400,600,600,600,600],"ograve":[611,611,556,556,500,500,500,500,600,600,600,600],"Ccaron":[722,722,722,722,722,667,667,667,600,600,600,600],"ugrave":[611,611,556,556,556,556,500,500,600,600,600,600],"radical":[549,549,453,453,549,549,453,453,600,600,600,600],"Dcaron":[722,722,722,722,722,722,722,722,600,600,600,600],"rcommaaccent":[389,389,333,333,444,389,389,333,600,600,600,600],"Ntilde":[722,722,722,722,722,722,667,722,600,600,600,600],"otilde":[611,611,556,556,500,500,500,500,600,600,600,600],"Rcommaaccent":[722,722,722,722,722,667,611,667,600,600,600,600],"Lcommaaccent":[611,611,556,556,667,611,556,611,600,600,600,600],"Atilde":[722,722,667,667,722,667,611,722,600,600,600,600],"Aogonek":[722,722,667,667,722,667,611,722,600,600,600,600],"Aring":[722,722,667,667,722,667,611,722,600,600,600,600],"Otilde":[778,778,778,778,778,722,722,722,600,600,600,600],"zdotaccent":[500,500,500,500,444,389,389,444,600,600,600,600],"Ecaron":[667,667,667,667,667,667,611,611,600,600,600,600],"Iogonek":[278,278,278,278,389,389,333,333,600,600,600,600],"kcommaaccent":[556,556,500,500,556,500,444,500,600,600,600,600],"minus":[584,584,584,584,570,606,675,564,600,600,600,600],"Icircumflex":[278,278,278,278,389,389,333,333,600,600,600,600],"ncaron":[611,611,556,556,556,556,500,500,600,600,600,600],"tcommaaccent":[333,333,278,278,333,278,278,278,600,600,600,600],"logicalnot":[584,584,584,584,570,606,675,564,600,600,600,600],"odieresis":[611,611,556,556,500,500,500,500,600,600,600,600],"udieresis":[611,611,556,556,556,556,500,500,600,600,600,600],"notequal":[549,549,549,549,549,549,549,549,600,600,600,600],"gcommaaccent":[611,611,556,556,500,500,500,500,600,600,600,600],"eth":[611,611,556,556,500,500,500,500,600,600,600,600],"zcaron":[500,500,500,500,444,389,389,444,600,600,600,600],"ncommaaccent":[611,611,556,556,556,556,500,500,600,600,600,600],"onesuperior":[333,333,333,333,300,300,300,300,600,600,600,600],"imacron":[278,278,278,278,278,278,278,278,600,600,600,600],"Euro":[556,556,556,556,500,500,500,500,600,600,600,600]},"kernPairs":{"AC":[-40,-40,-30,-30,-55,-65,-30,-40],"ACacute":[-40,-40,-30,-30,-55,-65,-30,-40],"ACcaron":[-40,-40,-30,-30,-55,-65,-30,-40],"ACcedilla":[-40,-40,-30,-30,-55,-65,-30,-40],"AG":[-50,-50,-30,-30,-55,-60,-35,-40],"AGbreve":[-50,-50,-30,-30,-55,-60,-35,-40],"AGcommaaccent":[-50,-50,-30,-30,-55,-60,-35,-40],"AO":[-40,-40,-30,-30,-45,-50,-40,-55],"AOacute":[-40,-40,-30,-30,-45,-50,-40,-55],"AOcircumflex":[-40,-40,-30,-30,-45,-50,-40,-55],"AOdieresis":[-40,-40,-30,-30,-45,-50,-40,-55],"AOgrave":[-40,-40,-30,-30,-45,-50,-40,-55],"AOhungarumlaut":[-40,-40,-30,-30,-45,-50,-40,-55],"AOmacron":[-40,-40,-30,-30,-45,-50,-40,-55],"AOslash":[-40,-40,-30,-30,-45,-50,-40,-55],"AOtilde":[-40,-40,-30,-30,-45,-50,-40,-55],"AQ":[-40,-40,-30,-30,-45,-55,-40,-55],"AT":[-90,-90,-120,-120,-95,-55,-37,-111],"ATcaron":[-90,-90,-120,-120,-95,-55,-37,-111],"ATcommaaccent":[-90,-90,-120,-120,-95,-55,-37,-111],"AU":[-50,-50,-50,-50,-50,-50,-50,-55],"AUacute":[-50,-50,-50,-50,-50,-50,-50,-55],"AUcircumflex":[-50,-50,-50,-50,-50,-50,-50,-55],"AUdieresis":[-50,-50,-50,-50,-50,-50,-50,-55],"AUgrave":[-50,-50,-50,-50,-50,-50,-50,-55],"AUhungarumlaut":[-50,-50,-50,-50,-50,-50,-50,-55],"AUmacron":[-50,-50,-50,-50,-50,-50,-50,-55],"AUogonek":[-50,-50,-50,-50,-50,-50,-50,-55],"AUring":[-50,-50,-50,-50,-50,-50,-50,-55],"AV":[-80,-80,-70,-70,-145,-95,-105,-135],"AW":[-60,-60,-50,-50,-130,-100,-95,-90],"AY":[-110,-110,-100,-100,-100,-70,-55,-105],"AYacute":[-110,-110,-100,-100,-100,-70,-55,-105],"AYdieresis":[-110,-110,-100,-100,-100,-70,-55,-105],"Au":[-30,-30,-30,-30,-50,-30,-20],"Auacute":[-30,-30,-30,-30,-50,-30,-20],"Aucircumflex":[-30,-30,-30,-30,-50,-30,-20],"Audieresis":[-30,-30,-30,-30,-50,-30,-20],"Augrave":[-30,-30,-30,-30,-50,-30,-20],"Auhungarumlaut":[-30,-30,-30,-30,-50,-30,-20],"Aumacron":[-30,-30,-30,-30,-50,-30,-20],"Auogonek":[-30,-30,-30,-30,-50,-30,-20],"Auring":[-30,-30,-30,-30,-50,-30,-20],"Av":[-40,-40,-40,-40,-100,-74,-55,-74],"Aw":[-30,-30,-40,-40,-90,-74,-55,-92],"Ay":[-30,-30,-40,-40,-74,-74,-55,-92],"Ayacute":[-30,-30,-40,-40,-74,-74,-55,-92],"Aydieresis":[-30,-30,-40,-40,-74,-74,-55,-92],"AacuteC":[-40,-40,-30,-30,-55,-65,-30,-40],"AacuteCacute":[-40,-40,-30,-30,-55,-65,-30,-40],"AacuteCcaron":[-40,-40,-30,-30,-55,-65,-30,-40],"AacuteCcedilla":[-40,-40,-30,-30,-55,-65,-30,-40],"AacuteG":[-50,-50,-30,-30,-55,-60,-35,-40],"AacuteGbreve":[-50,-50,-30,-30,-55,-60,-35,-40],"AacuteGcommaaccent":[-50,-50,-30,-30,-55,-60,-35,-40],"AacuteO":[-40,-40,-30,-30,-45,-50,-40,-55],"AacuteOacute":[-40,-40,-30,-30,-45,-50,-40,-55],"AacuteOcircumflex":[-40,-40,-30,-30,-45,-50,-40,-55],"AacuteOdieresis":[-40,-40,-30,-30,-45,-50,-40,-55],"AacuteOgrave":[-40,-40,-30,-30,-45,-50,-40,-55],"AacuteOhungarumlaut":[-40,-40,-30,-30,-45,-50,-40,-55],"AacuteOmacron":[-40,-40,-30,-30,-45,-50,-40,-55],"AacuteOslash":[-40,-40,-30,-30,-45,-50,-40,-55],"AacuteOtilde":[-40,-40,-30,-30,-45,-50,-40,-55],"AacuteQ":[-40,-40,-30,-30,-45,-55,-40,-55],"AacuteT":[-90,-90,-120,-120,-95,-55,-37,-111],"AacuteTcaron":[-90,-90,-120,-120,-95,-55,-37,-111],"AacuteTcommaaccent":[-90,-90,-120,-120,-95,-55,-37,-111],"AacuteU":[-50,-50,-50,-50,-50,-50,-50,-55],"AacuteUacute":[-50,-50,-50,-50,-50,-50,-50,-55],"AacuteUcircumflex":[-50,-50,-50,-50,-50,-50,-50,-55],"AacuteUdieresis":[-50,-50,-50,-50,-50,-50,-50,-55],"AacuteUgrave":[-50,-50,-50,-50,-50,-50,-50,-55],"AacuteUhungarumlaut":[-50,-50,-50,-50,-50,-50,-50,-55],"AacuteUmacron":[-50,-50,-50,-50,-50,-50,-50,-55],"AacuteUogonek":[-50,-50,-50,-50,-50,-50,-50,-55],"AacuteUring":[-50,-50,-50,-50,-50,-50,-50,-55],"AacuteV":[-80,-80,-70,-70,-145,-95,-105,-135],"AacuteW":[-60,-60,-50,-50,-130,-100,-95,-90],"AacuteY":[-110,-110,-100,-100,-100,-70,-55,-105],"AacuteYacute":[-110,-110,-100,-100,-100,-70,-55,-105],"AacuteYdieresis":[-110,-110,-100,-100,-100,-70,-55,-105],"Aacuteu":[-30,-30,-30,-30,-50,-30,-20],"Aacuteuacute":[-30,-30,-30,-30,-50,-30,-20],"Aacuteucircumflex":[-30,-30,-30,-30,-50,-30,-20],"Aacuteudieresis":[-30,-30,-30,-30,-50,-30,-20],"Aacuteugrave":[-30,-30,-30,-30,-50,-30,-20],"Aacuteuhungarumlaut":[-30,-30,-30,-30,-50,-30,-20],"Aacuteumacron":[-30,-30,-30,-30,-50,-30,-20],"Aacuteuogonek":[-30,-30,-30,-30,-50,-30,-20],"Aacuteuring":[-30,-30,-30,-30,-50,-30,-20],"Aacutev":[-40,-40,-40,-40,-100,-74,-55,-74],"Aacutew":[-30,-30,-40,-40,-90,-74,-55,-92],"Aacutey":[-30,-30,-40,-40,-74,-74,-55,-92],"Aacuteyacute":[-30,-30,-40,-40,-74,-74,-55,-92],"Aacuteydieresis":[-30,-30,-40,-40,-74,-74,-55,-92],"AbreveC":[-40,-40,-30,-30,-55,-65,-30,-40],"AbreveCacute":[-40,-40,-30,-30,-55,-65,-30,-40],"AbreveCcaron":[-40,-40,-30,-30,-55,-65,-30,-40],"AbreveCcedilla":[-40,-40,-30,-30,-55,-65,-30,-40],"AbreveG":[-50,-50,-30,-30,-55,-60,-35,-40],"AbreveGbreve":[-50,-50,-30,-30,-55,-60,-35,-40],"AbreveGcommaaccent":[-50,-50,-30,-30,-55,-60,-35,-40],"AbreveO":[-40,-40,-30,-30,-45,-50,-40,-55],"AbreveOacute":[-40,-40,-30,-30,-45,-50,-40,-55],"AbreveOcircumflex":[-40,-40,-30,-30,-45,-50,-40,-55],"AbreveOdieresis":[-40,-40,-30,-30,-45,-50,-40,-55],"AbreveOgrave":[-40,-40,-30,-30,-45,-50,-40,-55],"AbreveOhungarumlaut":[-40,-40,-30,-30,-45,-50,-40,-55],"AbreveOmacron":[-40,-40,-30,-30,-45,-50,-40,-55],"AbreveOslash":[-40,-40,-30,-30,-45,-50,-40,-55],"AbreveOtilde":[-40,-40,-30,-30,-45,-50,-40,-55],"AbreveQ":[-40,-40,-30,-30,-45,-55,-40,-55],"AbreveT":[-90,-90,-120,-120,-95,-55,-37,-111],"AbreveTcaron":[-90,-90,-120,-120,-95,-55,-37,-111],"AbreveTcommaaccent":[-90,-90,-120,-120,-95,-55,-37,-111],"AbreveU":[-50,-50,-50,-50,-50,-50,-50,-55],"AbreveUacute":[-50,-50,-50,-50,-50,-50,-50,-55],"AbreveUcircumflex":[-50,-50,-50,-50,-50,-50,-50,-55],"AbreveUdieresis":[-50,-50,-50,-50,-50,-50,-50,-55],"AbreveUgrave":[-50,-50,-50,-50,-50,-50,-50,-55],"AbreveUhungarumlaut":[-50,-50,-50,-50,-50,-50,-50,-55],"AbreveUmacron":[-50,-50,-50,-50,-50,-50,-50,-55],"AbreveUogonek":[-50,-50,-50,-50,-50,-50,-50,-55],"AbreveUring":[-50,-50,-50,-50,-50,-50,-50,-55],"AbreveV":[-80,-80,-70,-70,-145,-95,-105,-135],"AbreveW":[-60,-60,-50,-50,-130,-100,-95,-90],"AbreveY":[-110,-110,-100,-100,-100,-70,-55,-105],"AbreveYacute":[-110,-110,-100,-100,-100,-70,-55,-105],"AbreveYdieresis":[-110,-110,-100,-100,-100,-70,-55,-105],"Abreveu":[-30,-30,-30,-30,-50,-30,-20],"Abreveuacute":[-30,-30,-30,-30,-50,-30,-20],"Abreveucircumflex":[-30,-30,-30,-30,-50,-30,-20],"Abreveudieresis":[-30,-30,-30,-30,-50,-30,-20],"Abreveugrave":[-30,-30,-30,-30,-50,-30,-20],"Abreveuhungarumlaut":[-30,-30,-30,-30,-50,-30,-20],"Abreveumacron":[-30,-30,-30,-30,-50,-30,-20],"Abreveuogonek":[-30,-30,-30,-30,-50,-30,-20],"Abreveuring":[-30,-30,-30,-30,-50,-30,-20],"Abrevev":[-40,-40,-40,-40,-100,-74,-55,-74],"Abrevew":[-30,-30,-40,-40,-90,-74,-55,-92],"Abrevey":[-30,-30,-40,-40,-74,-74,-55,-92],"Abreveyacute":[-30,-30,-40,-40,-74,-74,-55,-92],"Abreveydieresis":[-30,-30,-40,-40,-74,-74,-55,-92],"AcircumflexC":[-40,-40,-30,-30,-55,-65,-30,-40],"AcircumflexCacute":[-40,-40,-30,-30,-55,-65,-30,-40],"AcircumflexCcaron":[-40,-40,-30,-30,-55,-65,-30,-40],"AcircumflexCcedilla":[-40,-40,-30,-30,-55,-65,-30,-40],"AcircumflexG":[-50,-50,-30,-30,-55,-60,-35,-40],"AcircumflexGbreve":[-50,-50,-30,-30,-55,-60,-35,-40],"AcircumflexGcommaaccent":[-50,-50,-30,-30,-55,-60,-35,-40],"AcircumflexO":[-40,-40,-30,-30,-45,-50,-40,-55],"AcircumflexOacute":[-40,-40,-30,-30,-45,-50,-40,-55],"AcircumflexOcircumflex":[-40,-40,-30,-30,-45,-50,-40,-55],"AcircumflexOdieresis":[-40,-40,-30,-30,-45,-50,-40,-55],"AcircumflexOgrave":[-40,-40,-30,-30,-45,-50,-40,-55],"AcircumflexOhungarumlaut":[-40,-40,-30,-30,-45,-50,-40,-55],"AcircumflexOmacron":[-40,-40,-30,-30,-45,-50,-40,-55],"AcircumflexOslash":[-40,-40,-30,-30,-45,-50,-40,-55],"AcircumflexOtilde":[-40,-40,-30,-30,-45,-50,-40,-55],"AcircumflexQ":[-40,-40,-30,-30,-45,-55,-40,-55],"AcircumflexT":[-90,-90,-120,-120,-95,-55,-37,-111],"AcircumflexTcaron":[-90,-90,-120,-120,-95,-55,-37,-111],"AcircumflexTcommaaccent":[-90,-90,-120,-120,-95,-55,-37,-111],"AcircumflexU":[-50,-50,-50,-50,-50,-50,-50,-55],"AcircumflexUacute":[-50,-50,-50,-50,-50,-50,-50,-55],"AcircumflexUcircumflex":[-50,-50,-50,-50,-50,-50,-50,-55],"AcircumflexUdieresis":[-50,-50,-50,-50,-50,-50,-50,-55],"AcircumflexUgrave":[-50,-50,-50,-50,-50,-50,-50,-55],"AcircumflexUhungarumlaut":[-50,-50,-50,-50,-50,-50,-50,-55],"AcircumflexUmacron":[-50,-50,-50,-50,-50,-50,-50,-55],"AcircumflexUogonek":[-50,-50,-50,-50,-50,-50,-50,-55],"AcircumflexUring":[-50,-50,-50,-50,-50,-50,-50,-55],"AcircumflexV":[-80,-80,-70,-70,-145,-95,-105,-135],"AcircumflexW":[-60,-60,-50,-50,-130,-100,-95,-90],"AcircumflexY":[-110,-110,-100,-100,-100,-70,-55,-105],"AcircumflexYacute":[-110,-110,-100,-100,-100,-70,-55,-105],"AcircumflexYdieresis":[-110,-110,-100,-100,-100,-70,-55,-105],"Acircumflexu":[-30,-30,-30,-30,-50,-30,-20],"Acircumflexuacute":[-30,-30,-30,-30,-50,-30,-20],"Acircumflexucircumflex":[-30,-30,-30,-30,-50,-30,-20],"Acircumflexudieresis":[-30,-30,-30,-30,-50,-30,-20],"Acircumflexugrave":[-30,-30,-30,-30,-50,-30,-20],"Acircumflexuhungarumlaut":[-30,-30,-30,-30,-50,-30,-20],"Acircumflexumacron":[-30,-30,-30,-30,-50,-30,-20],"Acircumflexuogonek":[-30,-30,-30,-30,-50,-30,-20],"Acircumflexuring":[-30,-30,-30,-30,-50,-30,-20],"Acircumflexv":[-40,-40,-40,-40,-100,-74,-55,-74],"Acircumflexw":[-30,-30,-40,-40,-90,-74,-55,-92],"Acircumflexy":[-30,-30,-40,-40,-74,-74,-55,-92],"Acircumflexyacute":[-30,-30,-40,-40,-74,-74,-55,-92],"Acircumflexydieresis":[-30,-30,-40,-40,-74,-74,-55,-92],"AdieresisC":[-40,-40,-30,-30,-55,-65,-30,-40],"AdieresisCacute":[-40,-40,-30,-30,-55,-65,-30,-40],"AdieresisCcaron":[-40,-40,-30,-30,-55,-65,-30,-40],"AdieresisCcedilla":[-40,-40,-30,-30,-55,-65,-30,-40],"AdieresisG":[-50,-50,-30,-30,-55,-60,-35,-40],"AdieresisGbreve":[-50,-50,-30,-30,-55,-60,-35,-40],"AdieresisGcommaaccent":[-50,-50,-30,-30,-55,-60,-35,-40],"AdieresisO":[-40,-40,-30,-30,-45,-50,-40,-55],"AdieresisOacute":[-40,-40,-30,-30,-45,-50,-40,-55],"AdieresisOcircumflex":[-40,-40,-30,-30,-45,-50,-40,-55],"AdieresisOdieresis":[-40,-40,-30,-30,-45,-50,-40,-55],"AdieresisOgrave":[-40,-40,-30,-30,-45,-50,-40,-55],"AdieresisOhungarumlaut":[-40,-40,-30,-30,-45,-50,-40,-55],"AdieresisOmacron":[-40,-40,-30,-30,-45,-50,-40,-55],"AdieresisOslash":[-40,-40,-30,-30,-45,-50,-40,-55],"AdieresisOtilde":[-40,-40,-30,-30,-45,-50,-40,-55],"AdieresisQ":[-40,-40,-30,-30,-45,-55,-40,-55],"AdieresisT":[-90,-90,-120,-120,-95,-55,-37,-111],"AdieresisTcaron":[-90,-90,-120,-120,-95,-55,-37,-111],"AdieresisTcommaaccent":[-90,-90,-120,-120,-95,-55,-37,-111],"AdieresisU":[-50,-50,-50,-50,-50,-50,-50,-55],"AdieresisUacute":[-50,-50,-50,-50,-50,-50,-50,-55],"AdieresisUcircumflex":[-50,-50,-50,-50,-50,-50,-50,-55],"AdieresisUdieresis":[-50,-50,-50,-50,-50,-50,-50,-55],"AdieresisUgrave":[-50,-50,-50,-50,-50,-50,-50,-55],"AdieresisUhungarumlaut":[-50,-50,-50,-50,-50,-50,-50,-55],"AdieresisUmacron":[-50,-50,-50,-50,-50,-50,-50,-55],"AdieresisUogonek":[-50,-50,-50,-50,-50,-50,-50,-55],"AdieresisUring":[-50,-50,-50,-50,-50,-50,-50,-55],"AdieresisV":[-80,-80,-70,-70,-145,-95,-105,-135],"AdieresisW":[-60,-60,-50,-50,-130,-100,-95,-90],"AdieresisY":[-110,-110,-100,-100,-100,-70,-55,-105],"AdieresisYacute":[-110,-110,-100,-100,-100,-70,-55,-105],"AdieresisYdieresis":[-110,-110,-100,-100,-100,-70,-55,-105],"Adieresisu":[-30,-30,-30,-30,-50,-30,-20],"Adieresisuacute":[-30,-30,-30,-30,-50,-30,-20],"Adieresisucircumflex":[-30,-30,-30,-30,-50,-30,-20],"Adieresisudieresis":[-30,-30,-30,-30,-50,-30,-20],"Adieresisugrave":[-30,-30,-30,-30,-50,-30,-20],"Adieresisuhungarumlaut":[-30,-30,-30,-30,-50,-30,-20],"Adieresisumacron":[-30,-30,-30,-30,-50,-30,-20],"Adieresisuogonek":[-30,-30,-30,-30,-50,-30,-20],"Adieresisuring":[-30,-30,-30,-30,-50,-30,-20],"Adieresisv":[-40,-40,-40,-40,-100,-74,-55,-74],"Adieresisw":[-30,-30,-40,-40,-90,-74,-55,-92],"Adieresisy":[-30,-30,-40,-40,-74,-74,-55,-92],"Adieresisyacute":[-30,-30,-40,-40,-74,-74,-55,-92],"Adieresisydieresis":[-30,-30,-40,-40,-74,-74,-55,-92],"AgraveC":[-40,-40,-30,-30,-55,-65,-30,-40],"AgraveCacute":[-40,-40,-30,-30,-55,-65,-30,-40],"AgraveCcaron":[-40,-40,-30,-30,-55,-65,-30,-40],"AgraveCcedilla":[-40,-40,-30,-30,-55,-65,-30,-40],"AgraveG":[-50,-50,-30,-30,-55,-60,-35,-40],"AgraveGbreve":[-50,-50,-30,-30,-55,-60,-35,-40],"AgraveGcommaaccent":[-50,-50,-30,-30,-55,-60,-35,-40],"AgraveO":[-40,-40,-30,-30,-45,-50,-40,-55],"AgraveOacute":[-40,-40,-30,-30,-45,-50,-40,-55],"AgraveOcircumflex":[-40,-40,-30,-30,-45,-50,-40,-55],"AgraveOdieresis":[-40,-40,-30,-30,-45,-50,-40,-55],"AgraveOgrave":[-40,-40,-30,-30,-45,-50,-40,-55],"AgraveOhungarumlaut":[-40,-40,-30,-30,-45,-50,-40,-55],"AgraveOmacron":[-40,-40,-30,-30,-45,-50,-40,-55],"AgraveOslash":[-40,-40,-30,-30,-45,-50,-40,-55],"AgraveOtilde":[-40,-40,-30,-30,-45,-50,-40,-55],"AgraveQ":[-40,-40,-30,-30,-45,-55,-40,-55],"AgraveT":[-90,-90,-120,-120,-95,-55,-37,-111],"AgraveTcaron":[-90,-90,-120,-120,-95,-55,-37,-111],"AgraveTcommaaccent":[-90,-90,-120,-120,-95,-55,-37,-111],"AgraveU":[-50,-50,-50,-50,-50,-50,-50,-55],"AgraveUacute":[-50,-50,-50,-50,-50,-50,-50,-55],"AgraveUcircumflex":[-50,-50,-50,-50,-50,-50,-50,-55],"AgraveUdieresis":[-50,-50,-50,-50,-50,-50,-50,-55],"AgraveUgrave":[-50,-50,-50,-50,-50,-50,-50,-55],"AgraveUhungarumlaut":[-50,-50,-50,-50,-50,-50,-50,-55],"AgraveUmacron":[-50,-50,-50,-50,-50,-50,-50,-55],"AgraveUogonek":[-50,-50,-50,-50,-50,-50,-50,-55],"AgraveUring":[-50,-50,-50,-50,-50,-50,-50,-55],"AgraveV":[-80,-80,-70,-70,-145,-95,-105,-135],"AgraveW":[-60,-60,-50,-50,-130,-100,-95,-90],"AgraveY":[-110,-110,-100,-100,-100,-70,-55,-105],"AgraveYacute":[-110,-110,-100,-100,-100,-70,-55,-105],"AgraveYdieresis":[-110,-110,-100,-100,-100,-70,-55,-105],"Agraveu":[-30,-30,-30,-30,-50,-30,-20],"Agraveuacute":[-30,-30,-30,-30,-50,-30,-20],"Agraveucircumflex":[-30,-30,-30,-30,-50,-30,-20],"Agraveudieresis":[-30,-30,-30,-30,-50,-30,-20],"Agraveugrave":[-30,-30,-30,-30,-50,-30,-20],"Agraveuhungarumlaut":[-30,-30,-30,-30,-50,-30,-20],"Agraveumacron":[-30,-30,-30,-30,-50,-30,-20],"Agraveuogonek":[-30,-30,-30,-30,-50,-30,-20],"Agraveuring":[-30,-30,-30,-30,-50,-30,-20],"Agravev":[-40,-40,-40,-40,-100,-74,-55,-74],"Agravew":[-30,-30,-40,-40,-90,-74,-55,-92],"Agravey":[-30,-30,-40,-40,-74,-74,-55,-92],"Agraveyacute":[-30,-30,-40,-40,-74,-74,-55,-92],"Agraveydieresis":[-30,-30,-40,-40,-74,-74,-55,-92],"AmacronC":[-40,-40,-30,-30,-55,-65,-30,-40],"AmacronCacute":[-40,-40,-30,-30,-55,-65,-30,-40],"AmacronCcaron":[-40,-40,-30,-30,-55,-65,-30,-40],"AmacronCcedilla":[-40,-40,-30,-30,-55,-65,-30,-40],"AmacronG":[-50,-50,-30,-30,-55,-60,-35,-40],"AmacronGbreve":[-50,-50,-30,-30,-55,-60,-35,-40],"AmacronGcommaaccent":[-50,-50,-30,-30,-55,-60,-35,-40],"AmacronO":[-40,-40,-30,-30,-45,-50,-40,-55],"AmacronOacute":[-40,-40,-30,-30,-45,-50,-40,-55],"AmacronOcircumflex":[-40,-40,-30,-30,-45,-50,-40,-55],"AmacronOdieresis":[-40,-40,-30,-30,-45,-50,-40,-55],"AmacronOgrave":[-40,-40,-30,-30,-45,-50,-40,-55],"AmacronOhungarumlaut":[-40,-40,-30,-30,-45,-50,-40,-55],"AmacronOmacron":[-40,-40,-30,-30,-45,-50,-40,-55],"AmacronOslash":[-40,-40,-30,-30,-45,-50,-40,-55],"AmacronOtilde":[-40,-40,-30,-30,-45,-50,-40,-55],"AmacronQ":[-40,-40,-30,-30,-45,-55,-40,-55],"AmacronT":[-90,-90,-120,-120,-95,-55,-37,-111],"AmacronTcaron":[-90,-90,-120,-120,-95,-55,-37,-111],"AmacronTcommaaccent":[-90,-90,-120,-120,-95,-55,-37,-111],"AmacronU":[-50,-50,-50,-50,-50,-50,-50,-55],"AmacronUacute":[-50,-50,-50,-50,-50,-50,-50,-55],"AmacronUcircumflex":[-50,-50,-50,-50,-50,-50,-50,-55],"AmacronUdieresis":[-50,-50,-50,-50,-50,-50,-50,-55],"AmacronUgrave":[-50,-50,-50,-50,-50,-50,-50,-55],"AmacronUhungarumlaut":[-50,-50,-50,-50,-50,-50,-50,-55],"AmacronUmacron":[-50,-50,-50,-50,-50,-50,-50,-55],"AmacronUogonek":[-50,-50,-50,-50,-50,-50,-50,-55],"AmacronUring":[-50,-50,-50,-50,-50,-50,-50,-55],"AmacronV":[-80,-80,-70,-70,-145,-95,-105,-135],"AmacronW":[-60,-60,-50,-50,-130,-100,-95,-90],"AmacronY":[-110,-110,-100,-100,-100,-70,-55,-105],"AmacronYacute":[-110,-110,-100,-100,-100,-70,-55,-105],"AmacronYdieresis":[-110,-110,-100,-100,-100,-70,-55,-105],"Amacronu":[-30,-30,-30,-30,-50,-30,-20],"Amacronuacute":[-30,-30,-30,-30,-50,-30,-20],"Amacronucircumflex":[-30,-30,-30,-30,-50,-30,-20],"Amacronudieresis":[-30,-30,-30,-30,-50,-30,-20],"Amacronugrave":[-30,-30,-30,-30,-50,-30,-20],"Amacronuhungarumlaut":[-30,-30,-30,-30,-50,-30,-20],"Amacronumacron":[-30,-30,-30,-30,-50,-30,-20],"Amacronuogonek":[-30,-30,-30,-30,-50,-30,-20],"Amacronuring":[-30,-30,-30,-30,-50,-30,-20],"Amacronv":[-40,-40,-40,-40,-100,-74,-55,-74],"Amacronw":[-30,-30,-40,-40,-90,-74,-55,-92],"Amacrony":[-30,-30,-40,-40,-74,-74,-55,-92],"Amacronyacute":[-30,-30,-40,-40,-74,-74,-55,-92],"Amacronydieresis":[-30,-30,-40,-40,-74,-74,-55,-92],"AogonekC":[-40,-40,-30,-30,-55,-65,-30,-40],"AogonekCacute":[-40,-40,-30,-30,-55,-65,-30,-40],"AogonekCcaron":[-40,-40,-30,-30,-55,-65,-30,-40],"AogonekCcedilla":[-40,-40,-30,-30,-55,-65,-30,-40],"AogonekG":[-50,-50,-30,-30,-55,-60,-35,-40],"AogonekGbreve":[-50,-50,-30,-30,-55,-60,-35,-40],"AogonekGcommaaccent":[-50,-50,-30,-30,-55,-60,-35,-40],"AogonekO":[-40,-40,-30,-30,-45,-50,-40,-55],"AogonekOacute":[-40,-40,-30,-30,-45,-50,-40,-55],"AogonekOcircumflex":[-40,-40,-30,-30,-45,-50,-40,-55],"AogonekOdieresis":[-40,-40,-30,-30,-45,-50,-40,-55],"AogonekOgrave":[-40,-40,-30,-30,-45,-50,-40,-55],"AogonekOhungarumlaut":[-40,-40,-30,-30,-45,-50,-40,-55],"AogonekOmacron":[-40,-40,-30,-30,-45,-50,-40,-55],"AogonekOslash":[-40,-40,-30,-30,-45,-50,-40,-55],"AogonekOtilde":[-40,-40,-30,-30,-45,-50,-40,-55],"AogonekQ":[-40,-40,-30,-30,-45,-55,-40,-55],"AogonekT":[-90,-90,-120,-120,-95,-55,-37,-111],"AogonekTcaron":[-90,-90,-120,-120,-95,-55,-37,-111],"AogonekTcommaaccent":[-90,-90,-120,-120,-95,-55,-37,-111],"AogonekU":[-50,-50,-50,-50,-50,-50,-50,-55],"AogonekUacute":[-50,-50,-50,-50,-50,-50,-50,-55],"AogonekUcircumflex":[-50,-50,-50,-50,-50,-50,-50,-55],"AogonekUdieresis":[-50,-50,-50,-50,-50,-50,-50,-55],"AogonekUgrave":[-50,-50,-50,-50,-50,-50,-50,-55],"AogonekUhungarumlaut":[-50,-50,-50,-50,-50,-50,-50,-55],"AogonekUmacron":[-50,-50,-50,-50,-50,-50,-50,-55],"AogonekUogonek":[-50,-50,-50,-50,-50,-50,-50,-55],"AogonekUring":[-50,-50,-50,-50,-50,-50,-50,-55],"AogonekV":[-80,-80,-70,-70,-145,-95,-105,-135],"AogonekW":[-60,-60,-50,-50,-130,-100,-95,-90],"AogonekY":[-110,-110,-100,-100,-100,-70,-55,-105],"AogonekYacute":[-110,-110,-100,-100,-100,-70,-55,-105],"AogonekYdieresis":[-110,-110,-100,-100,-100,-70,-55,-105],"Aogoneku":[-30,-30,-30,-30,-50,-30,-20],"Aogonekuacute":[-30,-30,-30,-30,-50,-30,-20],"Aogonekucircumflex":[-30,-30,-30,-30,-50,-30,-20],"Aogonekudieresis":[-30,-30,-30,-30,-50,-30,-20],"Aogonekugrave":[-30,-30,-30,-30,-50,-30,-20],"Aogonekuhungarumlaut":[-30,-30,-30,-30,-50,-30,-20],"Aogonekumacron":[-30,-30,-30,-30,-50,-30,-20],"Aogonekuogonek":[-30,-30,-30,-30,-50,-30,-20],"Aogonekuring":[-30,-30,-30,-30,-50,-30,-20],"Aogonekv":[-40,-40,-40,-40,-100,-74,-55,-74],"Aogonekw":[-30,-30,-40,-40,-90,-74,-55,-52],"Aogoneky":[-30,-30,-40,-40,-34,-34,-55,-52],"Aogonekyacute":[-30,-30,-40,-40,-34,-34,-55,-52],"Aogonekydieresis":[-30,-30,-40,-40,-34,-34,-55,-52],"AringC":[-40,-40,-30,-30,-55,-65,-30,-40],"AringCacute":[-40,-40,-30,-30,-55,-65,-30,-40],"AringCcaron":[-40,-40,-30,-30,-55,-65,-30,-40],"AringCcedilla":[-40,-40,-30,-30,-55,-65,-30,-40],"AringG":[-50,-50,-30,-30,-55,-60,-35,-40],"AringGbreve":[-50,-50,-30,-30,-55,-60,-35,-40],"AringGcommaaccent":[-50,-50,-30,-30,-55,-60,-35,-40],"AringO":[-40,-40,-30,-30,-45,-50,-40,-55],"AringOacute":[-40,-40,-30,-30,-45,-50,-40,-55],"AringOcircumflex":[-40,-40,-30,-30,-45,-50,-40,-55],"AringOdieresis":[-40,-40,-30,-30,-45,-50,-40,-55],"AringOgrave":[-40,-40,-30,-30,-45,-50,-40,-55],"AringOhungarumlaut":[-40,-40,-30,-30,-45,-50,-40,-55],"AringOmacron":[-40,-40,-30,-30,-45,-50,-40,-55],"AringOslash":[-40,-40,-30,-30,-45,-50,-40,-55],"AringOtilde":[-40,-40,-30,-30,-45,-50,-40,-55],"AringQ":[-40,-40,-30,-30,-45,-55,-40,-55],"AringT":[-90,-90,-120,-120,-95,-55,-37,-111],"AringTcaron":[-90,-90,-120,-120,-95,-55,-37,-111],"AringTcommaaccent":[-90,-90,-120,-120,-95,-55,-37,-111],"AringU":[-50,-50,-50,-50,-50,-50,-50,-55],"AringUacute":[-50,-50,-50,-50,-50,-50,-50,-55],"AringUcircumflex":[-50,-50,-50,-50,-50,-50,-50,-55],"AringUdieresis":[-50,-50,-50,-50,-50,-50,-50,-55],"AringUgrave":[-50,-50,-50,-50,-50,-50,-50,-55],"AringUhungarumlaut":[-50,-50,-50,-50,-50,-50,-50,-55],"AringUmacron":[-50,-50,-50,-50,-50,-50,-50,-55],"AringUogonek":[-50,-50,-50,-50,-50,-50,-50,-55],"AringUring":[-50,-50,-50,-50,-50,-50,-50,-55],"AringV":[-80,-80,-70,-70,-145,-95,-105,-135],"AringW":[-60,-60,-50,-50,-130,-100,-95,-90],"AringY":[-110,-110,-100,-100,-100,-70,-55,-105],"AringYacute":[-110,-110,-100,-100,-100,-70,-55,-105],"AringYdieresis":[-110,-110,-100,-100,-100,-70,-55,-105],"Aringu":[-30,-30,-30,-30,-50,-30,-20],"Aringuacute":[-30,-30,-30,-30,-50,-30,-20],"Aringucircumflex":[-30,-30,-30,-30,-50,-30,-20],"Aringudieresis":[-30,-30,-30,-30,-50,-30,-20],"Aringugrave":[-30,-30,-30,-30,-50,-30,-20],"Aringuhungarumlaut":[-30,-30,-30,-30,-50,-30,-20],"Aringumacron":[-30,-30,-30,-30,-50,-30,-20],"Aringuogonek":[-30,-30,-30,-30,-50,-30,-20],"Aringuring":[-30,-30,-30,-30,-50,-30,-20],"Aringv":[-40,-40,-40,-40,-100,-74,-55,-74],"Aringw":[-30,-30,-40,-40,-90,-74,-55,-92],"Aringy":[-30,-30,-40,-40,-74,-74,-55,-92],"Aringyacute":[-30,-30,-40,-40,-74,-74,-55,-92],"Aringydieresis":[-30,-30,-40,-40,-74,-74,-55,-92],"AtildeC":[-40,-40,-30,-30,-55,-65,-30,-40],"AtildeCacute":[-40,-40,-30,-30,-55,-65,-30,-40],"AtildeCcaron":[-40,-40,-30,-30,-55,-65,-30,-40],"AtildeCcedilla":[-40,-40,-30,-30,-55,-65,-30,-40],"AtildeG":[-50,-50,-30,-30,-55,-60,-35,-40],"AtildeGbreve":[-50,-50,-30,-30,-55,-60,-35,-40],"AtildeGcommaaccent":[-50,-50,-30,-30,-55,-60,-35,-40],"AtildeO":[-40,-40,-30,-30,-45,-50,-40,-55],"AtildeOacute":[-40,-40,-30,-30,-45,-50,-40,-55],"AtildeOcircumflex":[-40,-40,-30,-30,-45,-50,-40,-55],"AtildeOdieresis":[-40,-40,-30,-30,-45,-50,-40,-55],"AtildeOgrave":[-40,-40,-30,-30,-45,-50,-40,-55],"AtildeOhungarumlaut":[-40,-40,-30,-30,-45,-50,-40,-55],"AtildeOmacron":[-40,-40,-30,-30,-45,-50,-40,-55],"AtildeOslash":[-40,-40,-30,-30,-45,-50,-40,-55],"AtildeOtilde":[-40,-40,-30,-30,-45,-50,-40,-55],"AtildeQ":[-40,-40,-30,-30,-45,-55,-40,-55],"AtildeT":[-90,-90,-120,-120,-95,-55,-37,-111],"AtildeTcaron":[-90,-90,-120,-120,-95,-55,-37,-111],"AtildeTcommaaccent":[-90,-90,-120,-120,-95,-55,-37,-111],"AtildeU":[-50,-50,-50,-50,-50,-50,-50,-55],"AtildeUacute":[-50,-50,-50,-50,-50,-50,-50,-55],"AtildeUcircumflex":[-50,-50,-50,-50,-50,-50,-50,-55],"AtildeUdieresis":[-50,-50,-50,-50,-50,-50,-50,-55],"AtildeUgrave":[-50,-50,-50,-50,-50,-50,-50,-55],"AtildeUhungarumlaut":[-50,-50,-50,-50,-50,-50,-50,-55],"AtildeUmacron":[-50,-50,-50,-50,-50,-50,-50,-55],"AtildeUogonek":[-50,-50,-50,-50,-50,-50,-50,-55],"AtildeUring":[-50,-50,-50,-50,-50,-50,-50,-55],"AtildeV":[-80,-80,-70,-70,-145,-95,-105,-135],"AtildeW":[-60,-60,-50,-50,-130,-100,-95,-90],"AtildeY":[-110,-110,-100,-100,-100,-70,-55,-105],"AtildeYacute":[-110,-110,-100,-100,-100,-70,-55,-105],"AtildeYdieresis":[-110,-110,-100,-100,-100,-70,-55,-105],"Atildeu":[-30,-30,-30,-30,-50,-30,-20],"Atildeuacute":[-30,-30,-30,-30,-50,-30,-20],"Atildeucircumflex":[-30,-30,-30,-30,-50,-30,-20],"Atildeudieresis":[-30,-30,-30,-30,-50,-30,-20],"Atildeugrave":[-30,-30,-30,-30,-50,-30,-20],"Atildeuhungarumlaut":[-30,-30,-30,-30,-50,-30,-20],"Atildeumacron":[-30,-30,-30,-30,-50,-30,-20],"Atildeuogonek":[-30,-30,-30,-30,-50,-30,-20],"Atildeuring":[-30,-30,-30,-30,-50,-30,-20],"Atildev":[-40,-40,-40,-40,-100,-74,-55,-74],"Atildew":[-30,-30,-40,-40,-90,-74,-55,-92],"Atildey":[-30,-30,-40,-40,-74,-74,-55,-92],"Atildeyacute":[-30,-30,-40,-40,-74,-74,-55,-92],"Atildeydieresis":[-30,-30,-40,-40,-74,-74,-55,-92],"BA":[-30,-30,0,0,-30,-25,-25,-35],"BAacute":[-30,-30,0,0,-30,-25,-25,-35],"BAbreve":[-30,-30,0,0,-30,-25,-25,-35],"BAcircumflex":[-30,-30,0,0,-30,-25,-25,-35],"BAdieresis":[-30,-30,0,0,-30,-25,-25,-35],"BAgrave":[-30,-30,0,0,-30,-25,-25,-35],"BAmacron":[-30,-30,0,0,-30,-25,-25,-35],"BAogonek":[-30,-30,0,0,-30,-25,-25,-35],"BAring":[-30,-30,0,0,-30,-25,-25,-35],"BAtilde":[-30,-30,0,0,-30,-25,-25,-35],"BU":[-10,-10,-10,-10,-10,-10,-10,-10],"BUacute":[-10,-10,-10,-10,-10,-10,-10,-10],"BUcircumflex":[-10,-10,-10,-10,-10,-10,-10,-10],"BUdieresis":[-10,-10,-10,-10,-10,-10,-10,-10],"BUgrave":[-10,-10,-10,-10,-10,-10,-10,-10],"BUhungarumlaut":[-10,-10,-10,-10,-10,-10,-10,-10],"BUmacron":[-10,-10,-10,-10,-10,-10,-10,-10],"BUogonek":[-10,-10,-10,-10,-10,-10,-10,-10],"BUring":[-10,-10,-10,-10,-10,-10,-10,-10],"DA":[-40,-40,-40,-40,-35,-25,-35,-40],"DAacute":[-40,-40,-40,-40,-35,-25,-35,-40],"DAbreve":[-40,-40,-40,-40,-35,-25,-35,-40],"DAcircumflex":[-40,-40,-40,-40,-35,-25,-35,-40],"DAdieresis":[-40,-40,-40,-40,-35,-25,-35,-40],"DAgrave":[-40,-40,-40,-40,-35,-25,-35,-40],"DAmacron":[-40,-40,-40,-40,-35,-25,-35,-40],"DAogonek":[-40,-40,-40,-40,-35,-25,-35,-40],"DAring":[-40,-40,-40,-40,-35,-25,-35,-40],"DAtilde":[-40,-40,-40,-40,-35,-25,-35,-40],"DV":[-40,-40,-70,-70,-40,-50,-40,-40],"DW":[-40,-40,-40,-40,-40,-40,-40,-30],"DY":[-70,-70,-90,-90,-40,-50,-40,-55],"DYacute":[-70,-70,-90,-90,-40,-50,-40,-55],"DYdieresis":[-70,-70,-90,-90,-40,-50,-40,-55],"Dcomma":[-30,-30,-70,-70],"Dperiod":[-30,-30,-70,-70,-20],"DcaronA":[-40,-40,-40,-40,-35,-25,-35,-40],"DcaronAacute":[-40,-40,-40,-40,-35,-25,-35,-40],"DcaronAbreve":[-40,-40,-40,-40,-35,-25,-35,-40],"DcaronAcircumflex":[-40,-40,-40,-40,-35,-25,-35,-40],"DcaronAdieresis":[-40,-40,-40,-40,-35,-25,-35,-40],"DcaronAgrave":[-40,-40,-40,-40,-35,-25,-35,-40],"DcaronAmacron":[-40,-40,-40,-40,-35,-25,-35,-40],"DcaronAogonek":[-40,-40,-40,-40,-35,-25,-35,-40],"DcaronAring":[-40,-40,-40,-40,-35,-25,-35,-40],"DcaronAtilde":[-40,-40,-40,-40,-35,-25,-35,-40],"DcaronV":[-40,-40,-70,-70,-40,-50,-40,-40],"DcaronW":[-40,-40,-40,-40,-40,-40,-40,-30],"DcaronY":[-70,-70,-90,-90,-40,-50,-40,-55],"DcaronYacute":[-70,-70,-90,-90,-40,-50,-40,-55],"DcaronYdieresis":[-70,-70,-90,-90,-40,-50,-40,-55],"Dcaroncomma":[-30,-30,-70,-70],"Dcaronperiod":[-30,-30,-70,-70,-20],"DcroatA":[-40,-40,-40,-40,-35,-25,-35,-40],"DcroatAacute":[-40,-40,-40,-40,-35,-25,-35,-40],"DcroatAbreve":[-40,-40,-40,-40,-35,-25,-35,-40],"DcroatAcircumflex":[-40,-40,-40,-40,-35,-25,-35,-40],"DcroatAdieresis":[-40,-40,-40,-40,-35,-25,-35,-40],"DcroatAgrave":[-40,-40,-40,-40,-35,-25,-35,-40],"DcroatAmacron":[-40,-40,-40,-40,-35,-25,-35,-40],"DcroatAogonek":[-40,-40,-40,-40,-35,-25,-35,-40],"DcroatAring":[-40,-40,-40,-40,-35,-25,-35,-40],"DcroatAtilde":[-40,-40,-40,-40,-35,-25,-35,-40],"DcroatV":[-40,-40,-70,-70,-40,-50,-40,-40],"DcroatW":[-40,-40,-40,-40,-40,-40,-40,-30],"DcroatY":[-70,-70,-90,-90,-40,-50,-40,-55],"DcroatYacute":[-70,-70,-90,-90,-40,-50,-40,-55],"DcroatYdieresis":[-70,-70,-90,-90,-40,-50,-40,-55],"Dcroatcomma":[-30,-30,-70,-70],"Dcroatperiod":[-30,-30,-70,-70,-20],"FA":[-80,-80,-80,-80,-90,-100,-115,-74],"FAacute":[-80,-80,-80,-80,-90,-100,-115,-74],"FAbreve":[-80,-80,-80,-80,-90,-100,-115,-74],"FAcircumflex":[-80,-80,-80,-80,-90,-100,-115,-74],"FAdieresis":[-80,-80,-80,-80,-90,-100,-115,-74],"FAgrave":[-80,-80,-80,-80,-90,-100,-115,-74],"FAmacron":[-80,-80,-80,-80,-90,-100,-115,-74],"FAogonek":[-80,-80,-80,-80,-90,-100,-115,-74],"FAring":[-80,-80,-80,-80,-90,-100,-115,-74],"FAtilde":[-80,-80,-80,-80,-90,-100,-115,-74],"Fa":[-20,-20,-50,-50,-25,-95,-75,-15],"Faacute":[-20,-20,-50,-50,-25,-95,-75,-15],"Fabreve":[-20,-20,-50,-50,-25,-95,-75,-15],"Facircumflex":[-20,-20,-50,-50,-25,-95,-75,-15],"Fadieresis":[-20,-20,-50,-50,-25,-95,-75,-15],"Fagrave":[-20,-20,-50,-50,-25,-95,-75,-15],"Famacron":[-20,-20,-50,-50,-25,-95,-75,-15],"Faogonek":[-20,-20,-50,-50,-25,-95,-75,-15],"Faring":[-20,-20,-50,-50,-25,-95,-75,-15],"Fatilde":[-20,-20,-50,-50,-25,-95,-75,-15],"Fcomma":[-100,-100,-150,-150,-92,-129,-135,-80],"Fperiod":[-100,-100,-150,-150,-110,-129,-135,-80],"JA":[-20,-20,-20,-20,-30,-25,-40,-60],"JAacute":[-20,-20,-20,-20,-30,-25,-40,-60],"JAbreve":[-20,-20,-20,-20,-30,-25,-40,-60],"JAcircumflex":[-20,-20,-20,-20,-30,-25,-40,-60],"JAdieresis":[-20,-20,-20,-20,-30,-25,-40,-60],"JAgrave":[-20,-20,-20,-20,-30,-25,-40,-60],"JAmacron":[-20,-20,-20,-20,-30,-25,-40,-60],"JAogonek":[-20,-20,-20,-20,-30,-25,-40,-60],"JAring":[-20,-20,-20,-20,-30,-25,-40,-60],"JAtilde":[-20,-20,-20,-20,-30,-25,-40,-60],"Jcomma":[-20,-20,-30,-30,0,-10,-25],"Jperiod":[-20,-20,-30,-30,-20,-10,-25],"Ju":[-20,-20,-20,-20,-15,-40,-35],"Juacute":[-20,-20,-20,-20,-15,-40,-35],"Jucircumflex":[-20,-20,-20,-20,-15,-40,-35],"Judieresis":[-20,-20,-20,-20,-15,-40,-35],"Jugrave":[-20,-20,-20,-20,-15,-40,-35],"Juhungarumlaut":[-20,-20,-20,-20,-15,-40,-35],"Jumacron":[-20,-20,-20,-20,-15,-40,-35],"Juogonek":[-20,-20,-20,-20,-15,-40,-35],"Juring":[-20,-20,-20,-20,-15,-40,-35],"KO":[-30,-30,-50,-50,-30,-30,-50,-30],"KOacute":[-30,-30,-50,-50,-30,-30,-50,-30],"KOcircumflex":[-30,-30,-50,-50,-30,-30,-50,-30],"KOdieresis":[-30,-30,-50,-50,-30,-30,-50,-30],"KOgrave":[-30,-30,-50,-50,-30,-30,-50,-30],"KOhungarumlaut":[-30,-30,-50,-50,-30,-30,-50,-30],"KOmacron":[-30,-30,-50,-50,-30,-30,-50,-30],"KOslash":[-30,-30,-50,-50,-30,-30,-50,-30],"KOtilde":[-30,-30,-50,-50,-30,-30,-50,-30],"Ke":[-15,-15,-40,-40,-25,-25,-35,-25],"Keacute":[-15,-15,-40,-40,-25,-25,-35,-25],"Kecaron":[-15,-15,-40,-40,-25,-25,-35,-25],"Kecircumflex":[-15,-15,-40,-40,-25,-25,-35,-25],"Kedieresis":[-15,-15,-40,-40,-25,-25,-35,-25],"Kedotaccent":[-15,-15,-40,-40,-25,-25,-35,-25],"Kegrave":[-15,-15,-40,-40,-25,-25,-35,-25],"Kemacron":[-15,-15,-40,-40,-25,-25,-35,-25],"Keogonek":[-15,-15,-40,-40,-25,-25,-35,-25],"Ko":[-35,-35,-40,-40,-25,-25,-40,-35],"Koacute":[-35,-35,-40,-40,-25,-25,-40,-35],"Kocircumflex":[-35,-35,-40,-40,-25,-25,-40,-35],"Kodieresis":[-35,-35,-40,-40,-25,-25,-40,-35],"Kograve":[-35,-35,-40,-40,-25,-25,-40,-35],"Kohungarumlaut":[-35,-35,-40,-40,-25,-25,-40,-35],"Komacron":[-35,-35,-40,-40,-25,-25,-40,-35],"Koslash":[-35,-35,-40,-40,-25,-25,-40,-35],"Kotilde":[-35,-35,-40,-40,-25,-25,-40,-35],"Ku":[-30,-30,-30,-30,-15,-20,-40,-15],"Kuacute":[-30,-30,-30,-30,-15,-20,-40,-15],"Kucircumflex":[-30,-30,-30,-30,-15,-20,-40,-15],"Kudieresis":[-30,-30,-30,-30,-15,-20,-40,-15],"Kugrave":[-30,-30,-30,-30,-15,-20,-40,-15],"Kuhungarumlaut":[-30,-30,-30,-30,-15,-20,-40,-15],"Kumacron":[-30,-30,-30,-30,-15,-20,-40,-15],"Kuogonek":[-30,-30,-30,-30,-15,-20,-40,-15],"Kuring":[-30,-30,-30,-30,-15,-20,-40,-15],"Ky":[-40,-40,-50,-50,-45,-20,-40,-25],"Kyacute":[-40,-40,-50,-50,-45,-20,-40,-25],"Kydieresis":[-40,-40,-50,-50,-45,-20,-40,-25],"KcommaaccentO":[-30,-30,-50,-50,-30,-30,-50,-30],"KcommaaccentOacute":[-30,-30,-50,-50,-30,-30,-50,-30],"KcommaaccentOcircumflex":[-30,-30,-50,-50,-30,-30,-50,-30],"KcommaaccentOdieresis":[-30,-30,-50,-50,-30,-30,-50,-30],"KcommaaccentOgrave":[-30,-30,-50,-50,-30,-30,-50,-30],"KcommaaccentOhungarumlaut":[-30,-30,-50,-50,-30,-30,-50,-30],"KcommaaccentOmacron":[-30,-30,-50,-50,-30,-30,-50,-30],"KcommaaccentOslash":[-30,-30,-50,-50,-30,-30,-50,-30],"KcommaaccentOtilde":[-30,-30,-50,-50,-30,-30,-50,-30],"Kcommaaccente":[-15,-15,-40,-40,-25,-25,-35,-25],"Kcommaaccenteacute":[-15,-15,-40,-40,-25,-25,-35,-25],"Kcommaaccentecaron":[-15,-15,-40,-40,-25,-25,-35,-25],"Kcommaaccentecircumflex":[-15,-15,-40,-40,-25,-25,-35,-25],"Kcommaaccentedieresis":[-15,-15,-40,-40,-25,-25,-35,-25],"Kcommaaccentedotaccent":[-15,-15,-40,-40,-25,-25,-35,-25],"Kcommaaccentegrave":[-15,-15,-40,-40,-25,-25,-35,-25],"Kcommaaccentemacron":[-15,-15,-40,-40,-25,-25,-35,-25],"Kcommaaccenteogonek":[-15,-15,-40,-40,-25,-25,-35,-25],"Kcommaaccento":[-35,-35,-40,-40,-25,-25,-40,-35],"Kcommaaccentoacute":[-35,-35,-40,-40,-25,-25,-40,-35],"Kcommaaccentocircumflex":[-35,-35,-40,-40,-25,-25,-40,-35],"Kcommaaccentodieresis":[-35,-35,-40,-40,-25,-25,-40,-35],"Kcommaaccentograve":[-35,-35,-40,-40,-25,-25,-40,-35],"Kcommaaccentohungarumlaut":[-35,-35,-40,-40,-25,-25,-40,-35],"Kcommaaccentomacron":[-35,-35,-40,-40,-25,-25,-40,-35],"Kcommaaccentoslash":[-35,-35,-40,-40,-25,-25,-40,-35],"Kcommaaccentotilde":[-35,-35,-40,-40,-25,-25,-40,-35],"Kcommaaccentu":[-30,-30,-30,-30,-15,-20,-40,-15],"Kcommaaccentuacute":[-30,-30,-30,-30,-15,-20,-40,-15],"Kcommaaccentucircumflex":[-30,-30,-30,-30,-15,-20,-40,-15],"Kcommaaccentudieresis":[-30,-30,-30,-30,-15,-20,-40,-15],"Kcommaaccentugrave":[-30,-30,-30,-30,-15,-20,-40,-15],"Kcommaaccentuhungarumlaut":[-30,-30,-30,-30,-15,-20,-40,-15],"Kcommaaccentumacron":[-30,-30,-30,-30,-15,-20,-40,-15],"Kcommaaccentuogonek":[-30,-30,-30,-30,-15,-20,-40,-15],"Kcommaaccenturing":[-30,-30,-30,-30,-15,-20,-40,-15],"Kcommaaccenty":[-40,-40,-50,-50,-45,-20,-40,-25],"Kcommaaccentyacute":[-40,-40,-50,-50,-45,-20,-40,-25],"Kcommaaccentydieresis":[-40,-40,-50,-50,-45,-20,-40,-25],"LT":[-90,-90,-110,-110,-92,-18,-20,-92],"LTcaron":[-90,-90,-110,-110,-92,-18,-20,-92],"LTcommaaccent":[-90,-90,-110,-110,-92,-18,-20,-92],"LV":[-110,-110,-110,-110,-92,-37,-55,-100],"LW":[-80,-80,-70,-70,-92,-37,-55,-74],"LY":[-120,-120,-140,-140,-92,-37,-20,-100],"LYacute":[-120,-120,-140,-140,-92,-37,-20,-100],"LYdieresis":[-120,-120,-140,-140,-92,-37,-20,-100],"Lquotedblright":[-140,-140,-140,-140,-20],"Lquoteright":[-140,-140,-160,-160,-110,-55,-37,-92],"Ly":[-30,-30,-30,-30,-55,-37,-30,-55],"Lyacute":[-30,-30,-30,-30,-55,-37,-30,-55],"Lydieresis":[-30,-30,-30,-30,-55,-37,-30,-55],"LacuteT":[-90,-90,-110,-110,-92,-18,-20,-92],"LacuteTcaron":[-90,-90,-110,-110,-92,-18,-20,-92],"LacuteTcommaaccent":[-90,-90,-110,-110,-92,-18,-20,-92],"LacuteV":[-110,-110,-110,-110,-92,-37,-55,-100],"LacuteW":[-80,-80,-70,-70,-92,-37,-55,-74],"LacuteY":[-120,-120,-140,-140,-92,-37,-20,-100],"LacuteYacute":[-120,-120,-140,-140,-92,-37,-20,-100],"LacuteYdieresis":[-120,-120,-140,-140,-92,-37,-20,-100],"Lacutequotedblright":[-140,-140,-140,-140,-20],"Lacutequoteright":[-140,-140,-160,-160,-110,-55,-37,-92],"Lacutey":[-30,-30,-30,-30,-55,-37,-30,-55],"Lacuteyacute":[-30,-30,-30,-30,-55,-37,-30,-55],"Lacuteydieresis":[-30,-30,-30,-30,-55,-37,-30,-55],"LcommaaccentT":[-90,-90,-110,-110,-92,-18,-20,-92],"LcommaaccentTcaron":[-90,-90,-110,-110,-92,-18,-20,-92],"LcommaaccentTcommaaccent":[-90,-90,-110,-110,-92,-18,-20,-92],"LcommaaccentV":[-110,-110,-110,-110,-92,-37,-55,-100],"LcommaaccentW":[-80,-80,-70,-70,-92,-37,-55,-74],"LcommaaccentY":[-120,-120,-140,-140,-92,-37,-20,-100],"LcommaaccentYacute":[-120,-120,-140,-140,-92,-37,-20,-100],"LcommaaccentYdieresis":[-120,-120,-140,-140,-92,-37,-20,-100],"Lcommaaccentquotedblright":[-140,-140,-140,-140,-20],"Lcommaaccentquoteright":[-140,-140,-160,-160,-110,-55,-37,-92],"Lcommaaccenty":[-30,-30,-30,-30,-55,-37,-30,-55],"Lcommaaccentyacute":[-30,-30,-30,-30,-55,-37,-30,-55],"Lcommaaccentydieresis":[-30,-30,-30,-30,-55,-37,-30,-55],"LslashT":[-90,-90,-110,-110,-92,-18,-20,-92],"LslashTcaron":[-90,-90,-110,-110,-92,-18,-20,-92],"LslashTcommaaccent":[-90,-90,-110,-110,-92,-18,-20,-92],"LslashV":[-110,-110,-110,-110,-92,-37,-55,-100],"LslashW":[-80,-80,-70,-70,-92,-37,-55,-74],"LslashY":[-120,-120,-140,-140,-92,-37,-20,-100],"LslashYacute":[-120,-120,-140,-140,-92,-37,-20,-100],"LslashYdieresis":[-120,-120,-140,-140,-92,-37,-20,-100],"Lslashquotedblright":[-140,-140,-140,-140,-20],"Lslashquoteright":[-140,-140,-160,-160,-110,-55,-37,-92],"Lslashy":[-30,-30,-30,-30,-55,-37,-30,-55],"Lslashyacute":[-30,-30,-30,-30,-55,-37,-30,-55],"Lslashydieresis":[-30,-30,-30,-30,-55,-37,-30,-55],"OA":[-50,-50,-20,-20,-40,-40,-55,-35],"OAacute":[-50,-50,-20,-20,-40,-40,-55,-35],"OAbreve":[-50,-50,-20,-20,-40,-40,-55,-35],"OAcircumflex":[-50,-50,-20,-20,-40,-40,-55,-35],"OAdieresis":[-50,-50,-20,-20,-40,-40,-55,-35],"OAgrave":[-50,-50,-20,-20,-40,-40,-55,-35],"OAmacron":[-50,-50,-20,-20,-40,-40,-55,-35],"OAogonek":[-50,-50,-20,-20,-40,-40,-55,-35],"OAring":[-50,-50,-20,-20,-40,-40,-55,-35],"OAtilde":[-50,-50,-20,-20,-40,-40,-55,-35],"OT":[-40,-40,-40,-40,-40,-40,-40,-40],"OTcaron":[-40,-40,-40,-40,-40,-40,-40,-40],"OTcommaaccent":[-40,-40,-40,-40,-40,-40,-40,-40],"OV":[-50,-50,-50,-50,-50,-50,-50,-50],"OW":[-50,-50,-30,-30,-50,-50,-50,-35],"OX":[-50,-50,-60,-60,-40,-40,-40,-40],"OY":[-70,-70,-70,-70,-50,-50,-50,-50],"OYacute":[-70,-70,-70,-70,-50,-50,-50,-50],"OYdieresis":[-70,-70,-70,-70,-50,-50,-50,-50],"Ocomma":[-40,-40,-40,-40],"Operiod":[-40,-40,-40,-40],"OacuteA":[-50,-50,-20,-20,-40,-40,-55,-35],"OacuteAacute":[-50,-50,-20,-20,-40,-40,-55,-35],"OacuteAbreve":[-50,-50,-20,-20,-40,-40,-55,-35],"OacuteAcircumflex":[-50,-50,-20,-20,-40,-40,-55,-35],"OacuteAdieresis":[-50,-50,-20,-20,-40,-40,-55,-35],"OacuteAgrave":[-50,-50,-20,-20,-40,-40,-55,-35],"OacuteAmacron":[-50,-50,-20,-20,-40,-40,-55,-35],"OacuteAogonek":[-50,-50,-20,-20,-40,-40,-55,-35],"OacuteAring":[-50,-50,-20,-20,-40,-40,-55,-35],"OacuteAtilde":[-50,-50,-20,-20,-40,-40,-55,-35],"OacuteT":[-40,-40,-40,-40,-40,-40,-40,-40],"OacuteTcaron":[-40,-40,-40,-40,-40,-40,-40,-40],"OacuteTcommaaccent":[-40,-40,-40,-40,-40,-40,-40,-40],"OacuteV":[-50,-50,-50,-50,-50,-50,-50,-50],"OacuteW":[-50,-50,-30,-30,-50,-50,-50,-35],"OacuteX":[-50,-50,-60,-60,-40,-40,-40,-40],"OacuteY":[-70,-70,-70,-70,-50,-50,-50,-50],"OacuteYacute":[-70,-70,-70,-70,-50,-50,-50,-50],"OacuteYdieresis":[-70,-70,-70,-70,-50,-50,-50,-50],"Oacutecomma":[-40,-40,-40,-40],"Oacuteperiod":[-40,-40,-40,-40],"OcircumflexA":[-50,-50,-20,-20,-40,-40,-55,-35],"OcircumflexAacute":[-50,-50,-20,-20,-40,-40,-55,-35],"OcircumflexAbreve":[-50,-50,-20,-20,-40,-40,-55,-35],"OcircumflexAcircumflex":[-50,-50,-20,-20,-40,-40,-55,-35],"OcircumflexAdieresis":[-50,-50,-20,-20,-40,-40,-55,-35],"OcircumflexAgrave":[-50,-50,-20,-20,-40,-40,-55,-35],"OcircumflexAmacron":[-50,-50,-20,-20,-40,-40,-55,-35],"OcircumflexAogonek":[-50,-50,-20,-20,-40,-40,-55,-35],"OcircumflexAring":[-50,-50,-20,-20,-40,-40,-55,-35],"OcircumflexAtilde":[-50,-50,-20,-20,-40,-40,-55,-35],"OcircumflexT":[-40,-40,-40,-40,-40,-40,-40,-40],"OcircumflexTcaron":[-40,-40,-40,-40,-40,-40,-40,-40],"OcircumflexTcommaaccent":[-40,-40,-40,-40,-40,-40,-40,-40],"OcircumflexV":[-50,-50,-50,-50,-50,-50,-50,-50],"OcircumflexW":[-50,-50,-30,-30,-50,-50,-50,-35],"OcircumflexX":[-50,-50,-60,-60,-40,-40,-40,-40],"OcircumflexY":[-70,-70,-70,-70,-50,-50,-50,-50],"OcircumflexYacute":[-70,-70,-70,-70,-50,-50,-50,-50],"OcircumflexYdieresis":[-70,-70,-70,-70,-50,-50,-50,-50],"Ocircumflexcomma":[-40,-40,-40,-40],"Ocircumflexperiod":[-40,-40,-40,-40],"OdieresisA":[-50,-50,-20,-20,-40,-40,-55,-35],"OdieresisAacute":[-50,-50,-20,-20,-40,-40,-55,-35],"OdieresisAbreve":[-50,-50,-20,-20,-40,-40,-55,-35],"OdieresisAcircumflex":[-50,-50,-20,-20,-40,-40,-55,-35],"OdieresisAdieresis":[-50,-50,-20,-20,-40,-40,-55,-35],"OdieresisAgrave":[-50,-50,-20,-20,-40,-40,-55,-35],"OdieresisAmacron":[-50,-50,-20,-20,-40,-40,-55,-35],"OdieresisAogonek":[-50,-50,-20,-20,-40,-40,-55,-35],"OdieresisAring":[-50,-50,-20,-20,-40,-40,-55,-35],"OdieresisAtilde":[-50,-50,-20,-20,-40,-40,-55,-35],"OdieresisT":[-40,-40,-40,-40,-40,-40,-40,-40],"OdieresisTcaron":[-40,-40,-40,-40,-40,-40,-40,-40],"OdieresisTcommaaccent":[-40,-40,-40,-40,-40,-40,-40,-40],"OdieresisV":[-50,-50,-50,-50,-50,-50,-50,-50],"OdieresisW":[-50,-50,-30,-30,-50,-50,-50,-35],"OdieresisX":[-50,-50,-60,-60,-40,-40,-40,-40],"OdieresisY":[-70,-70,-70,-70,-50,-50,-50,-50],"OdieresisYacute":[-70,-70,-70,-70,-50,-50,-50,-50],"OdieresisYdieresis":[-70,-70,-70,-70,-50,-50,-50,-50],"Odieresiscomma":[-40,-40,-40,-40],"Odieresisperiod":[-40,-40,-40,-40],"OgraveA":[-50,-50,-20,-20,-40,-40,-55,-35],"OgraveAacute":[-50,-50,-20,-20,-40,-40,-55,-35],"OgraveAbreve":[-50,-50,-20,-20,-40,-40,-55,-35],"OgraveAcircumflex":[-50,-50,-20,-20,-40,-40,-55,-35],"OgraveAdieresis":[-50,-50,-20,-20,-40,-40,-55,-35],"OgraveAgrave":[-50,-50,-20,-20,-40,-40,-55,-35],"OgraveAmacron":[-50,-50,-20,-20,-40,-40,-55,-35],"OgraveAogonek":[-50,-50,-20,-20,-40,-40,-55,-35],"OgraveAring":[-50,-50,-20,-20,-40,-40,-55,-35],"OgraveAtilde":[-50,-50,-20,-20,-40,-40,-55,-35],"OgraveT":[-40,-40,-40,-40,-40,-40,-40,-40],"OgraveTcaron":[-40,-40,-40,-40,-40,-40,-40,-40],"OgraveTcommaaccent":[-40,-40,-40,-40,-40,-40,-40,-40],"OgraveV":[-50,-50,-50,-50,-50,-50,-50,-50],"OgraveW":[-50,-50,-30,-30,-50,-50,-50,-35],"OgraveX":[-50,-50,-60,-60,-40,-40,-40,-40],"OgraveY":[-70,-70,-70,-70,-50,-50,-50,-50],"OgraveYacute":[-70,-70,-70,-70,-50,-50,-50,-50],"OgraveYdieresis":[-70,-70,-70,-70,-50,-50,-50,-50],"Ogravecomma":[-40,-40,-40,-40],"Ograveperiod":[-40,-40,-40,-40],"OhungarumlautA":[-50,-50,-20,-20,-40,-40,-55,-35],"OhungarumlautAacute":[-50,-50,-20,-20,-40,-40,-55,-35],"OhungarumlautAbreve":[-50,-50,-20,-20,-40,-40,-55,-35],"OhungarumlautAcircumflex":[-50,-50,-20,-20,-40,-40,-55,-35],"OhungarumlautAdieresis":[-50,-50,-20,-20,-40,-40,-55,-35],"OhungarumlautAgrave":[-50,-50,-20,-20,-40,-40,-55,-35],"OhungarumlautAmacron":[-50,-50,-20,-20,-40,-40,-55,-35],"OhungarumlautAogonek":[-50,-50,-20,-20,-40,-40,-55,-35],"OhungarumlautAring":[-50,-50,-20,-20,-40,-40,-55,-35],"OhungarumlautAtilde":[-50,-50,-20,-20,-40,-40,-55,-35],"OhungarumlautT":[-40,-40,-40,-40,-40,-40,-40,-40],"OhungarumlautTcaron":[-40,-40,-40,-40,-40,-40,-40,-40],"OhungarumlautTcommaaccent":[-40,-40,-40,-40,-40,-40,-40,-40],"OhungarumlautV":[-50,-50,-50,-50,-50,-50,-50,-50],"OhungarumlautW":[-50,-50,-30,-30,-50,-50,-50,-35],"OhungarumlautX":[-50,-50,-60,-60,-40,-40,-40,-40],"OhungarumlautY":[-70,-70,-70,-70,-50,-50,-50,-50],"OhungarumlautYacute":[-70,-70,-70,-70,-50,-50,-50,-50],"OhungarumlautYdieresis":[-70,-70,-70,-70,-50,-50,-50,-50],"Ohungarumlautcomma":[-40,-40,-40,-40],"Ohungarumlautperiod":[-40,-40,-40,-40],"OmacronA":[-50,-50,-20,-20,-40,-40,-55,-35],"OmacronAacute":[-50,-50,-20,-20,-40,-40,-55,-35],"OmacronAbreve":[-50,-50,-20,-20,-40,-40,-55,-35],"OmacronAcircumflex":[-50,-50,-20,-20,-40,-40,-55,-35],"OmacronAdieresis":[-50,-50,-20,-20,-40,-40,-55,-35],"OmacronAgrave":[-50,-50,-20,-20,-40,-40,-55,-35],"OmacronAmacron":[-50,-50,-20,-20,-40,-40,-55,-35],"OmacronAogonek":[-50,-50,-20,-20,-40,-40,-55,-35],"OmacronAring":[-50,-50,-20,-20,-40,-40,-55,-35],"OmacronAtilde":[-50,-50,-20,-20,-40,-40,-55,-35],"OmacronT":[-40,-40,-40,-40,-40,-40,-40,-40],"OmacronTcaron":[-40,-40,-40,-40,-40,-40,-40,-40],"OmacronTcommaaccent":[-40,-40,-40,-40,-40,-40,-40,-40],"OmacronV":[-50,-50,-50,-50,-50,-50,-50,-50],"OmacronW":[-50,-50,-30,-30,-50,-50,-50,-35],"OmacronX":[-50,-50,-60,-60,-40,-40,-40,-40],"OmacronY":[-70,-70,-70,-70,-50,-50,-50,-50],"OmacronYacute":[-70,-70,-70,-70,-50,-50,-50,-50],"OmacronYdieresis":[-70,-70,-70,-70,-50,-50,-50,-50],"Omacroncomma":[-40,-40,-40,-40],"Omacronperiod":[-40,-40,-40,-40],"OslashA":[-50,-50,-20,-20,-40,-40,-55,-35],"OslashAacute":[-50,-50,-20,-20,-40,-40,-55,-35],"OslashAbreve":[-50,-50,-20,-20,-40,-40,-55,-35],"OslashAcircumflex":[-50,-50,-20,-20,-40,-40,-55,-35],"OslashAdieresis":[-50,-50,-20,-20,-40,-40,-55,-35],"OslashAgrave":[-50,-50,-20,-20,-40,-40,-55,-35],"OslashAmacron":[-50,-50,-20,-20,-40,-40,-55,-35],"OslashAogonek":[-50,-50,-20,-20,-40,-40,-55,-35],"OslashAring":[-50,-50,-20,-20,-40,-40,-55,-35],"OslashAtilde":[-50,-50,-20,-20,-40,-40,-55,-35],"OslashT":[-40,-40,-40,-40,-40,-40,-40,-40],"OslashTcaron":[-40,-40,-40,-40,-40,-40,-40,-40],"OslashTcommaaccent":[-40,-40,-40,-40,-40,-40,-40,-40],"OslashV":[-50,-50,-50,-50,-50,-50,-50,-50],"OslashW":[-50,-50,-30,-30,-50,-50,-50,-35],"OslashX":[-50,-50,-60,-60,-40,-40,-40,-40],"OslashY":[-70,-70,-70,-70,-50,-50,-50,-50],"OslashYacute":[-70,-70,-70,-70,-50,-50,-50,-50],"OslashYdieresis":[-70,-70,-70,-70,-50,-50,-50,-50],"Oslashcomma":[-40,-40,-40,-40],"Oslashperiod":[-40,-40,-40,-40],"OtildeA":[-50,-50,-20,-20,-40,-40,-55,-35],"OtildeAacute":[-50,-50,-20,-20,-40,-40,-55,-35],"OtildeAbreve":[-50,-50,-20,-20,-40,-40,-55,-35],"OtildeAcircumflex":[-50,-50,-20,-20,-40,-40,-55,-35],"OtildeAdieresis":[-50,-50,-20,-20,-40,-40,-55,-35],"OtildeAgrave":[-50,-50,-20,-20,-40,-40,-55,-35],"OtildeAmacron":[-50,-50,-20,-20,-40,-40,-55,-35],"OtildeAogonek":[-50,-50,-20,-20,-40,-40,-55,-35],"OtildeAring":[-50,-50,-20,-20,-40,-40,-55,-35],"OtildeAtilde":[-50,-50,-20,-20,-40,-40,-55,-35],"OtildeT":[-40,-40,-40,-40,-40,-40,-40,-40],"OtildeTcaron":[-40,-40,-40,-40,-40,-40,-40,-40],"OtildeTcommaaccent":[-40,-40,-40,-40,-40,-40,-40,-40],"OtildeV":[-50,-50,-50,-50,-50,-50,-50,-50],"OtildeW":[-50,-50,-30,-30,-50,-50,-50,-35],"OtildeX":[-50,-50,-60,-60,-40,-40,-40,-40],"OtildeY":[-70,-70,-70,-70,-50,-50,-50,-50],"OtildeYacute":[-70,-70,-70,-70,-50,-50,-50,-50],"OtildeYdieresis":[-70,-70,-70,-70,-50,-50,-50,-50],"Otildecomma":[-40,-40,-40,-40],"Otildeperiod":[-40,-40,-40,-40],"PA":[-100,-100,-120,-120,-74,-85,-90,-92],"PAacute":[-100,-100,-120,-120,-74,-85,-90,-92],"PAbreve":[-100,-100,-120,-120,-74,-85,-90,-92],"PAcircumflex":[-100,-100,-120,-120,-74,-85,-90,-92],"PAdieresis":[-100,-100,-120,-120,-74,-85,-90,-92],"PAgrave":[-100,-100,-120,-120,-74,-85,-90,-92],"PAmacron":[-100,-100,-120,-120,-74,-85,-90,-92],"PAogonek":[-100,-100,-120,-120,-74,-85,-90,-92],"PAring":[-100,-100,-120,-120,-74,-85,-90,-92],"PAtilde":[-100,-100,-120,-120,-74,-85,-90,-92],"Pa":[-30,-30,-40,-40,-10,-40,-80,-15],"Paacute":[-30,-30,-40,-40,-10,-40,-80,-15],"Pabreve":[-30,-30,-40,-40,-10,-40,-80,-15],"Pacircumflex":[-30,-30,-40,-40,-10,-40,-80,-15],"Padieresis":[-30,-30,-40,-40,-10,-40,-80,-15],"Pagrave":[-30,-30,-40,-40,-10,-40,-80,-15],"Pamacron":[-30,-30,-40,-40,-10,-40,-80,-15],"Paogonek":[-30,-30,-40,-40,-10,-40,-80,-15],"Paring":[-30,-30,-40,-40,-10,-40,-80,-15],"Patilde":[-30,-30,-40,-40,-10,-40,-80,-15],"Pcomma":[-120,-120,-180,-180,-92,-129,-135,-111],"Pe":[-30,-30,-50,-50,-20,-50,-80],"Peacute":[-30,-30,-50,-50,-20,-50,-80],"Pecaron":[-30,-30,-50,-50,-20,-50,-80],"Pecircumflex":[-30,-30,-50,-50,-20,-50,-80],"Pedieresis":[-30,-30,-50,-50,-20,-50,-80],"Pedotaccent":[-30,-30,-50,-50,-20,-50,-80],"Pegrave":[-30,-30,-50,-50,-20,-50,-80],"Pemacron":[-30,-30,-50,-50,-20,-50,-80],"Peogonek":[-30,-30,-50,-50,-20,-50,-80],"Po":[-40,-40,-50,-50,-20,-55,-80],"Poacute":[-40,-40,-50,-50,-20,-55,-80],"Pocircumflex":[-40,-40,-50,-50,-20,-55,-80],"Podieresis":[-40,-40,-50,-50,-20,-55,-80],"Pograve":[-40,-40,-50,-50,-20,-55,-80],"Pohungarumlaut":[-40,-40,-50,-50,-20,-55,-80],"Pomacron":[-40,-40,-50,-50,-20,-55,-80],"Poslash":[-40,-40,-50,-50,-20,-55,-80],"Potilde":[-40,-40,-50,-50,-20,-55,-80],"Pperiod":[-120,-120,-180,-180,-110,-129,-135,-111],"QU":[-10,-10,-10,-10,-10,-10,-10,-10],"QUacute":[-10,-10,-10,-10,-10,-10,-10,-10],"QUcircumflex":[-10,-10,-10,-10,-10,-10,-10,-10],"QUdieresis":[-10,-10,-10,-10,-10,-10,-10,-10],"QUgrave":[-10,-10,-10,-10,-10,-10,-10,-10],"QUhungarumlaut":[-10,-10,-10,-10,-10,-10,-10,-10],"QUmacron":[-10,-10,-10,-10,-10,-10,-10,-10],"QUogonek":[-10,-10,-10,-10,-10,-10,-10,-10],"QUring":[-10,-10,-10,-10,-10,-10,-10,-10],"Qcomma":[20,20],"Qperiod":[20,20,0,0,-20],"RO":[-20,-20,-20,-20,-30,-40,-40,-40],"ROacute":[-20,-20,-20,-20,-30,-40,-40,-40],"ROcircumflex":[-20,-20,-20,-20,-30,-40,-40,-40],"ROdieresis":[-20,-20,-20,-20,-30,-40,-40,-40],"ROgrave":[-20,-20,-20,-20,-30,-40,-40,-40],"ROhungarumlaut":[-20,-20,-20,-20,-30,-40,-40,-40],"ROmacron":[-20,-20,-20,-20,-30,-40,-40,-40],"ROslash":[-20,-20,-20,-20,-30,-40,-40,-40],"ROtilde":[-20,-20,-20,-20,-30,-40,-40,-40],"RT":[-20,-20,-30,-30,-40,-30,0,-60],"RTcaron":[-20,-20,-30,-30,-40,-30,0,-60],"RTcommaaccent":[-20,-20,-30,-30,-40,-30,0,-60],"RU":[-20,-20,-40,-40,-30,-40,-40,-40],"RUacute":[-20,-20,-40,-40,-30,-40,-40,-40],"RUcircumflex":[-20,-20,-40,-40,-30,-40,-40,-40],"RUdieresis":[-20,-20,-40,-40,-30,-40,-40,-40],"RUgrave":[-20,-20,-40,-40,-30,-40,-40,-40],"RUhungarumlaut":[-20,-20,-40,-40,-30,-40,-40,-40],"RUmacron":[-20,-20,-40,-40,-30,-40,-40,-40],"RUogonek":[-20,-20,-40,-40,-30,-40,-40,-40],"RUring":[-20,-20,-40,-40,-30,-40,-40,-40],"RV":[-50,-50,-50,-50,-55,-18,-18,-80],"RW":[-40,-40,-30,-30,-35,-18,-18,-55],"RY":[-50,-50,-50,-50,-35,-18,-18,-65],"RYacute":[-50,-50,-50,-50,-35,-18,-18,-65],"RYdieresis":[-50,-50,-50,-50,-35,-18,-18,-65],"RacuteO":[-20,-20,-20,-20,-30,-40,-40,-40],"RacuteOacute":[-20,-20,-20,-20,-30,-40,-40,-40],"RacuteOcircumflex":[-20,-20,-20,-20,-30,-40,-40,-40],"RacuteOdieresis":[-20,-20,-20,-20,-30,-40,-40,-40],"RacuteOgrave":[-20,-20,-20,-20,-30,-40,-40,-40],"RacuteOhungarumlaut":[-20,-20,-20,-20,-30,-40,-40,-40],"RacuteOmacron":[-20,-20,-20,-20,-30,-40,-40,-40],"RacuteOslash":[-20,-20,-20,-20,-30,-40,-40,-40],"RacuteOtilde":[-20,-20,-20,-20,-30,-40,-40,-40],"RacuteT":[-20,-20,-30,-30,-40,-30,0,-60],"RacuteTcaron":[-20,-20,-30,-30,-40,-30,0,-60],"RacuteTcommaaccent":[-20,-20,-30,-30,-40,-30,0,-60],"RacuteU":[-20,-20,-40,-40,-30,-40,-40,-40],"RacuteUacute":[-20,-20,-40,-40,-30,-40,-40,-40],"RacuteUcircumflex":[-20,-20,-40,-40,-30,-40,-40,-40],"RacuteUdieresis":[-20,-20,-40,-40,-30,-40,-40,-40],"RacuteUgrave":[-20,-20,-40,-40,-30,-40,-40,-40],"RacuteUhungarumlaut":[-20,-20,-40,-40,-30,-40,-40,-40],"RacuteUmacron":[-20,-20,-40,-40,-30,-40,-40,-40],"RacuteUogonek":[-20,-20,-40,-40,-30,-40,-40,-40],"RacuteUring":[-20,-20,-40,-40,-30,-40,-40,-40],"RacuteV":[-50,-50,-50,-50,-55,-18,-18,-80],"RacuteW":[-40,-40,-30,-30,-35,-18,-18,-55],"RacuteY":[-50,-50,-50,-50,-35,-18,-18,-65],"RacuteYacute":[-50,-50,-50,-50,-35,-18,-18,-65],"RacuteYdieresis":[-50,-50,-50,-50,-35,-18,-18,-65],"RcaronO":[-20,-20,-20,-20,-30,-40,-40,-40],"RcaronOacute":[-20,-20,-20,-20,-30,-40,-40,-40],"RcaronOcircumflex":[-20,-20,-20,-20,-30,-40,-40,-40],"RcaronOdieresis":[-20,-20,-20,-20,-30,-40,-40,-40],"RcaronOgrave":[-20,-20,-20,-20,-30,-40,-40,-40],"RcaronOhungarumlaut":[-20,-20,-20,-20,-30,-40,-40,-40],"RcaronOmacron":[-20,-20,-20,-20,-30,-40,-40,-40],"RcaronOslash":[-20,-20,-20,-20,-30,-40,-40,-40],"RcaronOtilde":[-20,-20,-20,-20,-30,-40,-40,-40],"RcaronT":[-20,-20,-30,-30,-40,-30,0,-60],"RcaronTcaron":[-20,-20,-30,-30,-40,-30,0,-60],"RcaronTcommaaccent":[-20,-20,-30,-30,-40,-30,0,-60],"RcaronU":[-20,-20,-40,-40,-30,-40,-40,-40],"RcaronUacute":[-20,-20,-40,-40,-30,-40,-40,-40],"RcaronUcircumflex":[-20,-20,-40,-40,-30,-40,-40,-40],"RcaronUdieresis":[-20,-20,-40,-40,-30,-40,-40,-40],"RcaronUgrave":[-20,-20,-40,-40,-30,-40,-40,-40],"RcaronUhungarumlaut":[-20,-20,-40,-40,-30,-40,-40,-40],"RcaronUmacron":[-20,-20,-40,-40,-30,-40,-40,-40],"RcaronUogonek":[-20,-20,-40,-40,-30,-40,-40,-40],"RcaronUring":[-20,-20,-40,-40,-30,-40,-40,-40],"RcaronV":[-50,-50,-50,-50,-55,-18,-18,-80],"RcaronW":[-40,-40,-30,-30,-35,-18,-18,-55],"RcaronY":[-50,-50,-50,-50,-35,-18,-18,-65],"RcaronYacute":[-50,-50,-50,-50,-35,-18,-18,-65],"RcaronYdieresis":[-50,-50,-50,-50,-35,-18,-18,-65],"RcommaaccentO":[-20,-20,-20,-20,-30,-40,-40,-40],"RcommaaccentOacute":[-20,-20,-20,-20,-30,-40,-40,-40],"RcommaaccentOcircumflex":[-20,-20,-20,-20,-30,-40,-40,-40],"RcommaaccentOdieresis":[-20,-20,-20,-20,-30,-40,-40,-40],"RcommaaccentOgrave":[-20,-20,-20,-20,-30,-40,-40,-40],"RcommaaccentOhungarumlaut":[-20,-20,-20,-20,-30,-40,-40,-40],"RcommaaccentOmacron":[-20,-20,-20,-20,-30,-40,-40,-40],"RcommaaccentOslash":[-20,-20,-20,-20,-30,-40,-40,-40],"RcommaaccentOtilde":[-20,-20,-20,-20,-30,-40,-40,-40],"RcommaaccentT":[-20,-20,-30,-30,-40,-30,0,-60],"RcommaaccentTcaron":[-20,-20,-30,-30,-40,-30,0,-60],"RcommaaccentTcommaaccent":[-20,-20,-30,-30,-40,-30,0,-60],"RcommaaccentU":[-20,-20,-40,-40,-30,-40,-40,-40],"RcommaaccentUacute":[-20,-20,-40,-40,-30,-40,-40,-40],"RcommaaccentUcircumflex":[-20,-20,-40,-40,-30,-40,-40,-40],"RcommaaccentUdieresis":[-20,-20,-40,-40,-30,-40,-40,-40],"RcommaaccentUgrave":[-20,-20,-40,-40,-30,-40,-40,-40],"RcommaaccentUhungarumlaut":[-20,-20,-40,-40,-30,-40,-40,-40],"RcommaaccentUmacron":[-20,-20,-40,-40,-30,-40,-40,-40],"RcommaaccentUogonek":[-20,-20,-40,-40,-30,-40,-40,-40],"RcommaaccentUring":[-20,-20,-40,-40,-30,-40,-40,-40],"RcommaaccentV":[-50,-50,-50,-50,-55,-18,-18,-80],"RcommaaccentW":[-40,-40,-30,-30,-35,-18,-18,-55],"RcommaaccentY":[-50,-50,-50,-50,-35,-18,-18,-65],"RcommaaccentYacute":[-50,-50,-50,-50,-35,-18,-18,-65],"RcommaaccentYdieresis":[-50,-50,-50,-50,-35,-18,-18,-65],"TA":[-90,-90,-120,-120,-90,-55,-50,-93],"TAacute":[-90,-90,-120,-120,-90,-55,-50,-93],"TAbreve":[-90,-90,-120,-120,-90,-55,-50,-93],"TAcircumflex":[-90,-90,-120,-120,-90,-55,-50,-93],"TAdieresis":[-90,-90,-120,-120,-90,-55,-50,-93],"TAgrave":[-90,-90,-120,-120,-90,-55,-50,-93],"TAmacron":[-90,-90,-120,-120,-90,-55,-50,-93],"TAogonek":[-90,-90,-120,-120,-90,-55,-50,-93],"TAring":[-90,-90,-120,-120,-90,-55,-50,-93],"TAtilde":[-90,-90,-120,-120,-90,-55,-50,-93],"TO":[-40,-40,-40,-40,-18,-18,-18,-18],"TOacute":[-40,-40,-40,-40,-18,-18,-18,-18],"TOcircumflex":[-40,-40,-40,-40,-18,-18,-18,-18],"TOdieresis":[-40,-40,-40,-40,-18,-18,-18,-18],"TOgrave":[-40,-40,-40,-40,-18,-18,-18,-18],"TOhungarumlaut":[-40,-40,-40,-40,-18,-18,-18,-18],"TOmacron":[-40,-40,-40,-40,-18,-18,-18,-18],"TOslash":[-40,-40,-40,-40,-18,-18,-18,-18],"TOtilde":[-40,-40,-40,-40,-18,-18,-18,-18],"Ta":[-80,-80,-120,-120,-92,-92,-92,-80],"Taacute":[-80,-80,-120,-120,-92,-92,-92,-80],"Tabreve":[-80,-80,-60,-60,-52,-92,-92,-80],"Tacircumflex":[-80,-80,-120,-120,-52,-92,-92,-80],"Tadieresis":[-80,-80,-120,-120,-52,-92,-92,-40],"Tagrave":[-80,-80,-120,-120,-52,-92,-92,-40],"Tamacron":[-80,-80,-60,-60,-52,-92,-92,-40],"Taogonek":[-80,-80,-120,-120,-92,-92,-92,-80],"Taring":[-80,-80,-120,-120,-92,-92,-92,-80],"Tatilde":[-80,-80,-60,-60,-52,-92,-92,-40],"Tcolon":[-40,-40,-20,-20,-74,-74,-55,-50],"Tcomma":[-80,-80,-120,-120,-74,-92,-74,-74],"Te":[-60,-60,-120,-120,-92,-92,-92,-70],"Teacute":[-60,-60,-120,-120,-92,-92,-92,-70],"Tecaron":[-60,-60,-120,-120,-92,-92,-92,-70],"Tecircumflex":[-60,-60,-120,-120,-92,-92,-52,-70],"Tedieresis":[-60,-60,-120,-120,-52,-52,-52,-30],"Tedotaccent":[-60,-60,-120,-120,-92,-92,-92,-70],"Tegrave":[-60,-60,-60,-60,-52,-52,-52,-70],"Temacron":[-60,-60,-60,-60,-52,-52,-52,-30],"Teogonek":[-60,-60,-120,-120,-92,-92,-92,-70],"Thyphen":[-120,-120,-140,-140,-92,-92,-74,-92],"To":[-80,-80,-120,-120,-92,-95,-92,-80],"Toacute":[-80,-80,-120,-120,-92,-95,-92,-80],"Tocircumflex":[-80,-80,-120,-120,-92,-95,-92,-80],"Todieresis":[-80,-80,-120,-120,-92,-95,-92,-80],"Tograve":[-80,-80,-120,-120,-92,-95,-92,-80],"Tohungarumlaut":[-80,-80,-120,-120,-92,-95,-92,-80],"Tomacron":[-80,-80,-60,-60,-92,-95,-92,-80],"Toslash":[-80,-80,-120,-120,-92,-95,-92,-80],"Totilde":[-80,-80,-60,-60,-92,-95,-92,-80],"Tperiod":[-80,-80,-120,-120,-90,-92,-74,-74],"Tr":[-80,-80,-120,-120,-74,-37,-55,-35],"Tracute":[-80,-80,-120,-120,-74,-37,-55,-35],"Trcommaaccent":[-80,-80,-120,-120,-74,-37,-55,-35],"Tsemicolon":[-40,-40,-20,-20,-74,-74,-65,-55],"Tu":[-90,-90,-120,-120,-92,-37,-55,-45],"Tuacute":[-90,-90,-120,-120,-92,-37,-55,-45],"Tucircumflex":[-90,-90,-120,-120,-92,-37,-55,-45],"Tudieresis":[-90,-90,-120,-120,-92,-37,-55,-45],"Tugrave":[-90,-90,-120,-120,-92,-37,-55,-45],"Tuhungarumlaut":[-90,-90,-120,-120,-92,-37,-55,-45],"Tumacron":[-90,-90,-60,-60,-92,-37,-55,-45],"Tuogonek":[-90,-90,-120,-120,-92,-37,-55,-45],"Turing":[-90,-90,-120,-120,-92,-37,-55,-45],"Tw":[-60,-60,-120,-120,-74,-37,-74,-80],"Ty":[-60,-60,-120,-120,-34,-37,-74,-80],"Tyacute":[-60,-60,-120,-120,-34,-37,-74,-80],"Tydieresis":[-60,-60,-60,-60,-34,-37,-34,-80],"TcaronA":[-90,-90,-120,-120,-90,-55,-50,-93],"TcaronAacute":[-90,-90,-120,-120,-90,-55,-50,-93],"TcaronAbreve":[-90,-90,-120,-120,-90,-55,-50,-93],"TcaronAcircumflex":[-90,-90,-120,-120,-90,-55,-50,-93],"TcaronAdieresis":[-90,-90,-120,-120,-90,-55,-50,-93],"TcaronAgrave":[-90,-90,-120,-120,-90,-55,-50,-93],"TcaronAmacron":[-90,-90,-120,-120,-90,-55,-50,-93],"TcaronAogonek":[-90,-90,-120,-120,-90,-55,-50,-93],"TcaronAring":[-90,-90,-120,-120,-90,-55,-50,-93],"TcaronAtilde":[-90,-90,-120,-120,-90,-55,-50,-93],"TcaronO":[-40,-40,-40,-40,-18,-18,-18,-18],"TcaronOacute":[-40,-40,-40,-40,-18,-18,-18,-18],"TcaronOcircumflex":[-40,-40,-40,-40,-18,-18,-18,-18],"TcaronOdieresis":[-40,-40,-40,-40,-18,-18,-18,-18],"TcaronOgrave":[-40,-40,-40,-40,-18,-18,-18,-18],"TcaronOhungarumlaut":[-40,-40,-40,-40,-18,-18,-18,-18],"TcaronOmacron":[-40,-40,-40,-40,-18,-18,-18,-18],"TcaronOslash":[-40,-40,-40,-40,-18,-18,-18,-18],"TcaronOtilde":[-40,-40,-40,-40,-18,-18,-18,-18],"Tcarona":[-80,-80,-120,-120,-92,-92,-92,-80],"Tcaronaacute":[-80,-80,-120,-120,-92,-92,-92,-80],"Tcaronabreve":[-80,-80,-60,-60,-52,-92,-92,-80],"Tcaronacircumflex":[-80,-80,-120,-120,-52,-92,-92,-80],"Tcaronadieresis":[-80,-80,-120,-120,-52,-92,-92,-40],"Tcaronagrave":[-80,-80,-120,-120,-52,-92,-92,-40],"Tcaronamacron":[-80,-80,-60,-60,-52,-92,-92,-40],"Tcaronaogonek":[-80,-80,-120,-120,-92,-92,-92,-80],"Tcaronaring":[-80,-80,-120,-120,-92,-92,-92,-80],"Tcaronatilde":[-80,-80,-60,-60,-52,-92,-92,-40],"Tcaroncolon":[-40,-40,-20,-20,-74,-74,-55,-50],"Tcaroncomma":[-80,-80,-120,-120,-74,-92,-74,-74],"Tcarone":[-60,-60,-120,-120,-92,-92,-92,-70],"Tcaroneacute":[-60,-60,-120,-120,-92,-92,-92,-70],"Tcaronecaron":[-60,-60,-120,-120,-92,-92,-92,-70],"Tcaronecircumflex":[-60,-60,-120,-120,-92,-92,-52,-30],"Tcaronedieresis":[-60,-60,-120,-120,-52,-52,-52,-30],"Tcaronedotaccent":[-60,-60,-120,-120,-92,-92,-92,-70],"Tcaronegrave":[-60,-60,-60,-60,-52,-52,-52,-70],"Tcaronemacron":[-60,-60,-60,-60,-52,-52,-52,-30],"Tcaroneogonek":[-60,-60,-120,-120,-92,-92,-92,-70],"Tcaronhyphen":[-120,-120,-140,-140,-92,-92,-74,-92],"Tcarono":[-80,-80,-120,-120,-92,-95,-92,-80],"Tcaronoacute":[-80,-80,-120,-120,-92,-95,-92,-80],"Tcaronocircumflex":[-80,-80,-120,-120,-92,-95,-92,-80],"Tcaronodieresis":[-80,-80,-120,-120,-92,-95,-92,-80],"Tcaronograve":[-80,-80,-120,-120,-92,-95,-92,-80],"Tcaronohungarumlaut":[-80,-80,-120,-120,-92,-95,-92,-80],"Tcaronomacron":[-80,-80,-60,-60,-92,-95,-92,-80],"Tcaronoslash":[-80,-80,-120,-120,-92,-95,-92,-80],"Tcaronotilde":[-80,-80,-60,-60,-92,-95,-92,-80],"Tcaronperiod":[-80,-80,-120,-120,-90,-92,-74,-74],"Tcaronr":[-80,-80,-120,-120,-74,-37,-55,-35],"Tcaronracute":[-80,-80,-120,-120,-74,-37,-55,-35],"Tcaronrcommaaccent":[-80,-80,-120,-120,-74,-37,-55,-35],"Tcaronsemicolon":[-40,-40,-20,-20,-74,-74,-65,-55],"Tcaronu":[-90,-90,-120,-120,-92,-37,-55,-45],"Tcaronuacute":[-90,-90,-120,-120,-92,-37,-55,-45],"Tcaronucircumflex":[-90,-90,-120,-120,-92,-37,-55,-45],"Tcaronudieresis":[-90,-90,-120,-120,-92,-37,-55,-45],"Tcaronugrave":[-90,-90,-120,-120,-92,-37,-55,-45],"Tcaronuhungarumlaut":[-90,-90,-120,-120,-92,-37,-55,-45],"Tcaronumacron":[-90,-90,-60,-60,-92,-37,-55,-45],"Tcaronuogonek":[-90,-90,-120,-120,-92,-37,-55,-45],"Tcaronuring":[-90,-90,-120,-120,-92,-37,-55,-45],"Tcaronw":[-60,-60,-120,-120,-74,-37,-74,-80],"Tcarony":[-60,-60,-120,-120,-34,-37,-74,-80],"Tcaronyacute":[-60,-60,-120,-120,-34,-37,-74,-80],"Tcaronydieresis":[-60,-60,-60,-60,-34,-37,-34,-80],"TcommaaccentA":[-90,-90,-120,-120,-90,-55,-50,-93],"TcommaaccentAacute":[-90,-90,-120,-120,-90,-55,-50,-93],"TcommaaccentAbreve":[-90,-90,-120,-120,-90,-55,-50,-93],"TcommaaccentAcircumflex":[-90,-90,-120,-120,-90,-55,-50,-93],"TcommaaccentAdieresis":[-90,-90,-120,-120,-90,-55,-50,-93],"TcommaaccentAgrave":[-90,-90,-120,-120,-90,-55,-50,-93],"TcommaaccentAmacron":[-90,-90,-120,-120,-90,-55,-50,-93],"TcommaaccentAogonek":[-90,-90,-120,-120,-90,-55,-50,-93],"TcommaaccentAring":[-90,-90,-120,-120,-90,-55,-50,-93],"TcommaaccentAtilde":[-90,-90,-120,-120,-90,-55,-50,-93],"TcommaaccentO":[-40,-40,-40,-40,-18,-18,-18,-18],"TcommaaccentOacute":[-40,-40,-40,-40,-18,-18,-18,-18],"TcommaaccentOcircumflex":[-40,-40,-40,-40,-18,-18,-18,-18],"TcommaaccentOdieresis":[-40,-40,-40,-40,-18,-18,-18,-18],"TcommaaccentOgrave":[-40,-40,-40,-40,-18,-18,-18,-18],"TcommaaccentOhungarumlaut":[-40,-40,-40,-40,-18,-18,-18,-18],"TcommaaccentOmacron":[-40,-40,-40,-40,-18,-18,-18,-18],"TcommaaccentOslash":[-40,-40,-40,-40,-18,-18,-18,-18],"TcommaaccentOtilde":[-40,-40,-40,-40,-18,-18,-18,-18],"Tcommaaccenta":[-80,-80,-120,-120,-92,-92,-92,-80],"Tcommaaccentaacute":[-80,-80,-120,-120,-92,-92,-92,-80],"Tcommaaccentabreve":[-80,-80,-60,-60,-52,-92,-92,-80],"Tcommaaccentacircumflex":[-80,-80,-120,-120,-52,-92,-92,-80],"Tcommaaccentadieresis":[-80,-80,-120,-120,-52,-92,-92,-40],"Tcommaaccentagrave":[-80,-80,-120,-120,-52,-92,-92,-40],"Tcommaaccentamacron":[-80,-80,-60,-60,-52,-92,-92,-40],"Tcommaaccentaogonek":[-80,-80,-120,-120,-92,-92,-92,-80],"Tcommaaccentaring":[-80,-80,-120,-120,-92,-92,-92,-80],"Tcommaaccentatilde":[-80,-80,-60,-60,-52,-92,-92,-40],"Tcommaaccentcolon":[-40,-40,-20,-20,-74,-74,-55,-50],"Tcommaaccentcomma":[-80,-80,-120,-120,-74,-92,-74,-74],"Tcommaaccente":[-60,-60,-120,-120,-92,-92,-92,-70],"Tcommaaccenteacute":[-60,-60,-120,-120,-92,-92,-92,-70],"Tcommaaccentecaron":[-60,-60,-120,-120,-92,-92,-92,-70],"Tcommaaccentecircumflex":[-60,-60,-120,-120,-92,-92,-52,-30],"Tcommaaccentedieresis":[-60,-60,-120,-120,-52,-52,-52,-30],"Tcommaaccentedotaccent":[-60,-60,-120,-120,-92,-92,-92,-70],"Tcommaaccentegrave":[-60,-60,-60,-60,-52,-52,-52,-30],"Tcommaaccentemacron":[-60,-60,-60,-60,-52,-52,-52,-70],"Tcommaaccenteogonek":[-60,-60,-120,-120,-92,-92,-92,-70],"Tcommaaccenthyphen":[-120,-120,-140,-140,-92,-92,-74,-92],"Tcommaaccento":[-80,-80,-120,-120,-92,-95,-92,-80],"Tcommaaccentoacute":[-80,-80,-120,-120,-92,-95,-92,-80],"Tcommaaccentocircumflex":[-80,-80,-120,-120,-92,-95,-92,-80],"Tcommaaccentodieresis":[-80,-80,-120,-120,-92,-95,-92,-80],"Tcommaaccentograve":[-80,-80,-120,-120,-92,-95,-92,-80],"Tcommaaccentohungarumlaut":[-80,-80,-120,-120,-92,-95,-92,-80],"Tcommaaccentomacron":[-80,-80,-60,-60,-92,-95,-92,-80],"Tcommaaccentoslash":[-80,-80,-120,-120,-92,-95,-92,-80],"Tcommaaccentotilde":[-80,-80,-60,-60,-92,-95,-92,-80],"Tcommaaccentperiod":[-80,-80,-120,-120,-90,-92,-74,-74],"Tcommaaccentr":[-80,-80,-120,-120,-74,-37,-55,-35],"Tcommaaccentracute":[-80,-80,-120,-120,-74,-37,-55,-35],"Tcommaaccentrcommaaccent":[-80,-80,-120,-120,-74,-37,-55,-35],"Tcommaaccentsemicolon":[-40,-40,-20,-20,-74,-74,-65,-55],"Tcommaaccentu":[-90,-90,-120,-120,-92,-37,-55,-45],"Tcommaaccentuacute":[-90,-90,-120,-120,-92,-37,-55,-45],"Tcommaaccentucircumflex":[-90,-90,-120,-120,-92,-37,-55,-45],"Tcommaaccentudieresis":[-90,-90,-120,-120,-92,-37,-55,-45],"Tcommaaccentugrave":[-90,-90,-120,-120,-92,-37,-55,-45],"Tcommaaccentuhungarumlaut":[-90,-90,-120,-120,-92,-37,-55,-45],"Tcommaaccentumacron":[-90,-90,-60,-60,-92,-37,-55,-45],"Tcommaaccentuogonek":[-90,-90,-120,-120,-92,-37,-55,-45],"Tcommaaccenturing":[-90,-90,-120,-120,-92,-37,-55,-45],"Tcommaaccentw":[-60,-60,-120,-120,-74,-37,-74,-80],"Tcommaaccenty":[-60,-60,-120,-120,-34,-37,-74,-80],"Tcommaaccentyacute":[-60,-60,-120,-120,-34,-37,-74,-80],"Tcommaaccentydieresis":[-60,-60,-60,-60,-34,-37,-34,-80],"UA":[-50,-50,-40,-40,-60,-45,-40,-40],"UAacute":[-50,-50,-40,-40,-60,-45,-40,-40],"UAbreve":[-50,-50,-40,-40,-60,-45,-40,-40],"UAcircumflex":[-50,-50,-40,-40,-60,-45,-40,-40],"UAdieresis":[-50,-50,-40,-40,-60,-45,-40,-40],"UAgrave":[-50,-50,-40,-40,-60,-45,-40,-40],"UAmacron":[-50,-50,-40,-40,-60,-45,-40,-40],"UAogonek":[-50,-50,-40,-40,-60,-45,-40,-40],"UAring":[-50,-50,-40,-40,-60,-45,-40,-40],"UAtilde":[-50,-50,-40,-40,-60,-45,-40,-40],"Ucomma":[-30,-30,-40,-40,-50,0,-25],"Uperiod":[-30,-30,-40,-40,-50,0,-25],"UacuteA":[-50,-50,-40,-40,-60,-45,-40,-40],"UacuteAacute":[-50,-50,-40,-40,-60,-45,-40,-40],"UacuteAbreve":[-50,-50,-40,-40,-60,-45,-40,-40],"UacuteAcircumflex":[-50,-50,-40,-40,-60,-45,-40,-40],"UacuteAdieresis":[-50,-50,-40,-40,-60,-45,-40,-40],"UacuteAgrave":[-50,-50,-40,-40,-60,-45,-40,-40],"UacuteAmacron":[-50,-50,-40,-40,-60,-45,-40,-40],"UacuteAogonek":[-50,-50,-40,-40,-60,-45,-40,-40],"UacuteAring":[-50,-50,-40,-40,-60,-45,-40,-40],"UacuteAtilde":[-50,-50,-40,-40,-60,-45,-40,-40],"Uacutecomma":[-30,-30,-40,-40,-50,0,-25],"Uacuteperiod":[-30,-30,-40,-40,-50,0,-25],"UcircumflexA":[-50,-50,-40,-40,-60,-45,-40,-40],"UcircumflexAacute":[-50,-50,-40,-40,-60,-45,-40,-40],"UcircumflexAbreve":[-50,-50,-40,-40,-60,-45,-40,-40],"UcircumflexAcircumflex":[-50,-50,-40,-40,-60,-45,-40,-40],"UcircumflexAdieresis":[-50,-50,-40,-40,-60,-45,-40,-40],"UcircumflexAgrave":[-50,-50,-40,-40,-60,-45,-40,-40],"UcircumflexAmacron":[-50,-50,-40,-40,-60,-45,-40,-40],"UcircumflexAogonek":[-50,-50,-40,-40,-60,-45,-40,-40],"UcircumflexAring":[-50,-50,-40,-40,-60,-45,-40,-40],"UcircumflexAtilde":[-50,-50,-40,-40,-60,-45,-40,-40],"Ucircumflexcomma":[-30,-30,-40,-40,-50,0,-25],"Ucircumflexperiod":[-30,-30,-40,-40,-50,0,-25],"UdieresisA":[-50,-50,-40,-40,-60,-45,-40,-40],"UdieresisAacute":[-50,-50,-40,-40,-60,-45,-40,-40],"UdieresisAbreve":[-50,-50,-40,-40,-60,-45,-40,-40],"UdieresisAcircumflex":[-50,-50,-40,-40,-60,-45,-40,-40],"UdieresisAdieresis":[-50,-50,-40,-40,-60,-45,-40,-40],"UdieresisAgrave":[-50,-50,-40,-40,-60,-45,-40,-40],"UdieresisAmacron":[-50,-50,-40,-40,-60,-45,-40,-40],"UdieresisAogonek":[-50,-50,-40,-40,-60,-45,-40,-40],"UdieresisAring":[-50,-50,-40,-40,-60,-45,-40,-40],"UdieresisAtilde":[-50,-50,-40,-40,-60,-45,-40,-40],"Udieresiscomma":[-30,-30,-40,-40,-50,0,-25],"Udieresisperiod":[-30,-30,-40,-40,-50,0,-25],"UgraveA":[-50,-50,-40,-40,-60,-45,-40,-40],"UgraveAacute":[-50,-50,-40,-40,-60,-45,-40,-40],"UgraveAbreve":[-50,-50,-40,-40,-60,-45,-40,-40],"UgraveAcircumflex":[-50,-50,-40,-40,-60,-45,-40,-40],"UgraveAdieresis":[-50,-50,-40,-40,-60,-45,-40,-40],"UgraveAgrave":[-50,-50,-40,-40,-60,-45,-40,-40],"UgraveAmacron":[-50,-50,-40,-40,-60,-45,-40,-40],"UgraveAogonek":[-50,-50,-40,-40,-60,-45,-40,-40],"UgraveAring":[-50,-50,-40,-40,-60,-45,-40,-40],"UgraveAtilde":[-50,-50,-40,-40,-60,-45,-40,-40],"Ugravecomma":[-30,-30,-40,-40,-50,0,-25],"Ugraveperiod":[-30,-30,-40,-40,-50,0,-25],"UhungarumlautA":[-50,-50,-40,-40,-60,-45,-40,-40],"UhungarumlautAacute":[-50,-50,-40,-40,-60,-45,-40,-40],"UhungarumlautAbreve":[-50,-50,-40,-40,-60,-45,-40,-40],"UhungarumlautAcircumflex":[-50,-50,-40,-40,-60,-45,-40,-40],"UhungarumlautAdieresis":[-50,-50,-40,-40,-60,-45,-40,-40],"UhungarumlautAgrave":[-50,-50,-40,-40,-60,-45,-40,-40],"UhungarumlautAmacron":[-50,-50,-40,-40,-60,-45,-40,-40],"UhungarumlautAogonek":[-50,-50,-40,-40,-60,-45,-40,-40],"UhungarumlautAring":[-50,-50,-40,-40,-60,-45,-40,-40],"UhungarumlautAtilde":[-50,-50,-40,-40,-60,-45,-40,-40],"Uhungarumlautcomma":[-30,-30,-40,-40,-50,0,-25],"Uhungarumlautperiod":[-30,-30,-40,-40,-50,0,-25],"UmacronA":[-50,-50,-40,-40,-60,-45,-40,-40],"UmacronAacute":[-50,-50,-40,-40,-60,-45,-40,-40],"UmacronAbreve":[-50,-50,-40,-40,-60,-45,-40,-40],"UmacronAcircumflex":[-50,-50,-40,-40,-60,-45,-40,-40],"UmacronAdieresis":[-50,-50,-40,-40,-60,-45,-40,-40],"UmacronAgrave":[-50,-50,-40,-40,-60,-45,-40,-40],"UmacronAmacron":[-50,-50,-40,-40,-60,-45,-40,-40],"UmacronAogonek":[-50,-50,-40,-40,-60,-45,-40,-40],"UmacronAring":[-50,-50,-40,-40,-60,-45,-40,-40],"UmacronAtilde":[-50,-50,-40,-40,-60,-45,-40,-40],"Umacroncomma":[-30,-30,-40,-40,-50,0,-25],"Umacronperiod":[-30,-30,-40,-40,-50,0,-25],"UogonekA":[-50,-50,-40,-40,-60,-45,-40,-40],"UogonekAacute":[-50,-50,-40,-40,-60,-45,-40,-40],"UogonekAbreve":[-50,-50,-40,-40,-60,-45,-40,-40],"UogonekAcircumflex":[-50,-50,-40,-40,-60,-45,-40,-40],"UogonekAdieresis":[-50,-50,-40,-40,-60,-45,-40,-40],"UogonekAgrave":[-50,-50,-40,-40,-60,-45,-40,-40],"UogonekAmacron":[-50,-50,-40,-40,-60,-45,-40,-40],"UogonekAogonek":[-50,-50,-40,-40,-60,-45,-40,-40],"UogonekAring":[-50,-50,-40,-40,-60,-45,-40,-40],"UogonekAtilde":[-50,-50,-40,-40,-60,-45,-40,-40],"Uogonekcomma":[-30,-30,-40,-40,-50,0,-25],"Uogonekperiod":[-30,-30,-40,-40,-50,0,-25],"UringA":[-50,-50,-40,-40,-60,-45,-40,-40],"UringAacute":[-50,-50,-40,-40,-60,-45,-40,-40],"UringAbreve":[-50,-50,-40,-40,-60,-45,-40,-40],"UringAcircumflex":[-50,-50,-40,-40,-60,-45,-40,-40],"UringAdieresis":[-50,-50,-40,-40,-60,-45,-40,-40],"UringAgrave":[-50,-50,-40,-40,-60,-45,-40,-40],"UringAmacron":[-50,-50,-40,-40,-60,-45,-40,-40],"UringAogonek":[-50,-50,-40,-40,-60,-45,-40,-40],"UringAring":[-50,-50,-40,-40,-60,-45,-40,-40],"UringAtilde":[-50,-50,-40,-40,-60,-45,-40,-40],"Uringcomma":[-30,-30,-40,-40,-50,0,-25],"Uringperiod":[-30,-30,-40,-40,-50,0,-25],"VA":[-80,-80,-80,-80,-135,-85,-60,-135],"VAacute":[-80,-80,-80,-80,-135,-85,-60,-135],"VAbreve":[-80,-80,-80,-80,-135,-85,-60,-135],"VAcircumflex":[-80,-80,-80,-80,-135,-85,-60,-135],"VAdieresis":[-80,-80,-80,-80,-135,-85,-60,-135],"VAgrave":[-80,-80,-80,-80,-135,-85,-60,-135],"VAmacron":[-80,-80,-80,-80,-135,-85,-60,-135],"VAogonek":[-80,-80,-80,-80,-135,-85,-60,-135],"VAring":[-80,-80,-80,-80,-135,-85,-60,-135],"VAtilde":[-80,-80,-80,-80,-135,-85,-60,-135],"VG":[-50,-50,-40,-40,-30,-10,0,-15],"VGbreve":[-50,-50,-40,-40,-30,-10,0,-15],"VGcommaaccent":[-50,-50,-40,-40,-30,-10,0,-15],"VO":[-50,-50,-40,-40,-45,-30,-30,-40],"VOacute":[-50,-50,-40,-40,-45,-30,-30,-40],"VOcircumflex":[-50,-50,-40,-40,-45,-30,-30,-40],"VOdieresis":[-50,-50,-40,-40,-45,-30,-30,-40],"VOgrave":[-50,-50,-40,-40,-45,-30,-30,-40],"VOhungarumlaut":[-50,-50,-40,-40,-45,-30,-30,-40],"VOmacron":[-50,-50,-40,-40,-45,-30,-30,-40],"VOslash":[-50,-50,-40,-40,-45,-30,-30,-40],"VOtilde":[-50,-50,-40,-40,-45,-30,-30,-40],"Va":[-60,-60,-70,-70,-92,-111,-111,-111],"Vaacute":[-60,-60,-70,-70,-92,-111,-111,-111],"Vabreve":[-60,-60,-70,-70,-92,-111,-111,-111],"Vacircumflex":[-60,-60,-70,-70,-92,-111,-111,-71],"Vadieresis":[-60,-60,-70,-70,-92,-111,-111,-71],"Vagrave":[-60,-60,-70,-70,-92,-111,-111,-71],"Vamacron":[-60,-60,-70,-70,-92,-111,-111,-71],"Vaogonek":[-60,-60,-70,-70,-92,-111,-111,-111],"Varing":[-60,-60,-70,-70,-92,-111,-111,-111],"Vatilde":[-60,-60,-70,-70,-92,-111,-111,-71],"Vcolon":[-40,-40,-40,-40,-92,-74,-65,-74],"Vcomma":[-120,-120,-125,-125,-129,-129,-129,-129],"Ve":[-50,-50,-80,-80,-100,-111,-111,-111],"Veacute":[-50,-50,-80,-80,-100,-111,-111,-111],"Vecaron":[-50,-50,-80,-80,-100,-111,-111,-71],"Vecircumflex":[-50,-50,-80,-80,-100,-111,-111,-71],"Vedieresis":[-50,-50,-80,-80,-100,-71,-71,-71],"Vedotaccent":[-50,-50,-80,-80,-100,-111,-111,-111],"Vegrave":[-50,-50,-80,-80,-100,-71,-71,-71],"Vemacron":[-50,-50,-80,-80,-100,-71,-71,-71],"Veogonek":[-50,-50,-80,-80,-100,-111,-111,-111],"Vhyphen":[-80,-80,-80,-80,-74,-70,-55,-100],"Vo":[-90,-90,-80,-80,-100,-111,-111,-129],"Voacute":[-90,-90,-80,-80,-100,-111,-111,-129],"Vocircumflex":[-90,-90,-80,-80,-100,-111,-111,-129],"Vodieresis":[-90,-90,-80,-80,-100,-111,-111,-89],"Vograve":[-90,-90,-80,-80,-100,-111,-111,-89],"Vohungarumlaut":[-90,-90,-80,-80,-100,-111,-111,-129],"Vomacron":[-90,-90,-80,-80,-100,-111,-111,-89],"Voslash":[-90,-90,-80,-80,-100,-111,-111,-129],"Votilde":[-90,-90,-80,-80,-100,-111,-111,-89],"Vperiod":[-120,-120,-125,-125,-145,-129,-129,-129],"Vsemicolon":[-40,-40,-40,-40,-92,-74,-74,-74],"Vu":[-60,-60,-70,-70,-92,-55,-74,-75],"Vuacute":[-60,-60,-70,-70,-92,-55,-74,-75],"Vucircumflex":[-60,-60,-70,-70,-92,-55,-74,-75],"Vudieresis":[-60,-60,-70,-70,-92,-55,-74,-75],"Vugrave":[-60,-60,-70,-70,-92,-55,-74,-75],"Vuhungarumlaut":[-60,-60,-70,-70,-92,-55,-74,-75],"Vumacron":[-60,-60,-70,-70,-92,-55,-74,-75],"Vuogonek":[-60,-60,-70,-70,-92,-55,-74,-75],"Vuring":[-60,-60,-70,-70,-92,-55,-74,-75],"WA":[-60,-60,-50,-50,-120,-74,-60,-120],"WAacute":[-60,-60,-50,-50,-120,-74,-60,-120],"WAbreve":[-60,-60,-50,-50,-120,-74,-60,-120],"WAcircumflex":[-60,-60,-50,-50,-120,-74,-60,-120],"WAdieresis":[-60,-60,-50,-50,-120,-74,-60,-120],"WAgrave":[-60,-60,-50,-50,-120,-74,-60,-120],"WAmacron":[-60,-60,-50,-50,-120,-74,-60,-120],"WAogonek":[-60,-60,-50,-50,-120,-74,-60,-120],"WAring":[-60,-60,-50,-50,-120,-74,-60,-120],"WAtilde":[-60,-60,-50,-50,-120,-74,-60,-120],"WO":[-20,-20,-20,-20,-10,-15,-25,-10],"WOacute":[-20,-20,-20,-20,-10,-15,-25,-10],"WOcircumflex":[-20,-20,-20,-20,-10,-15,-25,-10],"WOdieresis":[-20,-20,-20,-20,-10,-15,-25,-10],"WOgrave":[-20,-20,-20,-20,-10,-15,-25,-10],"WOhungarumlaut":[-20,-20,-20,-20,-10,-15,-25,-10],"WOmacron":[-20,-20,-20,-20,-10,-15,-25,-10],"WOslash":[-20,-20,-20,-20,-10,-15,-25,-10],"WOtilde":[-20,-20,-20,-20,-10,-15,-25,-10],"Wa":[-40,-40,-40,-40,-65,-85,-92,-80],"Waacute":[-40,-40,-40,-40,-65,-85,-92,-80],"Wabreve":[-40,-40,-40,-40,-65,-85,-92,-80],"Wacircumflex":[-40,-40,-40,-40,-65,-85,-92,-80],"Wadieresis":[-40,-40,-40,-40,-65,-85,-92,-80],"Wagrave":[-40,-40,-40,-40,-65,-85,-92,-80],"Wamacron":[-40,-40,-40,-40,-65,-85,-92,-80],"Waogonek":[-40,-40,-40,-40,-65,-85,-92,-80],"Waring":[-40,-40,-40,-40,-65,-85,-92,-80],"Watilde":[-40,-40,-40,-40,-65,-85,-92,-80],"Wcolon":[-10,-10,0,0,-55,-55,-65,-37],"Wcomma":[-80,-80,-80,-80,-92,-74,-92,-92],"We":[-35,-35,-30,-30,-65,-90,-92,-80],"Weacute":[-35,-35,-30,-30,-65,-90,-92,-80],"Wecaron":[-35,-35,-30,-30,-65,-90,-92,-80],"Wecircumflex":[-35,-35,-30,-30,-65,-90,-92,-80],"Wedieresis":[-35,-35,-30,-30,-65,-50,-52,-40],"Wedotaccent":[-35,-35,-30,-30,-65,-90,-92,-80],"Wegrave":[-35,-35,-30,-30,-65,-50,-52,-40],"Wemacron":[-35,-35,-30,-30,-65,-50,-52,-40],"Weogonek":[-35,-35,-30,-30,-65,-90,-92,-80],"Whyphen":[-40,-40,-40,-40,-37,-50,-37,-65],"Wo":[-60,-60,-30,-30,-75,-80,-92,-80],"Woacute":[-60,-60,-30,-30,-75,-80,-92,-80],"Wocircumflex":[-60,-60,-30,-30,-75,-80,-92,-80],"Wodieresis":[-60,-60,-30,-30,-75,-80,-92,-80],"Wograve":[-60,-60,-30,-30,-75,-80,-92,-80],"Wohungarumlaut":[-60,-60,-30,-30,-75,-80,-92,-80],"Womacron":[-60,-60,-30,-30,-75,-80,-92,-80],"Woslash":[-60,-60,-30,-30,-75,-80,-92,-80],"Wotilde":[-60,-60,-30,-30,-75,-80,-92,-80],"Wperiod":[-80,-80,-80,-80,-92,-74,-92,-92],"Wsemicolon":[-10,-10,0,0,-55,-55,-65,-37],"Wu":[-45,-45,-30,-30,-50,-55,-55,-50],"Wuacute":[-45,-45,-30,-30,-50,-55,-55,-50],"Wucircumflex":[-45,-45,-30,-30,-50,-55,-55,-50],"Wudieresis":[-45,-45,-30,-30,-50,-55,-55,-50],"Wugrave":[-45,-45,-30,-30,-50,-55,-55,-50],"Wuhungarumlaut":[-45,-45,-30,-30,-50,-55,-55,-50],"Wumacron":[-45,-45,-30,-30,-50,-55,-55,-50],"Wuogonek":[-45,-45,-30,-30,-50,-55,-55,-50],"Wuring":[-45,-45,-30,-30,-50,-55,-55,-50],"Wy":[-20,-20,-20,-20,-60,-55,-70,-73],"Wyacute":[-20,-20,-20,-20,-60,-55,-70,-73],"Wydieresis":[-20,-20,-20,-20,-60,-55,-70,-73],"YA":[-110,-110,-110,-110,-110,-74,-50,-120],"YAacute":[-110,-110,-110,-110,-110,-74,-50,-120],"YAbreve":[-110,-110,-110,-110,-110,-74,-50,-120],"YAcircumflex":[-110,-110,-110,-110,-110,-74,-50,-120],"YAdieresis":[-110,-110,-110,-110,-110,-74,-50,-120],"YAgrave":[-110,-110,-110,-110,-110,-74,-50,-120],"YAmacron":[-110,-110,-110,-110,-110,-74,-50,-120],"YAogonek":[-110,-110,-110,-110,-110,-74,-50,-120],"YAring":[-110,-110,-110,-110,-110,-74,-50,-120],"YAtilde":[-110,-110,-110,-110,-110,-74,-50,-120],"YO":[-70,-70,-85,-85,-35,-25,-15,-30],"YOacute":[-70,-70,-85,-85,-35,-25,-15,-30],"YOcircumflex":[-70,-70,-85,-85,-35,-25,-15,-30],"YOdieresis":[-70,-70,-85,-85,-35,-25,-15,-30],"YOgrave":[-70,-70,-85,-85,-35,-25,-15,-30],"YOhungarumlaut":[-70,-70,-85,-85,-35,-25,-15,-30],"YOmacron":[-70,-70,-85,-85,-35,-25,-15,-30],"YOslash":[-70,-70,-85,-85,-35,-25,-15,-30],"YOtilde":[-70,-70,-85,-85,-35,-25,-15,-30],"Ya":[-90,-90,-140,-140,-85,-92,-92,-100],"Yaacute":[-90,-90,-140,-140,-85,-92,-92,-100],"Yabreve":[-90,-90,-70,-70,-85,-92,-92,-100],"Yacircumflex":[-90,-90,-140,-140,-85,-92,-92,-100],"Yadieresis":[-90,-90,-140,-140,-85,-92,-92,-60],"Yagrave":[-90,-90,-140,-140,-85,-92,-92,-60],"Yamacron":[-90,-90,-70,-70,-85,-92,-92,-60],"Yaogonek":[-90,-90,-140,-140,-85,-92,-92,-100],"Yaring":[-90,-90,-140,-140,-85,-92,-92,-100],"Yatilde":[-90,-90,-140,-140,-85,-92,-92,-60],"Ycolon":[-50,-50,-60,-60,-92,-92,-65,-92],"Ycomma":[-100,-100,-140,-140,-92,-92,-92,-129],"Ye":[-80,-80,-140,-140,-111,-111,-92,-100],"Yeacute":[-80,-80,-140,-140,-111,-111,-92,-100],"Yecaron":[-80,-80,-140,-140,-111,-111,-92,-100],"Yecircumflex":[-80,-80,-140,-140,-111,-71,-92,-100],"Yedieresis":[-80,-80,-140,-140,-71,-71,-52,-60],"Yedotaccent":[-80,-80,-140,-140,-111,-111,-92,-100],"Yegrave":[-80,-80,-140,-140,-71,-71,-52,-60],"Yemacron":[-80,-80,-70,-70,-71,-71,-52,-60],"Yeogonek":[-80,-80,-140,-140,-111,-111,-92,-100],"Yo":[-100,-100,-140,-140,-111,-111,-92,-110],"Yoacute":[-100,-100,-140,-140,-111,-111,-92,-110],"Yocircumflex":[-100,-100,-140,-140,-111,-111,-92,-110],"Yodieresis":[-100,-100,-140,-140,-111,-111,-92,-70],"Yograve":[-100,-100,-140,-140,-111,-111,-92,-70],"Yohungarumlaut":[-100,-100,-140,-140,-111,-111,-92,-110],"Yomacron":[-100,-100,-140,-140,-111,-111,-92,-70],"Yoslash":[-100,-100,-140,-140,-111,-111,-92,-110],"Yotilde":[-100,-100,-140,-140,-111,-111,-92,-70],"Yperiod":[-100,-100,-140,-140,-92,-74,-92,-129],"Ysemicolon":[-50,-50,-60,-60,-92,-92,-65,-92],"Yu":[-100,-100,-110,-110,-92,-92,-92,-111],"Yuacute":[-100,-100,-110,-110,-92,-92,-92,-111],"Yucircumflex":[-100,-100,-110,-110,-92,-92,-92,-111],"Yudieresis":[-100,-100,-110,-110,-92,-92,-92,-71],"Yugrave":[-100,-100,-110,-110,-92,-92,-92,-71],"Yuhungarumlaut":[-100,-100,-110,-110,-92,-92,-92,-111],"Yumacron":[-100,-100,-110,-110,-92,-92,-92,-71],"Yuogonek":[-100,-100,-110,-110,-92,-92,-92,-111],"Yuring":[-100,-100,-110,-110,-92,-92,-92,-111],"YacuteA":[-110,-110,-110,-110,-110,-74,-50,-120],"YacuteAacute":[-110,-110,-110,-110,-110,-74,-50,-120],"YacuteAbreve":[-110,-110,-110,-110,-110,-74,-50,-120],"YacuteAcircumflex":[-110,-110,-110,-110,-110,-74,-50,-120],"YacuteAdieresis":[-110,-110,-110,-110,-110,-74,-50,-120],"YacuteAgrave":[-110,-110,-110,-110,-110,-74,-50,-120],"YacuteAmacron":[-110,-110,-110,-110,-110,-74,-50,-120],"YacuteAogonek":[-110,-110,-110,-110,-110,-74,-50,-120],"YacuteAring":[-110,-110,-110,-110,-110,-74,-50,-120],"YacuteAtilde":[-110,-110,-110,-110,-110,-74,-50,-120],"YacuteO":[-70,-70,-85,-85,-35,-25,-15,-30],"YacuteOacute":[-70,-70,-85,-85,-35,-25,-15,-30],"YacuteOcircumflex":[-70,-70,-85,-85,-35,-25,-15,-30],"YacuteOdieresis":[-70,-70,-85,-85,-35,-25,-15,-30],"YacuteOgrave":[-70,-70,-85,-85,-35,-25,-15,-30],"YacuteOhungarumlaut":[-70,-70,-85,-85,-35,-25,-15,-30],"YacuteOmacron":[-70,-70,-85,-85,-35,-25,-15,-30],"YacuteOslash":[-70,-70,-85,-85,-35,-25,-15,-30],"YacuteOtilde":[-70,-70,-85,-85,-35,-25,-15,-30],"Yacutea":[-90,-90,-140,-140,-85,-92,-92,-100],"Yacuteaacute":[-90,-90,-140,-140,-85,-92,-92,-100],"Yacuteabreve":[-90,-90,-70,-70,-85,-92,-92,-100],"Yacuteacircumflex":[-90,-90,-140,-140,-85,-92,-92,-100],"Yacuteadieresis":[-90,-90,-140,-140,-85,-92,-92,-60],"Yacuteagrave":[-90,-90,-140,-140,-85,-92,-92,-60],"Yacuteamacron":[-90,-90,-70,-70,-85,-92,-92,-60],"Yacuteaogonek":[-90,-90,-140,-140,-85,-92,-92,-100],"Yacutearing":[-90,-90,-140,-140,-85,-92,-92,-100],"Yacuteatilde":[-90,-90,-70,-70,-85,-92,-92,-60],"Yacutecolon":[-50,-50,-60,-60,-92,-92,-65,-92],"Yacutecomma":[-100,-100,-140,-140,-92,-92,-92,-129],"Yacutee":[-80,-80,-140,-140,-111,-111,-92,-100],"Yacuteeacute":[-80,-80,-140,-140,-111,-111,-92,-100],"Yacuteecaron":[-80,-80,-140,-140,-111,-111,-92,-100],"Yacuteecircumflex":[-80,-80,-140,-140,-111,-71,-92,-100],"Yacuteedieresis":[-80,-80,-140,-140,-71,-71,-52,-60],"Yacuteedotaccent":[-80,-80,-140,-140,-111,-111,-92,-100],"Yacuteegrave":[-80,-80,-140,-140,-71,-71,-52,-60],"Yacuteemacron":[-80,-80,-70,-70,-71,-71,-52,-60],"Yacuteeogonek":[-80,-80,-140,-140,-111,-111,-92,-100],"Yacuteo":[-100,-100,-140,-140,-111,-111,-92,-110],"Yacuteoacute":[-100,-100,-140,-140,-111,-111,-92,-110],"Yacuteocircumflex":[-100,-100,-140,-140,-111,-111,-92,-110],"Yacuteodieresis":[-100,-100,-140,-140,-111,-111,-92,-70],"Yacuteograve":[-100,-100,-140,-140,-111,-111,-92,-70],"Yacuteohungarumlaut":[-100,-100,-140,-140,-111,-111,-92,-110],"Yacuteomacron":[-100,-100,-70,-70,-111,-111,-92,-70],"Yacuteoslash":[-100,-100,-140,-140,-111,-111,-92,-110],"Yacuteotilde":[-100,-100,-140,-140,-111,-111,-92,-70],"Yacuteperiod":[-100,-100,-140,-140,-92,-74,-92,-129],"Yacutesemicolon":[-50,-50,-60,-60,-92,-92,-65,-92],"Yacuteu":[-100,-100,-110,-110,-92,-92,-92,-111],"Yacuteuacute":[-100,-100,-110,-110,-92,-92,-92,-111],"Yacuteucircumflex":[-100,-100,-110,-110,-92,-92,-92,-111],"Yacuteudieresis":[-100,-100,-110,-110,-92,-92,-92,-71],"Yacuteugrave":[-100,-100,-110,-110,-92,-92,-92,-71],"Yacuteuhungarumlaut":[-100,-100,-110,-110,-92,-92,-92,-111],"Yacuteumacron":[-100,-100,-110,-110,-92,-92,-92,-71],"Yacuteuogonek":[-100,-100,-110,-110,-92,-92,-92,-111],"Yacuteuring":[-100,-100,-110,-110,-92,-92,-92,-111],"YdieresisA":[-110,-110,-110,-110,-110,-74,-50,-120],"YdieresisAacute":[-110,-110,-110,-110,-110,-74,-50,-120],"YdieresisAbreve":[-110,-110,-110,-110,-110,-74,-50,-120],"YdieresisAcircumflex":[-110,-110,-110,-110,-110,-74,-50,-120],"YdieresisAdieresis":[-110,-110,-110,-110,-110,-74,-50,-120],"YdieresisAgrave":[-110,-110,-110,-110,-110,-74,-50,-120],"YdieresisAmacron":[-110,-110,-110,-110,-110,-74,-50,-120],"YdieresisAogonek":[-110,-110,-110,-110,-110,-74,-50,-120],"YdieresisAring":[-110,-110,-110,-110,-110,-74,-50,-120],"YdieresisAtilde":[-110,-110,-110,-110,-110,-74,-50,-120],"YdieresisO":[-70,-70,-85,-85,-35,-25,-15,-30],"YdieresisOacute":[-70,-70,-85,-85,-35,-25,-15,-30],"YdieresisOcircumflex":[-70,-70,-85,-85,-35,-25,-15,-30],"YdieresisOdieresis":[-70,-70,-85,-85,-35,-25,-15,-30],"YdieresisOgrave":[-70,-70,-85,-85,-35,-25,-15,-30],"YdieresisOhungarumlaut":[-70,-70,-85,-85,-35,-25,-15,-30],"YdieresisOmacron":[-70,-70,-85,-85,-35,-25,-15,-30],"YdieresisOslash":[-70,-70,-85,-85,-35,-25,-15,-30],"YdieresisOtilde":[-70,-70,-85,-85,-35,-25,-15,-30],"Ydieresisa":[-90,-90,-140,-140,-85,-92,-92,-100],"Ydieresisaacute":[-90,-90,-140,-140,-85,-92,-92,-100],"Ydieresisabreve":[-90,-90,-70,-70,-85,-92,-92,-100],"Ydieresisacircumflex":[-90,-90,-140,-140,-85,-92,-92,-100],"Ydieresisadieresis":[-90,-90,-140,-140,-85,-92,-92,-60],"Ydieresisagrave":[-90,-90,-140,-140,-85,-92,-92,-60],"Ydieresisamacron":[-90,-90,-70,-70,-85,-92,-92,-60],"Ydieresisaogonek":[-90,-90,-140,-140,-85,-92,-92,-100],"Ydieresisaring":[-90,-90,-140,-140,-85,-92,-92,-100],"Ydieresisatilde":[-90,-90,-70,-70,-85,-92,-92,-100],"Ydieresiscolon":[-50,-50,-60,-60,-92,-92,-65,-92],"Ydieresiscomma":[-100,-100,-140,-140,-92,-92,-92,-129],"Ydieresise":[-80,-80,-140,-140,-111,-111,-92,-100],"Ydieresiseacute":[-80,-80,-140,-140,-111,-111,-92,-100],"Ydieresisecaron":[-80,-80,-140,-140,-111,-111,-92,-100],"Ydieresisecircumflex":[-80,-80,-140,-140,-111,-71,-92,-100],"Ydieresisedieresis":[-80,-80,-140,-140,-71,-71,-52,-60],"Ydieresisedotaccent":[-80,-80,-140,-140,-111,-111,-92,-100],"Ydieresisegrave":[-80,-80,-140,-140,-71,-71,-52,-60],"Ydieresisemacron":[-80,-80,-70,-70,-71,-71,-52,-60],"Ydieresiseogonek":[-80,-80,-140,-140,-111,-111,-92,-100],"Ydieresiso":[-100,-100,-140,-140,-111,-111,-92,-110],"Ydieresisoacute":[-100,-100,-140,-140,-111,-111,-92,-110],"Ydieresisocircumflex":[-100,-100,-140,-140,-111,-111,-92,-110],"Ydieresisodieresis":[-100,-100,-140,-140,-111,-111,-92,-70],"Ydieresisograve":[-100,-100,-140,-140,-111,-111,-92,-70],"Ydieresisohungarumlaut":[-100,-100,-140,-140,-111,-111,-92,-110],"Ydieresisomacron":[-100,-100,-140,-140,-111,-111,-92,-70],"Ydieresisoslash":[-100,-100,-140,-140,-111,-111,-92,-110],"Ydieresisotilde":[-100,-100,-140,-140,-111,-111,-92,-70],"Ydieresisperiod":[-100,-100,-140,-140,-92,-74,-92,-129],"Ydieresissemicolon":[-50,-50,-60,-60,-92,-92,-65,-92],"Ydieresisu":[-100,-100,-110,-110,-92,-92,-92,-111],"Ydieresisuacute":[-100,-100,-110,-110,-92,-92,-92,-111],"Ydieresisucircumflex":[-100,-100,-110,-110,-92,-92,-92,-111],"Ydieresisudieresis":[-100,-100,-110,-110,-92,-92,-92,-71],"Ydieresisugrave":[-100,-100,-110,-110,-92,-92,-92,-71],"Ydieresisuhungarumlaut":[-100,-100,-110,-110,-92,-92,-92,-111],"Ydieresisumacron":[-100,-100,-110,-110,-92,-92,-92,-71],"Ydieresisuogonek":[-100,-100,-110,-110,-92,-92,-92,-111],"Ydieresisuring":[-100,-100,-110,-110,-92,-92,-92,-111],"ag":[-10,-10,0,0,0,0,-10],"agbreve":[-10,-10,0,0,0,0,-10],"agcommaaccent":[-10,-10,0,0,0,0,-10],"av":[-15,-15,-20,-20,-25,0,0,-20],"aw":[-15,-15,-20,-20,0,0,0,-15],"ay":[-20,-20,-30,-30],"ayacute":[-20,-20,-30,-30],"aydieresis":[-20,-20,-30,-30],"aacuteg":[-10,-10,0,0,0,0,-10],"aacutegbreve":[-10,-10,0,0,0,0,-10],"aacutegcommaaccent":[-10,-10,0,0,0,0,-10],"aacutev":[-15,-15,-20,-20,-25,0,0,-20],"aacutew":[-15,-15,-20,-20,0,0,0,-15],"aacutey":[-20,-20,-30,-30],"aacuteyacute":[-20,-20,-30,-30],"aacuteydieresis":[-20,-20,-30,-30],"abreveg":[-10,-10,0,0,0,0,-10],"abrevegbreve":[-10,-10,0,0,0,0,-10],"abrevegcommaaccent":[-10,-10,0,0,0,0,-10],"abrevev":[-15,-15,-20,-20,-25,0,0,-20],"abrevew":[-15,-15,-20,-20,0,0,0,-15],"abrevey":[-20,-20,-30,-30],"abreveyacute":[-20,-20,-30,-30],"abreveydieresis":[-20,-20,-30,-30],"acircumflexg":[-10,-10,0,0,0,0,-10],"acircumflexgbreve":[-10,-10,0,0,0,0,-10],"acircumflexgcommaaccent":[-10,-10,0,0,0,0,-10],"acircumflexv":[-15,-15,-20,-20,-25,0,0,-20],"acircumflexw":[-15,-15,-20,-20,0,0,0,-15],"acircumflexy":[-20,-20,-30,-30],"acircumflexyacute":[-20,-20,-30,-30],"acircumflexydieresis":[-20,-20,-30,-30],"adieresisg":[-10,-10,0,0,0,0,-10],"adieresisgbreve":[-10,-10,0,0,0,0,-10],"adieresisgcommaaccent":[-10,-10,0,0,0,0,-10],"adieresisv":[-15,-15,-20,-20,-25,0,0,-20],"adieresisw":[-15,-15,-20,-20,0,0,0,-15],"adieresisy":[-20,-20,-30,-30],"adieresisyacute":[-20,-20,-30,-30],"adieresisydieresis":[-20,-20,-30,-30],"agraveg":[-10,-10,0,0,0,0,-10],"agravegbreve":[-10,-10,0,0,0,0,-10],"agravegcommaaccent":[-10,-10,0,0,0,0,-10],"agravev":[-15,-15,-20,-20,-25,0,0,-20],"agravew":[-15,-15,-20,-20,0,0,0,-15],"agravey":[-20,-20,-30,-30],"agraveyacute":[-20,-20,-30,-30],"agraveydieresis":[-20,-20,-30,-30],"amacrong":[-10,-10,0,0,0,0,-10],"amacrongbreve":[-10,-10,0,0,0,0,-10],"amacrongcommaaccent":[-10,-10,0,0,0,0,-10],"amacronv":[-15,-15,-20,-20,-25,0,0,-20],"amacronw":[-15,-15,-20,-20,0,0,0,-15],"amacrony":[-20,-20,-30,-30],"amacronyacute":[-20,-20,-30,-30],"amacronydieresis":[-20,-20,-30,-30],"aogonekg":[-10,-10,0,0,0,0,-10],"aogonekgbreve":[-10,-10,0,0,0,0,-10],"aogonekgcommaaccent":[-10,-10,0,0,0,0,-10],"aogonekv":[-15,-15,-20,-20,-25,0,0,-20],"aogonekw":[-15,-15,-20,-20,0,0,0,-15],"aogoneky":[-20,-20,-30,-30],"aogonekyacute":[-20,-20,-30,-30],"aogonekydieresis":[-20,-20,-30,-30],"aringg":[-10,-10,0,0,0,0,-10],"aringgbreve":[-10,-10,0,0,0,0,-10],"aringgcommaaccent":[-10,-10,0,0,0,0,-10],"aringv":[-15,-15,-20,-20,-25,0,0,-20],"aringw":[-15,-15,-20,-20,0,0,0,-15],"aringy":[-20,-20,-30,-30],"aringyacute":[-20,-20,-30,-30],"aringydieresis":[-20,-20,-30,-30],"atildeg":[-10,-10,0,0,0,0,-10],"atildegbreve":[-10,-10,0,0,0,0,-10],"atildegcommaaccent":[-10,-10,0,0,0,0,-10],"atildev":[-15,-15,-20,-20,-25,0,0,-20],"atildew":[-15,-15,-20,-20,0,0,0,-15],"atildey":[-20,-20,-30,-30],"atildeyacute":[-20,-20,-30,-30],"atildeydieresis":[-20,-20,-30,-30],"bl":[-10,-10,-20,-20],"blacute":[-10,-10,-20,-20],"blcommaaccent":[-10,-10,-20,-20],"blslash":[-10,-10,-20,-20],"bu":[-20,-20,-20,-20,-20,-20,-20,-20],"buacute":[-20,-20,-20,-20,-20,-20,-20,-20],"bucircumflex":[-20,-20,-20,-20,-20,-20,-20,-20],"budieresis":[-20,-20,-20,-20,-20,-20,-20,-20],"bugrave":[-20,-20,-20,-20,-20,-20,-20,-20],"buhungarumlaut":[-20,-20,-20,-20,-20,-20,-20,-20],"bumacron":[-20,-20,-20,-20,-20,-20,-20,-20],"buogonek":[-20,-20,-20,-20,-20,-20,-20,-20],"buring":[-20,-20,-20,-20,-20,-20,-20,-20],"bv":[-20,-20,-20,-20,-15,0,0,-15],"by":[-20,-20,-20,-20],"byacute":[-20,-20,-20,-20],"bydieresis":[-20,-20,-20,-20],"ch":[-10,-10,0,0,0,-10,-15],"ck":[-20,-20,-20,-20,0,-10,-20],"ckcommaaccent":[-20,-20,-20,-20,0,-10,-20],"cl":[-20,-20],"clacute":[-20,-20],"clcommaaccent":[-20,-20],"clslash":[-20,-20],"cy":[-10,-10,0,0,0,0,0,-15],"cyacute":[-10,-10,0,0,0,0,0,-15],"cydieresis":[-10,-10,0,0,0,0,0,-15],"cacuteh":[-10,-10,0,0,0,-10,-15],"cacutek":[-20,-20,-20,-20,0,-10,-20],"cacutekcommaaccent":[-20,-20,-20,-20,0,-10,-20],"cacutel":[-20,-20],"cacutelacute":[-20,-20],"cacutelcommaaccent":[-20,-20],"cacutelslash":[-20,-20],"cacutey":[-10,-10,0,0,0,0,0,-15],"cacuteyacute":[-10,-10,0,0,0,0,0,-15],"cacuteydieresis":[-10,-10,0,0,0,0,0,-15],"ccaronh":[-10,-10,0,0,0,-10,-15],"ccaronk":[-20,-20,-20,-20,0,-10,-20],"ccaronkcommaaccent":[-20,-20,-20,-20,0,-10,-20],"ccaronl":[-20,-20],"ccaronlacute":[-20,-20],"ccaronlcommaaccent":[-20,-20],"ccaronlslash":[-20,-20],"ccarony":[-10,-10,0,0,0,0,0,-15],"ccaronyacute":[-10,-10,0,0,0,0,0,-15],"ccaronydieresis":[-10,-10,0,0,0,0,0,-15],"ccedillah":[-10,-10,0,0,0,-10,-15],"ccedillak":[-20,-20,-20,-20,0,-10,-20],"ccedillakcommaaccent":[-20,-20,-20,-20,0,-10,-20],"ccedillal":[-20,-20],"ccedillalacute":[-20,-20],"ccedillalcommaaccent":[-20,-20],"ccedillalslash":[-20,-20],"ccedillay":[-10,-10,0,0,0,0,0,-15],"ccedillayacute":[-10,-10,0,0,0,0,0,-15],"ccedillaydieresis":[-10,-10,0,0,0,0,0,-15],"colonspace":[-40,-40,-50,-50],"commaquotedblright":[-120,-120,-100,-100,-45,-95,-140,-70],"commaquoteright":[-120,-120,-100,-100,-55,-95,-140,-70],"commaspace":[-40,-40],"dd":[-10,-10],"ddcroat":[-10,-10],"dv":[-15,-15],"dw":[-15,-15,0,0,-15],"dy":[-15,-15],"dyacute":[-15,-15],"dydieresis":[-15,-15],"dcroatd":[-10,-10],"dcroatdcroat":[-10,-10],"dcroatv":[-15,-15],"dcroatw":[-15,-15,0,0,-15],"dcroaty":[-15,-15],"dcroatyacute":[-15,-15],"dcroatydieresis":[-15,-15],"ecomma":[10,10,-15,-15,0,0,-10],"eperiod":[20,20,-15,-15,0,0,-15],"ev":[-15,-15,-30,-30,-15,0,-15,-25],"ew":[-15,-15,-20,-20,0,0,-15,-25],"ex":[-15,-15,-30,-30,0,0,-20,-15],"ey":[-15,-15,-20,-20,0,0,-30,-15],"eyacute":[-15,-15,-20,-20,0,0,-30,-15],"eydieresis":[-15,-15,-20,-20,0,0,-30,-15],"eacutecomma":[10,10,-15,-15,0,0,-10],"eacuteperiod":[20,20,-15,-15,0,0,-15],"eacutev":[-15,-15,-30,-30,-15,0,-15,-25],"eacutew":[-15,-15,-20,-20,0,0,-15,-25],"eacutex":[-15,-15,-30,-30,0,0,-20,-15],"eacutey":[-15,-15,-20,-20,0,0,-30,-15],"eacuteyacute":[-15,-15,-20,-20,0,0,-30,-15],"eacuteydieresis":[-15,-15,-20,-20,0,0,-30,-15],"ecaroncomma":[10,10,-15,-15,0,0,-10],"ecaronperiod":[20,20,-15,-15,0,0,-15],"ecaronv":[-15,-15,-30,-30,-15,0,-15,-25],"ecaronw":[-15,-15,-20,-20,0,0,-15,-25],"ecaronx":[-15,-15,-30,-30,0,0,-20,-15],"ecarony":[-15,-15,-20,-20,0,0,-30,-15],"ecaronyacute":[-15,-15,-20,-20,0,0,-30,-15],"ecaronydieresis":[-15,-15,-20,-20,0,0,-30,-15],"ecircumflexcomma":[10,10,-15,-15,0,0,-10],"ecircumflexperiod":[20,20,-15,-15,0,0,-15],"ecircumflexv":[-15,-15,-30,-30,-15,0,-15,-25],"ecircumflexw":[-15,-15,-20,-20,0,0,-15,-25],"ecircumflexx":[-15,-15,-30,-30,0,0,-20,-15],"ecircumflexy":[-15,-15,-20,-20,0,0,-30,-15],"ecircumflexyacute":[-15,-15,-20,-20,0,0,-30,-15],"ecircumflexydieresis":[-15,-15,-20,-20,0,0,-30,-15],"edieresiscomma":[10,10,-15,-15,0,0,-10],"edieresisperiod":[20,20,-15,-15,0,0,-15],"edieresisv":[-15,-15,-30,-30,-15,0,-15,-25],"edieresisw":[-15,-15,-20,-20,0,0,-15,-25],"edieresisx":[-15,-15,-30,-30,0,0,-20,-15],"edieresisy":[-15,-15,-20,-20,0,0,-30,-15],"edieresisyacute":[-15,-15,-20,-20,0,0,-30,-15],"edieresisydieresis":[-15,-15,-20,-20,0,0,-30,-15],"edotaccentcomma":[10,10,-15,-15,0,0,-10],"edotaccentperiod":[20,20,-15,-15,0,0,-15],"edotaccentv":[-15,-15,-30,-30,-15,0,-15,-25],"edotaccentw":[-15,-15,-20,-20,0,0,-15,-25],"edotaccentx":[-15,-15,-30,-30,0,0,-20,-15],"edotaccenty":[-15,-15,-20,-20,0,0,-30,-15],"edotaccentyacute":[-15,-15,-20,-20,0,0,-30,-15],"edotaccentydieresis":[-15,-15,-20,-20,0,0,-30,-15],"egravecomma":[10,10,-15,-15,0,0,-10],"egraveperiod":[20,20,-15,-15,0,0,-15],"egravev":[-15,-15,-30,-30,-15,0,-15,-25],"egravew":[-15,-15,-20,-20,0,0,-15,-25],"egravex":[-15,-15,-30,-30,0,0,-20,-15],"egravey":[-15,-15,-20,-20,0,0,-30,-15],"egraveyacute":[-15,-15,-20,-20,0,0,-30,-15],"egraveydieresis":[-15,-15,-20,-20,0,0,-30,-15],"emacroncomma":[10,10,-15,-15,0,0,-10],"emacronperiod":[20,20,-15,-15,0,0,-15],"emacronv":[-15,-15,-30,-30,-15,0,-15,-25],"emacronw":[-15,-15,-20,-20,0,0,-15,-25],"emacronx":[-15,-15,-30,-30,0,0,-20,-15],"emacrony":[-15,-15,-20,-20,0,0,-30,-15],"emacronyacute":[-15,-15,-20,-20,0,0,-30,-15],"emacronydieresis":[-15,-15,-20,-20,0,0,-30,-15],"eogonekcomma":[10,10,-15,-15,0,0,-10],"eogonekperiod":[20,20,-15,-15,0,0,-15],"eogonekv":[-15,-15,-30,-30,-15,0,-15,-25],"eogonekw":[-15,-15,-20,-20,0,0,-15,-25],"eogonekx":[-15,-15,-30,-30,0,0,-20,-15],"eogoneky":[-15,-15,-20,-20,0,0,-30,-15],"eogonekyacute":[-15,-15,-20,-20,0,0,-30,-15],"eogonekydieresis":[-15,-15,-20,-20,0,0,-30,-15],"fcomma":[-10,-10,-30,-30,-15,-10,-10],"fe":[-10,-10,-30,-30,0,-10],"feacute":[-10,-10,-30,-30,0,-10],"fecaron":[-10,-10,-30,-30],"fecircumflex":[-10,-10,-30,-30],"fedieresis":[-10,-10,-30,-30],"fedotaccent":[-10,-10,-30,-30,0,-10],"fegrave":[-10,-10,-30,-30],"femacron":[-10,-10,-30,-30],"feogonek":[-10,-10,-30,-30,0,-10],"fo":[-20,-20,-30,-30,-25,-10],"foacute":[-20,-20,-30,-30,-25,-10],"focircumflex":[-20,-20,-30,-30,-25,-10],"fodieresis":[-20,-20,-30,-30,-25],"fograve":[-20,-20,-30,-30,-25,-10],"fohungarumlaut":[-20,-20,-30,-30,-25,-10],"fomacron":[-20,-20,-30,-30,-25],"foslash":[-20,-20,-30,-30,-25,-10],"fotilde":[-20,-20,-30,-30,-25,-10],"fperiod":[-10,-10,-30,-30,-15,-10,-15],"fquotedblright":[30,30,60,60,50],"fquoteright":[30,30,50,50,55,55,92,55],"ge":[10,10,0,0,0,0,-10],"geacute":[10,10,0,0,0,0,-10],"gecaron":[10,10,0,0,0,0,-10],"gecircumflex":[10,10,0,0,0,0,-10],"gedieresis":[10,10,0,0,0,0,-10],"gedotaccent":[10,10,0,0,0,0,-10],"gegrave":[10,10,0,0,0,0,-10],"gemacron":[10,10,0,0,0,0,-10],"geogonek":[10,10,0,0,0,0,-10],"gg":[-10,-10,0,0,0,0,-10],"ggbreve":[-10,-10,0,0,0,0,-10],"ggcommaaccent":[-10,-10,0,0,0,0,-10],"gbrevee":[10,10,0,0,0,0,-10],"gbreveeacute":[10,10,0,0,0,0,-10],"gbreveecaron":[10,10,0,0,0,0,-10],"gbreveecircumflex":[10,10,0,0,0,0,-10],"gbreveedieresis":[10,10,0,0,0,0,-10],"gbreveedotaccent":[10,10,0,0,0,0,-10],"gbreveegrave":[10,10,0,0,0,0,-10],"gbreveemacron":[10,10,0,0,0,0,-10],"gbreveeogonek":[10,10,0,0,0,0,-10],"gbreveg":[-10,-10,0,0,0,0,-10],"gbrevegbreve":[-10,-10,0,0,0,0,-10],"gbrevegcommaaccent":[-10,-10,0,0,0,0,-10],"gcommaaccente":[10,10,0,0,0,0,-10],"gcommaaccenteacute":[10,10,0,0,0,0,-10],"gcommaaccentecaron":[10,10,0,0,0,0,-10],"gcommaaccentecircumflex":[10,10,0,0,0,0,-10],"gcommaaccentedieresis":[10,10,0,0,0,0,-10],"gcommaaccentedotaccent":[10,10,0,0,0,0,-10],"gcommaaccentegrave":[10,10,0,0,0,0,-10],"gcommaaccentemacron":[10,10,0,0,0,0,-10],"gcommaaccenteogonek":[10,10,0,0,0,0,-10],"gcommaaccentg":[-10,-10,0,0,0,0,-10],"gcommaaccentgbreve":[-10,-10,0,0,0,0,-10],"gcommaaccentgcommaaccent":[-10,-10,0,0,0,0,-10],"hy":[-20,-20,-30,-30,-15,0,0,-5],"hyacute":[-20,-20,-30,-30,-15,0,0,-5],"hydieresis":[-20,-20,-30,-30,-15,0,0,-5],"ko":[-15,-15,-20,-20,-15,-10,-10,-10],"koacute":[-15,-15,-20,-20,-15,-10,-10,-10],"kocircumflex":[-15,-15,-20,-20,-15,-10,-10,-10],"kodieresis":[-15,-15,-20,-20,-15,-10,-10,-10],"kograve":[-15,-15,-20,-20,-15,-10,-10,-10],"kohungarumlaut":[-15,-15,-20,-20,-15,-10,-10,-10],"komacron":[-15,-15,-20,-20,-15,-10,-10,-10],"koslash":[-15,-15,-20,-20,-15,-10,-10,-10],"kotilde":[-15,-15,-20,-20,-15,-10,-10,-10],"kcommaaccento":[-15,-15,-20,-20,-15,-10,-10,-10],"kcommaaccentoacute":[-15,-15,-20,-20,-15,-10,-10,-10],"kcommaaccentocircumflex":[-15,-15,-20,-20,-15,-10,-10,-10],"kcommaaccentodieresis":[-15,-15,-20,-20,-15,-10,-10,-10],"kcommaaccentograve":[-15,-15,-20,-20,-15,-10,-10,-10],"kcommaaccentohungarumlaut":[-15,-15,-20,-20,-15,-10,-10,-10],"kcommaaccentomacron":[-15,-15,-20,-20,-15,-10,-10,-10],"kcommaaccentoslash":[-15,-15,-20,-20,-15,-10,-10,-10],"kcommaaccentotilde":[-15,-15,-20,-20,-15,-10,-10,-10],"lw":[-15,-15,0,0,0,0,0,-10],"ly":[-15,-15],"lyacute":[-15,-15],"lydieresis":[-15,-15],"lacutew":[-15,-15,0,0,0,0,0,-10],"lacutey":[-15,-15],"lacuteyacute":[-15,-15],"lacuteydieresis":[-15,-15],"lcommaaccentw":[-15,-15,0,0,0,0,0,-10],"lcommaaccenty":[-15,-15],"lcommaaccentyacute":[-15,-15],"lcommaaccentydieresis":[-15,-15],"lslashw":[-15,-15,0,0,0,0,0,-10],"lslashy":[-15,-15],"lslashyacute":[-15,-15],"lslashydieresis":[-15,-15],"mu":[-20,-20,-10,-10],"muacute":[-20,-20,-10,-10],"mucircumflex":[-20,-20,-10,-10],"mudieresis":[-20,-20,-10,-10],"mugrave":[-20,-20,-10,-10],"muhungarumlaut":[-20,-20,-10,-10],"mumacron":[-20,-20,-10,-10],"muogonek":[-20,-20,-10,-10],"muring":[-20,-20,-10,-10],"my":[-30,-30,-15,-15],"myacute":[-30,-30,-15,-15],"mydieresis":[-30,-30,-15,-15],"nu":[-10,-10,-10,-10],"nuacute":[-10,-10,-10,-10],"nucircumflex":[-10,-10,-10,-10],"nudieresis":[-10,-10,-10,-10],"nugrave":[-10,-10,-10,-10],"nuhungarumlaut":[-10,-10,-10,-10],"numacron":[-10,-10,-10,-10],"nuogonek":[-10,-10,-10,-10],"nuring":[-10,-10,-10,-10],"nv":[-40,-40,-20,-20,-40,-40,-40,-40],"ny":[-20,-20,-15,-15,0,0,0,-15],"nyacute":[-20,-20,-15,-15,0,0,0,-15],"nydieresis":[-20,-20,-15,-15,0,0,0,-15],"nacuteu":[-10,-10,-10,-10],"nacuteuacute":[-10,-10,-10,-10],"nacuteucircumflex":[-10,-10,-10,-10],"nacuteudieresis":[-10,-10,-10,-10],"nacuteugrave":[-10,-10,-10,-10],"nacuteuhungarumlaut":[-10,-10,-10,-10],"nacuteumacron":[-10,-10,-10,-10],"nacuteuogonek":[-10,-10,-10,-10],"nacuteuring":[-10,-10,-10,-10],"nacutev":[-40,-40,-20,-20,-40,-40,-40,-40],"nacutey":[-20,-20,-15,-15,0,0,0,-15],"nacuteyacute":[-20,-20,-15,-15,0,0,0,-15],"nacuteydieresis":[-20,-20,-15,-15,0,0,0,-15],"ncaronu":[-10,-10,-10,-10],"ncaronuacute":[-10,-10,-10,-10],"ncaronucircumflex":[-10,-10,-10,-10],"ncaronudieresis":[-10,-10,-10,-10],"ncaronugrave":[-10,-10,-10,-10],"ncaronuhungarumlaut":[-10,-10,-10,-10],"ncaronumacron":[-10,-10,-10,-10],"ncaronuogonek":[-10,-10,-10,-10],"ncaronuring":[-10,-10,-10,-10],"ncaronv":[-40,-40,-20,-20,-40,-40,-40,-40],"ncarony":[-20,-20,-15,-15,0,0,0,-15],"ncaronyacute":[-20,-20,-15,-15,0,0,0,-15],"ncaronydieresis":[-20,-20,-15,-15,0,0,0,-15],"ncommaaccentu":[-10,-10,-10,-10],"ncommaaccentuacute":[-10,-10,-10,-10],"ncommaaccentucircumflex":[-10,-10,-10,-10],"ncommaaccentudieresis":[-10,-10,-10,-10],"ncommaaccentugrave":[-10,-10,-10,-10],"ncommaaccentuhungarumlaut":[-10,-10,-10,-10],"ncommaaccentumacron":[-10,-10,-10,-10],"ncommaaccentuogonek":[-10,-10,-10,-10],"ncommaaccenturing":[-10,-10,-10,-10],"ncommaaccentv":[-40,-40,-20,-20,-40,-40,-40,-40],"ncommaaccenty":[-20,-20,-15,-15,0,0,0,-15],"ncommaaccentyacute":[-20,-20,-15,-15,0,0,0,-15],"ncommaaccentydieresis":[-20,-20,-15,-15,0,0,0,-15],"ntildeu":[-10,-10,-10,-10],"ntildeuacute":[-10,-10,-10,-10],"ntildeucircumflex":[-10,-10,-10,-10],"ntildeudieresis":[-10,-10,-10,-10],"ntildeugrave":[-10,-10,-10,-10],"ntildeuhungarumlaut":[-10,-10,-10,-10],"ntildeumacron":[-10,-10,-10,-10],"ntildeuogonek":[-10,-10,-10,-10],"ntildeuring":[-10,-10,-10,-10],"ntildev":[-40,-40,-20,-20,-40,-40,-40,-40],"ntildey":[-20,-20,-15,-15,0,0,0,-15],"ntildeyacute":[-20,-20,-15,-15,0,0,0,-15],"ntildeydieresis":[-20,-20,-15,-15,0,0,0,-15],"ov":[-20,-20,-15,-15,-10,-15,-10,-15],"ow":[-15,-15,-15,-15,-10,-25,0,-25],"ox":[-30,-30,-30,-30,0,-10],"oy":[-20,-20,-30,-30,0,-10,0,-10],"oyacute":[-20,-20,-30,-30,0,-10,0,-10],"oydieresis":[-20,-20,-30,-30,0,-10,0,-10],"oacutev":[-20,-20,-15,-15,-10,-15,-10,-15],"oacutew":[-15,-15,-15,-15,-10,-25,0,-25],"oacutex":[-30,-30,-30,-30,0,-10],"oacutey":[-20,-20,-30,-30,0,-10,0,-10],"oacuteyacute":[-20,-20,-30,-30,0,-10,0,-10],"oacuteydieresis":[-20,-20,-30,-30,0,-10,0,-10],"ocircumflexv":[-20,-20,-15,-15,-10,-15,-10,-15],"ocircumflexw":[-15,-15,-15,-15,-10,-25,0,-25],"ocircumflexx":[-30,-30,-30,-30,0,-10],"ocircumflexy":[-20,-20,-30,-30,0,-10,0,-10],"ocircumflexyacute":[-20,-20,-30,-30,0,-10,0,-10],"ocircumflexydieresis":[-20,-20,-30,-30,0,-10,0,-10],"odieresisv":[-20,-20,-15,-15,-10,-15,-10,-15],"odieresisw":[-15,-15,-15,-15,-10,-25,0,-25],"odieresisx":[-30,-30,-30,-30,0,-10],"odieresisy":[-20,-20,-30,-30,0,-10,0,-10],"odieresisyacute":[-20,-20,-30,-30,0,-10,0,-10],"odieresisydieresis":[-20,-20,-30,-30,0,-10,0,-10],"ogravev":[-20,-20,-15,-15,-10,-15,-10,-15],"ogravew":[-15,-15,-15,-15,-10,-25,0,-25],"ogravex":[-30,-30,-30,-30,0,-10],"ogravey":[-20,-20,-30,-30,0,-10,0,-10],"ograveyacute":[-20,-20,-30,-30,0,-10,0,-10],"ograveydieresis":[-20,-20,-30,-30,0,-10,0,-10],"ohungarumlautv":[-20,-20,-15,-15,-10,-15,-10,-15],"ohungarumlautw":[-15,-15,-15,-15,-10,-25,0,-25],"ohungarumlautx":[-30,-30,-30,-30,0,-10],"ohungarumlauty":[-20,-20,-30,-30,0,-10,0,-10],"ohungarumlautyacute":[-20,-20,-30,-30,0,-10,0,-10],"ohungarumlautydieresis":[-20,-20,-30,-30,0,-10,0,-10],"omacronv":[-20,-20,-15,-15,-10,-15,-10,-15],"omacronw":[-15,-15,-15,-15,-10,-25,0,-25],"omacronx":[-30,-30,-30,-30,0,-10],"omacrony":[-20,-20,-30,-30,0,-10,0,-10],"omacronyacute":[-20,-20,-30,-30,0,-10,0,-10],"omacronydieresis":[-20,-20,-30,-30,0,-10,0,-10],"oslashv":[-20,-20,-70,-70,-10,-15,-10,-15],"oslashw":[-15,-15,-70,-70,-10,-25,0,-25],"oslashx":[-30,-30,-85,-85,0,-10],"oslashy":[-20,-20,-70,-70,0,-10,0,-10],"oslashyacute":[-20,-20,-70,-70,0,-10,0,-10],"oslashydieresis":[-20,-20,-70,-70,0,-10,0,-10],"otildev":[-20,-20,-15,-15,-10,-15,-10,-15],"otildew":[-15,-15,-15,-15,-10,-25,0,-25],"otildex":[-30,-30,-30,-30,0,-10],"otildey":[-20,-20,-30,-30,0,-10,0,-10],"otildeyacute":[-20,-20,-30,-30,0,-10,0,-10],"otildeydieresis":[-20,-20,-30,-30,0,-10,0,-10],"py":[-15,-15,-30,-30,0,0,0,-10],"pyacute":[-15,-15,-30,-30,0,0,0,-10],"pydieresis":[-15,-15,-30,-30,0,0,0,-10],"periodquotedblright":[-120,-120,-100,-100,-55,-95,-140,-70],"periodquoteright":[-120,-120,-100,-100,-55,-95,-140,-70],"periodspace":[-40,-40,-60,-60],"quotedblrightspace":[-80,-80,-40,-40],"quoteleftquoteleft":[-46,-46,-57,-57,-63,-74,-111,-74],"quoterightd":[-80,-80,-50,-50,-20,-15,-25,-50],"quoterightdcroat":[-80,-80,-50,-50,-20,-15,-25,-50],"quoterightl":[-20,-20,0,0,0,0,0,-10],"quoterightlacute":[-20,-20,0,0,0,0,0,-10],"quoterightlcommaaccent":[-20,-20,0,0,0,0,0,-10],"quoterightlslash":[-20,-20,0,0,0,0,0,-10],"quoterightquoteright":[-46,-46,-57,-57,-63,-74,-111,-74],"quoterightr":[-40,-40,-50,-50,-20,-15,-25,-50],"quoterightracute":[-40,-40,-50,-50,-20,-15,-25,-50],"quoterightrcaron":[-40,-40,-50,-50,-20,-15,-25,-50],"quoterightrcommaaccent":[-40,-40,-50,-50,-20,-15,-25,-50],"quoterights":[-60,-60,-50,-50,-37,-74,-40,-55],"quoterightsacute":[-60,-60,-50,-50,-37,-74,-40,-55],"quoterightscaron":[-60,-60,-50,-50,-37,-74,-40,-55],"quoterightscedilla":[-60,-60,-50,-50,-37,-74,-40,-55],"quoterightscommaaccent":[-60,-60,-50,-50,-37,-74,-40,-55],"quoterightspace":[-80,-80,-70,-70,-74,-74,-111,-74],"quoterightv":[-20,-20,0,0,-20,-15,-10,-50],"rc":[-20,-20,0,0,-18,0,-37],"rcacute":[-20,-20,0,0,-18,0,-37],"rccaron":[-20,-20,0,0,-18,0,-37],"rccedilla":[-20,-20,0,0,-18,0,-37],"rcomma":[-60,-60,-50,-50,-92,-65,-111,-40],"rd":[-20,-20,0,0,0,0,-37],"rdcroat":[-20,-20,0,0,0,0,-37],"rg":[-15,-15,0,0,-10,0,-37,-18],"rgbreve":[-15,-15,0,0,-10,0,-37,-18],"rgcommaaccent":[-15,-15,0,0,-10,0,-37,-18],"rhyphen":[-20,-20,0,0,-37,0,-20,-20],"ro":[-20,-20,0,0,-18,0,-45],"roacute":[-20,-20,0,0,-18,0,-45],"rocircumflex":[-20,-20,0,0,-18,0,-45],"rodieresis":[-20,-20,0,0,-18,0,-45],"rograve":[-20,-20,0,0,-18,0,-45],"rohungarumlaut":[-20,-20,0,0,-18,0,-45],"romacron":[-20,-20,0,0,-18,0,-45],"roslash":[-20,-20,0,0,-18,0,-45],"rotilde":[-20,-20,0,0,-18,0,-45],"rperiod":[-60,-60,-50,-50,-100,-65,-111,-55],"rq":[-20,-20,0,0,-18,0,-37],"rs":[-15,-15,0,0,0,0,-10],"rsacute":[-15,-15,0,0,0,0,-10],"rscaron":[-15,-15,0,0,0,0,-10],"rscedilla":[-15,-15,0,0,0,0,-10],"rscommaaccent":[-15,-15,0,0,0,0,-10],"rt":[20,20,40,40],"rtcommaaccent":[20,20,40,40],"rv":[10,10,30,30,-10],"ry":[10,10,30,30],"ryacute":[10,10,30,30],"rydieresis":[10,10,30,30],"racutec":[-20,-20,0,0,-18,0,-37],"racutecacute":[-20,-20,0,0,-18,0,-37],"racuteccaron":[-20,-20,0,0,-18,0,-37],"racuteccedilla":[-20,-20,0,0,-18,0,-37],"racutecomma":[-60,-60,-50,-50,-92,-65,-111,-40],"racuted":[-20,-20,0,0,0,0,-37],"racutedcroat":[-20,-20,0,0,0,0,-37],"racuteg":[-15,-15,0,0,-10,0,-37,-18],"racutegbreve":[-15,-15,0,0,-10,0,-37,-18],"racutegcommaaccent":[-15,-15,0,0,-10,0,-37,-18],"racutehyphen":[-20,-20,0,0,-37,0,-20,-20],"racuteo":[-20,-20,0,0,-18,0,-45],"racuteoacute":[-20,-20,0,0,-18,0,-45],"racuteocircumflex":[-20,-20,0,0,-18,0,-45],"racuteodieresis":[-20,-20,0,0,-18,0,-45],"racuteograve":[-20,-20,0,0,-18,0,-45],"racuteohungarumlaut":[-20,-20,0,0,-18,0,-45],"racuteomacron":[-20,-20,0,0,-18,0,-45],"racuteoslash":[-20,-20,0,0,-18,0,-45],"racuteotilde":[-20,-20,0,0,-18,0,-45],"racuteperiod":[-60,-60,-50,-50,-100,-65,-111,-55],"racuteq":[-20,-20,0,0,-18,0,-37],"racutes":[-15,-15,0,0,0,0,-10],"racutesacute":[-15,-15,0,0,0,0,-10],"racutescaron":[-15,-15,0,0,0,0,-10],"racutescedilla":[-15,-15,0,0,0,0,-10],"racutescommaaccent":[-15,-15,0,0,0,0,-10],"racutet":[20,20,40,40],"racutetcommaaccent":[20,20,40,40],"racutev":[10,10,30,30,-10],"racutey":[10,10,30,30],"racuteyacute":[10,10,30,30],"racuteydieresis":[10,10,30,30],"rcaronc":[-20,-20,0,0,-18,0,-37],"rcaroncacute":[-20,-20,0,0,-18,0,-37],"rcaronccaron":[-20,-20,0,0,-18,0,-37],"rcaronccedilla":[-20,-20,0,0,-18,0,-37],"rcaroncomma":[-60,-60,-50,-50,-92,-65,-111,-40],"rcarond":[-20,-20,0,0,0,0,-37],"rcarondcroat":[-20,-20,0,0,0,0,-37],"rcarong":[-15,-15,0,0,-10,0,-37,-18],"rcarongbreve":[-15,-15,0,0,-10,0,-37,-18],"rcarongcommaaccent":[-15,-15,0,0,-10,0,-37,-18],"rcaronhyphen":[-20,-20,0,0,-37,0,-20,-20],"rcarono":[-20,-20,0,0,-18,0,-45],"rcaronoacute":[-20,-20,0,0,-18,0,-45],"rcaronocircumflex":[-20,-20,0,0,-18,0,-45],"rcaronodieresis":[-20,-20,0,0,-18,0,-45],"rcaronograve":[-20,-20,0,0,-18,0,-45],"rcaronohungarumlaut":[-20,-20,0,0,-18,0,-45],"rcaronomacron":[-20,-20,0,0,-18,0,-45],"rcaronoslash":[-20,-20,0,0,-18,0,-45],"rcaronotilde":[-20,-20,0,0,-18,0,-45],"rcaronperiod":[-60,-60,-50,-50,-100,-65,-111,-55],"rcaronq":[-20,-20,0,0,-18,0,-37],"rcarons":[-15,-15,0,0,0,0,-10],"rcaronsacute":[-15,-15,0,0,0,0,-10],"rcaronscaron":[-15,-15,0,0,0,0,-10],"rcaronscedilla":[-15,-15,0,0,0,0,-10],"rcaronscommaaccent":[-15,-15,0,0,0,0,-10],"rcaront":[20,20,40,40],"rcarontcommaaccent":[20,20,40,40],"rcaronv":[10,10,30,30,-10],"rcarony":[10,10,30,30],"rcaronyacute":[10,10,30,30],"rcaronydieresis":[10,10,30,30],"rcommaaccentc":[-20,-20,0,0,-18,0,-37],"rcommaaccentcacute":[-20,-20,0,0,-18,0,-37],"rcommaaccentccaron":[-20,-20,0,0,-18,0,-37],"rcommaaccentccedilla":[-20,-20,0,0,-18,0,-37],"rcommaaccentcomma":[-60,-60,-50,-50,-92,-65,-111,-40],"rcommaaccentd":[-20,-20,0,0,0,0,-37],"rcommaaccentdcroat":[-20,-20,0,0,0,0,-37],"rcommaaccentg":[-15,-15,0,0,-10,0,-37,-18],"rcommaaccentgbreve":[-15,-15,0,0,-10,0,-37,-18],"rcommaaccentgcommaaccent":[-15,-15,0,0,-10,0,-37,-18],"rcommaaccenthyphen":[-20,-20,0,0,-37,0,-20,-20],"rcommaaccento":[-20,-20,0,0,-18,0,-45],"rcommaaccentoacute":[-20,-20,0,0,-18,0,-45],"rcommaaccentocircumflex":[-20,-20,0,0,-18,0,-45],"rcommaaccentodieresis":[-20,-20,0,0,-18,0,-45],"rcommaaccentograve":[-20,-20,0,0,-18,0,-45],"rcommaaccentohungarumlaut":[-20,-20,0,0,-18,0,-45],"rcommaaccentomacron":[-20,-20,0,0,-18,0,-45],"rcommaaccentoslash":[-20,-20,0,0,-18,0,-45],"rcommaaccentotilde":[-20,-20,0,0,-18,0,-45],"rcommaaccentperiod":[-60,-60,-50,-50,-100,-65,-111,-55],"rcommaaccentq":[-20,-20,0,0,-18,0,-37],"rcommaaccents":[-15,-15,0,0,0,0,-10],"rcommaaccentsacute":[-15,-15,0,0,0,0,-10],"rcommaaccentscaron":[-15,-15,0,0,0,0,-10],"rcommaaccentscedilla":[-15,-15,0,0,0,0,-10],"rcommaaccentscommaaccent":[-15,-15,0,0,0,0,-10],"rcommaaccentt":[20,20,40,40],"rcommaaccenttcommaaccent":[20,20,40,40],"rcommaaccentv":[10,10,30,30,-10],"rcommaaccenty":[10,10,30,30],"rcommaaccentyacute":[10,10,30,30],"rcommaaccentydieresis":[10,10,30,30],"sw":[-15,-15,-30,-30],"sacutew":[-15,-15,-30,-30],"scaronw":[-15,-15,-30,-30],"scedillaw":[-15,-15,-30,-30],"scommaaccentw":[-15,-15,-30,-30],"semicolonspace":[-40,-40,-50,-50],"spaceT":[-100,-100,-50,-50,-30,0,-18,-18],"spaceTcaron":[-100,-100,-50,-50,-30,0,-18,-18],"spaceTcommaaccent":[-100,-100,-50,-50,-30,0,-18,-18],"spaceV":[-80,-80,-50,-50,-45,-70,-35,-50],"spaceW":[-80,-80,-40,-40,-30,-70,-40,-30],"spaceY":[-120,-120,-90,-90,-55,-70,-75,-90],"spaceYacute":[-120,-120,-90,-90,-55,-70,-75,-90],"spaceYdieresis":[-120,-120,-90,-90,-55,-70,-75,-90],"spacequotedblleft":[-80,-80,-30,-30],"spacequoteleft":[-60,-60,-60,-60],"va":[-20,-20,-25,-25,-10,0,0,-25],"vaacute":[-20,-20,-25,-25,-10,0,0,-25],"vabreve":[-20,-20,-25,-25,-10,0,0,-25],"vacircumflex":[-20,-20,-25,-25,-10,0,0,-25],"vadieresis":[-20,-20,-25,-25,-10,0,0,-25],"vagrave":[-20,-20,-25,-25,-10,0,0,-25],"vamacron":[-20,-20,-25,-25,-10,0,0,-25],"vaogonek":[-20,-20,-25,-25,-10,0,0,-25],"varing":[-20,-20,-25,-25,-10,0,0,-25],"vatilde":[-20,-20,-25,-25,-10,0,0,-25],"vcomma":[-80,-80,-80,-80,-55,-37,-74,-65],"vo":[-30,-30,-25,-25,-10,-15,0,-20],"voacute":[-30,-30,-25,-25,-10,-15,0,-20],"vocircumflex":[-30,-30,-25,-25,-10,-15,0,-20],"vodieresis":[-30,-30,-25,-25,-10,-15,0,-20],"vograve":[-30,-30,-25,-25,-10,-15,0,-20],"vohungarumlaut":[-30,-30,-25,-25,-10,-15,0,-20],"vomacron":[-30,-30,-25,-25,-10,-15,0,-20],"voslash":[-30,-30,-25,-25,-10,-15,0,-20],"votilde":[-30,-30,-25,-25,-10,-15,0,-20],"vperiod":[-80,-80,-80,-80,-70,-37,-74,-65],"wcomma":[-40,-40,-60,-60,-55,-37,-74,-65],"wo":[-20,-20,-10,-10,-10,-15,0,-10],"woacute":[-20,-20,-10,-10,-10,-15,0,-10],"wocircumflex":[-20,-20,-10,-10,-10,-15,0,-10],"wodieresis":[-20,-20,-10,-10,-10,-15,0,-10],"wograve":[-20,-20,-10,-10,-10,-15,0,-10],"wohungarumlaut":[-20,-20,-10,-10,-10,-15,0,-10],"womacron":[-20,-20,-10,-10,-10,-15,0,-10],"woslash":[-20,-20,-10,-10,-10,-15,0,-10],"wotilde":[-20,-20,-10,-10,-10,-15,0,-10],"wperiod":[-40,-40,-60,-60,-70,-37,-74,-65],"xe":[-10,-10,-30,-30,0,-10,0,-15],"xeacute":[-10,-10,-30,-30,0,-10,0,-15],"xecaron":[-10,-10,-30,-30,0,-10,0,-15],"xecircumflex":[-10,-10,-30,-30,0,-10,0,-15],"xedieresis":[-10,-10,-30,-30,0,-10,0,-15],"xedotaccent":[-10,-10,-30,-30,0,-10,0,-15],"xegrave":[-10,-10,-30,-30,0,-10,0,-15],"xemacron":[-10,-10,-30,-30,0,-10,0,-15],"xeogonek":[-10,-10,-30,-30,0,-10,0,-15],"ya":[-30,-30,-20,-20],"yaacute":[-30,-30,-20,-20],"yabreve":[-30,-30,-20,-20],"yacircumflex":[-30,-30,-20,-20],"yadieresis":[-30,-30,-20,-20],"yagrave":[-30,-30,-20,-20],"yamacron":[-30,-30,-20,-20],"yaogonek":[-30,-30,-20,-20],"yaring":[-30,-30,-20,-20],"yatilde":[-30,-30,-20,-20],"ycomma":[-80,-80,-100,-100,-55,-37,-55,-65],"ye":[-10,-10,-20,-20,-10],"yeacute":[-10,-10,-20,-20,-10],"yecaron":[-10,-10,-20,-20,-10],"yecircumflex":[-10,-10,-20,-20,-10],"yedieresis":[-10,-10,-20,-20,-10],"yedotaccent":[-10,-10,-20,-20,-10],"yegrave":[-10,-10,-20,-20,-10],"yemacron":[-10,-10,-20,-20,-10],"yeogonek":[-10,-10,-20,-20,-10],"yo":[-25,-25,-20,-20,-25],"yoacute":[-25,-25,-20,-20,-25],"yocircumflex":[-25,-25,-20,-20,-25],"yodieresis":[-25,-25,-20,-20,-25],"yograve":[-25,-25,-20,-20,-25],"yohungarumlaut":[-25,-25,-20,-20,-25],"yomacron":[-25,-25,-20,-20,-25],"yoslash":[-25,-25,-20,-20,-25],"yotilde":[-25,-25,-20,-20,-25],"yperiod":[-80,-80,-100,-100,-70,-37,-55,-65],"yacutea":[-30,-30,-20,-20],"yacuteaacute":[-30,-30,-20,-20],"yacuteabreve":[-30,-30,-20,-20],"yacuteacircumflex":[-30,-30,-20,-20],"yacuteadieresis":[-30,-30,-20,-20],"yacuteagrave":[-30,-30,-20,-20],"yacuteamacron":[-30,-30,-20,-20],"yacuteaogonek":[-30,-30,-20,-20],"yacutearing":[-30,-30,-20,-20],"yacuteatilde":[-30,-30,-20,-20],"yacutecomma":[-80,-80,-100,-100,-55,-37,-55,-65],"yacutee":[-10,-10,-20,-20,-10],"yacuteeacute":[-10,-10,-20,-20,-10],"yacuteecaron":[-10,-10,-20,-20,-10],"yacuteecircumflex":[-10,-10,-20,-20,-10],"yacuteedieresis":[-10,-10,-20,-20,-10],"yacuteedotaccent":[-10,-10,-20,-20,-10],"yacuteegrave":[-10,-10,-20,-20,-10],"yacuteemacron":[-10,-10,-20,-20,-10],"yacuteeogonek":[-10,-10,-20,-20,-10],"yacuteo":[-25,-25,-20,-20,-25],"yacuteoacute":[-25,-25,-20,-20,-25],"yacuteocircumflex":[-25,-25,-20,-20,-25],"yacuteodieresis":[-25,-25,-20,-20,-25],"yacuteograve":[-25,-25,-20,-20,-25],"yacuteohungarumlaut":[-25,-25,-20,-20,-25],"yacuteomacron":[-25,-25,-20,-20,-25],"yacuteoslash":[-25,-25,-20,-20,-25],"yacuteotilde":[-25,-25,-20,-20,-25],"yacuteperiod":[-80,-80,-100,-100,-70,-37,-55,-65],"ydieresisa":[-30,-30,-20,-20],"ydieresisaacute":[-30,-30,-20,-20],"ydieresisabreve":[-30,-30,-20,-20],"ydieresisacircumflex":[-30,-30,-20,-20],"ydieresisadieresis":[-30,-30,-20,-20],"ydieresisagrave":[-30,-30,-20,-20],"ydieresisamacron":[-30,-30,-20,-20],"ydieresisaogonek":[-30,-30,-20,-20],"ydieresisaring":[-30,-30,-20,-20],"ydieresisatilde":[-30,-30,-20,-20],"ydieresiscomma":[-80,-80,-100,-100,-55,-37,-55,-65],"ydieresise":[-10,-10,-20,-20,-10],"ydieresiseacute":[-10,-10,-20,-20,-10],"ydieresisecaron":[-10,-10,-20,-20,-10],"ydieresisecircumflex":[-10,-10,-20,-20,-10],"ydieresisedieresis":[-10,-10,-20,-20,-10],"ydieresisedotaccent":[-10,-10,-20,-20,-10],"ydieresisegrave":[-10,-10,-20,-20,-10],"ydieresisemacron":[-10,-10,-20,-20,-10],"ydieresiseogonek":[-10,-10,-20,-20,-10],"ydieresiso":[-25,-25,-20,-20,-25],"ydieresisoacute":[-25,-25,-20,-20,-25],"ydieresisocircumflex":[-25,-25,-20,-20,-25],"ydieresisodieresis":[-25,-25,-20,-20,-25],"ydieresisograve":[-25,-25,-20,-20,-25],"ydieresisohungarumlaut":[-25,-25,-20,-20,-25],"ydieresisomacron":[-25,-25,-20,-20,-25],"ydieresisoslash":[-25,-25,-20,-20,-25],"ydieresisotilde":[-25,-25,-20,-20,-25],"ydieresisperiod":[-80,-80,-100,-100,-70,-37,-55,-65],"ze":[10,10,-15,-15],"zeacute":[10,10,-15,-15],"zecaron":[10,10,-15,-15],"zecircumflex":[10,10,-15,-15],"zedieresis":[10,10,-15,-15],"zedotaccent":[10,10,-15,-15],"zegrave":[10,10,-15,-15],"zemacron":[10,10,-15,-15],"zeogonek":[10,10,-15,-15],"zacutee":[10,10,-15,-15],"zacuteeacute":[10,10,-15,-15],"zacuteecaron":[10,10,-15,-15],"zacuteecircumflex":[10,10,-15,-15],"zacuteedieresis":[10,10,-15,-15],"zacuteedotaccent":[10,10,-15,-15],"zacuteegrave":[10,10,-15,-15],"zacuteemacron":[10,10,-15,-15],"zacuteeogonek":[10,10,-15,-15],"zcarone":[10,10,-15,-15],"zcaroneacute":[10,10,-15,-15],"zcaronecaron":[10,10,-15,-15],"zcaronecircumflex":[10,10,-15,-15],"zcaronedieresis":[10,10,-15,-15],"zcaronedotaccent":[10,10,-15,-15],"zcaronegrave":[10,10,-15,-15],"zcaronemacron":[10,10,-15,-15],"zcaroneogonek":[10,10,-15,-15],"zdotaccente":[10,10,-15,-15],"zdotaccenteacute":[10,10,-15,-15],"zdotaccentecaron":[10,10,-15,-15],"zdotaccentecircumflex":[10,10,-15,-15],"zdotaccentedieresis":[10,10,-15,-15],"zdotaccentedotaccent":[10,10,-15,-15],"zdotaccentegrave":[10,10,-15,-15],"zdotaccentemacron":[10,10,-15,-15],"zdotaccenteogonek":[10,10,-15,-15],"Bcomma":[0,0,-20,-20],"Bperiod":[0,0,-20,-20],"Ccomma":[0,0,-30,-30],"Cperiod":[0,0,-30,-30],"Cacutecomma":[0,0,-30,-30],"Cacuteperiod":[0,0,-30,-30],"Ccaroncomma":[0,0,-30,-30],"Ccaronperiod":[0,0,-30,-30],"Ccedillacomma":[0,0,-30,-30],"Ccedillaperiod":[0,0,-30,-30],"Fe":[0,0,-30,-30,-25,-100,-75],"Feacute":[0,0,-30,-30,-25,-100,-75],"Fecaron":[0,0,-30,-30,-25,-100,-75],"Fecircumflex":[0,0,-30,-30,-25,-100,-75],"Fedieresis":[0,0,-30,-30,-25,-100,-75],"Fedotaccent":[0,0,-30,-30,-25,-100,-75],"Fegrave":[0,0,-30,-30,-25,-100,-75],"Femacron":[0,0,-30,-30,-25,-100,-75],"Feogonek":[0,0,-30,-30,-25,-100,-75],"Fo":[0,0,-30,-30,-25,-70,-105,-15],"Foacute":[0,0,-30,-30,-25,-70,-105,-15],"Focircumflex":[0,0,-30,-30,-25,-70,-105,-15],"Fodieresis":[0,0,-30,-30,-25,-70,-105,-15],"Fograve":[0,0,-30,-30,-25,-70,-105,-15],"Fohungarumlaut":[0,0,-30,-30,-25,-70,-105,-15],"Fomacron":[0,0,-30,-30,-25,-70,-105,-15],"Foslash":[0,0,-30,-30,-25,-70,-105,-15],"Fotilde":[0,0,-30,-30,-25,-70,-105,-15],"Fr":[0,0,-45,-45,0,-50,-55],"Fracute":[0,0,-45,-45,0,-50,-55],"Frcaron":[0,0,-45,-45,0,-50,-55],"Frcommaaccent":[0,0,-45,-45,0,-50,-55],"Ja":[0,0,-20,-20,-15,-40,-35],"Jaacute":[0,0,-20,-20,-15,-40,-35],"Jabreve":[0,0,-20,-20,-15,-40,-35],"Jacircumflex":[0,0,-20,-20,-15,-40,-35],"Jadieresis":[0,0,-20,-20,-15,-40,-35],"Jagrave":[0,0,-20,-20,-15,-40,-35],"Jamacron":[0,0,-20,-20,-15,-40,-35],"Jaogonek":[0,0,-20,-20,-15,-40,-35],"Jaring":[0,0,-20,-20,-15,-40,-35],"Jatilde":[0,0,-20,-20,-15,-40,-35],"LcaronT":[0,0,-110,-110],"LcaronTcaron":[0,0,-110,-110],"LcaronTcommaaccent":[0,0,-110,-110],"LcaronV":[0,0,-110,-110],"LcaronW":[0,0,-70,-70],"LcaronY":[0,0,-140,-140],"LcaronYacute":[0,0,-140,-140],"LcaronYdieresis":[0,0,-140,-140],"Lcaronquotedblright":[0,0,-140,-140],"Lcaronquoteright":[0,0,-160,-160,0,0,0,-92],"Lcarony":[0,0,-30,-30,0,0,0,-55],"Lcaronyacute":[0,0,-30,-30,0,0,0,-55],"Lcaronydieresis":[0,0,-30,-30,0,0,0,-55],"Scomma":[0,0,-20,-20],"Speriod":[0,0,-20,-20],"Sacutecomma":[0,0,-20,-20],"Sacuteperiod":[0,0,-20,-20],"Scaroncomma":[0,0,-20,-20],"Scaronperiod":[0,0,-20,-20],"Scedillacomma":[0,0,-20,-20],"Scedillaperiod":[0,0,-20,-20],"Scommaaccentcomma":[0,0,-20,-20],"Scommaaccentperiod":[0,0,-20,-20],"Trcaron":[0,0,-120,-120,-74,-37,-55,-35],"Tcaronrcaron":[0,0,-120,-120,-74,-37,-55,-35],"Tcommaaccentrcaron":[0,0,-120,-120,-74,-37,-55,-35],"Yhyphen":[0,0,-140,-140,-92,-92,-74,-111],"Yi":[0,0,-20,-20,-37,-55,-74,-55],"Yiacute":[0,0,-20,-20,-37,-55,-74,-55],"Yiogonek":[0,0,-20,-20,-37,-55,-74,-55],"Yacutehyphen":[0,0,-140,-140,-92,-92,-74,-111],"Yacutei":[0,0,-20,-20,-37,-55,-74,-55],"Yacuteiacute":[0,0,-20,-20,-37,-55,-74,-55],"Yacuteiogonek":[0,0,-20,-20,-37,-55,-74,-55],"Ydieresishyphen":[0,0,-140,-140,-92,-92,-74,-111],"Ydieresisi":[0,0,-20,-20,-37,-55,-74,-55],"Ydieresisiacute":[0,0,-20,-20,-37,-55,-74,-55],"Ydieresisiogonek":[0,0,-20,-20,-37,-55,-74,-55],"bb":[0,0,-10,-10,-10,-10],"bcomma":[0,0,-40,-40],"bperiod":[0,0,-40,-40,-40,-40,-40,-40],"ccomma":[0,0,-15,-15],"cacutecomma":[0,0,-15,-15],"ccaroncomma":[0,0,-15,-15],"ccedillacomma":[0,0,-15,-15],"fa":[0,0,-30,-30,0,0,0,-10],"faacute":[0,0,-30,-30,0,0,0,-10],"fabreve":[0,0,-30,-30,0,0,0,-10],"facircumflex":[0,0,-30,-30,0,0,0,-10],"fadieresis":[0,0,-30,-30,0,0,0,-10],"fagrave":[0,0,-30,-30,0,0,0,-10],"famacron":[0,0,-30,-30,0,0,0,-10],"faogonek":[0,0,-30,-30,0,0,0,-10],"faring":[0,0,-30,-30,0,0,0,-10],"fatilde":[0,0,-30,-30,0,0,0,-10],"fdotlessi":[0,0,-28,-28,-35,-30,-60,-50],"gr":[0,0,-10,-10],"gracute":[0,0,-10,-10],"grcaron":[0,0,-10,-10],"grcommaaccent":[0,0,-10,-10],"gbrever":[0,0,-10,-10],"gbreveracute":[0,0,-10,-10],"gbrevercaron":[0,0,-10,-10],"gbrevercommaaccent":[0,0,-10,-10],"gcommaaccentr":[0,0,-10,-10],"gcommaaccentracute":[0,0,-10,-10],"gcommaaccentrcaron":[0,0,-10,-10],"gcommaaccentrcommaaccent":[0,0,-10,-10],"ke":[0,0,-20,-20,-10,-30,-10,-10],"keacute":[0,0,-20,-20,-10,-30,-10,-10],"kecaron":[0,0,-20,-20,-10,-30,-10,-10],"kecircumflex":[0,0,-20,-20,-10,-30,-10,-10],"kedieresis":[0,0,-20,-20,-10,-30,-10,-10],"kedotaccent":[0,0,-20,-20,-10,-30,-10,-10],"kegrave":[0,0,-20,-20,-10,-30,-10,-10],"kemacron":[0,0,-20,-20,-10,-30,-10,-10],"keogonek":[0,0,-20,-20,-10,-30,-10,-10],"kcommaaccente":[0,0,-20,-20,-10,-30,-10,-10],"kcommaaccenteacute":[0,0,-20,-20,-10,-30,-10,-10],"kcommaaccentecaron":[0,0,-20,-20,-10,-30,-10,-10],"kcommaaccentecircumflex":[0,0,-20,-20,-10,-30,-10,-10],"kcommaaccentedieresis":[0,0,-20,-20,-10,-30,-10,-10],"kcommaaccentedotaccent":[0,0,-20,-20,-10,-30,-10,-10],"kcommaaccentegrave":[0,0,-20,-20,-10,-30,-10,-10],"kcommaaccentemacron":[0,0,-20,-20,-10,-30,-10,-10],"kcommaaccenteogonek":[0,0,-20,-20,-10,-30,-10,-10],"ocomma":[0,0,-40,-40],"operiod":[0,0,-40,-40],"oacutecomma":[0,0,-40,-40],"oacuteperiod":[0,0,-40,-40],"ocircumflexcomma":[0,0,-40,-40],"ocircumflexperiod":[0,0,-40,-40],"odieresiscomma":[0,0,-40,-40],"odieresisperiod":[0,0,-40,-40],"ogravecomma":[0,0,-40,-40],"ograveperiod":[0,0,-40,-40],"ohungarumlautcomma":[0,0,-40,-40],"ohungarumlautperiod":[0,0,-40,-40],"omacroncomma":[0,0,-40,-40],"omacronperiod":[0,0,-40,-40],"oslasha":[0,0,-55,-55],"oslashaacute":[0,0,-55,-55],"oslashabreve":[0,0,-55,-55],"oslashacircumflex":[0,0,-55,-55],"oslashadieresis":[0,0,-55,-55],"oslashagrave":[0,0,-55,-55],"oslashamacron":[0,0,-55,-55],"oslashaogonek":[0,0,-55,-55],"oslasharing":[0,0,-55,-55],"oslashatilde":[0,0,-55,-55],"oslashb":[0,0,-55,-55],"oslashc":[0,0,-55,-55],"oslashcacute":[0,0,-55,-55],"oslashccaron":[0,0,-55,-55],"oslashccedilla":[0,0,-55,-55],"oslashcomma":[0,0,-95,-95],"oslashd":[0,0,-55,-55],"oslashdcroat":[0,0,-55,-55],"oslashe":[0,0,-55,-55],"oslasheacute":[0,0,-55,-55],"oslashecaron":[0,0,-55,-55],"oslashecircumflex":[0,0,-55,-55],"oslashedieresis":[0,0,-55,-55],"oslashedotaccent":[0,0,-55,-55],"oslashegrave":[0,0,-55,-55],"oslashemacron":[0,0,-55,-55],"oslasheogonek":[0,0,-55,-55],"oslashf":[0,0,-55,-55],"oslashg":[0,0,-55,-55,0,0,-10],"oslashgbreve":[0,0,-55,-55,0,0,-10],"oslashgcommaaccent":[0,0,-55,-55,0,0,-10],"oslashh":[0,0,-55,-55],"oslashi":[0,0,-55,-55],"oslashiacute":[0,0,-55,-55],"oslashicircumflex":[0,0,-55,-55],"oslashidieresis":[0,0,-55,-55],"oslashigrave":[0,0,-55,-55],"oslashimacron":[0,0,-55,-55],"oslashiogonek":[0,0,-55,-55],"oslashj":[0,0,-55,-55],"oslashk":[0,0,-55,-55],"oslashkcommaaccent":[0,0,-55,-55],"oslashl":[0,0,-55,-55],"oslashlacute":[0,0,-55,-55],"oslashlcommaaccent":[0,0,-55,-55],"oslashlslash":[0,0,-55,-55],"oslashm":[0,0,-55,-55],"oslashn":[0,0,-55,-55],"oslashnacute":[0,0,-55,-55],"oslashncaron":[0,0,-55,-55],"oslashncommaaccent":[0,0,-55,-55],"oslashntilde":[0,0,-55,-55],"oslasho":[0,0,-55,-55],"oslashoacute":[0,0,-55,-55],"oslashocircumflex":[0,0,-55,-55],"oslashodieresis":[0,0,-55,-55],"oslashograve":[0,0,-55,-55],"oslashohungarumlaut":[0,0,-55,-55],"oslashomacron":[0,0,-55,-55],"oslashoslash":[0,0,-55,-55],"oslashotilde":[0,0,-55,-55],"oslashp":[0,0,-55,-55],"oslashperiod":[0,0,-95,-95],"oslashq":[0,0,-55,-55],"oslashr":[0,0,-55,-55],"oslashracute":[0,0,-55,-55],"oslashrcaron":[0,0,-55,-55],"oslashrcommaaccent":[0,0,-55,-55],"oslashs":[0,0,-55,-55],"oslashsacute":[0,0,-55,-55],"oslashscaron":[0,0,-55,-55],"oslashscedilla":[0,0,-55,-55],"oslashscommaaccent":[0,0,-55,-55],"oslasht":[0,0,-55,-55],"oslashtcommaaccent":[0,0,-55,-55],"oslashu":[0,0,-55,-55],"oslashuacute":[0,0,-55,-55],"oslashucircumflex":[0,0,-55,-55],"oslashudieresis":[0,0,-55,-55],"oslashugrave":[0,0,-55,-55],"oslashuhungarumlaut":[0,0,-55,-55],"oslashumacron":[0,0,-55,-55],"oslashuogonek":[0,0,-55,-55],"oslashuring":[0,0,-55,-55],"oslashz":[0,0,-55,-55],"oslashzacute":[0,0,-55,-55],"oslashzcaron":[0,0,-55,-55],"oslashzdotaccent":[0,0,-55,-55],"otildecomma":[0,0,-40,-40],"otildeperiod":[0,0,-40,-40],"pcomma":[0,0,-35,-35],"pperiod":[0,0,-35,-35],"ra":[0,0,-10,-10,0,0,-15],"raacute":[0,0,-10,-10,0,0,-15],"rabreve":[0,0,-10,-10,0,0,-15],"racircumflex":[0,0,-10,-10,0,0,-15],"radieresis":[0,0,-10,-10,0,0,-15],"ragrave":[0,0,-10,-10,0,0,-15],"ramacron":[0,0,-10,-10,0,0,-15],"raogonek":[0,0,-10,-10,0,0,-15],"raring":[0,0,-10,-10,0,0,-15],"ratilde":[0,0,-10,-10,0,0,-15],"rcolon":[0,0,30,30],"ri":[0,0,15,15],"riacute":[0,0,15,15],"ricircumflex":[0,0,15,15],"ridieresis":[0,0,15,15],"rigrave":[0,0,15,15],"rimacron":[0,0,15,15],"riogonek":[0,0,15,15],"rk":[0,0,15,15],"rkcommaaccent":[0,0,15,15],"rl":[0,0,15,15],"rlacute":[0,0,15,15],"rlcommaaccent":[0,0,15,15],"rlslash":[0,0,15,15],"rm":[0,0,25,25],"rn":[0,0,25,25,-15],"rnacute":[0,0,25,25,-15],"rncaron":[0,0,25,25,-15],"rncommaaccent":[0,0,25,25,-15],"rntilde":[0,0,25,25,-15],"rp":[0,0,30,30,-10],"rsemicolon":[0,0,30,30],"ru":[0,0,15,15],"ruacute":[0,0,15,15],"rucircumflex":[0,0,15,15],"rudieresis":[0,0,15,15],"rugrave":[0,0,15,15],"ruhungarumlaut":[0,0,15,15],"rumacron":[0,0,15,15],"ruogonek":[0,0,15,15],"ruring":[0,0,15,15],"racutea":[0,0,-10,-10,0,0,-15],"racuteaacute":[0,0,-10,-10,0,0,-15],"racuteabreve":[0,0,-10,-10,0,0,-15],"racuteacircumflex":[0,0,-10,-10,0,0,-15],"racuteadieresis":[0,0,-10,-10,0,0,-15],"racuteagrave":[0,0,-10,-10,0,0,-15],"racuteamacron":[0,0,-10,-10,0,0,-15],"racuteaogonek":[0,0,-10,-10,0,0,-15],"racutearing":[0,0,-10,-10,0,0,-15],"racuteatilde":[0,0,-10,-10,0,0,-15],"racutecolon":[0,0,30,30],"racutei":[0,0,15,15],"racuteiacute":[0,0,15,15],"racuteicircumflex":[0,0,15,15],"racuteidieresis":[0,0,15,15],"racuteigrave":[0,0,15,15],"racuteimacron":[0,0,15,15],"racuteiogonek":[0,0,15,15],"racutek":[0,0,15,15],"racutekcommaaccent":[0,0,15,15],"racutel":[0,0,15,15],"racutelacute":[0,0,15,15],"racutelcommaaccent":[0,0,15,15],"racutelslash":[0,0,15,15],"racutem":[0,0,25,25],"racuten":[0,0,25,25,-15],"racutenacute":[0,0,25,25,-15],"racutencaron":[0,0,25,25,-15],"racutencommaaccent":[0,0,25,25,-15],"racutentilde":[0,0,25,25,-15],"racutep":[0,0,30,30,-10],"racutesemicolon":[0,0,30,30],"racuteu":[0,0,15,15],"racuteuacute":[0,0,15,15],"racuteucircumflex":[0,0,15,15],"racuteudieresis":[0,0,15,15],"racuteugrave":[0,0,15,15],"racuteuhungarumlaut":[0,0,15,15],"racuteumacron":[0,0,15,15],"racuteuogonek":[0,0,15,15],"racuteuring":[0,0,15,15],"rcarona":[0,0,-10,-10,0,0,-15],"rcaronaacute":[0,0,-10,-10,0,0,-15],"rcaronabreve":[0,0,-10,-10,0,0,-15],"rcaronacircumflex":[0,0,-10,-10,0,0,-15],"rcaronadieresis":[0,0,-10,-10,0,0,-15],"rcaronagrave":[0,0,-10,-10,0,0,-15],"rcaronamacron":[0,0,-10,-10,0,0,-15],"rcaronaogonek":[0,0,-10,-10,0,0,-15],"rcaronaring":[0,0,-10,-10,0,0,-15],"rcaronatilde":[0,0,-10,-10,0,0,-15],"rcaroncolon":[0,0,30,30],"rcaroni":[0,0,15,15],"rcaroniacute":[0,0,15,15],"rcaronicircumflex":[0,0,15,15],"rcaronidieresis":[0,0,15,15],"rcaronigrave":[0,0,15,15],"rcaronimacron":[0,0,15,15],"rcaroniogonek":[0,0,15,15],"rcaronk":[0,0,15,15],"rcaronkcommaaccent":[0,0,15,15],"rcaronl":[0,0,15,15],"rcaronlacute":[0,0,15,15],"rcaronlcommaaccent":[0,0,15,15],"rcaronlslash":[0,0,15,15],"rcaronm":[0,0,25,25],"rcaronn":[0,0,25,25,-15],"rcaronnacute":[0,0,25,25,-15],"rcaronncaron":[0,0,25,25,-15],"rcaronncommaaccent":[0,0,25,25,-15],"rcaronntilde":[0,0,25,25,-15],"rcaronp":[0,0,30,30,-10],"rcaronsemicolon":[0,0,30,30],"rcaronu":[0,0,15,15],"rcaronuacute":[0,0,15,15],"rcaronucircumflex":[0,0,15,15],"rcaronudieresis":[0,0,15,15],"rcaronugrave":[0,0,15,15],"rcaronuhungarumlaut":[0,0,15,15],"rcaronumacron":[0,0,15,15],"rcaronuogonek":[0,0,15,15],"rcaronuring":[0,0,15,15],"rcommaaccenta":[0,0,-10,-10,0,0,-15],"rcommaaccentaacute":[0,0,-10,-10,0,0,-15],"rcommaaccentabreve":[0,0,-10,-10,0,0,-15],"rcommaaccentacircumflex":[0,0,-10,-10,0,0,-15],"rcommaaccentadieresis":[0,0,-10,-10,0,0,-15],"rcommaaccentagrave":[0,0,-10,-10,0,0,-15],"rcommaaccentamacron":[0,0,-10,-10,0,0,-15],"rcommaaccentaogonek":[0,0,-10,-10,0,0,-15],"rcommaaccentaring":[0,0,-10,-10,0,0,-15],"rcommaaccentatilde":[0,0,-10,-10,0,0,-15],"rcommaaccentcolon":[0,0,30,30],"rcommaaccenti":[0,0,15,15],"rcommaaccentiacute":[0,0,15,15],"rcommaaccenticircumflex":[0,0,15,15],"rcommaaccentidieresis":[0,0,15,15],"rcommaaccentigrave":[0,0,15,15],"rcommaaccentimacron":[0,0,15,15],"rcommaaccentiogonek":[0,0,15,15],"rcommaaccentk":[0,0,15,15],"rcommaaccentkcommaaccent":[0,0,15,15],"rcommaaccentl":[0,0,15,15],"rcommaaccentlacute":[0,0,15,15],"rcommaaccentlcommaaccent":[0,0,15,15],"rcommaaccentlslash":[0,0,15,15],"rcommaaccentm":[0,0,25,25],"rcommaaccentn":[0,0,25,25,-15],"rcommaaccentnacute":[0,0,25,25,-15],"rcommaaccentncaron":[0,0,25,25,-15],"rcommaaccentncommaaccent":[0,0,25,25,-15],"rcommaaccentntilde":[0,0,25,25,-15],"rcommaaccentp":[0,0,30,30,-10],"rcommaaccentsemicolon":[0,0,30,30],"rcommaaccentu":[0,0,15,15],"rcommaaccentuacute":[0,0,15,15],"rcommaaccentucircumflex":[0,0,15,15],"rcommaaccentudieresis":[0,0,15,15],"rcommaaccentugrave":[0,0,15,15],"rcommaaccentuhungarumlaut":[0,0,15,15],"rcommaaccentumacron":[0,0,15,15],"rcommaaccentuogonek":[0,0,15,15],"rcommaaccenturing":[0,0,15,15],"scomma":[0,0,-15,-15],"speriod":[0,0,-15,-15],"sacutecomma":[0,0,-15,-15],"sacuteperiod":[0,0,-15,-15],"scaroncomma":[0,0,-15,-15],"scaronperiod":[0,0,-15,-15],"scedillacomma":[0,0,-15,-15],"scedillaperiod":[0,0,-15,-15],"scommaaccentcomma":[0,0,-15,-15],"scommaaccentperiod":[0,0,-15,-15],"ve":[0,0,-25,-25,-10,-15,0,-15],"veacute":[0,0,-25,-25,-10,-15,0,-15],"vecaron":[0,0,-25,-25,-10,-15,0,-15],"vecircumflex":[0,0,-25,-25,-10,-15,0,-15],"vedieresis":[0,0,-25,-25,-10,-15,0,-15],"vedotaccent":[0,0,-25,-25,-10,-15,0,-15],"vegrave":[0,0,-25,-25,-10,-15,0,-15],"vemacron":[0,0,-25,-25,-10,-15,0,-15],"veogonek":[0,0,-25,-25,-10,-15,0,-15],"wa":[0,0,-15,-15,0,-10,0,-10],"waacute":[0,0,-15,-15,0,-10,0,-10],"wabreve":[0,0,-15,-15,0,-10,0,-10],"wacircumflex":[0,0,-15,-15,0,-10,0,-10],"wadieresis":[0,0,-15,-15,0,-10,0,-10],"wagrave":[0,0,-15,-15,0,-10,0,-10],"wamacron":[0,0,-15,-15,0,-10,0,-10],"waogonek":[0,0,-15,-15,0,-10,0,-10],"waring":[0,0,-15,-15,0,-10,0,-10],"watilde":[0,0,-15,-15,0,-10,0,-10],"we":[0,0,-10,-10,0,-10],"weacute":[0,0,-10,-10,0,-10],"wecaron":[0,0,-10,-10,0,-10],"wecircumflex":[0,0,-10,-10,0,-10],"wedieresis":[0,0,-10,-10,0,-10],"wedotaccent":[0,0,-10,-10,0,-10],"wegrave":[0,0,-10,-10,0,-10],"wemacron":[0,0,-10,-10,0,-10],"weogonek":[0,0,-10,-10,0,-10],"zo":[0,0,-15,-15],"zoacute":[0,0,-15,-15],"zocircumflex":[0,0,-15,-15],"zodieresis":[0,0,-15,-15],"zograve":[0,0,-15,-15],"zohungarumlaut":[0,0,-15,-15],"zomacron":[0,0,-15,-15],"zoslash":[0,0,-15,-15],"zotilde":[0,0,-15,-15],"zacuteo":[0,0,-15,-15],"zacuteoacute":[0,0,-15,-15],"zacuteocircumflex":[0,0,-15,-15],"zacuteodieresis":[0,0,-15,-15],"zacuteograve":[0,0,-15,-15],"zacuteohungarumlaut":[0,0,-15,-15],"zacuteomacron":[0,0,-15,-15],"zacuteoslash":[0,0,-15,-15],"zacuteotilde":[0,0,-15,-15],"zcarono":[0,0,-15,-15],"zcaronoacute":[0,0,-15,-15],"zcaronocircumflex":[0,0,-15,-15],"zcaronodieresis":[0,0,-15,-15],"zcaronograve":[0,0,-15,-15],"zcaronohungarumlaut":[0,0,-15,-15],"zcaronomacron":[0,0,-15,-15],"zcaronoslash":[0,0,-15,-15],"zcaronotilde":[0,0,-15,-15],"zdotaccento":[0,0,-15,-15],"zdotaccentoacute":[0,0,-15,-15],"zdotaccentocircumflex":[0,0,-15,-15],"zdotaccentodieresis":[0,0,-15,-15],"zdotaccentograve":[0,0,-15,-15],"zdotaccentohungarumlaut":[0,0,-15,-15],"zdotaccentomacron":[0,0,-15,-15],"zdotaccentoslash":[0,0,-15,-15],"zdotaccentotilde":[0,0,-15,-15],"Ap":[0,0,0,0,-25],"Aquoteright":[0,0,0,0,-74,-74,-37,-111],"Aacutep":[0,0,0,0,-25],"Aacutequoteright":[0,0,0,0,-74,-74,-37,-111],"Abrevep":[0,0,0,0,-25],"Abrevequoteright":[0,0,0,0,-74,-74,-37,-111],"Acircumflexp":[0,0,0,0,-25],"Acircumflexquoteright":[0,0,0,0,-74,-74,-37,-111],"Adieresisp":[0,0,0,0,-25],"Adieresisquoteright":[0,0,0,0,-74,-74,-37,-111],"Agravep":[0,0,0,0,-25],"Agravequoteright":[0,0,0,0,-74,-74,-37,-111],"Amacronp":[0,0,0,0,-25],"Amacronquoteright":[0,0,0,0,-74,-74,-37,-111],"Aogonekp":[0,0,0,0,-25],"Aogonekquoteright":[0,0,0,0,-74,-74,-37,-111],"Aringp":[0,0,0,0,-25],"Aringquoteright":[0,0,0,0,-74,-74,-37,-111],"Atildep":[0,0,0,0,-25],"Atildequoteright":[0,0,0,0,-74,-74,-37,-111],"Je":[0,0,0,0,-15,-40,-25],"Jeacute":[0,0,0,0,-15,-40,-25],"Jecaron":[0,0,0,0,-15,-40,-25],"Jecircumflex":[0,0,0,0,-15,-40,-25],"Jedieresis":[0,0,0,0,-15,-40,-25],"Jedotaccent":[0,0,0,0,-15,-40,-25],"Jegrave":[0,0,0,0,-15,-40,-25],"Jemacron":[0,0,0,0,-15,-40,-25],"Jeogonek":[0,0,0,0,-15,-40,-25],"Jo":[0,0,0,0,-15,-40,-25],"Joacute":[0,0,0,0,-15,-40,-25],"Jocircumflex":[0,0,0,0,-15,-40,-25],"Jodieresis":[0,0,0,0,-15,-40,-25],"Jograve":[0,0,0,0,-15,-40,-25],"Johungarumlaut":[0,0,0,0,-15,-40,-25],"Jomacron":[0,0,0,0,-15,-40,-25],"Joslash":[0,0,0,0,-15,-40,-25],"Jotilde":[0,0,0,0,-15,-40,-25],"NA":[0,0,0,0,-20,-30,-27,-35],"NAacute":[0,0,0,0,-20,-30,-27,-35],"NAbreve":[0,0,0,0,-20,-30,-27,-35],"NAcircumflex":[0,0,0,0,-20,-30,-27,-35],"NAdieresis":[0,0,0,0,-20,-30,-27,-35],"NAgrave":[0,0,0,0,-20,-30,-27,-35],"NAmacron":[0,0,0,0,-20,-30,-27,-35],"NAogonek":[0,0,0,0,-20,-30,-27,-35],"NAring":[0,0,0,0,-20,-30,-27,-35],"NAtilde":[0,0,0,0,-20,-30,-27,-35],"NacuteA":[0,0,0,0,-20,-30,-27,-35],"NacuteAacute":[0,0,0,0,-20,-30,-27,-35],"NacuteAbreve":[0,0,0,0,-20,-30,-27,-35],"NacuteAcircumflex":[0,0,0,0,-20,-30,-27,-35],"NacuteAdieresis":[0,0,0,0,-20,-30,-27,-35],"NacuteAgrave":[0,0,0,0,-20,-30,-27,-35],"NacuteAmacron":[0,0,0,0,-20,-30,-27,-35],"NacuteAogonek":[0,0,0,0,-20,-30,-27,-35],"NacuteAring":[0,0,0,0,-20,-30,-27,-35],"NacuteAtilde":[0,0,0,0,-20,-30,-27,-35],"NcaronA":[0,0,0,0,-20,-30,-27,-35],"NcaronAacute":[0,0,0,0,-20,-30,-27,-35],"NcaronAbreve":[0,0,0,0,-20,-30,-27,-35],"NcaronAcircumflex":[0,0,0,0,-20,-30,-27,-35],"NcaronAdieresis":[0,0,0,0,-20,-30,-27,-35],"NcaronAgrave":[0,0,0,0,-20,-30,-27,-35],"NcaronAmacron":[0,0,0,0,-20,-30,-27,-35],"NcaronAogonek":[0,0,0,0,-20,-30,-27,-35],"NcaronAring":[0,0,0,0,-20,-30,-27,-35],"NcaronAtilde":[0,0,0,0,-20,-30,-27,-35],"NcommaaccentA":[0,0,0,0,-20,-30,-27,-35],"NcommaaccentAacute":[0,0,0,0,-20,-30,-27,-35],"NcommaaccentAbreve":[0,0,0,0,-20,-30,-27,-35],"NcommaaccentAcircumflex":[0,0,0,0,-20,-30,-27,-35],"NcommaaccentAdieresis":[0,0,0,0,-20,-30,-27,-35],"NcommaaccentAgrave":[0,0,0,0,-20,-30,-27,-35],"NcommaaccentAmacron":[0,0,0,0,-20,-30,-27,-35],"NcommaaccentAogonek":[0,0,0,0,-20,-30,-27,-35],"NcommaaccentAring":[0,0,0,0,-20,-30,-27,-35],"NcommaaccentAtilde":[0,0,0,0,-20,-30,-27,-35],"NtildeA":[0,0,0,0,-20,-30,-27,-35],"NtildeAacute":[0,0,0,0,-20,-30,-27,-35],"NtildeAbreve":[0,0,0,0,-20,-30,-27,-35],"NtildeAcircumflex":[0,0,0,0,-20,-30,-27,-35],"NtildeAdieresis":[0,0,0,0,-20,-30,-27,-35],"NtildeAgrave":[0,0,0,0,-20,-30,-27,-35],"NtildeAmacron":[0,0,0,0,-20,-30,-27,-35],"NtildeAogonek":[0,0,0,0,-20,-30,-27,-35],"NtildeAring":[0,0,0,0,-20,-30,-27,-35],"NtildeAtilde":[0,0,0,0,-20,-30,-27,-35],"Ti":[0,0,0,0,-18,-37,-55,-35],"Tiacute":[0,0,0,0,-18,-37,-55,-35],"Tiogonek":[0,0,0,0,-18,-37,-55,-35],"Tcaroni":[0,0,0,0,-18,-37,-55,-35],"Tcaroniacute":[0,0,0,0,-18,-37,-55,-35],"Tcaroniogonek":[0,0,0,0,-18,-37,-55,-35],"Tcommaaccenti":[0,0,0,0,-18,-37,-55,-35],"Tcommaaccentiacute":[0,0,0,0,-18,-37,-55,-35],"Tcommaaccentiogonek":[0,0,0,0,-18,-37,-55,-35],"Vi":[0,0,0,0,-37,-55,-74,-60],"Viacute":[0,0,0,0,-37,-55,-74,-60],"Vicircumflex":[0,0,0,0,-37,0,-34,-20],"Vidieresis":[0,0,0,0,-37,0,-34,-20],"Vigrave":[0,0,0,0,-37,0,-34,-20],"Vimacron":[0,0,0,0,-37,0,-34,-20],"Viogonek":[0,0,0,0,-37,-55,-74,-60],"Wi":[0,0,0,0,-18,-37,-55,-40],"Wiacute":[0,0,0,0,-18,-37,-55,-40],"Wiogonek":[0,0,0,0,-18,-37,-55,-40],"fi":[0,0,0,0,-25,0,-20,-20],"gperiod":[0,0,0,0,-15,0,-15],"gbreveperiod":[0,0,0,0,-15,0,-15],"gcommaaccentperiod":[0,0,0,0,-15,0,-15],"iv":[0,0,0,0,-10,0,0,-25],"iacutev":[0,0,0,0,-10,0,0,-25],"icircumflexv":[0,0,0,0,-10,0,0,-25],"idieresisv":[0,0,0,0,-10,0,0,-25],"igravev":[0,0,0,0,-10,0,0,-25],"imacronv":[0,0,0,0,-10,0,0,-25],"iogonekv":[0,0,0,0,-10,0,0,-25],"ky":[0,0,0,0,-15,0,-10,-15],"kyacute":[0,0,0,0,-15,0,-10,-15],"kydieresis":[0,0,0,0,-15,0,-10,-15],"kcommaaccenty":[0,0,0,0,-15,0,-10,-15],"kcommaaccentyacute":[0,0,0,0,-15,0,-10,-15],"kcommaaccentydieresis":[0,0,0,0,-15,0,-10,-15],"quotedblleftA":[0,0,0,0,-10,0,0,-80],"quotedblleftAacute":[0,0,0,0,-10,0,0,-80],"quotedblleftAbreve":[0,0,0,0,-10,0,0,-80],"quotedblleftAcircumflex":[0,0,0,0,-10,0,0,-80],"quotedblleftAdieresis":[0,0,0,0,-10,0,0,-80],"quotedblleftAgrave":[0,0,0,0,-10,0,0,-80],"quotedblleftAmacron":[0,0,0,0,-10,0,0,-80],"quotedblleftAogonek":[0,0,0,0,-10,0,0,-80],"quotedblleftAring":[0,0,0,0,-10,0,0,-80],"quotedblleftAtilde":[0,0,0,0,-10,0,0,-80],"quoteleftA":[0,0,0,0,-10,0,0,-80],"quoteleftAacute":[0,0,0,0,-10,0,0,-80],"quoteleftAbreve":[0,0,0,0,-10,0,0,-80],"quoteleftAcircumflex":[0,0,0,0,-10,0,0,-80],"quoteleftAdieresis":[0,0,0,0,-10,0,0,-80],"quoteleftAgrave":[0,0,0,0,-10,0,0,-80],"quoteleftAmacron":[0,0,0,0,-10,0,0,-80],"quoteleftAogonek":[0,0,0,0,-10,0,0,-80],"quoteleftAring":[0,0,0,0,-10,0,0,-80],"quoteleftAtilde":[0,0,0,0,-10,0,0,-80],"re":[0,0,0,0,-18,0,-37],"reacute":[0,0,0,0,-18,0,-37],"recaron":[0,0,0,0,-18,0,-37],"recircumflex":[0,0,0,0,-18,0,-37],"redieresis":[0,0,0,0,-18,0,-37],"redotaccent":[0,0,0,0,-18,0,-37],"regrave":[0,0,0,0,-18,0,-37],"remacron":[0,0,0,0,-18,0,-37],"reogonek":[0,0,0,0,-18,0,-37],"racutee":[0,0,0,0,-18,0,-37],"racuteeacute":[0,0,0,0,-18,0,-37],"racuteecaron":[0,0,0,0,-18,0,-37],"racuteecircumflex":[0,0,0,0,-18,0,-37],"racuteedieresis":[0,0,0,0,-18,0,-37],"racuteedotaccent":[0,0,0,0,-18,0,-37],"racuteegrave":[0,0,0,0,-18,0,-37],"racuteemacron":[0,0,0,0,-18,0,-37],"racuteeogonek":[0,0,0,0,-18,0,-37],"rcarone":[0,0,0,0,-18,0,-37],"rcaroneacute":[0,0,0,0,-18,0,-37],"rcaronecaron":[0,0,0,0,-18,0,-37],"rcaronecircumflex":[0,0,0,0,-18,0,-37],"rcaronedieresis":[0,0,0,0,-18,0,-37],"rcaronedotaccent":[0,0,0,0,-18,0,-37],"rcaronegrave":[0,0,0,0,-18,0,-37],"rcaronemacron":[0,0,0,0,-18,0,-37],"rcaroneogonek":[0,0,0,0,-18,0,-37],"rcommaaccente":[0,0,0,0,-18,0,-37],"rcommaaccenteacute":[0,0,0,0,-18,0,-37],"rcommaaccentecaron":[0,0,0,0,-18,0,-37],"rcommaaccentecircumflex":[0,0,0,0,-18,0,-37],"rcommaaccentedieresis":[0,0,0,0,-18,0,-37],"rcommaaccentedotaccent":[0,0,0,0,-18,0,-37],"rcommaaccentegrave":[0,0,0,0,-18,0,-37],"rcommaaccentemacron":[0,0,0,0,-18,0,-37],"rcommaaccenteogonek":[0,0,0,0,-18,0,-37],"spaceA":[0,0,0,0,-55,-37,-18,-55],"spaceAacute":[0,0,0,0,-55,-37,-18,-55],"spaceAbreve":[0,0,0,0,-55,-37,-18,-55],"spaceAcircumflex":[0,0,0,0,-55,-37,-18,-55],"spaceAdieresis":[0,0,0,0,-55,-37,-18,-55],"spaceAgrave":[0,0,0,0,-55,-37,-18,-55],"spaceAmacron":[0,0,0,0,-55,-37,-18,-55],"spaceAogonek":[0,0,0,0,-55,-37,-18,-55],"spaceAring":[0,0,0,0,-55,-37,-18,-55],"spaceAtilde":[0,0,0,0,-55,-37,-18,-55],"Fi":[0,0,0,0,0,-40,-45],"Fiacute":[0,0,0,0,0,-40,-45],"Ficircumflex":[0,0,0,0,0,-40,-45],"Fidieresis":[0,0,0,0,0,-40,-45],"Figrave":[0,0,0,0,0,-40,-45],"Fimacron":[0,0,0,0,0,-40,-45],"Fiogonek":[0,0,0,0,0,-40,-45],"eb":[0,0,0,0,0,-10],"eacuteb":[0,0,0,0,0,-10],"ecaronb":[0,0,0,0,0,-10],"ecircumflexb":[0,0,0,0,0,-10],"edieresisb":[0,0,0,0,0,-10],"edotaccentb":[0,0,0,0,0,-10],"egraveb":[0,0,0,0,0,-10],"emacronb":[0,0,0,0,0,-10],"eogonekb":[0,0,0,0,0,-10],"ff":[0,0,0,0,0,-18,-18,-25],"quoterightt":[0,0,0,0,0,-37,-30,-18],"quoterighttcommaaccent":[0,0,0,0,0,-37,-30,-18],"Yicircumflex":[0,0,0,0,0,0,-34],"Yidieresis":[0,0,0,0,0,0,-34],"Yigrave":[0,0,0,0,0,0,-34],"Yimacron":[0,0,0,0,0,0,-34],"Yacuteicircumflex":[0,0,0,0,0,0,-34],"Yacuteidieresis":[0,0,0,0,0,0,-34],"Yacuteigrave":[0,0,0,0,0,0,-34],"Yacuteimacron":[0,0,0,0,0,0,-34],"Ydieresisicircumflex":[0,0,0,0,0,0,-34],"Ydieresisidieresis":[0,0,0,0,0,0,-34],"Ydieresisigrave":[0,0,0,0,0,0,-34],"Ydieresisimacron":[0,0,0,0,0,0,-34],"eg":[0,0,0,0,0,0,-40,-15],"egbreve":[0,0,0,0,0,0,-40,-15],"egcommaaccent":[0,0,0,0,0,0,-40,-15],"eacuteg":[0,0,0,0,0,0,-40,-15],"eacutegbreve":[0,0,0,0,0,0,-40,-15],"eacutegcommaaccent":[0,0,0,0,0,0,-40,-15],"ecarong":[0,0,0,0,0,0,-40,-15],"ecarongbreve":[0,0,0,0,0,0,-40,-15],"ecarongcommaaccent":[0,0,0,0,0,0,-40,-15],"ecircumflexg":[0,0,0,0,0,0,-40,-15],"ecircumflexgbreve":[0,0,0,0,0,0,-40,-15],"ecircumflexgcommaaccent":[0,0,0,0,0,0,-40,-15],"edieresisg":[0,0,0,0,0,0,-40,-15],"edieresisgbreve":[0,0,0,0,0,0,-40,-15],"edieresisgcommaaccent":[0,0,0,0,0,0,-40,-15],"edotaccentg":[0,0,0,0,0,0,-40,-15],"edotaccentgbreve":[0,0,0,0,0,0,-40,-15],"edotaccentgcommaaccent":[0,0,0,0,0,0,-40,-15],"egraveg":[0,0,0,0,0,0,-40,-15],"egravegbreve":[0,0,0,0,0,0,-40,-15],"egravegcommaaccent":[0,0,0,0,0,0,-40,-15],"emacrong":[0,0,0,0,0,0,-40,-15],"emacrongbreve":[0,0,0,0,0,0,-40,-15],"emacrongcommaaccent":[0,0,0,0,0,0,-40,-15],"eogonekg":[0,0,0,0,0,0,-40,-15],"eogonekgbreve":[0,0,0,0,0,0,-40,-15],"eogonekgcommaaccent":[0,0,0,0,0,0,-40,-15],"fiogonek":[0,0,0,0,0,0,-20],"gcomma":[0,0,0,0,0,0,-10],"gbrevecomma":[0,0,0,0,0,0,-10],"gcommaaccentcomma":[0,0,0,0,0,0,-10],"og":[0,0,0,0,0,0,-10],"ogbreve":[0,0,0,0,0,0,-10],"ogcommaaccent":[0,0,0,0,0,0,-10],"oacuteg":[0,0,0,0,0,0,-10],"oacutegbreve":[0,0,0,0,0,0,-10],"oacutegcommaaccent":[0,0,0,0,0,0,-10],"ocircumflexg":[0,0,0,0,0,0,-10],"ocircumflexgbreve":[0,0,0,0,0,0,-10],"ocircumflexgcommaaccent":[0,0,0,0,0,0,-10],"odieresisg":[0,0,0,0,0,0,-10],"odieresisgbreve":[0,0,0,0,0,0,-10],"odieresisgcommaaccent":[0,0,0,0,0,0,-10],"ograveg":[0,0,0,0,0,0,-10],"ogravegbreve":[0,0,0,0,0,0,-10],"ogravegcommaaccent":[0,0,0,0,0,0,-10],"ohungarumlautg":[0,0,0,0,0,0,-10],"ohungarumlautgbreve":[0,0,0,0,0,0,-10],"ohungarumlautgcommaaccent":[0,0,0,0,0,0,-10],"omacrong":[0,0,0,0,0,0,-10],"omacrongbreve":[0,0,0,0,0,0,-10],"omacrongcommaaccent":[0,0,0,0,0,0,-10],"otildeg":[0,0,0,0,0,0,-10],"otildegbreve":[0,0,0,0,0,0,-10],"otildegcommaaccent":[0,0,0,0,0,0,-10],"fiacute":[0,0,0,0,0,0,0,-20],"ga":[0,0,0,0,0,0,0,-5],"gaacute":[0,0,0,0,0,0,0,-5],"gabreve":[0,0,0,0,0,0,0,-5],"gacircumflex":[0,0,0,0,0,0,0,-5],"gadieresis":[0,0,0,0,0,0,0,-5],"gagrave":[0,0,0,0,0,0,0,-5],"gamacron":[0,0,0,0,0,0,0,-5],"gaogonek":[0,0,0,0,0,0,0,-5],"garing":[0,0,0,0,0,0,0,-5],"gatilde":[0,0,0,0,0,0,0,-5],"gbrevea":[0,0,0,0,0,0,0,-5],"gbreveaacute":[0,0,0,0,0,0,0,-5],"gbreveabreve":[0,0,0,0,0,0,0,-5],"gbreveacircumflex":[0,0,0,0,0,0,0,-5],"gbreveadieresis":[0,0,0,0,0,0,0,-5],"gbreveagrave":[0,0,0,0,0,0,0,-5],"gbreveamacron":[0,0,0,0,0,0,0,-5],"gbreveaogonek":[0,0,0,0,0,0,0,-5],"gbrevearing":[0,0,0,0,0,0,0,-5],"gbreveatilde":[0,0,0,0,0,0,0,-5],"gcommaaccenta":[0,0,0,0,0,0,0,-5],"gcommaaccentaacute":[0,0,0,0,0,0,0,-5],"gcommaaccentabreve":[0,0,0,0,0,0,0,-5],"gcommaaccentacircumflex":[0,0,0,0,0,0,0,-5],"gcommaaccentadieresis":[0,0,0,0,0,0,0,-5],"gcommaaccentagrave":[0,0,0,0,0,0,0,-5],"gcommaaccentamacron":[0,0,0,0,0,0,0,-5],"gcommaaccentaogonek":[0,0,0,0,0,0,0,-5],"gcommaaccentaring":[0,0,0,0,0,0,0,-5],"gcommaaccentatilde":[0,0,0,0,0,0,0,-5]}} \ No newline at end of file diff --git a/packages/png-js/lib/png-js.browser.js b/packages/png-js/lib/png-js.browser.js deleted file mode 100644 index f8746ab28..000000000 --- a/packages/png-js/lib/png-js.browser.js +++ /dev/null @@ -1,12601 +0,0 @@ -var global$1 = (typeof global !== "undefined" ? global : - typeof self !== "undefined" ? self : - typeof window !== "undefined" ? window : {}); - -var lookup = []; -var revLookup = []; -var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array; -var inited = false; -function init () { - inited = true; - var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; - for (var i = 0, len = code.length; i < len; ++i) { - lookup[i] = code[i]; - revLookup[code.charCodeAt(i)] = i; - } - - revLookup['-'.charCodeAt(0)] = 62; - revLookup['_'.charCodeAt(0)] = 63; -} - -function toByteArray (b64) { - if (!inited) { - init(); - } - var i, j, l, tmp, placeHolders, arr; - var len = b64.length; - - if (len % 4 > 0) { - throw new Error('Invalid string. Length must be a multiple of 4') - } - - // the number of equal signs (place holders) - // if there are two placeholders, than the two characters before it - // represent one byte - // if there is only one, then the three characters before it represent 2 bytes - // this is just a cheap hack to not do indexOf twice - placeHolders = b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0; - - // base64 is 4/3 + up to two characters of the original data - arr = new Arr(len * 3 / 4 - placeHolders); - - // if there are placeholders, only get up to the last complete 4 chars - l = placeHolders > 0 ? len - 4 : len; - - var L = 0; - - for (i = 0, j = 0; i < l; i += 4, j += 3) { - tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)]; - arr[L++] = (tmp >> 16) & 0xFF; - arr[L++] = (tmp >> 8) & 0xFF; - arr[L++] = tmp & 0xFF; - } - - if (placeHolders === 2) { - tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4); - arr[L++] = tmp & 0xFF; - } else if (placeHolders === 1) { - tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2); - arr[L++] = (tmp >> 8) & 0xFF; - arr[L++] = tmp & 0xFF; - } - - return arr -} - -function tripletToBase64 (num) { - return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F] -} - -function encodeChunk (uint8, start, end) { - var tmp; - var output = []; - for (var i = start; i < end; i += 3) { - tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]); - output.push(tripletToBase64(tmp)); - } - return output.join('') -} - -function fromByteArray (uint8) { - if (!inited) { - init(); - } - var tmp; - var len = uint8.length; - var extraBytes = len % 3; // if we have 1 byte left, pad 2 bytes - var output = ''; - var parts = []; - var maxChunkLength = 16383; // must be multiple of 3 - - // go through the array every three bytes, we'll deal with trailing stuff later - for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) { - parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength))); - } - - // pad the end with zeros, but make sure to not forget the extra bytes - if (extraBytes === 1) { - tmp = uint8[len - 1]; - output += lookup[tmp >> 2]; - output += lookup[(tmp << 4) & 0x3F]; - output += '=='; - } else if (extraBytes === 2) { - tmp = (uint8[len - 2] << 8) + (uint8[len - 1]); - output += lookup[tmp >> 10]; - output += lookup[(tmp >> 4) & 0x3F]; - output += lookup[(tmp << 2) & 0x3F]; - output += '='; - } - - parts.push(output); - - return parts.join('') -} - -function read (buffer, offset, isLE, mLen, nBytes) { - var e, m; - var eLen = nBytes * 8 - mLen - 1; - var eMax = (1 << eLen) - 1; - var eBias = eMax >> 1; - var nBits = -7; - var i = isLE ? (nBytes - 1) : 0; - var d = isLE ? -1 : 1; - var s = buffer[offset + i]; - - i += d; - - e = s & ((1 << (-nBits)) - 1); - s >>= (-nBits); - nBits += eLen; - for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {} - - m = e & ((1 << (-nBits)) - 1); - e >>= (-nBits); - nBits += mLen; - for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {} - - if (e === 0) { - e = 1 - eBias; - } else if (e === eMax) { - return m ? NaN : ((s ? -1 : 1) * Infinity) - } else { - m = m + Math.pow(2, mLen); - e = e - eBias; - } - return (s ? -1 : 1) * m * Math.pow(2, e - mLen) -} - -function write (buffer, value, offset, isLE, mLen, nBytes) { - var e, m, c; - var eLen = nBytes * 8 - mLen - 1; - var eMax = (1 << eLen) - 1; - var eBias = eMax >> 1; - var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0); - var i = isLE ? 0 : (nBytes - 1); - var d = isLE ? 1 : -1; - var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0; - - value = Math.abs(value); - - if (isNaN(value) || value === Infinity) { - m = isNaN(value) ? 1 : 0; - e = eMax; - } else { - e = Math.floor(Math.log(value) / Math.LN2); - if (value * (c = Math.pow(2, -e)) < 1) { - e--; - c *= 2; - } - if (e + eBias >= 1) { - value += rt / c; - } else { - value += rt * Math.pow(2, 1 - eBias); - } - if (value * c >= 2) { - e++; - c /= 2; - } - - if (e + eBias >= eMax) { - m = 0; - e = eMax; - } else if (e + eBias >= 1) { - m = (value * c - 1) * Math.pow(2, mLen); - e = e + eBias; - } else { - m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen); - e = 0; - } - } - - for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} - - e = (e << mLen) | m; - eLen += mLen; - for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} - - buffer[offset + i - d] |= s * 128; -} - -var toString = {}.toString; - -var isArray$1 = Array.isArray || function (arr) { - return toString.call(arr) == '[object Array]'; -}; - -/*! - * The buffer module from node.js, for the browser. - * - * @author Feross Aboukhadijeh - * @license MIT - */ -/* eslint-disable no-proto */ - - -var INSPECT_MAX_BYTES = 50; - -/** - * If `Buffer.TYPED_ARRAY_SUPPORT`: - * === true Use Uint8Array implementation (fastest) - * === false Use Object implementation (most compatible, even IE6) - * - * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+, - * Opera 11.6+, iOS 4.2+. - * - * Due to various browser bugs, sometimes the Object implementation will be used even - * when the browser supports typed arrays. - * - * Note: - * - * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances, - * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438. - * - * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function. - * - * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of - * incorrect length in some situations. - - * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they - * get the Object implementation, which is slower but behaves correctly. - */ -Buffer.TYPED_ARRAY_SUPPORT = global$1.TYPED_ARRAY_SUPPORT !== undefined - ? global$1.TYPED_ARRAY_SUPPORT - : true; - -/* - * Export kMaxLength after typed array support is determined. - */ -var _kMaxLength = kMaxLength(); - -function kMaxLength () { - return Buffer.TYPED_ARRAY_SUPPORT - ? 0x7fffffff - : 0x3fffffff -} - -function createBuffer (that, length) { - if (kMaxLength() < length) { - throw new RangeError('Invalid typed array length') - } - if (Buffer.TYPED_ARRAY_SUPPORT) { - // Return an augmented `Uint8Array` instance, for best performance - that = new Uint8Array(length); - that.__proto__ = Buffer.prototype; - } else { - // Fallback: Return an object instance of the Buffer class - if (that === null) { - that = new Buffer(length); - } - that.length = length; - } - - return that -} - -/** - * The Buffer constructor returns instances of `Uint8Array` that have their - * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of - * `Uint8Array`, so the returned instances will have all the node `Buffer` methods - * and the `Uint8Array` methods. Square bracket notation works as expected -- it - * returns a single octet. - * - * The `Uint8Array` prototype remains unmodified. - */ - -function Buffer (arg, encodingOrOffset, length) { - if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) { - return new Buffer(arg, encodingOrOffset, length) - } - - // Common case. - if (typeof arg === 'number') { - if (typeof encodingOrOffset === 'string') { - throw new Error( - 'If encoding is specified then the first argument must be a string' - ) - } - return allocUnsafe(this, arg) - } - return from(this, arg, encodingOrOffset, length) -} - -Buffer.poolSize = 8192; // not used by this implementation - -// TODO: Legacy, not needed anymore. Remove in next major version. -Buffer._augment = function (arr) { - arr.__proto__ = Buffer.prototype; - return arr -}; - -function from (that, value, encodingOrOffset, length) { - if (typeof value === 'number') { - throw new TypeError('"value" argument must not be a number') - } - - if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) { - return fromArrayBuffer(that, value, encodingOrOffset, length) - } - - if (typeof value === 'string') { - return fromString(that, value, encodingOrOffset) - } - - return fromObject(that, value) -} - -/** - * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError - * if value is a number. - * Buffer.from(str[, encoding]) - * Buffer.from(array) - * Buffer.from(buffer) - * Buffer.from(arrayBuffer[, byteOffset[, length]]) - **/ -Buffer.from = function (value, encodingOrOffset, length) { - return from(null, value, encodingOrOffset, length) -}; - -if (Buffer.TYPED_ARRAY_SUPPORT) { - Buffer.prototype.__proto__ = Uint8Array.prototype; - Buffer.__proto__ = Uint8Array; - if (typeof Symbol !== 'undefined' && Symbol.species && - Buffer[Symbol.species] === Buffer) ; -} - -function assertSize (size) { - if (typeof size !== 'number') { - throw new TypeError('"size" argument must be a number') - } else if (size < 0) { - throw new RangeError('"size" argument must not be negative') - } -} - -function alloc (that, size, fill, encoding) { - assertSize(size); - if (size <= 0) { - return createBuffer(that, size) - } - if (fill !== undefined) { - // Only pay attention to encoding if it's a string. This - // prevents accidentally sending in a number that would - // be interpretted as a start offset. - return typeof encoding === 'string' - ? createBuffer(that, size).fill(fill, encoding) - : createBuffer(that, size).fill(fill) - } - return createBuffer(that, size) -} - -/** - * Creates a new filled Buffer instance. - * alloc(size[, fill[, encoding]]) - **/ -Buffer.alloc = function (size, fill, encoding) { - return alloc(null, size, fill, encoding) -}; - -function allocUnsafe (that, size) { - assertSize(size); - that = createBuffer(that, size < 0 ? 0 : checked(size) | 0); - if (!Buffer.TYPED_ARRAY_SUPPORT) { - for (var i = 0; i < size; ++i) { - that[i] = 0; - } - } - return that -} - -/** - * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance. - * */ -Buffer.allocUnsafe = function (size) { - return allocUnsafe(null, size) -}; -/** - * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance. - */ -Buffer.allocUnsafeSlow = function (size) { - return allocUnsafe(null, size) -}; - -function fromString (that, string, encoding) { - if (typeof encoding !== 'string' || encoding === '') { - encoding = 'utf8'; - } - - if (!Buffer.isEncoding(encoding)) { - throw new TypeError('"encoding" must be a valid string encoding') - } - - var length = byteLength(string, encoding) | 0; - that = createBuffer(that, length); - - var actual = that.write(string, encoding); - - if (actual !== length) { - // Writing a hex string, for example, that contains invalid characters will - // cause everything after the first invalid character to be ignored. (e.g. - // 'abxxcd' will be treated as 'ab') - that = that.slice(0, actual); - } - - return that -} - -function fromArrayLike (that, array) { - var length = array.length < 0 ? 0 : checked(array.length) | 0; - that = createBuffer(that, length); - for (var i = 0; i < length; i += 1) { - that[i] = array[i] & 255; - } - return that -} - -function fromArrayBuffer (that, array, byteOffset, length) { - array.byteLength; // this throws if `array` is not a valid ArrayBuffer - - if (byteOffset < 0 || array.byteLength < byteOffset) { - throw new RangeError('\'offset\' is out of bounds') - } - - if (array.byteLength < byteOffset + (length || 0)) { - throw new RangeError('\'length\' is out of bounds') - } - - if (byteOffset === undefined && length === undefined) { - array = new Uint8Array(array); - } else if (length === undefined) { - array = new Uint8Array(array, byteOffset); - } else { - array = new Uint8Array(array, byteOffset, length); - } - - if (Buffer.TYPED_ARRAY_SUPPORT) { - // Return an augmented `Uint8Array` instance, for best performance - that = array; - that.__proto__ = Buffer.prototype; - } else { - // Fallback: Return an object instance of the Buffer class - that = fromArrayLike(that, array); - } - return that -} - -function fromObject (that, obj) { - if (internalIsBuffer(obj)) { - var len = checked(obj.length) | 0; - that = createBuffer(that, len); - - if (that.length === 0) { - return that - } - - obj.copy(that, 0, 0, len); - return that - } - - if (obj) { - if ((typeof ArrayBuffer !== 'undefined' && - obj.buffer instanceof ArrayBuffer) || 'length' in obj) { - if (typeof obj.length !== 'number' || isnan(obj.length)) { - return createBuffer(that, 0) - } - return fromArrayLike(that, obj) - } - - if (obj.type === 'Buffer' && isArray$1(obj.data)) { - return fromArrayLike(that, obj.data) - } - } - - throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.') -} - -function checked (length) { - // Note: cannot use `length < kMaxLength()` here because that fails when - // length is NaN (which is otherwise coerced to zero.) - if (length >= kMaxLength()) { - throw new RangeError('Attempt to allocate Buffer larger than maximum ' + - 'size: 0x' + kMaxLength().toString(16) + ' bytes') - } - return length | 0 -} - -function SlowBuffer (length) { - if (+length != length) { // eslint-disable-line eqeqeq - length = 0; - } - return Buffer.alloc(+length) -} -Buffer.isBuffer = isBuffer$1; -function internalIsBuffer (b) { - return !!(b != null && b._isBuffer) -} - -Buffer.compare = function compare (a, b) { - if (!internalIsBuffer(a) || !internalIsBuffer(b)) { - throw new TypeError('Arguments must be Buffers') - } - - if (a === b) return 0 - - var x = a.length; - var y = b.length; - - for (var i = 0, len = Math.min(x, y); i < len; ++i) { - if (a[i] !== b[i]) { - x = a[i]; - y = b[i]; - break - } - } - - if (x < y) return -1 - if (y < x) return 1 - return 0 -}; - -Buffer.isEncoding = function isEncoding (encoding) { - switch (String(encoding).toLowerCase()) { - case 'hex': - case 'utf8': - case 'utf-8': - case 'ascii': - case 'latin1': - case 'binary': - case 'base64': - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return true - default: - return false - } -}; - -Buffer.concat = function concat (list, length) { - if (!isArray$1(list)) { - throw new TypeError('"list" argument must be an Array of Buffers') - } - - if (list.length === 0) { - return Buffer.alloc(0) - } - - var i; - if (length === undefined) { - length = 0; - for (i = 0; i < list.length; ++i) { - length += list[i].length; - } - } - - var buffer = Buffer.allocUnsafe(length); - var pos = 0; - for (i = 0; i < list.length; ++i) { - var buf = list[i]; - if (!internalIsBuffer(buf)) { - throw new TypeError('"list" argument must be an Array of Buffers') - } - buf.copy(buffer, pos); - pos += buf.length; - } - return buffer -}; - -function byteLength (string, encoding) { - if (internalIsBuffer(string)) { - return string.length - } - if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' && - (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) { - return string.byteLength - } - if (typeof string !== 'string') { - string = '' + string; - } - - var len = string.length; - if (len === 0) return 0 - - // Use a for loop to avoid recursion - var loweredCase = false; - for (;;) { - switch (encoding) { - case 'ascii': - case 'latin1': - case 'binary': - return len - case 'utf8': - case 'utf-8': - case undefined: - return utf8ToBytes(string).length - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return len * 2 - case 'hex': - return len >>> 1 - case 'base64': - return base64ToBytes(string).length - default: - if (loweredCase) return utf8ToBytes(string).length // assume utf8 - encoding = ('' + encoding).toLowerCase(); - loweredCase = true; - } - } -} -Buffer.byteLength = byteLength; - -function slowToString (encoding, start, end) { - var loweredCase = false; - - // No need to verify that "this.length <= MAX_UINT32" since it's a read-only - // property of a typed array. - - // This behaves neither like String nor Uint8Array in that we set start/end - // to their upper/lower bounds if the value passed is out of range. - // undefined is handled specially as per ECMA-262 6th Edition, - // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization. - if (start === undefined || start < 0) { - start = 0; - } - // Return early if start > this.length. Done here to prevent potential uint32 - // coercion fail below. - if (start > this.length) { - return '' - } - - if (end === undefined || end > this.length) { - end = this.length; - } - - if (end <= 0) { - return '' - } - - // Force coersion to uint32. This will also coerce falsey/NaN values to 0. - end >>>= 0; - start >>>= 0; - - if (end <= start) { - return '' - } - - if (!encoding) encoding = 'utf8'; - - while (true) { - switch (encoding) { - case 'hex': - return hexSlice(this, start, end) - - case 'utf8': - case 'utf-8': - return utf8Slice(this, start, end) - - case 'ascii': - return asciiSlice(this, start, end) - - case 'latin1': - case 'binary': - return latin1Slice(this, start, end) - - case 'base64': - return base64Slice(this, start, end) - - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return utf16leSlice(this, start, end) - - default: - if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) - encoding = (encoding + '').toLowerCase(); - loweredCase = true; - } - } -} - -// The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect -// Buffer instances. -Buffer.prototype._isBuffer = true; - -function swap (b, n, m) { - var i = b[n]; - b[n] = b[m]; - b[m] = i; -} - -Buffer.prototype.swap16 = function swap16 () { - var len = this.length; - if (len % 2 !== 0) { - throw new RangeError('Buffer size must be a multiple of 16-bits') - } - for (var i = 0; i < len; i += 2) { - swap(this, i, i + 1); - } - return this -}; - -Buffer.prototype.swap32 = function swap32 () { - var len = this.length; - if (len % 4 !== 0) { - throw new RangeError('Buffer size must be a multiple of 32-bits') - } - for (var i = 0; i < len; i += 4) { - swap(this, i, i + 3); - swap(this, i + 1, i + 2); - } - return this -}; - -Buffer.prototype.swap64 = function swap64 () { - var len = this.length; - if (len % 8 !== 0) { - throw new RangeError('Buffer size must be a multiple of 64-bits') - } - for (var i = 0; i < len; i += 8) { - swap(this, i, i + 7); - swap(this, i + 1, i + 6); - swap(this, i + 2, i + 5); - swap(this, i + 3, i + 4); - } - return this -}; - -Buffer.prototype.toString = function toString () { - var length = this.length | 0; - if (length === 0) return '' - if (arguments.length === 0) return utf8Slice(this, 0, length) - return slowToString.apply(this, arguments) -}; - -Buffer.prototype.equals = function equals (b) { - if (!internalIsBuffer(b)) throw new TypeError('Argument must be a Buffer') - if (this === b) return true - return Buffer.compare(this, b) === 0 -}; - -Buffer.prototype.inspect = function inspect () { - var str = ''; - var max = INSPECT_MAX_BYTES; - if (this.length > 0) { - str = this.toString('hex', 0, max).match(/.{2}/g).join(' '); - if (this.length > max) str += ' ... '; - } - return '' -}; - -Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) { - if (!internalIsBuffer(target)) { - throw new TypeError('Argument must be a Buffer') - } - - if (start === undefined) { - start = 0; - } - if (end === undefined) { - end = target ? target.length : 0; - } - if (thisStart === undefined) { - thisStart = 0; - } - if (thisEnd === undefined) { - thisEnd = this.length; - } - - if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) { - throw new RangeError('out of range index') - } - - if (thisStart >= thisEnd && start >= end) { - return 0 - } - if (thisStart >= thisEnd) { - return -1 - } - if (start >= end) { - return 1 - } - - start >>>= 0; - end >>>= 0; - thisStart >>>= 0; - thisEnd >>>= 0; - - if (this === target) return 0 - - var x = thisEnd - thisStart; - var y = end - start; - var len = Math.min(x, y); - - var thisCopy = this.slice(thisStart, thisEnd); - var targetCopy = target.slice(start, end); - - for (var i = 0; i < len; ++i) { - if (thisCopy[i] !== targetCopy[i]) { - x = thisCopy[i]; - y = targetCopy[i]; - break - } - } - - if (x < y) return -1 - if (y < x) return 1 - return 0 -}; - -// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`, -// OR the last index of `val` in `buffer` at offset <= `byteOffset`. -// -// Arguments: -// - buffer - a Buffer to search -// - val - a string, Buffer, or number -// - byteOffset - an index into `buffer`; will be clamped to an int32 -// - encoding - an optional encoding, relevant is val is a string -// - dir - true for indexOf, false for lastIndexOf -function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) { - // Empty buffer means no match - if (buffer.length === 0) return -1 - - // Normalize byteOffset - if (typeof byteOffset === 'string') { - encoding = byteOffset; - byteOffset = 0; - } else if (byteOffset > 0x7fffffff) { - byteOffset = 0x7fffffff; - } else if (byteOffset < -2147483648) { - byteOffset = -2147483648; - } - byteOffset = +byteOffset; // Coerce to Number. - if (isNaN(byteOffset)) { - // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer - byteOffset = dir ? 0 : (buffer.length - 1); - } - - // Normalize byteOffset: negative offsets start from the end of the buffer - if (byteOffset < 0) byteOffset = buffer.length + byteOffset; - if (byteOffset >= buffer.length) { - if (dir) return -1 - else byteOffset = buffer.length - 1; - } else if (byteOffset < 0) { - if (dir) byteOffset = 0; - else return -1 - } - - // Normalize val - if (typeof val === 'string') { - val = Buffer.from(val, encoding); - } - - // Finally, search either indexOf (if dir is true) or lastIndexOf - if (internalIsBuffer(val)) { - // Special case: looking for empty string/buffer always fails - if (val.length === 0) { - return -1 - } - return arrayIndexOf(buffer, val, byteOffset, encoding, dir) - } else if (typeof val === 'number') { - val = val & 0xFF; // Search for a byte value [0-255] - if (Buffer.TYPED_ARRAY_SUPPORT && - typeof Uint8Array.prototype.indexOf === 'function') { - if (dir) { - return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset) - } else { - return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset) - } - } - return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir) - } - - throw new TypeError('val must be string, number or Buffer') -} - -function arrayIndexOf (arr, val, byteOffset, encoding, dir) { - var indexSize = 1; - var arrLength = arr.length; - var valLength = val.length; - - if (encoding !== undefined) { - encoding = String(encoding).toLowerCase(); - if (encoding === 'ucs2' || encoding === 'ucs-2' || - encoding === 'utf16le' || encoding === 'utf-16le') { - if (arr.length < 2 || val.length < 2) { - return -1 - } - indexSize = 2; - arrLength /= 2; - valLength /= 2; - byteOffset /= 2; - } - } - - function read (buf, i) { - if (indexSize === 1) { - return buf[i] - } else { - return buf.readUInt16BE(i * indexSize) - } - } - - var i; - if (dir) { - var foundIndex = -1; - for (i = byteOffset; i < arrLength; i++) { - if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) { - if (foundIndex === -1) foundIndex = i; - if (i - foundIndex + 1 === valLength) return foundIndex * indexSize - } else { - if (foundIndex !== -1) i -= i - foundIndex; - foundIndex = -1; - } - } - } else { - if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength; - for (i = byteOffset; i >= 0; i--) { - var found = true; - for (var j = 0; j < valLength; j++) { - if (read(arr, i + j) !== read(val, j)) { - found = false; - break - } - } - if (found) return i - } - } - - return -1 -} - -Buffer.prototype.includes = function includes (val, byteOffset, encoding) { - return this.indexOf(val, byteOffset, encoding) !== -1 -}; - -Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) { - return bidirectionalIndexOf(this, val, byteOffset, encoding, true) -}; - -Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) { - return bidirectionalIndexOf(this, val, byteOffset, encoding, false) -}; - -function hexWrite (buf, string, offset, length) { - offset = Number(offset) || 0; - var remaining = buf.length - offset; - if (!length) { - length = remaining; - } else { - length = Number(length); - if (length > remaining) { - length = remaining; - } - } - - // must be an even number of digits - var strLen = string.length; - if (strLen % 2 !== 0) throw new TypeError('Invalid hex string') - - if (length > strLen / 2) { - length = strLen / 2; - } - for (var i = 0; i < length; ++i) { - var parsed = parseInt(string.substr(i * 2, 2), 16); - if (isNaN(parsed)) return i - buf[offset + i] = parsed; - } - return i -} - -function utf8Write (buf, string, offset, length) { - return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length) -} - -function asciiWrite (buf, string, offset, length) { - return blitBuffer(asciiToBytes(string), buf, offset, length) -} - -function latin1Write (buf, string, offset, length) { - return asciiWrite(buf, string, offset, length) -} - -function base64Write (buf, string, offset, length) { - return blitBuffer(base64ToBytes(string), buf, offset, length) -} - -function ucs2Write (buf, string, offset, length) { - return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length) -} - -Buffer.prototype.write = function write (string, offset, length, encoding) { - // Buffer#write(string) - if (offset === undefined) { - encoding = 'utf8'; - length = this.length; - offset = 0; - // Buffer#write(string, encoding) - } else if (length === undefined && typeof offset === 'string') { - encoding = offset; - length = this.length; - offset = 0; - // Buffer#write(string, offset[, length][, encoding]) - } else if (isFinite(offset)) { - offset = offset | 0; - if (isFinite(length)) { - length = length | 0; - if (encoding === undefined) encoding = 'utf8'; - } else { - encoding = length; - length = undefined; - } - // legacy write(string, encoding, offset, length) - remove in v0.13 - } else { - throw new Error( - 'Buffer.write(string, encoding, offset[, length]) is no longer supported' - ) - } - - var remaining = this.length - offset; - if (length === undefined || length > remaining) length = remaining; - - if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) { - throw new RangeError('Attempt to write outside buffer bounds') - } - - if (!encoding) encoding = 'utf8'; - - var loweredCase = false; - for (;;) { - switch (encoding) { - case 'hex': - return hexWrite(this, string, offset, length) - - case 'utf8': - case 'utf-8': - return utf8Write(this, string, offset, length) - - case 'ascii': - return asciiWrite(this, string, offset, length) - - case 'latin1': - case 'binary': - return latin1Write(this, string, offset, length) - - case 'base64': - // Warning: maxLength not taken into account in base64Write - return base64Write(this, string, offset, length) - - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return ucs2Write(this, string, offset, length) - - default: - if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) - encoding = ('' + encoding).toLowerCase(); - loweredCase = true; - } - } -}; - -Buffer.prototype.toJSON = function toJSON () { - return { - type: 'Buffer', - data: Array.prototype.slice.call(this._arr || this, 0) - } -}; - -function base64Slice (buf, start, end) { - if (start === 0 && end === buf.length) { - return fromByteArray(buf) - } else { - return fromByteArray(buf.slice(start, end)) - } -} - -function utf8Slice (buf, start, end) { - end = Math.min(buf.length, end); - var res = []; - - var i = start; - while (i < end) { - var firstByte = buf[i]; - var codePoint = null; - var bytesPerSequence = (firstByte > 0xEF) ? 4 - : (firstByte > 0xDF) ? 3 - : (firstByte > 0xBF) ? 2 - : 1; - - if (i + bytesPerSequence <= end) { - var secondByte, thirdByte, fourthByte, tempCodePoint; - - switch (bytesPerSequence) { - case 1: - if (firstByte < 0x80) { - codePoint = firstByte; - } - break - case 2: - secondByte = buf[i + 1]; - if ((secondByte & 0xC0) === 0x80) { - tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F); - if (tempCodePoint > 0x7F) { - codePoint = tempCodePoint; - } - } - break - case 3: - secondByte = buf[i + 1]; - thirdByte = buf[i + 2]; - if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) { - tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F); - if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) { - codePoint = tempCodePoint; - } - } - break - case 4: - secondByte = buf[i + 1]; - thirdByte = buf[i + 2]; - fourthByte = buf[i + 3]; - if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) { - tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F); - if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) { - codePoint = tempCodePoint; - } - } - } - } - - if (codePoint === null) { - // we did not generate a valid codePoint so insert a - // replacement char (U+FFFD) and advance only 1 byte - codePoint = 0xFFFD; - bytesPerSequence = 1; - } else if (codePoint > 0xFFFF) { - // encode to utf16 (surrogate pair dance) - codePoint -= 0x10000; - res.push(codePoint >>> 10 & 0x3FF | 0xD800); - codePoint = 0xDC00 | codePoint & 0x3FF; - } - - res.push(codePoint); - i += bytesPerSequence; - } - - return decodeCodePointsArray(res) -} - -// Based on http://stackoverflow.com/a/22747272/680742, the browser with -// the lowest limit is Chrome, with 0x10000 args. -// We go 1 magnitude less, for safety -var MAX_ARGUMENTS_LENGTH = 0x1000; - -function decodeCodePointsArray (codePoints) { - var len = codePoints.length; - if (len <= MAX_ARGUMENTS_LENGTH) { - return String.fromCharCode.apply(String, codePoints) // avoid extra slice() - } - - // Decode in chunks to avoid "call stack size exceeded". - var res = ''; - var i = 0; - while (i < len) { - res += String.fromCharCode.apply( - String, - codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH) - ); - } - return res -} - -function asciiSlice (buf, start, end) { - var ret = ''; - end = Math.min(buf.length, end); - - for (var i = start; i < end; ++i) { - ret += String.fromCharCode(buf[i] & 0x7F); - } - return ret -} - -function latin1Slice (buf, start, end) { - var ret = ''; - end = Math.min(buf.length, end); - - for (var i = start; i < end; ++i) { - ret += String.fromCharCode(buf[i]); - } - return ret -} - -function hexSlice (buf, start, end) { - var len = buf.length; - - if (!start || start < 0) start = 0; - if (!end || end < 0 || end > len) end = len; - - var out = ''; - for (var i = start; i < end; ++i) { - out += toHex(buf[i]); - } - return out -} - -function utf16leSlice (buf, start, end) { - var bytes = buf.slice(start, end); - var res = ''; - for (var i = 0; i < bytes.length; i += 2) { - res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256); - } - return res -} - -Buffer.prototype.slice = function slice (start, end) { - var len = this.length; - start = ~~start; - end = end === undefined ? len : ~~end; - - if (start < 0) { - start += len; - if (start < 0) start = 0; - } else if (start > len) { - start = len; - } - - if (end < 0) { - end += len; - if (end < 0) end = 0; - } else if (end > len) { - end = len; - } - - if (end < start) end = start; - - var newBuf; - if (Buffer.TYPED_ARRAY_SUPPORT) { - newBuf = this.subarray(start, end); - newBuf.__proto__ = Buffer.prototype; - } else { - var sliceLen = end - start; - newBuf = new Buffer(sliceLen, undefined); - for (var i = 0; i < sliceLen; ++i) { - newBuf[i] = this[i + start]; - } - } - - return newBuf -}; - -/* - * Need to make sure that buffer isn't trying to write out of bounds. - */ -function checkOffset (offset, ext, length) { - if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint') - if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length') -} - -Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) { - offset = offset | 0; - byteLength = byteLength | 0; - if (!noAssert) checkOffset(offset, byteLength, this.length); - - var val = this[offset]; - var mul = 1; - var i = 0; - while (++i < byteLength && (mul *= 0x100)) { - val += this[offset + i] * mul; - } - - return val -}; - -Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) { - offset = offset | 0; - byteLength = byteLength | 0; - if (!noAssert) { - checkOffset(offset, byteLength, this.length); - } - - var val = this[offset + --byteLength]; - var mul = 1; - while (byteLength > 0 && (mul *= 0x100)) { - val += this[offset + --byteLength] * mul; - } - - return val -}; - -Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) { - if (!noAssert) checkOffset(offset, 1, this.length); - return this[offset] -}; - -Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 2, this.length); - return this[offset] | (this[offset + 1] << 8) -}; - -Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 2, this.length); - return (this[offset] << 8) | this[offset + 1] -}; - -Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length); - - return ((this[offset]) | - (this[offset + 1] << 8) | - (this[offset + 2] << 16)) + - (this[offset + 3] * 0x1000000) -}; - -Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length); - - return (this[offset] * 0x1000000) + - ((this[offset + 1] << 16) | - (this[offset + 2] << 8) | - this[offset + 3]) -}; - -Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) { - offset = offset | 0; - byteLength = byteLength | 0; - if (!noAssert) checkOffset(offset, byteLength, this.length); - - var val = this[offset]; - var mul = 1; - var i = 0; - while (++i < byteLength && (mul *= 0x100)) { - val += this[offset + i] * mul; - } - mul *= 0x80; - - if (val >= mul) val -= Math.pow(2, 8 * byteLength); - - return val -}; - -Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) { - offset = offset | 0; - byteLength = byteLength | 0; - if (!noAssert) checkOffset(offset, byteLength, this.length); - - var i = byteLength; - var mul = 1; - var val = this[offset + --i]; - while (i > 0 && (mul *= 0x100)) { - val += this[offset + --i] * mul; - } - mul *= 0x80; - - if (val >= mul) val -= Math.pow(2, 8 * byteLength); - - return val -}; - -Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) { - if (!noAssert) checkOffset(offset, 1, this.length); - if (!(this[offset] & 0x80)) return (this[offset]) - return ((0xff - this[offset] + 1) * -1) -}; - -Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 2, this.length); - var val = this[offset] | (this[offset + 1] << 8); - return (val & 0x8000) ? val | 0xFFFF0000 : val -}; - -Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 2, this.length); - var val = this[offset + 1] | (this[offset] << 8); - return (val & 0x8000) ? val | 0xFFFF0000 : val -}; - -Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length); - - return (this[offset]) | - (this[offset + 1] << 8) | - (this[offset + 2] << 16) | - (this[offset + 3] << 24) -}; - -Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length); - - return (this[offset] << 24) | - (this[offset + 1] << 16) | - (this[offset + 2] << 8) | - (this[offset + 3]) -}; - -Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length); - return read(this, offset, true, 23, 4) -}; - -Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length); - return read(this, offset, false, 23, 4) -}; - -Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 8, this.length); - return read(this, offset, true, 52, 8) -}; - -Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 8, this.length); - return read(this, offset, false, 52, 8) -}; - -function checkInt (buf, value, offset, ext, max, min) { - if (!internalIsBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance') - if (value > max || value < min) throw new RangeError('"value" argument is out of bounds') - if (offset + ext > buf.length) throw new RangeError('Index out of range') -} - -Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) { - value = +value; - offset = offset | 0; - byteLength = byteLength | 0; - if (!noAssert) { - var maxBytes = Math.pow(2, 8 * byteLength) - 1; - checkInt(this, value, offset, byteLength, maxBytes, 0); - } - - var mul = 1; - var i = 0; - this[offset] = value & 0xFF; - while (++i < byteLength && (mul *= 0x100)) { - this[offset + i] = (value / mul) & 0xFF; - } - - return offset + byteLength -}; - -Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) { - value = +value; - offset = offset | 0; - byteLength = byteLength | 0; - if (!noAssert) { - var maxBytes = Math.pow(2, 8 * byteLength) - 1; - checkInt(this, value, offset, byteLength, maxBytes, 0); - } - - var i = byteLength - 1; - var mul = 1; - this[offset + i] = value & 0xFF; - while (--i >= 0 && (mul *= 0x100)) { - this[offset + i] = (value / mul) & 0xFF; - } - - return offset + byteLength -}; - -Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0); - if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value); - this[offset] = (value & 0xff); - return offset + 1 -}; - -function objectWriteUInt16 (buf, value, offset, littleEndian) { - if (value < 0) value = 0xffff + value + 1; - for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) { - buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>> - (littleEndian ? i : 1 - i) * 8; - } -} - -Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0); - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value & 0xff); - this[offset + 1] = (value >>> 8); - } else { - objectWriteUInt16(this, value, offset, true); - } - return offset + 2 -}; - -Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0); - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value >>> 8); - this[offset + 1] = (value & 0xff); - } else { - objectWriteUInt16(this, value, offset, false); - } - return offset + 2 -}; - -function objectWriteUInt32 (buf, value, offset, littleEndian) { - if (value < 0) value = 0xffffffff + value + 1; - for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) { - buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff; - } -} - -Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0); - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset + 3] = (value >>> 24); - this[offset + 2] = (value >>> 16); - this[offset + 1] = (value >>> 8); - this[offset] = (value & 0xff); - } else { - objectWriteUInt32(this, value, offset, true); - } - return offset + 4 -}; - -Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0); - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value >>> 24); - this[offset + 1] = (value >>> 16); - this[offset + 2] = (value >>> 8); - this[offset + 3] = (value & 0xff); - } else { - objectWriteUInt32(this, value, offset, false); - } - return offset + 4 -}; - -Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) { - var limit = Math.pow(2, 8 * byteLength - 1); - - checkInt(this, value, offset, byteLength, limit - 1, -limit); - } - - var i = 0; - var mul = 1; - var sub = 0; - this[offset] = value & 0xFF; - while (++i < byteLength && (mul *= 0x100)) { - if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) { - sub = 1; - } - this[offset + i] = ((value / mul) >> 0) - sub & 0xFF; - } - - return offset + byteLength -}; - -Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) { - var limit = Math.pow(2, 8 * byteLength - 1); - - checkInt(this, value, offset, byteLength, limit - 1, -limit); - } - - var i = byteLength - 1; - var mul = 1; - var sub = 0; - this[offset + i] = value & 0xFF; - while (--i >= 0 && (mul *= 0x100)) { - if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) { - sub = 1; - } - this[offset + i] = ((value / mul) >> 0) - sub & 0xFF; - } - - return offset + byteLength -}; - -Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -128); - if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value); - if (value < 0) value = 0xff + value + 1; - this[offset] = (value & 0xff); - return offset + 1 -}; - -Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -32768); - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value & 0xff); - this[offset + 1] = (value >>> 8); - } else { - objectWriteUInt16(this, value, offset, true); - } - return offset + 2 -}; - -Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -32768); - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value >>> 8); - this[offset + 1] = (value & 0xff); - } else { - objectWriteUInt16(this, value, offset, false); - } - return offset + 2 -}; - -Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -2147483648); - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value & 0xff); - this[offset + 1] = (value >>> 8); - this[offset + 2] = (value >>> 16); - this[offset + 3] = (value >>> 24); - } else { - objectWriteUInt32(this, value, offset, true); - } - return offset + 4 -}; - -Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -2147483648); - if (value < 0) value = 0xffffffff + value + 1; - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value >>> 24); - this[offset + 1] = (value >>> 16); - this[offset + 2] = (value >>> 8); - this[offset + 3] = (value & 0xff); - } else { - objectWriteUInt32(this, value, offset, false); - } - return offset + 4 -}; - -function checkIEEE754 (buf, value, offset, ext, max, min) { - if (offset + ext > buf.length) throw new RangeError('Index out of range') - if (offset < 0) throw new RangeError('Index out of range') -} - -function writeFloat (buf, value, offset, littleEndian, noAssert) { - if (!noAssert) { - checkIEEE754(buf, value, offset, 4); - } - write(buf, value, offset, littleEndian, 23, 4); - return offset + 4 -} - -Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) { - return writeFloat(this, value, offset, true, noAssert) -}; - -Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) { - return writeFloat(this, value, offset, false, noAssert) -}; - -function writeDouble (buf, value, offset, littleEndian, noAssert) { - if (!noAssert) { - checkIEEE754(buf, value, offset, 8); - } - write(buf, value, offset, littleEndian, 52, 8); - return offset + 8 -} - -Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) { - return writeDouble(this, value, offset, true, noAssert) -}; - -Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) { - return writeDouble(this, value, offset, false, noAssert) -}; - -// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length) -Buffer.prototype.copy = function copy (target, targetStart, start, end) { - if (!start) start = 0; - if (!end && end !== 0) end = this.length; - if (targetStart >= target.length) targetStart = target.length; - if (!targetStart) targetStart = 0; - if (end > 0 && end < start) end = start; - - // Copy 0 bytes; we're done - if (end === start) return 0 - if (target.length === 0 || this.length === 0) return 0 - - // Fatal error conditions - if (targetStart < 0) { - throw new RangeError('targetStart out of bounds') - } - if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds') - if (end < 0) throw new RangeError('sourceEnd out of bounds') - - // Are we oob? - if (end > this.length) end = this.length; - if (target.length - targetStart < end - start) { - end = target.length - targetStart + start; - } - - var len = end - start; - var i; - - if (this === target && start < targetStart && targetStart < end) { - // descending copy from end - for (i = len - 1; i >= 0; --i) { - target[i + targetStart] = this[i + start]; - } - } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) { - // ascending copy from start - for (i = 0; i < len; ++i) { - target[i + targetStart] = this[i + start]; - } - } else { - Uint8Array.prototype.set.call( - target, - this.subarray(start, start + len), - targetStart - ); - } - - return len -}; - -// Usage: -// buffer.fill(number[, offset[, end]]) -// buffer.fill(buffer[, offset[, end]]) -// buffer.fill(string[, offset[, end]][, encoding]) -Buffer.prototype.fill = function fill (val, start, end, encoding) { - // Handle string cases: - if (typeof val === 'string') { - if (typeof start === 'string') { - encoding = start; - start = 0; - end = this.length; - } else if (typeof end === 'string') { - encoding = end; - end = this.length; - } - if (val.length === 1) { - var code = val.charCodeAt(0); - if (code < 256) { - val = code; - } - } - if (encoding !== undefined && typeof encoding !== 'string') { - throw new TypeError('encoding must be a string') - } - if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) { - throw new TypeError('Unknown encoding: ' + encoding) - } - } else if (typeof val === 'number') { - val = val & 255; - } - - // Invalid ranges are not set to a default, so can range check early. - if (start < 0 || this.length < start || this.length < end) { - throw new RangeError('Out of range index') - } - - if (end <= start) { - return this - } - - start = start >>> 0; - end = end === undefined ? this.length : end >>> 0; - - if (!val) val = 0; - - var i; - if (typeof val === 'number') { - for (i = start; i < end; ++i) { - this[i] = val; - } - } else { - var bytes = internalIsBuffer(val) - ? val - : utf8ToBytes(new Buffer(val, encoding).toString()); - var len = bytes.length; - for (i = 0; i < end - start; ++i) { - this[i + start] = bytes[i % len]; - } - } - - return this -}; - -// HELPER FUNCTIONS -// ================ - -var INVALID_BASE64_RE = /[^+\/0-9A-Za-z-_]/g; - -function base64clean (str) { - // Node strips out invalid characters like \n and \t from the string, base64-js does not - str = stringtrim(str).replace(INVALID_BASE64_RE, ''); - // Node converts strings with length < 2 to '' - if (str.length < 2) return '' - // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not - while (str.length % 4 !== 0) { - str = str + '='; - } - return str -} - -function stringtrim (str) { - if (str.trim) return str.trim() - return str.replace(/^\s+|\s+$/g, '') -} - -function toHex (n) { - if (n < 16) return '0' + n.toString(16) - return n.toString(16) -} - -function utf8ToBytes (string, units) { - units = units || Infinity; - var codePoint; - var length = string.length; - var leadSurrogate = null; - var bytes = []; - - for (var i = 0; i < length; ++i) { - codePoint = string.charCodeAt(i); - - // is surrogate component - if (codePoint > 0xD7FF && codePoint < 0xE000) { - // last char was a lead - if (!leadSurrogate) { - // no lead yet - if (codePoint > 0xDBFF) { - // unexpected trail - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD); - continue - } else if (i + 1 === length) { - // unpaired lead - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD); - continue - } - - // valid lead - leadSurrogate = codePoint; - - continue - } - - // 2 leads in a row - if (codePoint < 0xDC00) { - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD); - leadSurrogate = codePoint; - continue - } - - // valid surrogate pair - codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000; - } else if (leadSurrogate) { - // valid bmp char, but last char was a lead - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD); - } - - leadSurrogate = null; - - // encode utf8 - if (codePoint < 0x80) { - if ((units -= 1) < 0) break - bytes.push(codePoint); - } else if (codePoint < 0x800) { - if ((units -= 2) < 0) break - bytes.push( - codePoint >> 0x6 | 0xC0, - codePoint & 0x3F | 0x80 - ); - } else if (codePoint < 0x10000) { - if ((units -= 3) < 0) break - bytes.push( - codePoint >> 0xC | 0xE0, - codePoint >> 0x6 & 0x3F | 0x80, - codePoint & 0x3F | 0x80 - ); - } else if (codePoint < 0x110000) { - if ((units -= 4) < 0) break - bytes.push( - codePoint >> 0x12 | 0xF0, - codePoint >> 0xC & 0x3F | 0x80, - codePoint >> 0x6 & 0x3F | 0x80, - codePoint & 0x3F | 0x80 - ); - } else { - throw new Error('Invalid code point') - } - } - - return bytes -} - -function asciiToBytes (str) { - var byteArray = []; - for (var i = 0; i < str.length; ++i) { - // Node's code seems to be doing this and not & 0x7F.. - byteArray.push(str.charCodeAt(i) & 0xFF); - } - return byteArray -} - -function utf16leToBytes (str, units) { - var c, hi, lo; - var byteArray = []; - for (var i = 0; i < str.length; ++i) { - if ((units -= 2) < 0) break - - c = str.charCodeAt(i); - hi = c >> 8; - lo = c % 256; - byteArray.push(lo); - byteArray.push(hi); - } - - return byteArray -} - - -function base64ToBytes (str) { - return toByteArray(base64clean(str)) -} - -function blitBuffer (src, dst, offset, length) { - for (var i = 0; i < length; ++i) { - if ((i + offset >= dst.length) || (i >= src.length)) break - dst[i + offset] = src[i]; - } - return i -} - -function isnan (val) { - return val !== val // eslint-disable-line no-self-compare -} - - -// the following is from is-buffer, also by Feross Aboukhadijeh and with same lisence -// The _isBuffer check is for Safari 5-7 support, because it's missing -// Object.prototype.constructor. Remove this eventually -function isBuffer$1(obj) { - return obj != null && (!!obj._isBuffer || isFastBuffer(obj) || isSlowBuffer(obj)) -} - -function isFastBuffer (obj) { - return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj) -} - -// For Node v0.10 support. Remove this eventually. -function isSlowBuffer (obj) { - return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isFastBuffer(obj.slice(0, 0)) -} - -var _polyfillNode_buffer = /*#__PURE__*/Object.freeze({ - __proto__: null, - Buffer: Buffer, - INSPECT_MAX_BYTES: INSPECT_MAX_BYTES, - SlowBuffer: SlowBuffer, - isBuffer: isBuffer$1, - kMaxLength: _kMaxLength -}); - -// shim for using process in browser -// based off https://github.com/defunctzombie/node-process/blob/master/browser.js - -function defaultSetTimout() { - throw new Error('setTimeout has not been defined'); -} -function defaultClearTimeout () { - throw new Error('clearTimeout has not been defined'); -} -var cachedSetTimeout = defaultSetTimout; -var cachedClearTimeout = defaultClearTimeout; -if (typeof global$1.setTimeout === 'function') { - cachedSetTimeout = setTimeout; -} -if (typeof global$1.clearTimeout === 'function') { - cachedClearTimeout = clearTimeout; -} - -function runTimeout(fun) { - if (cachedSetTimeout === setTimeout) { - //normal enviroments in sane situations - return setTimeout(fun, 0); - } - // if setTimeout wasn't available but was latter defined - if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { - cachedSetTimeout = setTimeout; - return setTimeout(fun, 0); - } - try { - // when when somebody has screwed with setTimeout but no I.E. maddness - return cachedSetTimeout(fun, 0); - } catch(e){ - try { - // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally - return cachedSetTimeout.call(null, fun, 0); - } catch(e){ - // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error - return cachedSetTimeout.call(this, fun, 0); - } - } - - -} -function runClearTimeout(marker) { - if (cachedClearTimeout === clearTimeout) { - //normal enviroments in sane situations - return clearTimeout(marker); - } - // if clearTimeout wasn't available but was latter defined - if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { - cachedClearTimeout = clearTimeout; - return clearTimeout(marker); - } - try { - // when when somebody has screwed with setTimeout but no I.E. maddness - return cachedClearTimeout(marker); - } catch (e){ - try { - // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally - return cachedClearTimeout.call(null, marker); - } catch (e){ - // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. - // Some versions of I.E. have different rules for clearTimeout vs setTimeout - return cachedClearTimeout.call(this, marker); - } - } - - - -} -var queue = []; -var draining = false; -var currentQueue; -var queueIndex = -1; - -function cleanUpNextTick() { - if (!draining || !currentQueue) { - return; - } - draining = false; - if (currentQueue.length) { - queue = currentQueue.concat(queue); - } else { - queueIndex = -1; - } - if (queue.length) { - drainQueue(); - } -} - -function drainQueue() { - if (draining) { - return; - } - var timeout = runTimeout(cleanUpNextTick); - draining = true; - - var len = queue.length; - while(len) { - currentQueue = queue; - queue = []; - while (++queueIndex < len) { - if (currentQueue) { - currentQueue[queueIndex].run(); - } - } - queueIndex = -1; - len = queue.length; - } - currentQueue = null; - draining = false; - runClearTimeout(timeout); -} -function nextTick(fun) { - var args = new Array(arguments.length - 1); - if (arguments.length > 1) { - for (var i = 1; i < arguments.length; i++) { - args[i - 1] = arguments[i]; - } - } - queue.push(new Item(fun, args)); - if (queue.length === 1 && !draining) { - runTimeout(drainQueue); - } -} -// v8 likes predictible objects -function Item(fun, array) { - this.fun = fun; - this.array = array; -} -Item.prototype.run = function () { - this.fun.apply(null, this.array); -}; -var title = 'browser'; -var platform = 'browser'; -var browser = true; -var env = {}; -var argv = []; -var version = ''; // empty string to avoid regexp issues -var versions = {}; -var release = {}; -var config = {}; - -function noop() {} - -var on = noop; -var addListener = noop; -var once = noop; -var off = noop; -var removeListener = noop; -var removeAllListeners = noop; -var emit = noop; - -function binding$1(name) { - throw new Error('process.binding is not supported'); -} - -function cwd () { return '/' } -function chdir (dir) { - throw new Error('process.chdir is not supported'); -}function umask() { return 0; } - -// from https://github.com/kumavis/browser-process-hrtime/blob/master/index.js -var performance = global$1.performance || {}; -var performanceNow = - performance.now || - performance.mozNow || - performance.msNow || - performance.oNow || - performance.webkitNow || - function(){ return (new Date()).getTime() }; - -// generate timestamp or delta -// see http://nodejs.org/api/process.html#process_process_hrtime -function hrtime(previousTimestamp){ - var clocktime = performanceNow.call(performance)*1e-3; - var seconds = Math.floor(clocktime); - var nanoseconds = Math.floor((clocktime%1)*1e9); - if (previousTimestamp) { - seconds = seconds - previousTimestamp[0]; - nanoseconds = nanoseconds - previousTimestamp[1]; - if (nanoseconds<0) { - seconds--; - nanoseconds += 1e9; - } - } - return [seconds,nanoseconds] -} - -var startTime = new Date(); -function uptime() { - var currentTime = new Date(); - var dif = currentTime - startTime; - return dif / 1000; -} - -var browser$1 = { - nextTick: nextTick, - title: title, - browser: browser, - env: env, - argv: argv, - version: version, - versions: versions, - on: on, - addListener: addListener, - once: once, - off: off, - removeListener: removeListener, - removeAllListeners: removeAllListeners, - emit: emit, - binding: binding$1, - cwd: cwd, - chdir: chdir, - umask: umask, - hrtime: hrtime, - platform: platform, - release: release, - config: config, - uptime: uptime -}; - -function getDefaultExportFromCjs (x) { - return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x; -} - -function getAugmentedNamespace(n) { - if (n.__esModule) return n; - var f = n.default; - if (typeof f == "function") { - var a = function a () { - if (this instanceof a) { - return Reflect.construct(f, arguments, this.constructor); - } - return f.apply(this, arguments); - }; - a.prototype = f.prototype; - } else a = {}; - Object.defineProperty(a, '__esModule', {value: true}); - Object.keys(n).forEach(function (k) { - var d = Object.getOwnPropertyDescriptor(n, k); - Object.defineProperty(a, k, d.get ? d : { - enumerable: true, - get: function () { - return n[k]; - } - }); - }); - return a; -} - -var lib = {}; - -var require$$0 = /*@__PURE__*/getAugmentedNamespace(_polyfillNode_buffer); - -var domain; - -// This constructor is used to store event handlers. Instantiating this is -// faster than explicitly calling `Object.create(null)` to get a "clean" empty -// object (tested with v8 v4.9). -function EventHandlers() {} -EventHandlers.prototype = Object.create(null); - -function EventEmitter() { - EventEmitter.init.call(this); -} - -// nodejs oddity -// require('events') === require('events').EventEmitter -EventEmitter.EventEmitter = EventEmitter; - -EventEmitter.usingDomains = false; - -EventEmitter.prototype.domain = undefined; -EventEmitter.prototype._events = undefined; -EventEmitter.prototype._maxListeners = undefined; - -// By default EventEmitters will print a warning if more than 10 listeners are -// added to it. This is a useful default which helps finding memory leaks. -EventEmitter.defaultMaxListeners = 10; - -EventEmitter.init = function() { - this.domain = null; - if (EventEmitter.usingDomains) { - // if there is an active domain, then attach to it. - if (domain.active && !(this instanceof domain.Domain)) { - this.domain = domain.active; - } - } - - if (!this._events || this._events === Object.getPrototypeOf(this)._events) { - this._events = new EventHandlers(); - this._eventsCount = 0; - } - - this._maxListeners = this._maxListeners || undefined; -}; - -// Obviously not all Emitters should be limited to 10. This function allows -// that to be increased. Set to zero for unlimited. -EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) { - if (typeof n !== 'number' || n < 0 || isNaN(n)) - throw new TypeError('"n" argument must be a positive number'); - this._maxListeners = n; - return this; -}; - -function $getMaxListeners(that) { - if (that._maxListeners === undefined) - return EventEmitter.defaultMaxListeners; - return that._maxListeners; -} - -EventEmitter.prototype.getMaxListeners = function getMaxListeners() { - return $getMaxListeners(this); -}; - -// These standalone emit* functions are used to optimize calling of event -// handlers for fast cases because emit() itself often has a variable number of -// arguments and can be deoptimized because of that. These functions always have -// the same number of arguments and thus do not get deoptimized, so the code -// inside them can execute faster. -function emitNone(handler, isFn, self) { - if (isFn) - handler.call(self); - else { - var len = handler.length; - var listeners = arrayClone(handler, len); - for (var i = 0; i < len; ++i) - listeners[i].call(self); - } -} -function emitOne(handler, isFn, self, arg1) { - if (isFn) - handler.call(self, arg1); - else { - var len = handler.length; - var listeners = arrayClone(handler, len); - for (var i = 0; i < len; ++i) - listeners[i].call(self, arg1); - } -} -function emitTwo(handler, isFn, self, arg1, arg2) { - if (isFn) - handler.call(self, arg1, arg2); - else { - var len = handler.length; - var listeners = arrayClone(handler, len); - for (var i = 0; i < len; ++i) - listeners[i].call(self, arg1, arg2); - } -} -function emitThree(handler, isFn, self, arg1, arg2, arg3) { - if (isFn) - handler.call(self, arg1, arg2, arg3); - else { - var len = handler.length; - var listeners = arrayClone(handler, len); - for (var i = 0; i < len; ++i) - listeners[i].call(self, arg1, arg2, arg3); - } -} - -function emitMany(handler, isFn, self, args) { - if (isFn) - handler.apply(self, args); - else { - var len = handler.length; - var listeners = arrayClone(handler, len); - for (var i = 0; i < len; ++i) - listeners[i].apply(self, args); - } -} - -EventEmitter.prototype.emit = function emit(type) { - var er, handler, len, args, i, events, domain; - var doError = (type === 'error'); - - events = this._events; - if (events) - doError = (doError && events.error == null); - else if (!doError) - return false; - - domain = this.domain; - - // If there is no 'error' event listener then throw. - if (doError) { - er = arguments[1]; - if (domain) { - if (!er) - er = new Error('Uncaught, unspecified "error" event'); - er.domainEmitter = this; - er.domain = domain; - er.domainThrown = false; - domain.emit('error', er); - } else if (er instanceof Error) { - throw er; // Unhandled 'error' event - } else { - // At least give some kind of context to the user - var err = new Error('Uncaught, unspecified "error" event. (' + er + ')'); - err.context = er; - throw err; - } - return false; - } - - handler = events[type]; - - if (!handler) - return false; - - var isFn = typeof handler === 'function'; - len = arguments.length; - switch (len) { - // fast cases - case 1: - emitNone(handler, isFn, this); - break; - case 2: - emitOne(handler, isFn, this, arguments[1]); - break; - case 3: - emitTwo(handler, isFn, this, arguments[1], arguments[2]); - break; - case 4: - emitThree(handler, isFn, this, arguments[1], arguments[2], arguments[3]); - break; - // slower - default: - args = new Array(len - 1); - for (i = 1; i < len; i++) - args[i - 1] = arguments[i]; - emitMany(handler, isFn, this, args); - } - - return true; -}; - -function _addListener(target, type, listener, prepend) { - var m; - var events; - var existing; - - if (typeof listener !== 'function') - throw new TypeError('"listener" argument must be a function'); - - events = target._events; - if (!events) { - events = target._events = new EventHandlers(); - target._eventsCount = 0; - } else { - // To avoid recursion in the case that type === "newListener"! Before - // adding it to the listeners, first emit "newListener". - if (events.newListener) { - target.emit('newListener', type, - listener.listener ? listener.listener : listener); - - // Re-assign `events` because a newListener handler could have caused the - // this._events to be assigned to a new object - events = target._events; - } - existing = events[type]; - } - - if (!existing) { - // Optimize the case of one listener. Don't need the extra array object. - existing = events[type] = listener; - ++target._eventsCount; - } else { - if (typeof existing === 'function') { - // Adding the second element, need to change to array. - existing = events[type] = prepend ? [listener, existing] : - [existing, listener]; - } else { - // If we've already got an array, just append. - if (prepend) { - existing.unshift(listener); - } else { - existing.push(listener); - } - } - - // Check for listener leak - if (!existing.warned) { - m = $getMaxListeners(target); - if (m && m > 0 && existing.length > m) { - existing.warned = true; - var w = new Error('Possible EventEmitter memory leak detected. ' + - existing.length + ' ' + type + ' listeners added. ' + - 'Use emitter.setMaxListeners() to increase limit'); - w.name = 'MaxListenersExceededWarning'; - w.emitter = target; - w.type = type; - w.count = existing.length; - emitWarning(w); - } - } - } - - return target; -} -function emitWarning(e) { - typeof console.warn === 'function' ? console.warn(e) : console.log(e); -} -EventEmitter.prototype.addListener = function addListener(type, listener) { - return _addListener(this, type, listener, false); -}; - -EventEmitter.prototype.on = EventEmitter.prototype.addListener; - -EventEmitter.prototype.prependListener = - function prependListener(type, listener) { - return _addListener(this, type, listener, true); - }; - -function _onceWrap(target, type, listener) { - var fired = false; - function g() { - target.removeListener(type, g); - if (!fired) { - fired = true; - listener.apply(target, arguments); - } - } - g.listener = listener; - return g; -} - -EventEmitter.prototype.once = function once(type, listener) { - if (typeof listener !== 'function') - throw new TypeError('"listener" argument must be a function'); - this.on(type, _onceWrap(this, type, listener)); - return this; -}; - -EventEmitter.prototype.prependOnceListener = - function prependOnceListener(type, listener) { - if (typeof listener !== 'function') - throw new TypeError('"listener" argument must be a function'); - this.prependListener(type, _onceWrap(this, type, listener)); - return this; - }; - -// emits a 'removeListener' event iff the listener was removed -EventEmitter.prototype.removeListener = - function removeListener(type, listener) { - var list, events, position, i, originalListener; - - if (typeof listener !== 'function') - throw new TypeError('"listener" argument must be a function'); - - events = this._events; - if (!events) - return this; - - list = events[type]; - if (!list) - return this; - - if (list === listener || (list.listener && list.listener === listener)) { - if (--this._eventsCount === 0) - this._events = new EventHandlers(); - else { - delete events[type]; - if (events.removeListener) - this.emit('removeListener', type, list.listener || listener); - } - } else if (typeof list !== 'function') { - position = -1; - - for (i = list.length; i-- > 0;) { - if (list[i] === listener || - (list[i].listener && list[i].listener === listener)) { - originalListener = list[i].listener; - position = i; - break; - } - } - - if (position < 0) - return this; - - if (list.length === 1) { - list[0] = undefined; - if (--this._eventsCount === 0) { - this._events = new EventHandlers(); - return this; - } else { - delete events[type]; - } - } else { - spliceOne(list, position); - } - - if (events.removeListener) - this.emit('removeListener', type, originalListener || listener); - } - - return this; - }; - -// Alias for removeListener added in NodeJS 10.0 -// https://nodejs.org/api/events.html#events_emitter_off_eventname_listener -EventEmitter.prototype.off = function(type, listener){ - return this.removeListener(type, listener); -}; - -EventEmitter.prototype.removeAllListeners = - function removeAllListeners(type) { - var listeners, events; - - events = this._events; - if (!events) - return this; - - // not listening for removeListener, no need to emit - if (!events.removeListener) { - if (arguments.length === 0) { - this._events = new EventHandlers(); - this._eventsCount = 0; - } else if (events[type]) { - if (--this._eventsCount === 0) - this._events = new EventHandlers(); - else - delete events[type]; - } - return this; - } - - // emit removeListener for all listeners on all events - if (arguments.length === 0) { - var keys = Object.keys(events); - for (var i = 0, key; i < keys.length; ++i) { - key = keys[i]; - if (key === 'removeListener') continue; - this.removeAllListeners(key); - } - this.removeAllListeners('removeListener'); - this._events = new EventHandlers(); - this._eventsCount = 0; - return this; - } - - listeners = events[type]; - - if (typeof listeners === 'function') { - this.removeListener(type, listeners); - } else if (listeners) { - // LIFO order - do { - this.removeListener(type, listeners[listeners.length - 1]); - } while (listeners[0]); - } - - return this; - }; - -EventEmitter.prototype.listeners = function listeners(type) { - var evlistener; - var ret; - var events = this._events; - - if (!events) - ret = []; - else { - evlistener = events[type]; - if (!evlistener) - ret = []; - else if (typeof evlistener === 'function') - ret = [evlistener.listener || evlistener]; - else - ret = unwrapListeners(evlistener); - } - - return ret; -}; - -EventEmitter.listenerCount = function(emitter, type) { - if (typeof emitter.listenerCount === 'function') { - return emitter.listenerCount(type); - } else { - return listenerCount$1.call(emitter, type); - } -}; - -EventEmitter.prototype.listenerCount = listenerCount$1; -function listenerCount$1(type) { - var events = this._events; - - if (events) { - var evlistener = events[type]; - - if (typeof evlistener === 'function') { - return 1; - } else if (evlistener) { - return evlistener.length; - } - } - - return 0; -} - -EventEmitter.prototype.eventNames = function eventNames() { - return this._eventsCount > 0 ? Reflect.ownKeys(this._events) : []; -}; - -// About 1.5x faster than the two-arg version of Array#splice(). -function spliceOne(list, index) { - for (var i = index, k = i + 1, n = list.length; k < n; i += 1, k += 1) - list[i] = list[k]; - list.pop(); -} - -function arrayClone(arr, i) { - var copy = new Array(i); - while (i--) - copy[i] = arr[i]; - return copy; -} - -function unwrapListeners(arr) { - var ret = new Array(arr.length); - for (var i = 0; i < ret.length; ++i) { - ret[i] = arr[i].listener || arr[i]; - } - return ret; -} - -var inherits; -if (typeof Object.create === 'function'){ - inherits = function inherits(ctor, superCtor) { - // implementation from standard node.js 'util' module - ctor.super_ = superCtor; - ctor.prototype = Object.create(superCtor.prototype, { - constructor: { - value: ctor, - enumerable: false, - writable: true, - configurable: true - } - }); - }; -} else { - inherits = function inherits(ctor, superCtor) { - ctor.super_ = superCtor; - var TempCtor = function () {}; - TempCtor.prototype = superCtor.prototype; - ctor.prototype = new TempCtor(); - ctor.prototype.constructor = ctor; - }; -} - -var getOwnPropertyDescriptors = Object.getOwnPropertyDescriptors || - function getOwnPropertyDescriptors(obj) { - var keys = Object.keys(obj); - var descriptors = {}; - for (var i = 0; i < keys.length; i++) { - descriptors[keys[i]] = Object.getOwnPropertyDescriptor(obj, keys[i]); - } - return descriptors; - }; - -var formatRegExp = /%[sdj%]/g; -function format(f) { - if (!isString(f)) { - var objects = []; - for (var i = 0; i < arguments.length; i++) { - objects.push(inspect$1(arguments[i])); - } - return objects.join(' '); - } - - var i = 1; - var args = arguments; - var len = args.length; - var str = String(f).replace(formatRegExp, function(x) { - if (x === '%%') return '%'; - if (i >= len) return x; - switch (x) { - case '%s': return String(args[i++]); - case '%d': return Number(args[i++]); - case '%j': - try { - return JSON.stringify(args[i++]); - } catch (_) { - return '[Circular]'; - } - default: - return x; - } - }); - for (var x = args[i]; i < len; x = args[++i]) { - if (isNull(x) || !isObject(x)) { - str += ' ' + x; - } else { - str += ' ' + inspect$1(x); - } - } - return str; -} - -// Mark that a method should not be used. -// Returns a modified function which warns once by default. -// If --no-deprecation is set, then it is a no-op. -function deprecate(fn, msg) { - // Allow for deprecating things in the process of starting up. - if (isUndefined(global$1.process)) { - return function() { - return deprecate(fn, msg).apply(this, arguments); - }; - } - - if (browser$1.noDeprecation === true) { - return fn; - } - - var warned = false; - function deprecated() { - if (!warned) { - if (browser$1.throwDeprecation) { - throw new Error(msg); - } else if (browser$1.traceDeprecation) { - console.trace(msg); - } else { - console.error(msg); - } - warned = true; - } - return fn.apply(this, arguments); - } - - return deprecated; -} - -var debugs = {}; -var debugEnviron; -function debuglog(set) { - if (isUndefined(debugEnviron)) - debugEnviron = browser$1.env.NODE_DEBUG || ''; - set = set.toUpperCase(); - if (!debugs[set]) { - if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) { - var pid = 0; - debugs[set] = function() { - var msg = format.apply(null, arguments); - console.error('%s %d: %s', set, pid, msg); - }; - } else { - debugs[set] = function() {}; - } - } - return debugs[set]; -} - -/** - * Echos the value of a value. Trys to print the value out - * in the best way possible given the different types. - * - * @param {Object} obj The object to print out. - * @param {Object} opts Optional options object that alters the output. - */ -/* legacy: obj, showHidden, depth, colors*/ -function inspect$1(obj, opts) { - // default options - var ctx = { - seen: [], - stylize: stylizeNoColor - }; - // legacy... - if (arguments.length >= 3) ctx.depth = arguments[2]; - if (arguments.length >= 4) ctx.colors = arguments[3]; - if (isBoolean(opts)) { - // legacy... - ctx.showHidden = opts; - } else if (opts) { - // got an "options" object - _extend(ctx, opts); - } - // set default options - if (isUndefined(ctx.showHidden)) ctx.showHidden = false; - if (isUndefined(ctx.depth)) ctx.depth = 2; - if (isUndefined(ctx.colors)) ctx.colors = false; - if (isUndefined(ctx.customInspect)) ctx.customInspect = true; - if (ctx.colors) ctx.stylize = stylizeWithColor; - return formatValue(ctx, obj, ctx.depth); -} - -// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics -inspect$1.colors = { - 'bold' : [1, 22], - 'italic' : [3, 23], - 'underline' : [4, 24], - 'inverse' : [7, 27], - 'white' : [37, 39], - 'grey' : [90, 39], - 'black' : [30, 39], - 'blue' : [34, 39], - 'cyan' : [36, 39], - 'green' : [32, 39], - 'magenta' : [35, 39], - 'red' : [31, 39], - 'yellow' : [33, 39] -}; - -// Don't use 'blue' not visible on cmd.exe -inspect$1.styles = { - 'special': 'cyan', - 'number': 'yellow', - 'boolean': 'yellow', - 'undefined': 'grey', - 'null': 'bold', - 'string': 'green', - 'date': 'magenta', - // "name": intentionally not styling - 'regexp': 'red' -}; - - -function stylizeWithColor(str, styleType) { - var style = inspect$1.styles[styleType]; - - if (style) { - return '\u001b[' + inspect$1.colors[style][0] + 'm' + str + - '\u001b[' + inspect$1.colors[style][1] + 'm'; - } else { - return str; - } -} - - -function stylizeNoColor(str, styleType) { - return str; -} - - -function arrayToHash(array) { - var hash = {}; - - array.forEach(function(val, idx) { - hash[val] = true; - }); - - return hash; -} - - -function formatValue(ctx, value, recurseTimes) { - // Provide a hook for user-specified inspect functions. - // Check that value is an object with an inspect function on it - if (ctx.customInspect && - value && - isFunction(value.inspect) && - // Filter out the util module, it's inspect function is special - value.inspect !== inspect$1 && - // Also filter out any prototype objects using the circular check. - !(value.constructor && value.constructor.prototype === value)) { - var ret = value.inspect(recurseTimes, ctx); - if (!isString(ret)) { - ret = formatValue(ctx, ret, recurseTimes); - } - return ret; - } - - // Primitive types cannot have properties - var primitive = formatPrimitive(ctx, value); - if (primitive) { - return primitive; - } - - // Look up the keys of the object. - var keys = Object.keys(value); - var visibleKeys = arrayToHash(keys); - - if (ctx.showHidden) { - keys = Object.getOwnPropertyNames(value); - } - - // IE doesn't make error fields non-enumerable - // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx - if (isError(value) - && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) { - return formatError(value); - } - - // Some type of object without properties can be shortcutted. - if (keys.length === 0) { - if (isFunction(value)) { - var name = value.name ? ': ' + value.name : ''; - return ctx.stylize('[Function' + name + ']', 'special'); - } - if (isRegExp(value)) { - return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); - } - if (isDate(value)) { - return ctx.stylize(Date.prototype.toString.call(value), 'date'); - } - if (isError(value)) { - return formatError(value); - } - } - - var base = '', array = false, braces = ['{', '}']; - - // Make Array say that they are Array - if (isArray(value)) { - array = true; - braces = ['[', ']']; - } - - // Make functions say that they are functions - if (isFunction(value)) { - var n = value.name ? ': ' + value.name : ''; - base = ' [Function' + n + ']'; - } - - // Make RegExps say that they are RegExps - if (isRegExp(value)) { - base = ' ' + RegExp.prototype.toString.call(value); - } - - // Make dates with properties first say the date - if (isDate(value)) { - base = ' ' + Date.prototype.toUTCString.call(value); - } - - // Make error with message first say the error - if (isError(value)) { - base = ' ' + formatError(value); - } - - if (keys.length === 0 && (!array || value.length == 0)) { - return braces[0] + base + braces[1]; - } - - if (recurseTimes < 0) { - if (isRegExp(value)) { - return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); - } else { - return ctx.stylize('[Object]', 'special'); - } - } - - ctx.seen.push(value); - - var output; - if (array) { - output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); - } else { - output = keys.map(function(key) { - return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); - }); - } - - ctx.seen.pop(); - - return reduceToSingleString(output, base, braces); -} - - -function formatPrimitive(ctx, value) { - if (isUndefined(value)) - return ctx.stylize('undefined', 'undefined'); - if (isString(value)) { - var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') - .replace(/'/g, "\\'") - .replace(/\\"/g, '"') + '\''; - return ctx.stylize(simple, 'string'); - } - if (isNumber(value)) - return ctx.stylize('' + value, 'number'); - if (isBoolean(value)) - return ctx.stylize('' + value, 'boolean'); - // For some reason typeof null is "object", so special case here. - if (isNull(value)) - return ctx.stylize('null', 'null'); -} - - -function formatError(value) { - return '[' + Error.prototype.toString.call(value) + ']'; -} - - -function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { - var output = []; - for (var i = 0, l = value.length; i < l; ++i) { - if (hasOwnProperty(value, String(i))) { - output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, - String(i), true)); - } else { - output.push(''); - } - } - keys.forEach(function(key) { - if (!key.match(/^\d+$/)) { - output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, - key, true)); - } - }); - return output; -} - - -function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { - var name, str, desc; - desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] }; - if (desc.get) { - if (desc.set) { - str = ctx.stylize('[Getter/Setter]', 'special'); - } else { - str = ctx.stylize('[Getter]', 'special'); - } - } else { - if (desc.set) { - str = ctx.stylize('[Setter]', 'special'); - } - } - if (!hasOwnProperty(visibleKeys, key)) { - name = '[' + key + ']'; - } - if (!str) { - if (ctx.seen.indexOf(desc.value) < 0) { - if (isNull(recurseTimes)) { - str = formatValue(ctx, desc.value, null); - } else { - str = formatValue(ctx, desc.value, recurseTimes - 1); - } - if (str.indexOf('\n') > -1) { - if (array) { - str = str.split('\n').map(function(line) { - return ' ' + line; - }).join('\n').substr(2); - } else { - str = '\n' + str.split('\n').map(function(line) { - return ' ' + line; - }).join('\n'); - } - } - } else { - str = ctx.stylize('[Circular]', 'special'); - } - } - if (isUndefined(name)) { - if (array && key.match(/^\d+$/)) { - return str; - } - name = JSON.stringify('' + key); - if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { - name = name.substr(1, name.length - 2); - name = ctx.stylize(name, 'name'); - } else { - name = name.replace(/'/g, "\\'") - .replace(/\\"/g, '"') - .replace(/(^"|"$)/g, "'"); - name = ctx.stylize(name, 'string'); - } - } - - return name + ': ' + str; -} - - -function reduceToSingleString(output, base, braces) { - var length = output.reduce(function(prev, cur) { - if (cur.indexOf('\n') >= 0) ; - return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1; - }, 0); - - if (length > 60) { - return braces[0] + - (base === '' ? '' : base + '\n ') + - ' ' + - output.join(',\n ') + - ' ' + - braces[1]; - } - - return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; -} - - -// NOTE: These type checking functions intentionally don't use `instanceof` -// because it is fragile and can be easily faked with `Object.create()`. -function isArray(ar) { - return Array.isArray(ar); -} - -function isBoolean(arg) { - return typeof arg === 'boolean'; -} - -function isNull(arg) { - return arg === null; -} - -function isNullOrUndefined(arg) { - return arg == null; -} - -function isNumber(arg) { - return typeof arg === 'number'; -} - -function isString(arg) { - return typeof arg === 'string'; -} - -function isSymbol(arg) { - return typeof arg === 'symbol'; -} - -function isUndefined(arg) { - return arg === void 0; -} - -function isRegExp(re) { - return isObject(re) && objectToString(re) === '[object RegExp]'; -} - -function isObject(arg) { - return typeof arg === 'object' && arg !== null; -} - -function isDate(d) { - return isObject(d) && objectToString(d) === '[object Date]'; -} - -function isError(e) { - return isObject(e) && - (objectToString(e) === '[object Error]' || e instanceof Error); -} - -function isFunction(arg) { - return typeof arg === 'function'; -} - -function isPrimitive(arg) { - return arg === null || - typeof arg === 'boolean' || - typeof arg === 'number' || - typeof arg === 'string' || - typeof arg === 'symbol' || // ES6 symbol - typeof arg === 'undefined'; -} - -function isBuffer(maybeBuf) { - return Buffer.isBuffer(maybeBuf); -} - -function objectToString(o) { - return Object.prototype.toString.call(o); -} - - -function pad(n) { - return n < 10 ? '0' + n.toString(10) : n.toString(10); -} - - -var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', - 'Oct', 'Nov', 'Dec']; - -// 26 Feb 16:19:34 -function timestamp() { - var d = new Date(); - var time = [pad(d.getHours()), - pad(d.getMinutes()), - pad(d.getSeconds())].join(':'); - return [d.getDate(), months[d.getMonth()], time].join(' '); -} - - -// log is just a thin wrapper to console.log that prepends a timestamp -function log() { - console.log('%s - %s', timestamp(), format.apply(null, arguments)); -} - -function _extend(origin, add) { - // Don't do anything if add isn't an object - if (!add || !isObject(add)) return origin; - - var keys = Object.keys(add); - var i = keys.length; - while (i--) { - origin[keys[i]] = add[keys[i]]; - } - return origin; -} -function hasOwnProperty(obj, prop) { - return Object.prototype.hasOwnProperty.call(obj, prop); -} - -var kCustomPromisifiedSymbol = typeof Symbol !== 'undefined' ? Symbol('util.promisify.custom') : undefined; - -function promisify(original) { - if (typeof original !== 'function') - throw new TypeError('The "original" argument must be of type Function'); - - if (kCustomPromisifiedSymbol && original[kCustomPromisifiedSymbol]) { - var fn = original[kCustomPromisifiedSymbol]; - if (typeof fn !== 'function') { - throw new TypeError('The "util.promisify.custom" argument must be of type Function'); - } - Object.defineProperty(fn, kCustomPromisifiedSymbol, { - value: fn, enumerable: false, writable: false, configurable: true - }); - return fn; - } - - function fn() { - var promiseResolve, promiseReject; - var promise = new Promise(function (resolve, reject) { - promiseResolve = resolve; - promiseReject = reject; - }); - - var args = []; - for (var i = 0; i < arguments.length; i++) { - args.push(arguments[i]); - } - args.push(function (err, value) { - if (err) { - promiseReject(err); - } else { - promiseResolve(value); - } - }); - - try { - original.apply(this, args); - } catch (err) { - promiseReject(err); - } - - return promise; - } - - Object.setPrototypeOf(fn, Object.getPrototypeOf(original)); - - if (kCustomPromisifiedSymbol) Object.defineProperty(fn, kCustomPromisifiedSymbol, { - value: fn, enumerable: false, writable: false, configurable: true - }); - return Object.defineProperties( - fn, - getOwnPropertyDescriptors(original) - ); -} - -promisify.custom = kCustomPromisifiedSymbol; - -function callbackifyOnRejected(reason, cb) { - // `!reason` guard inspired by bluebird (Ref: https://goo.gl/t5IS6M). - // Because `null` is a special error value in callbacks which means "no error - // occurred", we error-wrap so the callback consumer can distinguish between - // "the promise rejected with null" or "the promise fulfilled with undefined". - if (!reason) { - var newReason = new Error('Promise was rejected with a falsy value'); - newReason.reason = reason; - reason = newReason; - } - return cb(reason); -} - -function callbackify(original) { - if (typeof original !== 'function') { - throw new TypeError('The "original" argument must be of type Function'); - } - - // We DO NOT return the promise as it gives the user a false sense that - // the promise is actually somehow related to the callback's execution - // and that the callback throwing will reject the promise. - function callbackified() { - var args = []; - for (var i = 0; i < arguments.length; i++) { - args.push(arguments[i]); - } - - var maybeCb = args.pop(); - if (typeof maybeCb !== 'function') { - throw new TypeError('The last argument must be of type Function'); - } - var self = this; - var cb = function() { - return maybeCb.apply(self, arguments); - }; - // In true node style we process the callback on `nextTick` with all the - // implications (stack, `uncaughtException`, `async_hooks`) - original.apply(this, args) - .then(function(ret) { browser$1.nextTick(cb.bind(null, null, ret)); }, - function(rej) { browser$1.nextTick(callbackifyOnRejected.bind(null, rej, cb)); }); - } - - Object.setPrototypeOf(callbackified, Object.getPrototypeOf(original)); - Object.defineProperties(callbackified, getOwnPropertyDescriptors(original)); - return callbackified; -} - -var _polyfillNode_util = { - inherits: inherits, - _extend: _extend, - log: log, - isBuffer: isBuffer, - isPrimitive: isPrimitive, - isFunction: isFunction, - isError: isError, - isDate: isDate, - isObject: isObject, - isRegExp: isRegExp, - isUndefined: isUndefined, - isSymbol: isSymbol, - isString: isString, - isNumber: isNumber, - isNullOrUndefined: isNullOrUndefined, - isNull: isNull, - isBoolean: isBoolean, - isArray: isArray, - inspect: inspect$1, - deprecate: deprecate, - format: format, - debuglog: debuglog, - promisify: promisify, - callbackify: callbackify, -}; - -var _polyfillNode_util$1 = /*#__PURE__*/Object.freeze({ - __proto__: null, - _extend: _extend, - callbackify: callbackify, - debuglog: debuglog, - default: _polyfillNode_util, - deprecate: deprecate, - format: format, - inherits: inherits, - inspect: inspect$1, - isArray: isArray, - isBoolean: isBoolean, - isBuffer: isBuffer, - isDate: isDate, - isError: isError, - isFunction: isFunction, - isNull: isNull, - isNullOrUndefined: isNullOrUndefined, - isNumber: isNumber, - isObject: isObject, - isPrimitive: isPrimitive, - isRegExp: isRegExp, - isString: isString, - isSymbol: isSymbol, - isUndefined: isUndefined, - log: log, - promisify: promisify -}); - -function BufferList() { - this.head = null; - this.tail = null; - this.length = 0; -} - -BufferList.prototype.push = function (v) { - var entry = { data: v, next: null }; - if (this.length > 0) this.tail.next = entry;else this.head = entry; - this.tail = entry; - ++this.length; -}; - -BufferList.prototype.unshift = function (v) { - var entry = { data: v, next: this.head }; - if (this.length === 0) this.tail = entry; - this.head = entry; - ++this.length; -}; - -BufferList.prototype.shift = function () { - if (this.length === 0) return; - var ret = this.head.data; - if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next; - --this.length; - return ret; -}; - -BufferList.prototype.clear = function () { - this.head = this.tail = null; - this.length = 0; -}; - -BufferList.prototype.join = function (s) { - if (this.length === 0) return ''; - var p = this.head; - var ret = '' + p.data; - while (p = p.next) { - ret += s + p.data; - }return ret; -}; - -BufferList.prototype.concat = function (n) { - if (this.length === 0) return Buffer.alloc(0); - if (this.length === 1) return this.head.data; - var ret = Buffer.allocUnsafe(n >>> 0); - var p = this.head; - var i = 0; - while (p) { - p.data.copy(ret, i); - i += p.data.length; - p = p.next; - } - return ret; -}; - -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -var isBufferEncoding = Buffer.isEncoding - || function(encoding) { - switch (encoding && encoding.toLowerCase()) { - case 'hex': case 'utf8': case 'utf-8': case 'ascii': case 'binary': case 'base64': case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': case 'raw': return true; - default: return false; - } - }; - - -function assertEncoding(encoding) { - if (encoding && !isBufferEncoding(encoding)) { - throw new Error('Unknown encoding: ' + encoding); - } -} - -// StringDecoder provides an interface for efficiently splitting a series of -// buffers into a series of JS strings without breaking apart multi-byte -// characters. CESU-8 is handled as part of the UTF-8 encoding. -// -// @TODO Handling all encodings inside a single object makes it very difficult -// to reason about this code, so it should be split up in the future. -// @TODO There should be a utf8-strict encoding that rejects invalid UTF-8 code -// points as used by CESU-8. -function StringDecoder(encoding) { - this.encoding = (encoding || 'utf8').toLowerCase().replace(/[-_]/, ''); - assertEncoding(encoding); - switch (this.encoding) { - case 'utf8': - // CESU-8 represents each of Surrogate Pair by 3-bytes - this.surrogateSize = 3; - break; - case 'ucs2': - case 'utf16le': - // UTF-16 represents each of Surrogate Pair by 2-bytes - this.surrogateSize = 2; - this.detectIncompleteChar = utf16DetectIncompleteChar; - break; - case 'base64': - // Base-64 stores 3 bytes in 4 chars, and pads the remainder. - this.surrogateSize = 3; - this.detectIncompleteChar = base64DetectIncompleteChar; - break; - default: - this.write = passThroughWrite; - return; - } - - // Enough space to store all bytes of a single character. UTF-8 needs 4 - // bytes, but CESU-8 may require up to 6 (3 bytes per surrogate). - this.charBuffer = new Buffer(6); - // Number of bytes received for the current incomplete multi-byte character. - this.charReceived = 0; - // Number of bytes expected for the current incomplete multi-byte character. - this.charLength = 0; -} - -// write decodes the given buffer and returns it as JS string that is -// guaranteed to not contain any partial multi-byte characters. Any partial -// character found at the end of the buffer is buffered up, and will be -// returned when calling write again with the remaining bytes. -// -// Note: Converting a Buffer containing an orphan surrogate to a String -// currently works, but converting a String to a Buffer (via `new Buffer`, or -// Buffer#write) will replace incomplete surrogates with the unicode -// replacement character. See https://codereview.chromium.org/121173009/ . -StringDecoder.prototype.write = function(buffer) { - var charStr = ''; - // if our last write ended with an incomplete multibyte character - while (this.charLength) { - // determine how many remaining bytes this buffer has to offer for this char - var available = (buffer.length >= this.charLength - this.charReceived) ? - this.charLength - this.charReceived : - buffer.length; - - // add the new bytes to the char buffer - buffer.copy(this.charBuffer, this.charReceived, 0, available); - this.charReceived += available; - - if (this.charReceived < this.charLength) { - // still not enough chars in this buffer? wait for more ... - return ''; - } - - // remove bytes belonging to the current character from the buffer - buffer = buffer.slice(available, buffer.length); - - // get the character that was split - charStr = this.charBuffer.slice(0, this.charLength).toString(this.encoding); - - // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character - var charCode = charStr.charCodeAt(charStr.length - 1); - if (charCode >= 0xD800 && charCode <= 0xDBFF) { - this.charLength += this.surrogateSize; - charStr = ''; - continue; - } - this.charReceived = this.charLength = 0; - - // if there are no more bytes in this buffer, just emit our char - if (buffer.length === 0) { - return charStr; - } - break; - } - - // determine and set charLength / charReceived - this.detectIncompleteChar(buffer); - - var end = buffer.length; - if (this.charLength) { - // buffer the incomplete character bytes we got - buffer.copy(this.charBuffer, 0, buffer.length - this.charReceived, end); - end -= this.charReceived; - } - - charStr += buffer.toString(this.encoding, 0, end); - - var end = charStr.length - 1; - var charCode = charStr.charCodeAt(end); - // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character - if (charCode >= 0xD800 && charCode <= 0xDBFF) { - var size = this.surrogateSize; - this.charLength += size; - this.charReceived += size; - this.charBuffer.copy(this.charBuffer, size, 0, size); - buffer.copy(this.charBuffer, 0, 0, size); - return charStr.substring(0, end); - } - - // or just emit the charStr - return charStr; -}; - -// detectIncompleteChar determines if there is an incomplete UTF-8 character at -// the end of the given buffer. If so, it sets this.charLength to the byte -// length that character, and sets this.charReceived to the number of bytes -// that are available for this character. -StringDecoder.prototype.detectIncompleteChar = function(buffer) { - // determine how many bytes we have to check at the end of this buffer - var i = (buffer.length >= 3) ? 3 : buffer.length; - - // Figure out if one of the last i bytes of our buffer announces an - // incomplete char. - for (; i > 0; i--) { - var c = buffer[buffer.length - i]; - - // See http://en.wikipedia.org/wiki/UTF-8#Description - - // 110XXXXX - if (i == 1 && c >> 5 == 0x06) { - this.charLength = 2; - break; - } - - // 1110XXXX - if (i <= 2 && c >> 4 == 0x0E) { - this.charLength = 3; - break; - } - - // 11110XXX - if (i <= 3 && c >> 3 == 0x1E) { - this.charLength = 4; - break; - } - } - this.charReceived = i; -}; - -StringDecoder.prototype.end = function(buffer) { - var res = ''; - if (buffer && buffer.length) - res = this.write(buffer); - - if (this.charReceived) { - var cr = this.charReceived; - var buf = this.charBuffer; - var enc = this.encoding; - res += buf.slice(0, cr).toString(enc); - } - - return res; -}; - -function passThroughWrite(buffer) { - return buffer.toString(this.encoding); -} - -function utf16DetectIncompleteChar(buffer) { - this.charReceived = buffer.length % 2; - this.charLength = this.charReceived ? 2 : 0; -} - -function base64DetectIncompleteChar(buffer) { - this.charReceived = buffer.length % 3; - this.charLength = this.charReceived ? 3 : 0; -} - -Readable.ReadableState = ReadableState; - -var debug = debuglog('stream'); -inherits(Readable, EventEmitter); - -function prependListener(emitter, event, fn) { - // Sadly this is not cacheable as some libraries bundle their own - // event emitter implementation with them. - if (typeof emitter.prependListener === 'function') { - return emitter.prependListener(event, fn); - } else { - // This is a hack to make sure that our error handler is attached before any - // userland ones. NEVER DO THIS. This is here only because this code needs - // to continue to work with older versions of Node.js that do not include - // the prependListener() method. The goal is to eventually remove this hack. - if (!emitter._events || !emitter._events[event]) - emitter.on(event, fn); - else if (Array.isArray(emitter._events[event])) - emitter._events[event].unshift(fn); - else - emitter._events[event] = [fn, emitter._events[event]]; - } -} -function listenerCount (emitter, type) { - return emitter.listeners(type).length; -} -function ReadableState(options, stream) { - - options = options || {}; - - // object stream flag. Used to make read(n) ignore n and to - // make all the buffer merging and length checks go away - this.objectMode = !!options.objectMode; - - if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.readableObjectMode; - - // the point at which it stops calling _read() to fill the buffer - // Note: 0 is a valid value, means "don't call _read preemptively ever" - var hwm = options.highWaterMark; - var defaultHwm = this.objectMode ? 16 : 16 * 1024; - this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm; - - // cast to ints. - this.highWaterMark = ~ ~this.highWaterMark; - - // A linked list is used to store data chunks instead of an array because the - // linked list can remove elements from the beginning faster than - // array.shift() - this.buffer = new BufferList(); - this.length = 0; - this.pipes = null; - this.pipesCount = 0; - this.flowing = null; - this.ended = false; - this.endEmitted = false; - this.reading = false; - - // a flag to be able to tell if the onwrite cb is called immediately, - // or on a later tick. We set this to true at first, because any - // actions that shouldn't happen until "later" should generally also - // not happen before the first write call. - this.sync = true; - - // whenever we return null, then we set a flag to say - // that we're awaiting a 'readable' event emission. - this.needReadable = false; - this.emittedReadable = false; - this.readableListening = false; - this.resumeScheduled = false; - - // Crypto is kind of old and crusty. Historically, its default string - // encoding is 'binary' so we have to make this configurable. - // Everything else in the universe uses 'utf8', though. - this.defaultEncoding = options.defaultEncoding || 'utf8'; - - // when piping, we only care about 'readable' events that happen - // after read()ing all the bytes and not getting any pushback. - this.ranOut = false; - - // the number of writers that are awaiting a drain event in .pipe()s - this.awaitDrain = 0; - - // if true, a maybeReadMore has been scheduled - this.readingMore = false; - - this.decoder = null; - this.encoding = null; - if (options.encoding) { - this.decoder = new StringDecoder(options.encoding); - this.encoding = options.encoding; - } -} -function Readable(options) { - - if (!(this instanceof Readable)) return new Readable(options); - - this._readableState = new ReadableState(options, this); - - // legacy - this.readable = true; - - if (options && typeof options.read === 'function') this._read = options.read; - - EventEmitter.call(this); -} - -// Manually shove something into the read() buffer. -// This returns true if the highWaterMark has not been hit yet, -// similar to how Writable.write() returns true if you should -// write() some more. -Readable.prototype.push = function (chunk, encoding) { - var state = this._readableState; - - if (!state.objectMode && typeof chunk === 'string') { - encoding = encoding || state.defaultEncoding; - if (encoding !== state.encoding) { - chunk = Buffer.from(chunk, encoding); - encoding = ''; - } - } - - return readableAddChunk(this, state, chunk, encoding, false); -}; - -// Unshift should *always* be something directly out of read() -Readable.prototype.unshift = function (chunk) { - var state = this._readableState; - return readableAddChunk(this, state, chunk, '', true); -}; - -Readable.prototype.isPaused = function () { - return this._readableState.flowing === false; -}; - -function readableAddChunk(stream, state, chunk, encoding, addToFront) { - var er = chunkInvalid(state, chunk); - if (er) { - stream.emit('error', er); - } else if (chunk === null) { - state.reading = false; - onEofChunk(stream, state); - } else if (state.objectMode || chunk && chunk.length > 0) { - if (state.ended && !addToFront) { - var e = new Error('stream.push() after EOF'); - stream.emit('error', e); - } else if (state.endEmitted && addToFront) { - var _e = new Error('stream.unshift() after end event'); - stream.emit('error', _e); - } else { - var skipAdd; - if (state.decoder && !addToFront && !encoding) { - chunk = state.decoder.write(chunk); - skipAdd = !state.objectMode && chunk.length === 0; - } - - if (!addToFront) state.reading = false; - - // Don't add to the buffer if we've decoded to an empty string chunk and - // we're not in object mode - if (!skipAdd) { - // if we want the data now, just emit it. - if (state.flowing && state.length === 0 && !state.sync) { - stream.emit('data', chunk); - stream.read(0); - } else { - // update the buffer info. - state.length += state.objectMode ? 1 : chunk.length; - if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk); - - if (state.needReadable) emitReadable(stream); - } - } - - maybeReadMore(stream, state); - } - } else if (!addToFront) { - state.reading = false; - } - - return needMoreData(state); -} - -// if it's past the high water mark, we can push in some more. -// Also, if we have no data yet, we can stand some -// more bytes. This is to work around cases where hwm=0, -// such as the repl. Also, if the push() triggered a -// readable event, and the user called read(largeNumber) such that -// needReadable was set, then we ought to push more, so that another -// 'readable' event will be triggered. -function needMoreData(state) { - return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0); -} - -// backwards compatibility. -Readable.prototype.setEncoding = function (enc) { - this._readableState.decoder = new StringDecoder(enc); - this._readableState.encoding = enc; - return this; -}; - -// Don't raise the hwm > 8MB -var MAX_HWM = 0x800000; -function computeNewHighWaterMark(n) { - if (n >= MAX_HWM) { - n = MAX_HWM; - } else { - // Get the next highest power of 2 to prevent increasing hwm excessively in - // tiny amounts - n--; - n |= n >>> 1; - n |= n >>> 2; - n |= n >>> 4; - n |= n >>> 8; - n |= n >>> 16; - n++; - } - return n; -} - -// This function is designed to be inlinable, so please take care when making -// changes to the function body. -function howMuchToRead(n, state) { - if (n <= 0 || state.length === 0 && state.ended) return 0; - if (state.objectMode) return 1; - if (n !== n) { - // Only flow one buffer at a time - if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length; - } - // If we're asking for more than the current hwm, then raise the hwm. - if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); - if (n <= state.length) return n; - // Don't have enough - if (!state.ended) { - state.needReadable = true; - return 0; - } - return state.length; -} - -// you can override either this method, or the async _read(n) below. -Readable.prototype.read = function (n) { - debug('read', n); - n = parseInt(n, 10); - var state = this._readableState; - var nOrig = n; - - if (n !== 0) state.emittedReadable = false; - - // if we're doing read(0) to trigger a readable event, but we - // already have a bunch of data in the buffer, then just trigger - // the 'readable' event and move on. - if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) { - debug('read: emitReadable', state.length, state.ended); - if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this); - return null; - } - - n = howMuchToRead(n, state); - - // if we've ended, and we're now clear, then finish it up. - if (n === 0 && state.ended) { - if (state.length === 0) endReadable(this); - return null; - } - - // All the actual chunk generation logic needs to be - // *below* the call to _read. The reason is that in certain - // synthetic stream cases, such as passthrough streams, _read - // may be a completely synchronous operation which may change - // the state of the read buffer, providing enough data when - // before there was *not* enough. - // - // So, the steps are: - // 1. Figure out what the state of things will be after we do - // a read from the buffer. - // - // 2. If that resulting state will trigger a _read, then call _read. - // Note that this may be asynchronous, or synchronous. Yes, it is - // deeply ugly to write APIs this way, but that still doesn't mean - // that the Readable class should behave improperly, as streams are - // designed to be sync/async agnostic. - // Take note if the _read call is sync or async (ie, if the read call - // has returned yet), so that we know whether or not it's safe to emit - // 'readable' etc. - // - // 3. Actually pull the requested chunks out of the buffer and return. - - // if we need a readable event, then we need to do some reading. - var doRead = state.needReadable; - debug('need readable', doRead); - - // if we currently have less than the highWaterMark, then also read some - if (state.length === 0 || state.length - n < state.highWaterMark) { - doRead = true; - debug('length less than watermark', doRead); - } - - // however, if we've ended, then there's no point, and if we're already - // reading, then it's unnecessary. - if (state.ended || state.reading) { - doRead = false; - debug('reading or ended', doRead); - } else if (doRead) { - debug('do read'); - state.reading = true; - state.sync = true; - // if the length is currently zero, then we *need* a readable event. - if (state.length === 0) state.needReadable = true; - // call internal read method - this._read(state.highWaterMark); - state.sync = false; - // If _read pushed data synchronously, then `reading` will be false, - // and we need to re-evaluate how much data we can return to the user. - if (!state.reading) n = howMuchToRead(nOrig, state); - } - - var ret; - if (n > 0) ret = fromList(n, state);else ret = null; - - if (ret === null) { - state.needReadable = true; - n = 0; - } else { - state.length -= n; - } - - if (state.length === 0) { - // If we have nothing in the buffer, then we want to know - // as soon as we *do* get something into the buffer. - if (!state.ended) state.needReadable = true; - - // If we tried to read() past the EOF, then emit end on the next tick. - if (nOrig !== n && state.ended) endReadable(this); - } - - if (ret !== null) this.emit('data', ret); - - return ret; -}; - -function chunkInvalid(state, chunk) { - var er = null; - if (!Buffer.isBuffer(chunk) && typeof chunk !== 'string' && chunk !== null && chunk !== undefined && !state.objectMode) { - er = new TypeError('Invalid non-string/buffer chunk'); - } - return er; -} - -function onEofChunk(stream, state) { - if (state.ended) return; - if (state.decoder) { - var chunk = state.decoder.end(); - if (chunk && chunk.length) { - state.buffer.push(chunk); - state.length += state.objectMode ? 1 : chunk.length; - } - } - state.ended = true; - - // emit 'readable' now to make sure it gets picked up. - emitReadable(stream); -} - -// Don't emit readable right away in sync mode, because this can trigger -// another read() call => stack overflow. This way, it might trigger -// a nextTick recursion warning, but that's not so bad. -function emitReadable(stream) { - var state = stream._readableState; - state.needReadable = false; - if (!state.emittedReadable) { - debug('emitReadable', state.flowing); - state.emittedReadable = true; - if (state.sync) nextTick(emitReadable_, stream);else emitReadable_(stream); - } -} - -function emitReadable_(stream) { - debug('emit readable'); - stream.emit('readable'); - flow(stream); -} - -// at this point, the user has presumably seen the 'readable' event, -// and called read() to consume some data. that may have triggered -// in turn another _read(n) call, in which case reading = true if -// it's in progress. -// However, if we're not ended, or reading, and the length < hwm, -// then go ahead and try to read some more preemptively. -function maybeReadMore(stream, state) { - if (!state.readingMore) { - state.readingMore = true; - nextTick(maybeReadMore_, stream, state); - } -} - -function maybeReadMore_(stream, state) { - var len = state.length; - while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) { - debug('maybeReadMore read 0'); - stream.read(0); - if (len === state.length) - // didn't get any data, stop spinning. - break;else len = state.length; - } - state.readingMore = false; -} - -// abstract method. to be overridden in specific implementation classes. -// call cb(er, data) where data is <= n in length. -// for virtual (non-string, non-buffer) streams, "length" is somewhat -// arbitrary, and perhaps not very meaningful. -Readable.prototype._read = function (n) { - this.emit('error', new Error('not implemented')); -}; - -Readable.prototype.pipe = function (dest, pipeOpts) { - var src = this; - var state = this._readableState; - - switch (state.pipesCount) { - case 0: - state.pipes = dest; - break; - case 1: - state.pipes = [state.pipes, dest]; - break; - default: - state.pipes.push(dest); - break; - } - state.pipesCount += 1; - debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); - - var doEnd = (!pipeOpts || pipeOpts.end !== false); - - var endFn = doEnd ? onend : cleanup; - if (state.endEmitted) nextTick(endFn);else src.once('end', endFn); - - dest.on('unpipe', onunpipe); - function onunpipe(readable) { - debug('onunpipe'); - if (readable === src) { - cleanup(); - } - } - - function onend() { - debug('onend'); - dest.end(); - } - - // when the dest drains, it reduces the awaitDrain counter - // on the source. This would be more elegant with a .once() - // handler in flow(), but adding and removing repeatedly is - // too slow. - var ondrain = pipeOnDrain(src); - dest.on('drain', ondrain); - - var cleanedUp = false; - function cleanup() { - debug('cleanup'); - // cleanup event handlers once the pipe is broken - dest.removeListener('close', onclose); - dest.removeListener('finish', onfinish); - dest.removeListener('drain', ondrain); - dest.removeListener('error', onerror); - dest.removeListener('unpipe', onunpipe); - src.removeListener('end', onend); - src.removeListener('end', cleanup); - src.removeListener('data', ondata); - - cleanedUp = true; - - // if the reader is waiting for a drain event from this - // specific writer, then it would cause it to never start - // flowing again. - // So, if this is awaiting a drain, then we just call it now. - // If we don't know, then assume that we are waiting for one. - if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); - } - - // If the user pushes more data while we're writing to dest then we'll end up - // in ondata again. However, we only want to increase awaitDrain once because - // dest will only emit one 'drain' event for the multiple writes. - // => Introduce a guard on increasing awaitDrain. - var increasedAwaitDrain = false; - src.on('data', ondata); - function ondata(chunk) { - debug('ondata'); - increasedAwaitDrain = false; - var ret = dest.write(chunk); - if (false === ret && !increasedAwaitDrain) { - // If the user unpiped during `dest.write()`, it is possible - // to get stuck in a permanently paused state if that write - // also returned false. - // => Check whether `dest` is still a piping destination. - if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) { - debug('false write response, pause', src._readableState.awaitDrain); - src._readableState.awaitDrain++; - increasedAwaitDrain = true; - } - src.pause(); - } - } - - // if the dest has an error, then stop piping into it. - // however, don't suppress the throwing behavior for this. - function onerror(er) { - debug('onerror', er); - unpipe(); - dest.removeListener('error', onerror); - if (listenerCount(dest, 'error') === 0) dest.emit('error', er); - } - - // Make sure our error handler is attached before userland ones. - prependListener(dest, 'error', onerror); - - // Both close and finish should trigger unpipe, but only once. - function onclose() { - dest.removeListener('finish', onfinish); - unpipe(); - } - dest.once('close', onclose); - function onfinish() { - debug('onfinish'); - dest.removeListener('close', onclose); - unpipe(); - } - dest.once('finish', onfinish); - - function unpipe() { - debug('unpipe'); - src.unpipe(dest); - } - - // tell the dest that it's being piped to - dest.emit('pipe', src); - - // start the flow if it hasn't been started already. - if (!state.flowing) { - debug('pipe resume'); - src.resume(); - } - - return dest; -}; - -function pipeOnDrain(src) { - return function () { - var state = src._readableState; - debug('pipeOnDrain', state.awaitDrain); - if (state.awaitDrain) state.awaitDrain--; - if (state.awaitDrain === 0 && src.listeners('data').length) { - state.flowing = true; - flow(src); - } - }; -} - -Readable.prototype.unpipe = function (dest) { - var state = this._readableState; - - // if we're not piping anywhere, then do nothing. - if (state.pipesCount === 0) return this; - - // just one destination. most common case. - if (state.pipesCount === 1) { - // passed in one, but it's not the right one. - if (dest && dest !== state.pipes) return this; - - if (!dest) dest = state.pipes; - - // got a match. - state.pipes = null; - state.pipesCount = 0; - state.flowing = false; - if (dest) dest.emit('unpipe', this); - return this; - } - - // slow case. multiple pipe destinations. - - if (!dest) { - // remove all. - var dests = state.pipes; - var len = state.pipesCount; - state.pipes = null; - state.pipesCount = 0; - state.flowing = false; - - for (var _i = 0; _i < len; _i++) { - dests[_i].emit('unpipe', this); - }return this; - } - - // try to find the right one. - var i = indexOf(state.pipes, dest); - if (i === -1) return this; - - state.pipes.splice(i, 1); - state.pipesCount -= 1; - if (state.pipesCount === 1) state.pipes = state.pipes[0]; - - dest.emit('unpipe', this); - - return this; -}; - -// set up data events if they are asked for -// Ensure readable listeners eventually get something -Readable.prototype.on = function (ev, fn) { - var res = EventEmitter.prototype.on.call(this, ev, fn); - - if (ev === 'data') { - // Start flowing on next tick if stream isn't explicitly paused - if (this._readableState.flowing !== false) this.resume(); - } else if (ev === 'readable') { - var state = this._readableState; - if (!state.endEmitted && !state.readableListening) { - state.readableListening = state.needReadable = true; - state.emittedReadable = false; - if (!state.reading) { - nextTick(nReadingNextTick, this); - } else if (state.length) { - emitReadable(this); - } - } - } - - return res; -}; -Readable.prototype.addListener = Readable.prototype.on; - -function nReadingNextTick(self) { - debug('readable nexttick read 0'); - self.read(0); -} - -// pause() and resume() are remnants of the legacy readable stream API -// If the user uses them, then switch into old mode. -Readable.prototype.resume = function () { - var state = this._readableState; - if (!state.flowing) { - debug('resume'); - state.flowing = true; - resume(this, state); - } - return this; -}; - -function resume(stream, state) { - if (!state.resumeScheduled) { - state.resumeScheduled = true; - nextTick(resume_, stream, state); - } -} - -function resume_(stream, state) { - if (!state.reading) { - debug('resume read 0'); - stream.read(0); - } - - state.resumeScheduled = false; - state.awaitDrain = 0; - stream.emit('resume'); - flow(stream); - if (state.flowing && !state.reading) stream.read(0); -} - -Readable.prototype.pause = function () { - debug('call pause flowing=%j', this._readableState.flowing); - if (false !== this._readableState.flowing) { - debug('pause'); - this._readableState.flowing = false; - this.emit('pause'); - } - return this; -}; - -function flow(stream) { - var state = stream._readableState; - debug('flow', state.flowing); - while (state.flowing && stream.read() !== null) {} -} - -// wrap an old-style stream as the async data source. -// This is *not* part of the readable stream interface. -// It is an ugly unfortunate mess of history. -Readable.prototype.wrap = function (stream) { - var state = this._readableState; - var paused = false; - - var self = this; - stream.on('end', function () { - debug('wrapped end'); - if (state.decoder && !state.ended) { - var chunk = state.decoder.end(); - if (chunk && chunk.length) self.push(chunk); - } - - self.push(null); - }); - - stream.on('data', function (chunk) { - debug('wrapped data'); - if (state.decoder) chunk = state.decoder.write(chunk); - - // don't skip over falsy values in objectMode - if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return; - - var ret = self.push(chunk); - if (!ret) { - paused = true; - stream.pause(); - } - }); - - // proxy all the other methods. - // important when wrapping filters and duplexes. - for (var i in stream) { - if (this[i] === undefined && typeof stream[i] === 'function') { - this[i] = function (method) { - return function () { - return stream[method].apply(stream, arguments); - }; - }(i); - } - } - - // proxy certain important events. - var events = ['error', 'close', 'destroy', 'pause', 'resume']; - forEach(events, function (ev) { - stream.on(ev, self.emit.bind(self, ev)); - }); - - // when we try to consume some more bytes, simply unpause the - // underlying stream. - self._read = function (n) { - debug('wrapped _read', n); - if (paused) { - paused = false; - stream.resume(); - } - }; - - return self; -}; - -// exposed for testing purposes only. -Readable._fromList = fromList; - -// Pluck off n bytes from an array of buffers. -// Length is the combined lengths of all the buffers in the list. -// This function is designed to be inlinable, so please take care when making -// changes to the function body. -function fromList(n, state) { - // nothing buffered - if (state.length === 0) return null; - - var ret; - if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) { - // read it all, truncate the list - if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length); - state.buffer.clear(); - } else { - // read part of list - ret = fromListPartial(n, state.buffer, state.decoder); - } - - return ret; -} - -// Extracts only enough buffered data to satisfy the amount requested. -// This function is designed to be inlinable, so please take care when making -// changes to the function body. -function fromListPartial(n, list, hasStrings) { - var ret; - if (n < list.head.data.length) { - // slice is the same for buffers and strings - ret = list.head.data.slice(0, n); - list.head.data = list.head.data.slice(n); - } else if (n === list.head.data.length) { - // first chunk is a perfect match - ret = list.shift(); - } else { - // result spans more than one buffer - ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list); - } - return ret; -} - -// Copies a specified amount of characters from the list of buffered data -// chunks. -// This function is designed to be inlinable, so please take care when making -// changes to the function body. -function copyFromBufferString(n, list) { - var p = list.head; - var c = 1; - var ret = p.data; - n -= ret.length; - while (p = p.next) { - var str = p.data; - var nb = n > str.length ? str.length : n; - if (nb === str.length) ret += str;else ret += str.slice(0, n); - n -= nb; - if (n === 0) { - if (nb === str.length) { - ++c; - if (p.next) list.head = p.next;else list.head = list.tail = null; - } else { - list.head = p; - p.data = str.slice(nb); - } - break; - } - ++c; - } - list.length -= c; - return ret; -} - -// Copies a specified amount of bytes from the list of buffered data chunks. -// This function is designed to be inlinable, so please take care when making -// changes to the function body. -function copyFromBuffer(n, list) { - var ret = Buffer.allocUnsafe(n); - var p = list.head; - var c = 1; - p.data.copy(ret); - n -= p.data.length; - while (p = p.next) { - var buf = p.data; - var nb = n > buf.length ? buf.length : n; - buf.copy(ret, ret.length - n, 0, nb); - n -= nb; - if (n === 0) { - if (nb === buf.length) { - ++c; - if (p.next) list.head = p.next;else list.head = list.tail = null; - } else { - list.head = p; - p.data = buf.slice(nb); - } - break; - } - ++c; - } - list.length -= c; - return ret; -} - -function endReadable(stream) { - var state = stream._readableState; - - // If we get here before consuming all the bytes, then that is a - // bug in node. Should never happen. - if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream'); - - if (!state.endEmitted) { - state.ended = true; - nextTick(endReadableNT, state, stream); - } -} - -function endReadableNT(state, stream) { - // Check that we didn't get one last unshift. - if (!state.endEmitted && state.length === 0) { - state.endEmitted = true; - stream.readable = false; - stream.emit('end'); - } -} - -function forEach(xs, f) { - for (var i = 0, l = xs.length; i < l; i++) { - f(xs[i], i); - } -} - -function indexOf(xs, x) { - for (var i = 0, l = xs.length; i < l; i++) { - if (xs[i] === x) return i; - } - return -1; -} - -// A bit simpler than readable streams. -// Implement an async ._write(chunk, encoding, cb), and it'll handle all -// the drain event emission and buffering. - -Writable.WritableState = WritableState; -inherits(Writable, EventEmitter); - -function nop() {} - -function WriteReq(chunk, encoding, cb) { - this.chunk = chunk; - this.encoding = encoding; - this.callback = cb; - this.next = null; -} - -function WritableState(options, stream) { - Object.defineProperty(this, 'buffer', { - get: deprecate(function () { - return this.getBuffer(); - }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.') - }); - options = options || {}; - - // object stream flag to indicate whether or not this stream - // contains buffers or objects. - this.objectMode = !!options.objectMode; - - if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.writableObjectMode; - - // the point at which write() starts returning false - // Note: 0 is a valid value, means that we always return false if - // the entire buffer is not flushed immediately on write() - var hwm = options.highWaterMark; - var defaultHwm = this.objectMode ? 16 : 16 * 1024; - this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm; - - // cast to ints. - this.highWaterMark = ~ ~this.highWaterMark; - - this.needDrain = false; - // at the start of calling end() - this.ending = false; - // when end() has been called, and returned - this.ended = false; - // when 'finish' is emitted - this.finished = false; - - // should we decode strings into buffers before passing to _write? - // this is here so that some node-core streams can optimize string - // handling at a lower level. - var noDecode = options.decodeStrings === false; - this.decodeStrings = !noDecode; - - // Crypto is kind of old and crusty. Historically, its default string - // encoding is 'binary' so we have to make this configurable. - // Everything else in the universe uses 'utf8', though. - this.defaultEncoding = options.defaultEncoding || 'utf8'; - - // not an actual buffer we keep track of, but a measurement - // of how much we're waiting to get pushed to some underlying - // socket or file. - this.length = 0; - - // a flag to see when we're in the middle of a write. - this.writing = false; - - // when true all writes will be buffered until .uncork() call - this.corked = 0; - - // a flag to be able to tell if the onwrite cb is called immediately, - // or on a later tick. We set this to true at first, because any - // actions that shouldn't happen until "later" should generally also - // not happen before the first write call. - this.sync = true; - - // a flag to know if we're processing previously buffered items, which - // may call the _write() callback in the same tick, so that we don't - // end up in an overlapped onwrite situation. - this.bufferProcessing = false; - - // the callback that's passed to _write(chunk,cb) - this.onwrite = function (er) { - onwrite(stream, er); - }; - - // the callback that the user supplies to write(chunk,encoding,cb) - this.writecb = null; - - // the amount that is being written when _write is called. - this.writelen = 0; - - this.bufferedRequest = null; - this.lastBufferedRequest = null; - - // number of pending user-supplied write callbacks - // this must be 0 before 'finish' can be emitted - this.pendingcb = 0; - - // emit prefinish if the only thing we're waiting for is _write cbs - // This is relevant for synchronous Transform streams - this.prefinished = false; - - // True if the error was already emitted and should not be thrown again - this.errorEmitted = false; - - // count buffered requests - this.bufferedRequestCount = 0; - - // allocate the first CorkedRequest, there is always - // one allocated and free to use, and we maintain at most two - this.corkedRequestsFree = new CorkedRequest(this); -} - -WritableState.prototype.getBuffer = function writableStateGetBuffer() { - var current = this.bufferedRequest; - var out = []; - while (current) { - out.push(current); - current = current.next; - } - return out; -}; -function Writable(options) { - - // Writable ctor is applied to Duplexes, though they're not - // instanceof Writable, they're instanceof Readable. - if (!(this instanceof Writable) && !(this instanceof Duplex)) return new Writable(options); - - this._writableState = new WritableState(options, this); - - // legacy. - this.writable = true; - - if (options) { - if (typeof options.write === 'function') this._write = options.write; - - if (typeof options.writev === 'function') this._writev = options.writev; - } - - EventEmitter.call(this); -} - -// Otherwise people can pipe Writable streams, which is just wrong. -Writable.prototype.pipe = function () { - this.emit('error', new Error('Cannot pipe, not readable')); -}; - -function writeAfterEnd(stream, cb) { - var er = new Error('write after end'); - // TODO: defer error events consistently everywhere, not just the cb - stream.emit('error', er); - nextTick(cb, er); -} - -// If we get something that is not a buffer, string, null, or undefined, -// and we're not in objectMode, then that's an error. -// Otherwise stream chunks are all considered to be of length=1, and the -// watermarks determine how many objects to keep in the buffer, rather than -// how many bytes or characters. -function validChunk(stream, state, chunk, cb) { - var valid = true; - var er = false; - // Always throw error if a null is written - // if we are not in object mode then throw - // if it is not a buffer, string, or undefined. - if (chunk === null) { - er = new TypeError('May not write null values to stream'); - } else if (!Buffer.isBuffer(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { - er = new TypeError('Invalid non-string/buffer chunk'); - } - if (er) { - stream.emit('error', er); - nextTick(cb, er); - valid = false; - } - return valid; -} - -Writable.prototype.write = function (chunk, encoding, cb) { - var state = this._writableState; - var ret = false; - - if (typeof encoding === 'function') { - cb = encoding; - encoding = null; - } - - if (Buffer.isBuffer(chunk)) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding; - - if (typeof cb !== 'function') cb = nop; - - if (state.ended) writeAfterEnd(this, cb);else if (validChunk(this, state, chunk, cb)) { - state.pendingcb++; - ret = writeOrBuffer(this, state, chunk, encoding, cb); - } - - return ret; -}; - -Writable.prototype.cork = function () { - var state = this._writableState; - - state.corked++; -}; - -Writable.prototype.uncork = function () { - var state = this._writableState; - - if (state.corked) { - state.corked--; - - if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state); - } -}; - -Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { - // node::ParseEncoding() requires lower case. - if (typeof encoding === 'string') encoding = encoding.toLowerCase(); - if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding); - this._writableState.defaultEncoding = encoding; - return this; -}; - -function decodeChunk(state, chunk, encoding) { - if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { - chunk = Buffer.from(chunk, encoding); - } - return chunk; -} - -// if we're already writing something, then just put this -// in the queue, and wait our turn. Otherwise, call _write -// If we return false, then we need a drain event, so set that flag. -function writeOrBuffer(stream, state, chunk, encoding, cb) { - chunk = decodeChunk(state, chunk, encoding); - - if (Buffer.isBuffer(chunk)) encoding = 'buffer'; - var len = state.objectMode ? 1 : chunk.length; - - state.length += len; - - var ret = state.length < state.highWaterMark; - // we must ensure that previous needDrain will not be reset to false. - if (!ret) state.needDrain = true; - - if (state.writing || state.corked) { - var last = state.lastBufferedRequest; - state.lastBufferedRequest = new WriteReq(chunk, encoding, cb); - if (last) { - last.next = state.lastBufferedRequest; - } else { - state.bufferedRequest = state.lastBufferedRequest; - } - state.bufferedRequestCount += 1; - } else { - doWrite(stream, state, false, len, chunk, encoding, cb); - } - - return ret; -} - -function doWrite(stream, state, writev, len, chunk, encoding, cb) { - state.writelen = len; - state.writecb = cb; - state.writing = true; - state.sync = true; - if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite); - state.sync = false; -} - -function onwriteError(stream, state, sync, er, cb) { - --state.pendingcb; - if (sync) nextTick(cb, er);else cb(er); - - stream._writableState.errorEmitted = true; - stream.emit('error', er); -} - -function onwriteStateUpdate(state) { - state.writing = false; - state.writecb = null; - state.length -= state.writelen; - state.writelen = 0; -} - -function onwrite(stream, er) { - var state = stream._writableState; - var sync = state.sync; - var cb = state.writecb; - - onwriteStateUpdate(state); - - if (er) onwriteError(stream, state, sync, er, cb);else { - // Check if we're actually ready to finish, but don't emit yet - var finished = needFinish(state); - - if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) { - clearBuffer(stream, state); - } - - if (sync) { - /**/ - nextTick(afterWrite, stream, state, finished, cb); - /**/ - } else { - afterWrite(stream, state, finished, cb); - } - } -} - -function afterWrite(stream, state, finished, cb) { - if (!finished) onwriteDrain(stream, state); - state.pendingcb--; - cb(); - finishMaybe(stream, state); -} - -// Must force callback to be called on nextTick, so that we don't -// emit 'drain' before the write() consumer gets the 'false' return -// value, and has a chance to attach a 'drain' listener. -function onwriteDrain(stream, state) { - if (state.length === 0 && state.needDrain) { - state.needDrain = false; - stream.emit('drain'); - } -} - -// if there's something in the buffer waiting, then process it -function clearBuffer(stream, state) { - state.bufferProcessing = true; - var entry = state.bufferedRequest; - - if (stream._writev && entry && entry.next) { - // Fast case, write everything using _writev() - var l = state.bufferedRequestCount; - var buffer = new Array(l); - var holder = state.corkedRequestsFree; - holder.entry = entry; - - var count = 0; - while (entry) { - buffer[count] = entry; - entry = entry.next; - count += 1; - } - - doWrite(stream, state, true, state.length, buffer, '', holder.finish); - - // doWrite is almost always async, defer these to save a bit of time - // as the hot path ends with doWrite - state.pendingcb++; - state.lastBufferedRequest = null; - if (holder.next) { - state.corkedRequestsFree = holder.next; - holder.next = null; - } else { - state.corkedRequestsFree = new CorkedRequest(state); - } - } else { - // Slow case, write chunks one-by-one - while (entry) { - var chunk = entry.chunk; - var encoding = entry.encoding; - var cb = entry.callback; - var len = state.objectMode ? 1 : chunk.length; - - doWrite(stream, state, false, len, chunk, encoding, cb); - entry = entry.next; - // if we didn't call the onwrite immediately, then - // it means that we need to wait until it does. - // also, that means that the chunk and cb are currently - // being processed, so move the buffer counter past them. - if (state.writing) { - break; - } - } - - if (entry === null) state.lastBufferedRequest = null; - } - - state.bufferedRequestCount = 0; - state.bufferedRequest = entry; - state.bufferProcessing = false; -} - -Writable.prototype._write = function (chunk, encoding, cb) { - cb(new Error('not implemented')); -}; - -Writable.prototype._writev = null; - -Writable.prototype.end = function (chunk, encoding, cb) { - var state = this._writableState; - - if (typeof chunk === 'function') { - cb = chunk; - chunk = null; - encoding = null; - } else if (typeof encoding === 'function') { - cb = encoding; - encoding = null; - } - - if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); - - // .end() fully uncorks - if (state.corked) { - state.corked = 1; - this.uncork(); - } - - // ignore unnecessary end() calls. - if (!state.ending && !state.finished) endWritable(this, state, cb); -}; - -function needFinish(state) { - return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; -} - -function prefinish(stream, state) { - if (!state.prefinished) { - state.prefinished = true; - stream.emit('prefinish'); - } -} - -function finishMaybe(stream, state) { - var need = needFinish(state); - if (need) { - if (state.pendingcb === 0) { - prefinish(stream, state); - state.finished = true; - stream.emit('finish'); - } else { - prefinish(stream, state); - } - } - return need; -} - -function endWritable(stream, state, cb) { - state.ending = true; - finishMaybe(stream, state); - if (cb) { - if (state.finished) nextTick(cb);else stream.once('finish', cb); - } - state.ended = true; - stream.writable = false; -} - -// It seems a linked list but it is not -// there will be only 2 of these for each stream -function CorkedRequest(state) { - var _this = this; - - this.next = null; - this.entry = null; - - this.finish = function (err) { - var entry = _this.entry; - _this.entry = null; - while (entry) { - var cb = entry.callback; - state.pendingcb--; - cb(err); - entry = entry.next; - } - if (state.corkedRequestsFree) { - state.corkedRequestsFree.next = _this; - } else { - state.corkedRequestsFree = _this; - } - }; -} - -inherits(Duplex, Readable); - -var keys = Object.keys(Writable.prototype); -for (var v = 0; v < keys.length; v++) { - var method = keys[v]; - if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; -} -function Duplex(options) { - if (!(this instanceof Duplex)) return new Duplex(options); - - Readable.call(this, options); - Writable.call(this, options); - - if (options && options.readable === false) this.readable = false; - - if (options && options.writable === false) this.writable = false; - - this.allowHalfOpen = true; - if (options && options.allowHalfOpen === false) this.allowHalfOpen = false; - - this.once('end', onend); -} - -// the no-half-open enforcer -function onend() { - // if we allow half-open state, or if the writable side ended, - // then we're ok. - if (this.allowHalfOpen || this._writableState.ended) return; - - // no more data can be written. - // But allow more writes to happen in this tick. - nextTick(onEndNT, this); -} - -function onEndNT(self) { - self.end(); -} - -// a transform stream is a readable/writable stream where you do -// something with the data. Sometimes it's called a "filter", -// but that's not a great name for it, since that implies a thing where -// some bits pass through, and others are simply ignored. (That would -// be a valid example of a transform, of course.) -// -// While the output is causally related to the input, it's not a -// necessarily symmetric or synchronous transformation. For example, -// a zlib stream might take multiple plain-text writes(), and then -// emit a single compressed chunk some time in the future. -// -// Here's how this works: -// -// The Transform stream has all the aspects of the readable and writable -// stream classes. When you write(chunk), that calls _write(chunk,cb) -// internally, and returns false if there's a lot of pending writes -// buffered up. When you call read(), that calls _read(n) until -// there's enough pending readable data buffered up. -// -// In a transform stream, the written data is placed in a buffer. When -// _read(n) is called, it transforms the queued up data, calling the -// buffered _write cb's as it consumes chunks. If consuming a single -// written chunk would result in multiple output chunks, then the first -// outputted bit calls the readcb, and subsequent chunks just go into -// the read buffer, and will cause it to emit 'readable' if necessary. -// -// This way, back-pressure is actually determined by the reading side, -// since _read has to be called to start processing a new chunk. However, -// a pathological inflate type of transform can cause excessive buffering -// here. For example, imagine a stream where every byte of input is -// interpreted as an integer from 0-255, and then results in that many -// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in -// 1kb of data being output. In this case, you could write a very small -// amount of input, and end up with a very large amount of output. In -// such a pathological inflating mechanism, there'd be no way to tell -// the system to stop doing the transform. A single 4MB write could -// cause the system to run out of memory. -// -// However, even in such a pathological case, only a single written chunk -// would be consumed, and then the rest would wait (un-transformed) until -// the results of the previous transformed chunk were consumed. - -inherits(Transform, Duplex); - -function TransformState(stream) { - this.afterTransform = function (er, data) { - return afterTransform(stream, er, data); - }; - - this.needTransform = false; - this.transforming = false; - this.writecb = null; - this.writechunk = null; - this.writeencoding = null; -} - -function afterTransform(stream, er, data) { - var ts = stream._transformState; - ts.transforming = false; - - var cb = ts.writecb; - - if (!cb) return stream.emit('error', new Error('no writecb in Transform class')); - - ts.writechunk = null; - ts.writecb = null; - - if (data !== null && data !== undefined) stream.push(data); - - cb(er); - - var rs = stream._readableState; - rs.reading = false; - if (rs.needReadable || rs.length < rs.highWaterMark) { - stream._read(rs.highWaterMark); - } -} -function Transform(options) { - if (!(this instanceof Transform)) return new Transform(options); - - Duplex.call(this, options); - - this._transformState = new TransformState(this); - - // when the writable side finishes, then flush out anything remaining. - var stream = this; - - // start out asking for a readable event once data is transformed. - this._readableState.needReadable = true; - - // we have implemented the _read method, and done the other things - // that Readable wants before the first _read call, so unset the - // sync guard flag. - this._readableState.sync = false; - - if (options) { - if (typeof options.transform === 'function') this._transform = options.transform; - - if (typeof options.flush === 'function') this._flush = options.flush; - } - - this.once('prefinish', function () { - if (typeof this._flush === 'function') this._flush(function (er) { - done(stream, er); - });else done(stream); - }); -} - -Transform.prototype.push = function (chunk, encoding) { - this._transformState.needTransform = false; - return Duplex.prototype.push.call(this, chunk, encoding); -}; - -// This is the part where you do stuff! -// override this function in implementation classes. -// 'chunk' is an input chunk. -// -// Call `push(newChunk)` to pass along transformed output -// to the readable side. You may call 'push' zero or more times. -// -// Call `cb(err)` when you are done with this chunk. If you pass -// an error, then that'll put the hurt on the whole operation. If you -// never call cb(), then you'll never get another chunk. -Transform.prototype._transform = function (chunk, encoding, cb) { - throw new Error('Not implemented'); -}; - -Transform.prototype._write = function (chunk, encoding, cb) { - var ts = this._transformState; - ts.writecb = cb; - ts.writechunk = chunk; - ts.writeencoding = encoding; - if (!ts.transforming) { - var rs = this._readableState; - if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); - } -}; - -// Doesn't matter what the args are here. -// _transform does all the work. -// That we got here means that the readable side wants more data. -Transform.prototype._read = function (n) { - var ts = this._transformState; - - if (ts.writechunk !== null && ts.writecb && !ts.transforming) { - ts.transforming = true; - this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); - } else { - // mark that we need a transform, so that any data that comes in - // will get processed, now that we've asked for it. - ts.needTransform = true; - } -}; - -function done(stream, er) { - if (er) return stream.emit('error', er); - - // if there's nothing in the write buffer, then that means - // that nothing more will ever be provided - var ws = stream._writableState; - var ts = stream._transformState; - - if (ws.length) throw new Error('Calling transform done when ws.length != 0'); - - if (ts.transforming) throw new Error('Calling transform done when still transforming'); - - return stream.push(null); -} - -inherits(PassThrough, Transform); -function PassThrough(options) { - if (!(this instanceof PassThrough)) return new PassThrough(options); - - Transform.call(this, options); -} - -PassThrough.prototype._transform = function (chunk, encoding, cb) { - cb(null, chunk); -}; - -inherits(Stream, EventEmitter); -Stream.Readable = Readable; -Stream.Writable = Writable; -Stream.Duplex = Duplex; -Stream.Transform = Transform; -Stream.PassThrough = PassThrough; - -// Backwards-compat with node 0.4.x -Stream.Stream = Stream; - -// old-style streams. Note that the pipe method (the only relevant -// part of this class) is overridden in the Readable class. - -function Stream() { - EventEmitter.call(this); -} - -Stream.prototype.pipe = function(dest, options) { - var source = this; - - function ondata(chunk) { - if (dest.writable) { - if (false === dest.write(chunk) && source.pause) { - source.pause(); - } - } - } - - source.on('data', ondata); - - function ondrain() { - if (source.readable && source.resume) { - source.resume(); - } - } - - dest.on('drain', ondrain); - - // If the 'end' option is not supplied, dest.end() will be called when - // source gets the 'end' or 'close' events. Only dest.end() once. - if (!dest._isStdio && (!options || options.end !== false)) { - source.on('end', onend); - source.on('close', onclose); - } - - var didOnEnd = false; - function onend() { - if (didOnEnd) return; - didOnEnd = true; - - dest.end(); - } - - - function onclose() { - if (didOnEnd) return; - didOnEnd = true; - - if (typeof dest.destroy === 'function') dest.destroy(); - } - - // don't leave dangling pipes when there are errors. - function onerror(er) { - cleanup(); - if (EventEmitter.listenerCount(this, 'error') === 0) { - throw er; // Unhandled stream error in pipe. - } - } - - source.on('error', onerror); - dest.on('error', onerror); - - // remove all the event listeners that were added. - function cleanup() { - source.removeListener('data', ondata); - dest.removeListener('drain', ondrain); - - source.removeListener('end', onend); - source.removeListener('close', onclose); - - source.removeListener('error', onerror); - dest.removeListener('error', onerror); - - source.removeListener('end', cleanup); - source.removeListener('close', cleanup); - - dest.removeListener('close', cleanup); - } - - source.on('end', cleanup); - source.on('close', cleanup); - - dest.on('close', cleanup); - - dest.emit('pipe', source); - - // Allow for unix-like usage: A.pipe(B).pipe(C) - return dest; -}; - -var _polyfillNode_stream = /*#__PURE__*/Object.freeze({ - __proto__: null, - Duplex: Duplex, - PassThrough: PassThrough, - Readable: Readable, - Stream: Stream, - Transform: Transform, - Writable: Writable, - default: Stream -}); - -var require$$1 = /*@__PURE__*/getAugmentedNamespace(_polyfillNode_stream); - -var binding = {}; - -function compare(a, b) { - if (a === b) { - return 0; - } - - var x = a.length; - var y = b.length; - - for (var i = 0, len = Math.min(x, y); i < len; ++i) { - if (a[i] !== b[i]) { - x = a[i]; - y = b[i]; - break; - } - } - - if (x < y) { - return -1; - } - if (y < x) { - return 1; - } - return 0; -} -var hasOwn = Object.prototype.hasOwnProperty; - -var objectKeys = Object.keys || function (obj) { - var keys = []; - for (var key in obj) { - if (hasOwn.call(obj, key)) keys.push(key); - } - return keys; -}; -var pSlice = Array.prototype.slice; -var _functionsHaveNames; -function functionsHaveNames() { - if (typeof _functionsHaveNames !== 'undefined') { - return _functionsHaveNames; - } - return _functionsHaveNames = (function () { - return function foo() {}.name === 'foo'; - }()); -} -function pToString (obj) { - return Object.prototype.toString.call(obj); -} -function isView(arrbuf) { - if (isBuffer$1(arrbuf)) { - return false; - } - if (typeof global$1.ArrayBuffer !== 'function') { - return false; - } - if (typeof ArrayBuffer.isView === 'function') { - return ArrayBuffer.isView(arrbuf); - } - if (!arrbuf) { - return false; - } - if (arrbuf instanceof DataView) { - return true; - } - if (arrbuf.buffer && arrbuf.buffer instanceof ArrayBuffer) { - return true; - } - return false; -} -// 1. The assert module provides functions that throw -// AssertionError's when particular conditions are not met. The -// assert module must conform to the following interface. - -function assert(value, message) { - if (!value) fail(value, true, message, '==', ok); -} - -// 2. The AssertionError is defined in assert. -// new assert.AssertionError({ message: message, -// actual: actual, -// expected: expected }) - -var regex = /\s*function\s+([^\(\s]*)\s*/; -// based on https://github.com/ljharb/function.prototype.name/blob/adeeeec8bfcc6068b187d7d9fb3d5bb1d3a30899/implementation.js -function getName(func) { - if (!isFunction(func)) { - return; - } - if (functionsHaveNames()) { - return func.name; - } - var str = func.toString(); - var match = str.match(regex); - return match && match[1]; -} -assert.AssertionError = AssertionError; -function AssertionError(options) { - this.name = 'AssertionError'; - this.actual = options.actual; - this.expected = options.expected; - this.operator = options.operator; - if (options.message) { - this.message = options.message; - this.generatedMessage = false; - } else { - this.message = getMessage(this); - this.generatedMessage = true; - } - var stackStartFunction = options.stackStartFunction || fail; - if (Error.captureStackTrace) { - Error.captureStackTrace(this, stackStartFunction); - } else { - // non v8 browsers so we can have a stacktrace - var err = new Error(); - if (err.stack) { - var out = err.stack; - - // try to strip useless frames - var fn_name = getName(stackStartFunction); - var idx = out.indexOf('\n' + fn_name); - if (idx >= 0) { - // once we have located the function frame - // we need to strip out everything before it (and its line) - var next_line = out.indexOf('\n', idx + 1); - out = out.substring(next_line + 1); - } - - this.stack = out; - } - } -} - -// assert.AssertionError instanceof Error -inherits(AssertionError, Error); - -function truncate(s, n) { - if (typeof s === 'string') { - return s.length < n ? s : s.slice(0, n); - } else { - return s; - } -} -function inspect(something) { - if (functionsHaveNames() || !isFunction(something)) { - return inspect$1(something); - } - var rawname = getName(something); - var name = rawname ? ': ' + rawname : ''; - return '[Function' + name + ']'; -} -function getMessage(self) { - return truncate(inspect(self.actual), 128) + ' ' + - self.operator + ' ' + - truncate(inspect(self.expected), 128); -} - -// At present only the three keys mentioned above are used and -// understood by the spec. Implementations or sub modules can pass -// other keys to the AssertionError's constructor - they will be -// ignored. - -// 3. All of the following functions must throw an AssertionError -// when a corresponding condition is not met, with a message that -// may be undefined if not provided. All assertion methods provide -// both the actual and expected values to the assertion error for -// display purposes. - -function fail(actual, expected, message, operator, stackStartFunction) { - throw new AssertionError({ - message: message, - actual: actual, - expected: expected, - operator: operator, - stackStartFunction: stackStartFunction - }); -} - -// EXTENSION! allows for well behaved errors defined elsewhere. -assert.fail = fail; - -// 4. Pure assertion tests whether a value is truthy, as determined -// by !!guard. -// assert.ok(guard, message_opt); -// This statement is equivalent to assert.equal(true, !!guard, -// message_opt);. To test strictly for the value true, use -// assert.strictEqual(true, guard, message_opt);. - -function ok(value, message) { - if (!value) fail(value, true, message, '==', ok); -} -assert.ok = ok; - -// 5. The equality assertion tests shallow, coercive equality with -// ==. -// assert.equal(actual, expected, message_opt); -assert.equal = equal; -function equal(actual, expected, message) { - if (actual != expected) fail(actual, expected, message, '==', equal); -} - -// 6. The non-equality assertion tests for whether two objects are not equal -// with != assert.notEqual(actual, expected, message_opt); -assert.notEqual = notEqual; -function notEqual(actual, expected, message) { - if (actual == expected) { - fail(actual, expected, message, '!=', notEqual); - } -} - -// 7. The equivalence assertion tests a deep equality relation. -// assert.deepEqual(actual, expected, message_opt); -assert.deepEqual = deepEqual; -function deepEqual(actual, expected, message) { - if (!_deepEqual(actual, expected, false)) { - fail(actual, expected, message, 'deepEqual', deepEqual); - } -} -assert.deepStrictEqual = deepStrictEqual; -function deepStrictEqual(actual, expected, message) { - if (!_deepEqual(actual, expected, true)) { - fail(actual, expected, message, 'deepStrictEqual', deepStrictEqual); - } -} - -function _deepEqual(actual, expected, strict, memos) { - // 7.1. All identical values are equivalent, as determined by ===. - if (actual === expected) { - return true; - } else if (isBuffer$1(actual) && isBuffer$1(expected)) { - return compare(actual, expected) === 0; - - // 7.2. If the expected value is a Date object, the actual value is - // equivalent if it is also a Date object that refers to the same time. - } else if (isDate(actual) && isDate(expected)) { - return actual.getTime() === expected.getTime(); - - // 7.3 If the expected value is a RegExp object, the actual value is - // equivalent if it is also a RegExp object with the same source and - // properties (`global`, `multiline`, `lastIndex`, `ignoreCase`). - } else if (isRegExp(actual) && isRegExp(expected)) { - return actual.source === expected.source && - actual.global === expected.global && - actual.multiline === expected.multiline && - actual.lastIndex === expected.lastIndex && - actual.ignoreCase === expected.ignoreCase; - - // 7.4. Other pairs that do not both pass typeof value == 'object', - // equivalence is determined by ==. - } else if ((actual === null || typeof actual !== 'object') && - (expected === null || typeof expected !== 'object')) { - return strict ? actual === expected : actual == expected; - - // If both values are instances of typed arrays, wrap their underlying - // ArrayBuffers in a Buffer each to increase performance - // This optimization requires the arrays to have the same type as checked by - // Object.prototype.toString (aka pToString). Never perform binary - // comparisons for Float*Arrays, though, since e.g. +0 === -0 but their - // bit patterns are not identical. - } else if (isView(actual) && isView(expected) && - pToString(actual) === pToString(expected) && - !(actual instanceof Float32Array || - actual instanceof Float64Array)) { - return compare(new Uint8Array(actual.buffer), - new Uint8Array(expected.buffer)) === 0; - - // 7.5 For all other Object pairs, including Array objects, equivalence is - // determined by having the same number of owned properties (as verified - // with Object.prototype.hasOwnProperty.call), the same set of keys - // (although not necessarily the same order), equivalent values for every - // corresponding key, and an identical 'prototype' property. Note: this - // accounts for both named and indexed properties on Arrays. - } else if (isBuffer$1(actual) !== isBuffer$1(expected)) { - return false; - } else { - memos = memos || {actual: [], expected: []}; - - var actualIndex = memos.actual.indexOf(actual); - if (actualIndex !== -1) { - if (actualIndex === memos.expected.indexOf(expected)) { - return true; - } - } - - memos.actual.push(actual); - memos.expected.push(expected); - - return objEquiv(actual, expected, strict, memos); - } -} - -function isArguments(object) { - return Object.prototype.toString.call(object) == '[object Arguments]'; -} - -function objEquiv(a, b, strict, actualVisitedObjects) { - if (a === null || a === undefined || b === null || b === undefined) - return false; - // if one is a primitive, the other must be same - if (isPrimitive(a) || isPrimitive(b)) - return a === b; - if (strict && Object.getPrototypeOf(a) !== Object.getPrototypeOf(b)) - return false; - var aIsArgs = isArguments(a); - var bIsArgs = isArguments(b); - if ((aIsArgs && !bIsArgs) || (!aIsArgs && bIsArgs)) - return false; - if (aIsArgs) { - a = pSlice.call(a); - b = pSlice.call(b); - return _deepEqual(a, b, strict); - } - var ka = objectKeys(a); - var kb = objectKeys(b); - var key, i; - // having the same number of owned properties (keys incorporates - // hasOwnProperty) - if (ka.length !== kb.length) - return false; - //the same set of keys (although not necessarily the same order), - ka.sort(); - kb.sort(); - //~~~cheap key test - for (i = ka.length - 1; i >= 0; i--) { - if (ka[i] !== kb[i]) - return false; - } - //equivalent values for every corresponding key, and - //~~~possibly expensive deep test - for (i = ka.length - 1; i >= 0; i--) { - key = ka[i]; - if (!_deepEqual(a[key], b[key], strict, actualVisitedObjects)) - return false; - } - return true; -} - -// 8. The non-equivalence assertion tests for any deep inequality. -// assert.notDeepEqual(actual, expected, message_opt); -assert.notDeepEqual = notDeepEqual; -function notDeepEqual(actual, expected, message) { - if (_deepEqual(actual, expected, false)) { - fail(actual, expected, message, 'notDeepEqual', notDeepEqual); - } -} - -assert.notDeepStrictEqual = notDeepStrictEqual; -function notDeepStrictEqual(actual, expected, message) { - if (_deepEqual(actual, expected, true)) { - fail(actual, expected, message, 'notDeepStrictEqual', notDeepStrictEqual); - } -} - - -// 9. The strict equality assertion tests strict equality, as determined by ===. -// assert.strictEqual(actual, expected, message_opt); -assert.strictEqual = strictEqual; -function strictEqual(actual, expected, message) { - if (actual !== expected) { - fail(actual, expected, message, '===', strictEqual); - } -} - -// 10. The strict non-equality assertion tests for strict inequality, as -// determined by !==. assert.notStrictEqual(actual, expected, message_opt); -assert.notStrictEqual = notStrictEqual; -function notStrictEqual(actual, expected, message) { - if (actual === expected) { - fail(actual, expected, message, '!==', notStrictEqual); - } -} - -function expectedException(actual, expected) { - if (!actual || !expected) { - return false; - } - - if (Object.prototype.toString.call(expected) == '[object RegExp]') { - return expected.test(actual); - } - - try { - if (actual instanceof expected) { - return true; - } - } catch (e) { - // Ignore. The instanceof check doesn't work for arrow functions. - } - - if (Error.isPrototypeOf(expected)) { - return false; - } - - return expected.call({}, actual) === true; -} - -function _tryBlock(block) { - var error; - try { - block(); - } catch (e) { - error = e; - } - return error; -} - -function _throws(shouldThrow, block, expected, message) { - var actual; - - if (typeof block !== 'function') { - throw new TypeError('"block" argument must be a function'); - } - - if (typeof expected === 'string') { - message = expected; - expected = null; - } - - actual = _tryBlock(block); - - message = (expected && expected.name ? ' (' + expected.name + ').' : '.') + - (message ? ' ' + message : '.'); - - if (shouldThrow && !actual) { - fail(actual, expected, 'Missing expected exception' + message); - } - - var userProvidedMessage = typeof message === 'string'; - var isUnwantedException = !shouldThrow && isError(actual); - var isUnexpectedException = !shouldThrow && actual && !expected; - - if ((isUnwantedException && - userProvidedMessage && - expectedException(actual, expected)) || - isUnexpectedException) { - fail(actual, expected, 'Got unwanted exception' + message); - } - - if ((shouldThrow && actual && expected && - !expectedException(actual, expected)) || (!shouldThrow && actual)) { - throw actual; - } -} - -// 11. Expected to throw an error: -// assert.throws(block, Error_opt, message_opt); -assert.throws = throws; -function throws(block, /*optional*/error, /*optional*/message) { - _throws(true, block, error, message); -} - -// EXTENSION! This is annoying to write outside this module. -assert.doesNotThrow = doesNotThrow; -function doesNotThrow(block, /*optional*/error, /*optional*/message) { - _throws(false, block, error, message); -} - -assert.ifError = ifError; -function ifError(err) { - if (err) throw err; -} - -var _polyfillNode_assert = /*#__PURE__*/Object.freeze({ - __proto__: null, - AssertionError: AssertionError, - assert: ok, - deepEqual: deepEqual, - deepStrictEqual: deepStrictEqual, - default: assert, - doesNotThrow: doesNotThrow, - equal: equal, - fail: fail, - ifError: ifError, - notDeepEqual: notDeepEqual, - notDeepStrictEqual: notDeepStrictEqual, - notEqual: notEqual, - notStrictEqual: notStrictEqual, - ok: ok, - strictEqual: strictEqual, - throws: throws -}); - -var require$$4 = /*@__PURE__*/getAugmentedNamespace(_polyfillNode_assert); - -// (C) 1995-2013 Jean-loup Gailly and Mark Adler -// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// 3. This notice may not be removed or altered from any source distribution. - -function ZStream() { - /* next input byte */ - this.input = null; // JS specific, because we have no pointers - this.next_in = 0; - /* number of bytes available at input */ - this.avail_in = 0; - /* total number of input bytes read so far */ - this.total_in = 0; - /* next output byte should be put there */ - this.output = null; // JS specific, because we have no pointers - this.next_out = 0; - /* remaining free space at output */ - this.avail_out = 0; - /* total number of bytes output so far */ - this.total_out = 0; - /* last error message, NULL if no error */ - this.msg = '' /*Z_NULL*/; - /* not visible by applications */ - this.state = null; - /* best guess about the data type: binary or text */ - this.data_type = 2 /*Z_UNKNOWN*/; - /* adler32 value of the uncompressed data */ - this.adler = 0; -} -var zstream = ZStream; - -var deflate$1 = {}; - -var common = {}; - -(function (exports) { - - var TYPED_OK = typeof Uint8Array !== 'undefined' && typeof Uint16Array !== 'undefined' && typeof Int32Array !== 'undefined'; - function _has(obj, key) { - return Object.prototype.hasOwnProperty.call(obj, key); - } - exports.assign = function (obj /*from1, from2, from3, ...*/) { - var sources = Array.prototype.slice.call(arguments, 1); - while (sources.length) { - var source = sources.shift(); - if (!source) { - continue; - } - if (typeof source !== 'object') { - throw new TypeError(source + 'must be non-object'); - } - for (var p in source) { - if (_has(source, p)) { - obj[p] = source[p]; - } - } - } - return obj; - }; - - // reduce buffer size, avoiding mem copy - exports.shrinkBuf = function (buf, size) { - if (buf.length === size) { - return buf; - } - if (buf.subarray) { - return buf.subarray(0, size); - } - buf.length = size; - return buf; - }; - var fnTyped = { - arraySet: function (dest, src, src_offs, len, dest_offs) { - if (src.subarray && dest.subarray) { - dest.set(src.subarray(src_offs, src_offs + len), dest_offs); - return; - } - // Fallback to ordinary array - for (var i = 0; i < len; i++) { - dest[dest_offs + i] = src[src_offs + i]; - } - }, - // Join array of chunks to single array. - flattenChunks: function (chunks) { - var i, l, len, pos, chunk, result; - - // calculate data length - len = 0; - for (i = 0, l = chunks.length; i < l; i++) { - len += chunks[i].length; - } - - // join chunks - result = new Uint8Array(len); - pos = 0; - for (i = 0, l = chunks.length; i < l; i++) { - chunk = chunks[i]; - result.set(chunk, pos); - pos += chunk.length; - } - return result; - } - }; - var fnUntyped = { - arraySet: function (dest, src, src_offs, len, dest_offs) { - for (var i = 0; i < len; i++) { - dest[dest_offs + i] = src[src_offs + i]; - } - }, - // Join array of chunks to single array. - flattenChunks: function (chunks) { - return [].concat.apply([], chunks); - } - }; - - // Enable/Disable typed arrays use, for testing - // - exports.setTyped = function (on) { - if (on) { - exports.Buf8 = Uint8Array; - exports.Buf16 = Uint16Array; - exports.Buf32 = Int32Array; - exports.assign(exports, fnTyped); - } else { - exports.Buf8 = Array; - exports.Buf16 = Array; - exports.Buf32 = Array; - exports.assign(exports, fnUntyped); - } - }; - exports.setTyped(TYPED_OK); -})(common); - -var trees$1 = {}; - -// (C) 1995-2013 Jean-loup Gailly and Mark Adler -// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// 3. This notice may not be removed or altered from any source distribution. - -/* eslint-disable space-unary-ops */ - -var utils$3 = common; - -/* Public constants ==========================================================*/ -/* ===========================================================================*/ - -//var Z_FILTERED = 1; -//var Z_HUFFMAN_ONLY = 2; -//var Z_RLE = 3; -var Z_FIXED$1 = 4; -//var Z_DEFAULT_STRATEGY = 0; - -/* Possible values of the data_type field (though see inflate()) */ -var Z_BINARY = 0; -var Z_TEXT = 1; -//var Z_ASCII = 1; // = Z_TEXT -var Z_UNKNOWN$1 = 2; - -/*============================================================================*/ - -function zero$1(buf) { - var len = buf.length; - while (--len >= 0) { - buf[len] = 0; - } -} - -// From zutil.h - -var STORED_BLOCK = 0; -var STATIC_TREES = 1; -var DYN_TREES = 2; -/* The three kinds of block type */ - -var MIN_MATCH$1 = 3; -var MAX_MATCH$1 = 258; -/* The minimum and maximum match lengths */ - -// From deflate.h -/* =========================================================================== - * Internal compression state. - */ - -var LENGTH_CODES$1 = 29; -/* number of length codes, not counting the special END_BLOCK code */ - -var LITERALS$1 = 256; -/* number of literal bytes 0..255 */ - -var L_CODES$1 = LITERALS$1 + 1 + LENGTH_CODES$1; -/* number of Literal or Length codes, including the END_BLOCK code */ - -var D_CODES$1 = 30; -/* number of distance codes */ - -var BL_CODES$1 = 19; -/* number of codes used to transfer the bit lengths */ - -var HEAP_SIZE$1 = 2 * L_CODES$1 + 1; -/* maximum heap size */ - -var MAX_BITS$1 = 15; -/* All codes must not exceed MAX_BITS bits */ - -var Buf_size = 16; -/* size of bit buffer in bi_buf */ - -/* =========================================================================== - * Constants - */ - -var MAX_BL_BITS = 7; -/* Bit length codes must not exceed MAX_BL_BITS bits */ - -var END_BLOCK = 256; -/* end of block literal code */ - -var REP_3_6 = 16; -/* repeat previous bit length 3-6 times (2 bits of repeat count) */ - -var REPZ_3_10 = 17; -/* repeat a zero length 3-10 times (3 bits of repeat count) */ - -var REPZ_11_138 = 18; -/* repeat a zero length 11-138 times (7 bits of repeat count) */ - -/* eslint-disable comma-spacing,array-bracket-spacing */ -var extra_lbits = /* extra bits for each length code */ -[0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0]; -var extra_dbits = /* extra bits for each distance code */ -[0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13]; -var extra_blbits = /* extra bits for each bit length code */ -[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7]; -var bl_order = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]; -/* eslint-enable comma-spacing,array-bracket-spacing */ - -/* The lengths of the bit length codes are sent in order of decreasing - * probability, to avoid transmitting the lengths for unused bit length codes. - */ - -/* =========================================================================== - * Local data. These are initialized only once. - */ - -// We pre-fill arrays with 0 to avoid uninitialized gaps - -var DIST_CODE_LEN = 512; /* see definition of array dist_code below */ - -// !!!! Use flat array instead of structure, Freq = i*2, Len = i*2+1 -var static_ltree = new Array((L_CODES$1 + 2) * 2); -zero$1(static_ltree); -/* The static literal tree. Since the bit lengths are imposed, there is no - * need for the L_CODES extra codes used during heap construction. However - * The codes 286 and 287 are needed to build a canonical tree (see _tr_init - * below). - */ - -var static_dtree = new Array(D_CODES$1 * 2); -zero$1(static_dtree); -/* The static distance tree. (Actually a trivial tree since all codes use - * 5 bits.) - */ - -var _dist_code = new Array(DIST_CODE_LEN); -zero$1(_dist_code); -/* Distance codes. The first 256 values correspond to the distances - * 3 .. 258, the last 256 values correspond to the top 8 bits of - * the 15 bit distances. - */ - -var _length_code = new Array(MAX_MATCH$1 - MIN_MATCH$1 + 1); -zero$1(_length_code); -/* length code for each normalized match length (0 == MIN_MATCH) */ - -var base_length = new Array(LENGTH_CODES$1); -zero$1(base_length); -/* First normalized length for each code (0 = MIN_MATCH) */ - -var base_dist = new Array(D_CODES$1); -zero$1(base_dist); -/* First normalized distance for each code (0 = distance of 1) */ - -function StaticTreeDesc(static_tree, extra_bits, extra_base, elems, max_length) { - this.static_tree = static_tree; /* static tree or NULL */ - this.extra_bits = extra_bits; /* extra bits for each code or NULL */ - this.extra_base = extra_base; /* base index for extra_bits */ - this.elems = elems; /* max number of elements in the tree */ - this.max_length = max_length; /* max bit length for the codes */ - - // show if `static_tree` has data or dummy - needed for monomorphic objects - this.has_stree = static_tree && static_tree.length; -} -var static_l_desc; -var static_d_desc; -var static_bl_desc; -function TreeDesc(dyn_tree, stat_desc) { - this.dyn_tree = dyn_tree; /* the dynamic tree */ - this.max_code = 0; /* largest code with non zero frequency */ - this.stat_desc = stat_desc; /* the corresponding static tree */ -} -function d_code(dist) { - return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)]; -} - -/* =========================================================================== - * Output a short LSB first on the stream. - * IN assertion: there is enough room in pendingBuf. - */ -function put_short(s, w) { - // put_byte(s, (uch)((w) & 0xff)); - // put_byte(s, (uch)((ush)(w) >> 8)); - s.pending_buf[s.pending++] = w & 0xff; - s.pending_buf[s.pending++] = w >>> 8 & 0xff; -} - -/* =========================================================================== - * Send a value on a given number of bits. - * IN assertion: length <= 16 and value fits in length bits. - */ -function send_bits(s, value, length) { - if (s.bi_valid > Buf_size - length) { - s.bi_buf |= value << s.bi_valid & 0xffff; - put_short(s, s.bi_buf); - s.bi_buf = value >> Buf_size - s.bi_valid; - s.bi_valid += length - Buf_size; - } else { - s.bi_buf |= value << s.bi_valid & 0xffff; - s.bi_valid += length; - } -} -function send_code(s, c, tree) { - send_bits(s, tree[c * 2] /*.Code*/, tree[c * 2 + 1] /*.Len*/); -} - -/* =========================================================================== - * Reverse the first len bits of a code, using straightforward code (a faster - * method would use a table) - * IN assertion: 1 <= len <= 15 - */ -function bi_reverse(code, len) { - var res = 0; - do { - res |= code & 1; - code >>>= 1; - res <<= 1; - } while (--len > 0); - return res >>> 1; -} - -/* =========================================================================== - * Flush the bit buffer, keeping at most 7 bits in it. - */ -function bi_flush(s) { - if (s.bi_valid === 16) { - put_short(s, s.bi_buf); - s.bi_buf = 0; - s.bi_valid = 0; - } else if (s.bi_valid >= 8) { - s.pending_buf[s.pending++] = s.bi_buf & 0xff; - s.bi_buf >>= 8; - s.bi_valid -= 8; - } -} - -/* =========================================================================== - * Compute the optimal bit lengths for a tree and update the total bit length - * for the current block. - * IN assertion: the fields freq and dad are set, heap[heap_max] and - * above are the tree nodes sorted by increasing frequency. - * OUT assertions: the field len is set to the optimal bit length, the - * array bl_count contains the frequencies for each bit length. - * The length opt_len is updated; static_len is also updated if stree is - * not null. - */ -function gen_bitlen(s, desc) -// deflate_state *s; -// tree_desc *desc; /* the tree descriptor */ -{ - var tree = desc.dyn_tree; - var max_code = desc.max_code; - var stree = desc.stat_desc.static_tree; - var has_stree = desc.stat_desc.has_stree; - var extra = desc.stat_desc.extra_bits; - var base = desc.stat_desc.extra_base; - var max_length = desc.stat_desc.max_length; - var h; /* heap index */ - var n, m; /* iterate over the tree elements */ - var bits; /* bit length */ - var xbits; /* extra bits */ - var f; /* frequency */ - var overflow = 0; /* number of elements with bit length too large */ - - for (bits = 0; bits <= MAX_BITS$1; bits++) { - s.bl_count[bits] = 0; - } - - /* In a first pass, compute the optimal bit lengths (which may - * overflow in the case of the bit length tree). - */ - tree[s.heap[s.heap_max] * 2 + 1] /*.Len*/ = 0; /* root of the heap */ - - for (h = s.heap_max + 1; h < HEAP_SIZE$1; h++) { - n = s.heap[h]; - bits = tree[tree[n * 2 + 1] /*.Dad*/ * 2 + 1] /*.Len*/ + 1; - if (bits > max_length) { - bits = max_length; - overflow++; - } - tree[n * 2 + 1] /*.Len*/ = bits; - /* We overwrite tree[n].Dad which is no longer needed */ - - if (n > max_code) { - continue; - } /* not a leaf node */ - - s.bl_count[bits]++; - xbits = 0; - if (n >= base) { - xbits = extra[n - base]; - } - f = tree[n * 2] /*.Freq*/; - s.opt_len += f * (bits + xbits); - if (has_stree) { - s.static_len += f * (stree[n * 2 + 1] /*.Len*/ + xbits); - } - } - if (overflow === 0) { - return; - } - - // Trace((stderr,"\nbit length overflow\n")); - /* This happens for example on obj2 and pic of the Calgary corpus */ - - /* Find the first bit length which could increase: */ - do { - bits = max_length - 1; - while (s.bl_count[bits] === 0) { - bits--; - } - s.bl_count[bits]--; /* move one leaf down the tree */ - s.bl_count[bits + 1] += 2; /* move one overflow item as its brother */ - s.bl_count[max_length]--; - /* The brother of the overflow item also moves one step up, - * but this does not affect bl_count[max_length] - */ - overflow -= 2; - } while (overflow > 0); - - /* Now recompute all bit lengths, scanning in increasing frequency. - * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all - * lengths instead of fixing only the wrong ones. This idea is taken - * from 'ar' written by Haruhiko Okumura.) - */ - for (bits = max_length; bits !== 0; bits--) { - n = s.bl_count[bits]; - while (n !== 0) { - m = s.heap[--h]; - if (m > max_code) { - continue; - } - if (tree[m * 2 + 1] /*.Len*/ !== bits) { - // Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); - s.opt_len += (bits - tree[m * 2 + 1] /*.Len*/) * tree[m * 2] /*.Freq*/; - tree[m * 2 + 1] /*.Len*/ = bits; - } - n--; - } - } -} - -/* =========================================================================== - * Generate the codes for a given tree and bit counts (which need not be - * optimal). - * IN assertion: the array bl_count contains the bit length statistics for - * the given tree and the field len is set for all tree elements. - * OUT assertion: the field code is set for all tree elements of non - * zero code length. - */ -function gen_codes(tree, max_code, bl_count) -// ct_data *tree; /* the tree to decorate */ -// int max_code; /* largest code with non zero frequency */ -// ushf *bl_count; /* number of codes at each bit length */ -{ - var next_code = new Array(MAX_BITS$1 + 1); /* next code value for each bit length */ - var code = 0; /* running code value */ - var bits; /* bit index */ - var n; /* code index */ - - /* The distribution counts are first used to generate the code values - * without bit reversal. - */ - for (bits = 1; bits <= MAX_BITS$1; bits++) { - next_code[bits] = code = code + bl_count[bits - 1] << 1; - } - /* Check that the bit counts in bl_count are consistent. The last code - * must be all ones. - */ - //Assert (code + bl_count[MAX_BITS]-1 == (1< length code (0..28) */ - length = 0; - for (code = 0; code < LENGTH_CODES$1 - 1; code++) { - base_length[code] = length; - for (n = 0; n < 1 << extra_lbits[code]; n++) { - _length_code[length++] = code; - } - } - //Assert (length == 256, "tr_static_init: length != 256"); - /* Note that the length 255 (match length 258) can be represented - * in two different ways: code 284 + 5 bits or code 285, so we - * overwrite length_code[255] to use the best encoding: - */ - _length_code[length - 1] = code; - - /* Initialize the mapping dist (0..32K) -> dist code (0..29) */ - dist = 0; - for (code = 0; code < 16; code++) { - base_dist[code] = dist; - for (n = 0; n < 1 << extra_dbits[code]; n++) { - _dist_code[dist++] = code; - } - } - //Assert (dist == 256, "tr_static_init: dist != 256"); - dist >>= 7; /* from now on, all distances are divided by 128 */ - for (; code < D_CODES$1; code++) { - base_dist[code] = dist << 7; - for (n = 0; n < 1 << extra_dbits[code] - 7; n++) { - _dist_code[256 + dist++] = code; - } - } - //Assert (dist == 256, "tr_static_init: 256+dist != 512"); - - /* Construct the codes of the static literal tree */ - for (bits = 0; bits <= MAX_BITS$1; bits++) { - bl_count[bits] = 0; - } - n = 0; - while (n <= 143) { - static_ltree[n * 2 + 1] /*.Len*/ = 8; - n++; - bl_count[8]++; - } - while (n <= 255) { - static_ltree[n * 2 + 1] /*.Len*/ = 9; - n++; - bl_count[9]++; - } - while (n <= 279) { - static_ltree[n * 2 + 1] /*.Len*/ = 7; - n++; - bl_count[7]++; - } - while (n <= 287) { - static_ltree[n * 2 + 1] /*.Len*/ = 8; - n++; - bl_count[8]++; - } - /* Codes 286 and 287 do not exist, but we must include them in the - * tree construction to get a canonical Huffman tree (longest code - * all ones) - */ - gen_codes(static_ltree, L_CODES$1 + 1, bl_count); - - /* The static distance tree is trivial: */ - for (n = 0; n < D_CODES$1; n++) { - static_dtree[n * 2 + 1] /*.Len*/ = 5; - static_dtree[n * 2] /*.Code*/ = bi_reverse(n, 5); - } - - // Now data ready and we can init static trees - static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS$1 + 1, L_CODES$1, MAX_BITS$1); - static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0, D_CODES$1, MAX_BITS$1); - static_bl_desc = new StaticTreeDesc(new Array(0), extra_blbits, 0, BL_CODES$1, MAX_BL_BITS); - - //static_init_done = true; -} - -/* =========================================================================== - * Initialize a new block. - */ -function init_block(s) { - var n; /* iterates over tree elements */ - - /* Initialize the trees. */ - for (n = 0; n < L_CODES$1; n++) { - s.dyn_ltree[n * 2] /*.Freq*/ = 0; - } - for (n = 0; n < D_CODES$1; n++) { - s.dyn_dtree[n * 2] /*.Freq*/ = 0; - } - for (n = 0; n < BL_CODES$1; n++) { - s.bl_tree[n * 2] /*.Freq*/ = 0; - } - s.dyn_ltree[END_BLOCK * 2] /*.Freq*/ = 1; - s.opt_len = s.static_len = 0; - s.last_lit = s.matches = 0; -} - -/* =========================================================================== - * Flush the bit buffer and align the output on a byte boundary - */ -function bi_windup(s) { - if (s.bi_valid > 8) { - put_short(s, s.bi_buf); - } else if (s.bi_valid > 0) { - //put_byte(s, (Byte)s->bi_buf); - s.pending_buf[s.pending++] = s.bi_buf; - } - s.bi_buf = 0; - s.bi_valid = 0; -} - -/* =========================================================================== - * Copy a stored block, storing first the length and its - * one's complement if requested. - */ -function copy_block(s, buf, len, header) -//DeflateState *s; -//charf *buf; /* the input data */ -//unsigned len; /* its length */ -//int header; /* true if block header must be written */ -{ - bi_windup(s); /* align on byte boundary */ - - { - put_short(s, len); - put_short(s, ~len); - } - // while (len--) { - // put_byte(s, *buf++); - // } - utils$3.arraySet(s.pending_buf, s.window, buf, len, s.pending); - s.pending += len; -} - -/* =========================================================================== - * Compares to subtrees, using the tree depth as tie breaker when - * the subtrees have equal frequency. This minimizes the worst case length. - */ -function smaller(tree, n, m, depth) { - var _n2 = n * 2; - var _m2 = m * 2; - return tree[_n2] /*.Freq*/ < tree[_m2] /*.Freq*/ || tree[_n2] /*.Freq*/ === tree[_m2] /*.Freq*/ && depth[n] <= depth[m]; -} - -/* =========================================================================== - * Restore the heap property by moving down the tree starting at node k, - * exchanging a node with the smallest of its two sons if necessary, stopping - * when the heap property is re-established (each father smaller than its - * two sons). - */ -function pqdownheap(s, tree, k) -// deflate_state *s; -// ct_data *tree; /* the tree to restore */ -// int k; /* node to move down */ -{ - var v = s.heap[k]; - var j = k << 1; /* left son of k */ - while (j <= s.heap_len) { - /* Set j to the smallest of the two sons: */ - if (j < s.heap_len && smaller(tree, s.heap[j + 1], s.heap[j], s.depth)) { - j++; - } - /* Exit if v is smaller than both sons */ - if (smaller(tree, v, s.heap[j], s.depth)) { - break; - } - - /* Exchange v with the smallest son */ - s.heap[k] = s.heap[j]; - k = j; - - /* And continue down the tree, setting j to the left son of k */ - j <<= 1; - } - s.heap[k] = v; -} - -// inlined manually -// var SMALLEST = 1; - -/* =========================================================================== - * Send the block data compressed using the given Huffman trees - */ -function compress_block(s, ltree, dtree) -// deflate_state *s; -// const ct_data *ltree; /* literal tree */ -// const ct_data *dtree; /* distance tree */ -{ - var dist; /* distance of matched string */ - var lc; /* match length or unmatched char (if dist == 0) */ - var lx = 0; /* running index in l_buf */ - var code; /* the code to send */ - var extra; /* number of extra bits to send */ - - if (s.last_lit !== 0) { - do { - dist = s.pending_buf[s.d_buf + lx * 2] << 8 | s.pending_buf[s.d_buf + lx * 2 + 1]; - lc = s.pending_buf[s.l_buf + lx]; - lx++; - if (dist === 0) { - send_code(s, lc, ltree); /* send a literal byte */ - //Tracecv(isgraph(lc), (stderr," '%c' ", lc)); - } else { - /* Here, lc is the match length - MIN_MATCH */ - code = _length_code[lc]; - send_code(s, code + LITERALS$1 + 1, ltree); /* send the length code */ - extra = extra_lbits[code]; - if (extra !== 0) { - lc -= base_length[code]; - send_bits(s, lc, extra); /* send the extra length bits */ - } - dist--; /* dist is now the match distance - 1 */ - code = d_code(dist); - //Assert (code < D_CODES, "bad d_code"); - - send_code(s, code, dtree); /* send the distance code */ - extra = extra_dbits[code]; - if (extra !== 0) { - dist -= base_dist[code]; - send_bits(s, dist, extra); /* send the extra distance bits */ - } - } /* literal or match pair ? */ - - /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ - //Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx, - // "pendingBuf overflow"); - } while (lx < s.last_lit); - } - send_code(s, END_BLOCK, ltree); -} - -/* =========================================================================== - * Construct one Huffman tree and assigns the code bit strings and lengths. - * Update the total bit length for the current block. - * IN assertion: the field freq is set for all tree elements. - * OUT assertions: the fields len and code are set to the optimal bit length - * and corresponding code. The length opt_len is updated; static_len is - * also updated if stree is not null. The field max_code is set. - */ -function build_tree(s, desc) -// deflate_state *s; -// tree_desc *desc; /* the tree descriptor */ -{ - var tree = desc.dyn_tree; - var stree = desc.stat_desc.static_tree; - var has_stree = desc.stat_desc.has_stree; - var elems = desc.stat_desc.elems; - var n, m; /* iterate over heap elements */ - var max_code = -1; /* largest code with non zero frequency */ - var node; /* new node being created */ - - /* Construct the initial heap, with least frequent element in - * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. - * heap[0] is not used. - */ - s.heap_len = 0; - s.heap_max = HEAP_SIZE$1; - for (n = 0; n < elems; n++) { - if (tree[n * 2] /*.Freq*/ !== 0) { - s.heap[++s.heap_len] = max_code = n; - s.depth[n] = 0; - } else { - tree[n * 2 + 1] /*.Len*/ = 0; - } - } - - /* The pkzip format requires that at least one distance code exists, - * and that at least one bit should be sent even if there is only one - * possible code. So to avoid special checks later on we force at least - * two codes of non zero frequency. - */ - while (s.heap_len < 2) { - node = s.heap[++s.heap_len] = max_code < 2 ? ++max_code : 0; - tree[node * 2] /*.Freq*/ = 1; - s.depth[node] = 0; - s.opt_len--; - if (has_stree) { - s.static_len -= stree[node * 2 + 1] /*.Len*/; - } - /* node is 0 or 1 so it does not have extra bits */ - } - desc.max_code = max_code; - - /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, - * establish sub-heaps of increasing lengths: - */ - for (n = s.heap_len >> 1 /*int /2*/; n >= 1; n--) { - pqdownheap(s, tree, n); - } - - /* Construct the Huffman tree by repeatedly combining the least two - * frequent nodes. - */ - node = elems; /* next internal node of the tree */ - do { - //pqremove(s, tree, n); /* n = node of least frequency */ - /*** pqremove ***/ - n = s.heap[1 /*SMALLEST*/]; - s.heap[1 /*SMALLEST*/] = s.heap[s.heap_len--]; - pqdownheap(s, tree, 1 /*SMALLEST*/); - /***/ - - m = s.heap[1 /*SMALLEST*/]; /* m = node of next least frequency */ - - s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */ - s.heap[--s.heap_max] = m; - - /* Create a new node father of n and m */ - tree[node * 2] /*.Freq*/ = tree[n * 2] /*.Freq*/ + tree[m * 2] /*.Freq*/; - s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1; - tree[n * 2 + 1] /*.Dad*/ = tree[m * 2 + 1] /*.Dad*/ = node; - - /* and insert the new node in the heap */ - s.heap[1 /*SMALLEST*/] = node++; - pqdownheap(s, tree, 1 /*SMALLEST*/); - } while (s.heap_len >= 2); - s.heap[--s.heap_max] = s.heap[1 /*SMALLEST*/]; - - /* At this point, the fields freq and dad are set. We can now - * generate the bit lengths. - */ - gen_bitlen(s, desc); - - /* The field len is now set, we can generate the bit codes */ - gen_codes(tree, max_code, s.bl_count); -} - -/* =========================================================================== - * Scan a literal or distance tree to determine the frequencies of the codes - * in the bit length tree. - */ -function scan_tree(s, tree, max_code) -// deflate_state *s; -// ct_data *tree; /* the tree to be scanned */ -// int max_code; /* and its largest code of non zero frequency */ -{ - var n; /* iterates over all tree elements */ - var prevlen = -1; /* last emitted length */ - var curlen; /* length of current code */ - - var nextlen = tree[0 * 2 + 1] /*.Len*/; /* length of next code */ - - var count = 0; /* repeat count of the current code */ - var max_count = 7; /* max repeat count */ - var min_count = 4; /* min repeat count */ - - if (nextlen === 0) { - max_count = 138; - min_count = 3; - } - tree[(max_code + 1) * 2 + 1] /*.Len*/ = 0xffff; /* guard */ - - for (n = 0; n <= max_code; n++) { - curlen = nextlen; - nextlen = tree[(n + 1) * 2 + 1] /*.Len*/; - if (++count < max_count && curlen === nextlen) { - continue; - } else if (count < min_count) { - s.bl_tree[curlen * 2] /*.Freq*/ += count; - } else if (curlen !== 0) { - if (curlen !== prevlen) { - s.bl_tree[curlen * 2] /*.Freq*/++; - } - s.bl_tree[REP_3_6 * 2] /*.Freq*/++; - } else if (count <= 10) { - s.bl_tree[REPZ_3_10 * 2] /*.Freq*/++; - } else { - s.bl_tree[REPZ_11_138 * 2] /*.Freq*/++; - } - count = 0; - prevlen = curlen; - if (nextlen === 0) { - max_count = 138; - min_count = 3; - } else if (curlen === nextlen) { - max_count = 6; - min_count = 3; - } else { - max_count = 7; - min_count = 4; - } - } -} - -/* =========================================================================== - * Send a literal or distance tree in compressed form, using the codes in - * bl_tree. - */ -function send_tree(s, tree, max_code) -// deflate_state *s; -// ct_data *tree; /* the tree to be scanned */ -// int max_code; /* and its largest code of non zero frequency */ -{ - var n; /* iterates over all tree elements */ - var prevlen = -1; /* last emitted length */ - var curlen; /* length of current code */ - - var nextlen = tree[0 * 2 + 1] /*.Len*/; /* length of next code */ - - var count = 0; /* repeat count of the current code */ - var max_count = 7; /* max repeat count */ - var min_count = 4; /* min repeat count */ - - /* tree[max_code+1].Len = -1; */ /* guard already set */ - if (nextlen === 0) { - max_count = 138; - min_count = 3; - } - for (n = 0; n <= max_code; n++) { - curlen = nextlen; - nextlen = tree[(n + 1) * 2 + 1] /*.Len*/; - if (++count < max_count && curlen === nextlen) { - continue; - } else if (count < min_count) { - do { - send_code(s, curlen, s.bl_tree); - } while (--count !== 0); - } else if (curlen !== 0) { - if (curlen !== prevlen) { - send_code(s, curlen, s.bl_tree); - count--; - } - //Assert(count >= 3 && count <= 6, " 3_6?"); - send_code(s, REP_3_6, s.bl_tree); - send_bits(s, count - 3, 2); - } else if (count <= 10) { - send_code(s, REPZ_3_10, s.bl_tree); - send_bits(s, count - 3, 3); - } else { - send_code(s, REPZ_11_138, s.bl_tree); - send_bits(s, count - 11, 7); - } - count = 0; - prevlen = curlen; - if (nextlen === 0) { - max_count = 138; - min_count = 3; - } else if (curlen === nextlen) { - max_count = 6; - min_count = 3; - } else { - max_count = 7; - min_count = 4; - } - } -} - -/* =========================================================================== - * Construct the Huffman tree for the bit lengths and return the index in - * bl_order of the last bit length code to send. - */ -function build_bl_tree(s) { - var max_blindex; /* index of last bit length code of non zero freq */ - - /* Determine the bit length frequencies for literal and distance trees */ - scan_tree(s, s.dyn_ltree, s.l_desc.max_code); - scan_tree(s, s.dyn_dtree, s.d_desc.max_code); - - /* Build the bit length tree: */ - build_tree(s, s.bl_desc); - /* opt_len now includes the length of the tree representations, except - * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. - */ - - /* Determine the number of bit length codes to send. The pkzip format - * requires that at least 4 bit length codes be sent. (appnote.txt says - * 3 but the actual value used is 4.) - */ - for (max_blindex = BL_CODES$1 - 1; max_blindex >= 3; max_blindex--) { - if (s.bl_tree[bl_order[max_blindex] * 2 + 1] /*.Len*/ !== 0) { - break; - } - } - /* Update opt_len to include the bit length tree and counts */ - s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4; - //Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", - // s->opt_len, s->static_len)); - - return max_blindex; -} - -/* =========================================================================== - * Send the header for a block using dynamic Huffman trees: the counts, the - * lengths of the bit length codes, the literal tree and the distance tree. - * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. - */ -function send_all_trees(s, lcodes, dcodes, blcodes) -// deflate_state *s; -// int lcodes, dcodes, blcodes; /* number of codes for each tree */ -{ - var rank; /* index in bl_order */ - - //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); - //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, - // "too many codes"); - //Tracev((stderr, "\nbl counts: ")); - send_bits(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */ - send_bits(s, dcodes - 1, 5); - send_bits(s, blcodes - 4, 4); /* not -3 as stated in appnote.txt */ - for (rank = 0; rank < blcodes; rank++) { - //Tracev((stderr, "\nbl code %2d ", bl_order[rank])); - send_bits(s, s.bl_tree[bl_order[rank] * 2 + 1] /*.Len*/, 3); - } - //Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); - - send_tree(s, s.dyn_ltree, lcodes - 1); /* literal tree */ - //Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); - - send_tree(s, s.dyn_dtree, dcodes - 1); /* distance tree */ - //Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); -} - -/* =========================================================================== - * Check if the data type is TEXT or BINARY, using the following algorithm: - * - TEXT if the two conditions below are satisfied: - * a) There are no non-portable control characters belonging to the - * "black list" (0..6, 14..25, 28..31). - * b) There is at least one printable character belonging to the - * "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). - * - BINARY otherwise. - * - The following partially-portable control characters form a - * "gray list" that is ignored in this detection algorithm: - * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}). - * IN assertion: the fields Freq of dyn_ltree are set. - */ -function detect_data_type(s) { - /* black_mask is the bit mask of black-listed bytes - * set bits 0..6, 14..25, and 28..31 - * 0xf3ffc07f = binary 11110011111111111100000001111111 - */ - var black_mask = 0xf3ffc07f; - var n; - - /* Check for non-textual ("black-listed") bytes. */ - for (n = 0; n <= 31; n++, black_mask >>>= 1) { - if (black_mask & 1 && s.dyn_ltree[n * 2] /*.Freq*/ !== 0) { - return Z_BINARY; - } - } - - /* Check for textual ("white-listed") bytes. */ - if (s.dyn_ltree[9 * 2] /*.Freq*/ !== 0 || s.dyn_ltree[10 * 2] /*.Freq*/ !== 0 || s.dyn_ltree[13 * 2] /*.Freq*/ !== 0) { - return Z_TEXT; - } - for (n = 32; n < LITERALS$1; n++) { - if (s.dyn_ltree[n * 2] /*.Freq*/ !== 0) { - return Z_TEXT; - } - } - - /* There are no "black-listed" or "white-listed" bytes: - * this stream either is empty or has tolerated ("gray-listed") bytes only. - */ - return Z_BINARY; -} -var static_init_done = false; - -/* =========================================================================== - * Initialize the tree data structures for a new zlib stream. - */ -function _tr_init(s) { - if (!static_init_done) { - tr_static_init(); - static_init_done = true; - } - s.l_desc = new TreeDesc(s.dyn_ltree, static_l_desc); - s.d_desc = new TreeDesc(s.dyn_dtree, static_d_desc); - s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc); - s.bi_buf = 0; - s.bi_valid = 0; - - /* Initialize the first block of the first file: */ - init_block(s); -} - -/* =========================================================================== - * Send a stored block - */ -function _tr_stored_block(s, buf, stored_len, last) -//DeflateState *s; -//charf *buf; /* input block */ -//ulg stored_len; /* length of input block */ -//int last; /* one if this is the last block for a file */ -{ - send_bits(s, (STORED_BLOCK << 1) + (last ? 1 : 0), 3); /* send block type */ - copy_block(s, buf, stored_len); /* with header */ -} - -/* =========================================================================== - * Send one empty static block to give enough lookahead for inflate. - * This takes 10 bits, of which 7 may remain in the bit buffer. - */ -function _tr_align(s) { - send_bits(s, STATIC_TREES << 1, 3); - send_code(s, END_BLOCK, static_ltree); - bi_flush(s); -} - -/* =========================================================================== - * Determine the best encoding for the current block: dynamic trees, static - * trees or store, and output the encoded block to the zip file. - */ -function _tr_flush_block(s, buf, stored_len, last) -//DeflateState *s; -//charf *buf; /* input block, or NULL if too old */ -//ulg stored_len; /* length of input block */ -//int last; /* one if this is the last block for a file */ -{ - var opt_lenb, static_lenb; /* opt_len and static_len in bytes */ - var max_blindex = 0; /* index of last bit length code of non zero freq */ - - /* Build the Huffman trees unless a stored block is forced */ - if (s.level > 0) { - /* Check if the file is binary or text */ - if (s.strm.data_type === Z_UNKNOWN$1) { - s.strm.data_type = detect_data_type(s); - } - - /* Construct the literal and distance trees */ - build_tree(s, s.l_desc); - // Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, - // s->static_len)); - - build_tree(s, s.d_desc); - // Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, - // s->static_len)); - /* At this point, opt_len and static_len are the total bit lengths of - * the compressed block data, excluding the tree representations. - */ - - /* Build the bit length tree for the above two trees, and get the index - * in bl_order of the last bit length code to send. - */ - max_blindex = build_bl_tree(s); - - /* Determine the best encoding. Compute the block lengths in bytes. */ - opt_lenb = s.opt_len + 3 + 7 >>> 3; - static_lenb = s.static_len + 3 + 7 >>> 3; - - // Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", - // opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, - // s->last_lit)); - - if (static_lenb <= opt_lenb) { - opt_lenb = static_lenb; - } - } else { - // Assert(buf != (char*)0, "lost buf"); - opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ - } - if (stored_len + 4 <= opt_lenb && buf !== -1) { - /* 4: two words for the lengths */ - - /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. - * Otherwise we can't have processed more than WSIZE input bytes since - * the last block flush, because compression would have been - * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to - * transform a block into a stored block. - */ - _tr_stored_block(s, buf, stored_len, last); - } else if (s.strategy === Z_FIXED$1 || static_lenb === opt_lenb) { - send_bits(s, (STATIC_TREES << 1) + (last ? 1 : 0), 3); - compress_block(s, static_ltree, static_dtree); - } else { - send_bits(s, (DYN_TREES << 1) + (last ? 1 : 0), 3); - send_all_trees(s, s.l_desc.max_code + 1, s.d_desc.max_code + 1, max_blindex + 1); - compress_block(s, s.dyn_ltree, s.dyn_dtree); - } - // Assert (s->compressed_len == s->bits_sent, "bad compressed size"); - /* The above check is made mod 2^32, for files larger than 512 MB - * and uLong implemented on 32 bits. - */ - init_block(s); - if (last) { - bi_windup(s); - } - // Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, - // s->compressed_len-7*last)); -} - -/* =========================================================================== - * Save the match info and tally the frequency counts. Return true if - * the current block must be flushed. - */ -function _tr_tally(s, dist, lc) -// deflate_state *s; -// unsigned dist; /* distance of matched string */ -// unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ -{ - //var out_length, in_length, dcode; - - s.pending_buf[s.d_buf + s.last_lit * 2] = dist >>> 8 & 0xff; - s.pending_buf[s.d_buf + s.last_lit * 2 + 1] = dist & 0xff; - s.pending_buf[s.l_buf + s.last_lit] = lc & 0xff; - s.last_lit++; - if (dist === 0) { - /* lc is the unmatched char */ - s.dyn_ltree[lc * 2] /*.Freq*/++; - } else { - s.matches++; - /* Here, lc is the match length - MIN_MATCH */ - dist--; /* dist = match distance - 1 */ - //Assert((ush)dist < (ush)MAX_DIST(s) && - // (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && - // (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); - - s.dyn_ltree[(_length_code[lc] + LITERALS$1 + 1) * 2] /*.Freq*/++; - s.dyn_dtree[d_code(dist) * 2] /*.Freq*/++; - } - - // (!) This block is disabled in zlib defaults, - // don't enable it for binary compatibility - - //#ifdef TRUNCATE_BLOCK - // /* Try to guess if it is profitable to stop the current block here */ - // if ((s.last_lit & 0x1fff) === 0 && s.level > 2) { - // /* Compute an upper bound for the compressed length */ - // out_length = s.last_lit*8; - // in_length = s.strstart - s.block_start; - // - // for (dcode = 0; dcode < D_CODES; dcode++) { - // out_length += s.dyn_dtree[dcode*2]/*.Freq*/ * (5 + extra_dbits[dcode]); - // } - // out_length >>>= 3; - // //Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", - // // s->last_lit, in_length, out_length, - // // 100L - out_length*100L/in_length)); - // if (s.matches < (s.last_lit>>1)/*int /2*/ && out_length < (in_length>>1)/*int /2*/) { - // return true; - // } - // } - //#endif - - return s.last_lit === s.lit_bufsize - 1; - /* We avoid equality with lit_bufsize because of wraparound at 64K - * on 16 bit machines and because stored blocks are restricted to - * 64K-1 bytes. - */ -} -trees$1._tr_init = _tr_init; -trees$1._tr_stored_block = _tr_stored_block; -trees$1._tr_flush_block = _tr_flush_block; -trees$1._tr_tally = _tr_tally; -trees$1._tr_align = _tr_align; - -// Note: adler32 takes 12% for level 0 and 2% for level 6. -// It isn't worth it to make additional optimizations as in original. -// Small size is preferable. - -// (C) 1995-2013 Jean-loup Gailly and Mark Adler -// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// 3. This notice may not be removed or altered from any source distribution. - -function adler32$2(adler, buf, len, pos) { - var s1 = adler & 0xffff | 0, - s2 = adler >>> 16 & 0xffff | 0, - n = 0; - while (len !== 0) { - // Set limit ~ twice less than 5552, to keep - // s2 in 31-bits, because we force signed ints. - // in other case %= will fail. - n = len > 2000 ? 2000 : len; - len -= n; - do { - s1 = s1 + buf[pos++] | 0; - s2 = s2 + s1 | 0; - } while (--n); - s1 %= 65521; - s2 %= 65521; - } - return s1 | s2 << 16 | 0; -} -var adler32_1 = adler32$2; - -// Note: we can't get significant speed boost here. -// So write code to minimize size - no pregenerated tables -// and array tools dependencies. - -// (C) 1995-2013 Jean-loup Gailly and Mark Adler -// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// 3. This notice may not be removed or altered from any source distribution. - -// Use ordinary array, since untyped makes no boost here -function makeTable() { - var c, - table = []; - for (var n = 0; n < 256; n++) { - c = n; - for (var k = 0; k < 8; k++) { - c = c & 1 ? 0xEDB88320 ^ c >>> 1 : c >>> 1; - } - table[n] = c; - } - return table; -} - -// Create table on load. Just 255 signed longs. Not a problem. -var crcTable = makeTable(); -function crc32$2(crc, buf, len, pos) { - var t = crcTable, - end = pos + len; - crc ^= -1; - for (var i = pos; i < end; i++) { - crc = crc >>> 8 ^ t[(crc ^ buf[i]) & 0xFF]; - } - return crc ^ -1; // >>> 0; -} -var crc32_1 = crc32$2; - -// (C) 1995-2013 Jean-loup Gailly and Mark Adler -// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// 3. This notice may not be removed or altered from any source distribution. - -var messages = { - 2: 'need dictionary', - /* Z_NEED_DICT 2 */ - 1: 'stream end', - /* Z_STREAM_END 1 */ - 0: '', - /* Z_OK 0 */ - '-1': 'file error', - /* Z_ERRNO (-1) */ - '-2': 'stream error', - /* Z_STREAM_ERROR (-2) */ - '-3': 'data error', - /* Z_DATA_ERROR (-3) */ - '-4': 'insufficient memory', - /* Z_MEM_ERROR (-4) */ - '-5': 'buffer error', - /* Z_BUF_ERROR (-5) */ - '-6': 'incompatible version' /* Z_VERSION_ERROR (-6) */ -}; - -// (C) 1995-2013 Jean-loup Gailly and Mark Adler -// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// 3. This notice may not be removed or altered from any source distribution. - -var utils$2 = common; -var trees = trees$1; -var adler32$1 = adler32_1; -var crc32$1 = crc32_1; -var msg = messages; - -/* Public constants ==========================================================*/ -/* ===========================================================================*/ - -/* Allowed flush values; see deflate() and inflate() below for details */ -var Z_NO_FLUSH = 0; -var Z_PARTIAL_FLUSH = 1; -//var Z_SYNC_FLUSH = 2; -var Z_FULL_FLUSH = 3; -var Z_FINISH$1 = 4; -var Z_BLOCK$1 = 5; -//var Z_TREES = 6; - -/* Return codes for the compression/decompression functions. Negative values - * are errors, positive values are used for special but normal events. - */ -var Z_OK$1 = 0; -var Z_STREAM_END$1 = 1; -//var Z_NEED_DICT = 2; -//var Z_ERRNO = -1; -var Z_STREAM_ERROR$1 = -2; -var Z_DATA_ERROR$1 = -3; -//var Z_MEM_ERROR = -4; -var Z_BUF_ERROR$1 = -5; -//var Z_VERSION_ERROR = -6; - -/* compression levels */ -//var Z_NO_COMPRESSION = 0; -//var Z_BEST_SPEED = 1; -//var Z_BEST_COMPRESSION = 9; -var Z_DEFAULT_COMPRESSION = -1; -var Z_FILTERED = 1; -var Z_HUFFMAN_ONLY = 2; -var Z_RLE = 3; -var Z_FIXED = 4; -var Z_DEFAULT_STRATEGY = 0; - -/* Possible values of the data_type field (though see inflate()) */ -//var Z_BINARY = 0; -//var Z_TEXT = 1; -//var Z_ASCII = 1; // = Z_TEXT -var Z_UNKNOWN = 2; - -/* The deflate compression method */ -var Z_DEFLATED$1 = 8; - -/*============================================================================*/ - -var MAX_MEM_LEVEL = 9; -/* Maximum value for memLevel in deflateInit2 */ -var MAX_WBITS$1 = 15; -/* 32K LZ77 window */ -var DEF_MEM_LEVEL = 8; -var LENGTH_CODES = 29; -/* number of length codes, not counting the special END_BLOCK code */ -var LITERALS = 256; -/* number of literal bytes 0..255 */ -var L_CODES = LITERALS + 1 + LENGTH_CODES; -/* number of Literal or Length codes, including the END_BLOCK code */ -var D_CODES = 30; -/* number of distance codes */ -var BL_CODES = 19; -/* number of codes used to transfer the bit lengths */ -var HEAP_SIZE = 2 * L_CODES + 1; -/* maximum heap size */ -var MAX_BITS = 15; -/* All codes must not exceed MAX_BITS bits */ - -var MIN_MATCH = 3; -var MAX_MATCH = 258; -var MIN_LOOKAHEAD = MAX_MATCH + MIN_MATCH + 1; -var PRESET_DICT = 0x20; -var INIT_STATE = 42; -var EXTRA_STATE = 69; -var NAME_STATE = 73; -var COMMENT_STATE = 91; -var HCRC_STATE = 103; -var BUSY_STATE = 113; -var FINISH_STATE = 666; -var BS_NEED_MORE = 1; /* block not completed, need more input or more output */ -var BS_BLOCK_DONE = 2; /* block flush performed */ -var BS_FINISH_STARTED = 3; /* finish started, need only more output at next deflate */ -var BS_FINISH_DONE = 4; /* finish done, accept no more input or output */ - -var OS_CODE = 0x03; // Unix :) . Don't detect, use this default. - -function err(strm, errorCode) { - strm.msg = msg[errorCode]; - return errorCode; -} -function rank(f) { - return (f << 1) - (f > 4 ? 9 : 0); -} -function zero(buf) { - var len = buf.length; - while (--len >= 0) { - buf[len] = 0; - } -} - -/* ========================================================================= - * Flush as much pending output as possible. All deflate() output goes - * through this function so some applications may wish to modify it - * to avoid allocating a large strm->output buffer and copying into it. - * (See also read_buf()). - */ -function flush_pending(strm) { - var s = strm.state; - - //_tr_flush_bits(s); - var len = s.pending; - if (len > strm.avail_out) { - len = strm.avail_out; - } - if (len === 0) { - return; - } - utils$2.arraySet(strm.output, s.pending_buf, s.pending_out, len, strm.next_out); - strm.next_out += len; - s.pending_out += len; - strm.total_out += len; - strm.avail_out -= len; - s.pending -= len; - if (s.pending === 0) { - s.pending_out = 0; - } -} -function flush_block_only(s, last) { - trees._tr_flush_block(s, s.block_start >= 0 ? s.block_start : -1, s.strstart - s.block_start, last); - s.block_start = s.strstart; - flush_pending(s.strm); -} -function put_byte(s, b) { - s.pending_buf[s.pending++] = b; -} - -/* ========================================================================= - * Put a short in the pending buffer. The 16-bit value is put in MSB order. - * IN assertion: the stream state is correct and there is enough room in - * pending_buf. - */ -function putShortMSB(s, b) { - // put_byte(s, (Byte)(b >> 8)); - // put_byte(s, (Byte)(b & 0xff)); - s.pending_buf[s.pending++] = b >>> 8 & 0xff; - s.pending_buf[s.pending++] = b & 0xff; -} - -/* =========================================================================== - * Read a new buffer from the current input stream, update the adler32 - * and total number of bytes read. All deflate() input goes through - * this function so some applications may wish to modify it to avoid - * allocating a large strm->input buffer and copying from it. - * (See also flush_pending()). - */ -function read_buf(strm, buf, start, size) { - var len = strm.avail_in; - if (len > size) { - len = size; - } - if (len === 0) { - return 0; - } - strm.avail_in -= len; - - // zmemcpy(buf, strm->next_in, len); - utils$2.arraySet(buf, strm.input, strm.next_in, len, start); - if (strm.state.wrap === 1) { - strm.adler = adler32$1(strm.adler, buf, len, start); - } else if (strm.state.wrap === 2) { - strm.adler = crc32$1(strm.adler, buf, len, start); - } - strm.next_in += len; - strm.total_in += len; - return len; -} - -/* =========================================================================== - * Set match_start to the longest match starting at the given string and - * return its length. Matches shorter or equal to prev_length are discarded, - * in which case the result is equal to prev_length and match_start is - * garbage. - * IN assertions: cur_match is the head of the hash chain for the current - * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 - * OUT assertion: the match length is not greater than s->lookahead. - */ -function longest_match(s, cur_match) { - var chain_length = s.max_chain_length; /* max hash chain length */ - var scan = s.strstart; /* current string */ - var match; /* matched string */ - var len; /* length of current match */ - var best_len = s.prev_length; /* best match length so far */ - var nice_match = s.nice_match; /* stop if match long enough */ - var limit = s.strstart > s.w_size - MIN_LOOKAHEAD ? s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0 /*NIL*/; - var _win = s.window; // shortcut - - var wmask = s.w_mask; - var prev = s.prev; - - /* Stop when cur_match becomes <= limit. To simplify the code, - * we prevent matches with the string of window index 0. - */ - - var strend = s.strstart + MAX_MATCH; - var scan_end1 = _win[scan + best_len - 1]; - var scan_end = _win[scan + best_len]; - - /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. - * It is easy to get rid of this optimization if necessary. - */ - // Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); - - /* Do not waste too much time if we already have a good match: */ - if (s.prev_length >= s.good_match) { - chain_length >>= 2; - } - /* Do not look for matches beyond the end of the input. This is necessary - * to make deflate deterministic. - */ - if (nice_match > s.lookahead) { - nice_match = s.lookahead; - } - - // Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); - - do { - // Assert(cur_match < s->strstart, "no future"); - match = cur_match; - - /* Skip to next match if the match length cannot increase - * or if the match length is less than 2. Note that the checks below - * for insufficient lookahead only occur occasionally for performance - * reasons. Therefore uninitialized memory will be accessed, and - * conditional jumps will be made that depend on those values. - * However the length of the match is limited to the lookahead, so - * the output of deflate is not affected by the uninitialized values. - */ - - if (_win[match + best_len] !== scan_end || _win[match + best_len - 1] !== scan_end1 || _win[match] !== _win[scan] || _win[++match] !== _win[scan + 1]) { - continue; - } - - /* The check at best_len-1 can be removed because it will be made - * again later. (This heuristic is not always a win.) - * It is not necessary to compare scan[2] and match[2] since they - * are always equal when the other bytes match, given that - * the hash keys are equal and that HASH_BITS >= 8. - */ - scan += 2; - match++; - // Assert(*scan == *match, "match[2]?"); - - /* We check for insufficient lookahead only every 8th comparison; - * the 256th check will be made at strstart+258. - */ - do { - /*jshint noempty:false*/ - } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && scan < strend); - - // Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); - - len = MAX_MATCH - (strend - scan); - scan = strend - MAX_MATCH; - if (len > best_len) { - s.match_start = cur_match; - best_len = len; - if (len >= nice_match) { - break; - } - scan_end1 = _win[scan + best_len - 1]; - scan_end = _win[scan + best_len]; - } - } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0); - if (best_len <= s.lookahead) { - return best_len; - } - return s.lookahead; -} - -/* =========================================================================== - * Fill the window when the lookahead becomes insufficient. - * Updates strstart and lookahead. - * - * IN assertion: lookahead < MIN_LOOKAHEAD - * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD - * At least one byte has been read, or avail_in == 0; reads are - * performed for at least two bytes (required for the zip translate_eol - * option -- not supported here). - */ -function fill_window(s) { - var _w_size = s.w_size; - var p, n, m, more, str; - - //Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead"); - - do { - more = s.window_size - s.lookahead - s.strstart; - - // JS ints have 32 bit, block below not needed - /* Deal with !@#$% 64K limit: */ - //if (sizeof(int) <= 2) { - // if (more == 0 && s->strstart == 0 && s->lookahead == 0) { - // more = wsize; - // - // } else if (more == (unsigned)(-1)) { - // /* Very unlikely, but possible on 16 bit machine if - // * strstart == 0 && lookahead == 1 (input done a byte at time) - // */ - // more--; - // } - //} - - /* If the window is almost full and there is insufficient lookahead, - * move the upper half to the lower one to make room in the upper half. - */ - if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) { - utils$2.arraySet(s.window, s.window, _w_size, _w_size, 0); - s.match_start -= _w_size; - s.strstart -= _w_size; - /* we now have strstart >= MAX_DIST */ - s.block_start -= _w_size; - - /* Slide the hash table (could be avoided with 32 bit values - at the expense of memory usage). We slide even when level == 0 - to keep the hash table consistent if we switch back to level > 0 - later. (Using level 0 permanently is not an optimal usage of - zlib, so we don't care about this pathological case.) - */ - - n = s.hash_size; - p = n; - do { - m = s.head[--p]; - s.head[p] = m >= _w_size ? m - _w_size : 0; - } while (--n); - n = _w_size; - p = n; - do { - m = s.prev[--p]; - s.prev[p] = m >= _w_size ? m - _w_size : 0; - /* If n is not on any hash chain, prev[n] is garbage but - * its value will never be used. - */ - } while (--n); - more += _w_size; - } - if (s.strm.avail_in === 0) { - break; - } - - /* If there was no sliding: - * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && - * more == window_size - lookahead - strstart - * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) - * => more >= window_size - 2*WSIZE + 2 - * In the BIG_MEM or MMAP case (not yet supported), - * window_size == input_size + MIN_LOOKAHEAD && - * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. - * Otherwise, window_size == 2*WSIZE so more >= 2. - * If there was sliding, more >= WSIZE. So in all cases, more >= 2. - */ - //Assert(more >= 2, "more < 2"); - n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more); - s.lookahead += n; - - /* Initialize the hash value now that we have some input: */ - if (s.lookahead + s.insert >= MIN_MATCH) { - str = s.strstart - s.insert; - s.ins_h = s.window[str]; - - /* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */ - s.ins_h = (s.ins_h << s.hash_shift ^ s.window[str + 1]) & s.hash_mask; - //#if MIN_MATCH != 3 - // Call update_hash() MIN_MATCH-3 more times - //#endif - while (s.insert) { - /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */ - s.ins_h = (s.ins_h << s.hash_shift ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask; - s.prev[str & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = str; - str++; - s.insert--; - if (s.lookahead + s.insert < MIN_MATCH) { - break; - } - } - } - /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, - * but this is not important since only literal bytes will be emitted. - */ - } while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0); - - /* If the WIN_INIT bytes after the end of the current data have never been - * written, then zero those bytes in order to avoid memory check reports of - * the use of uninitialized (or uninitialised as Julian writes) bytes by - * the longest match routines. Update the high water mark for the next - * time through here. WIN_INIT is set to MAX_MATCH since the longest match - * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead. - */ - // if (s.high_water < s.window_size) { - // var curr = s.strstart + s.lookahead; - // var init = 0; - // - // if (s.high_water < curr) { - // /* Previous high water mark below current data -- zero WIN_INIT - // * bytes or up to end of window, whichever is less. - // */ - // init = s.window_size - curr; - // if (init > WIN_INIT) - // init = WIN_INIT; - // zmemzero(s->window + curr, (unsigned)init); - // s->high_water = curr + init; - // } - // else if (s->high_water < (ulg)curr + WIN_INIT) { - // /* High water mark at or above current data, but below current data - // * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up - // * to end of window, whichever is less. - // */ - // init = (ulg)curr + WIN_INIT - s->high_water; - // if (init > s->window_size - s->high_water) - // init = s->window_size - s->high_water; - // zmemzero(s->window + s->high_water, (unsigned)init); - // s->high_water += init; - // } - // } - // - // Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, - // "not enough room for search"); -} - -/* =========================================================================== - * Copy without compression as much as possible from the input stream, return - * the current block state. - * This function does not insert new strings in the dictionary since - * uncompressible data is probably not useful. This function is used - * only for the level=0 compression option. - * NOTE: this function should be optimized to avoid extra copying from - * window to pending_buf. - */ -function deflate_stored(s, flush) { - /* Stored blocks are limited to 0xffff bytes, pending_buf is limited - * to pending_buf_size, and each stored block has a 5 byte header: - */ - var max_block_size = 0xffff; - if (max_block_size > s.pending_buf_size - 5) { - max_block_size = s.pending_buf_size - 5; - } - - /* Copy as much as possible from input to output: */ - for (;;) { - /* Fill the window as much as possible: */ - if (s.lookahead <= 1) { - //Assert(s->strstart < s->w_size+MAX_DIST(s) || - // s->block_start >= (long)s->w_size, "slide too late"); - // if (!(s.strstart < s.w_size + (s.w_size - MIN_LOOKAHEAD) || - // s.block_start >= s.w_size)) { - // throw new Error("slide too late"); - // } - - fill_window(s); - if (s.lookahead === 0 && flush === Z_NO_FLUSH) { - return BS_NEED_MORE; - } - if (s.lookahead === 0) { - break; - } - /* flush the current block */ - } - //Assert(s->block_start >= 0L, "block gone"); - // if (s.block_start < 0) throw new Error("block gone"); - - s.strstart += s.lookahead; - s.lookahead = 0; - - /* Emit a stored block if pending_buf will be full: */ - var max_start = s.block_start + max_block_size; - if (s.strstart === 0 || s.strstart >= max_start) { - /* strstart == 0 is possible when wraparound on 16-bit machine */ - s.lookahead = s.strstart - max_start; - s.strstart = max_start; - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - /* Flush if we may have to slide, otherwise block_start may become - * negative and the data will be gone: - */ - if (s.strstart - s.block_start >= s.w_size - MIN_LOOKAHEAD) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - } - s.insert = 0; - if (flush === Z_FINISH$1) { - /*** FLUSH_BLOCK(s, 1); ***/ - flush_block_only(s, true); - if (s.strm.avail_out === 0) { - return BS_FINISH_STARTED; - } - /***/ - return BS_FINISH_DONE; - } - if (s.strstart > s.block_start) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - return BS_NEED_MORE; -} - -/* =========================================================================== - * Compress as much as possible from the input stream, return the current - * block state. - * This function does not perform lazy evaluation of matches and inserts - * new strings in the dictionary only for unmatched strings or for short - * matches. It is used only for the fast compression options. - */ -function deflate_fast(s, flush) { - var hash_head; /* head of the hash chain */ - var bflush; /* set if current block must be flushed */ - - for (;;) { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the next match, plus MIN_MATCH bytes to insert the - * string following the next match. - */ - if (s.lookahead < MIN_LOOKAHEAD) { - fill_window(s); - if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) { - return BS_NEED_MORE; - } - if (s.lookahead === 0) { - break; /* flush the current block */ - } - } - - /* Insert the string window[strstart .. strstart+2] in the - * dictionary, and set hash_head to the head of the hash chain: - */ - hash_head = 0 /*NIL*/; - if (s.lookahead >= MIN_MATCH) { - /*** INSERT_STRING(s, s.strstart, hash_head); ***/ - s.ins_h = (s.ins_h << s.hash_shift ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask; - hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = s.strstart; - /***/ - } - - /* Find the longest match, discarding those <= prev_length. - * At this point we have always match_length < MIN_MATCH - */ - if (hash_head !== 0 /*NIL*/ && s.strstart - hash_head <= s.w_size - MIN_LOOKAHEAD) { - /* To simplify the code, we prevent matches with the string - * of window index 0 (in particular we have to avoid a match - * of the string with itself at the start of the input file). - */ - s.match_length = longest_match(s, hash_head); - /* longest_match() sets match_start */ - } - if (s.match_length >= MIN_MATCH) { - // check_match(s, s.strstart, s.match_start, s.match_length); // for debug only - - /*** _tr_tally_dist(s, s.strstart - s.match_start, - s.match_length - MIN_MATCH, bflush); ***/ - bflush = trees._tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH); - s.lookahead -= s.match_length; - - /* Insert new strings in the hash table only if the match length - * is not too large. This saves time but degrades compression. - */ - if (s.match_length <= s.max_lazy_match /*max_insert_length*/ && s.lookahead >= MIN_MATCH) { - s.match_length--; /* string at strstart already in table */ - do { - s.strstart++; - /*** INSERT_STRING(s, s.strstart, hash_head); ***/ - s.ins_h = (s.ins_h << s.hash_shift ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask; - hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = s.strstart; - /***/ - /* strstart never exceeds WSIZE-MAX_MATCH, so there are - * always MIN_MATCH bytes ahead. - */ - } while (--s.match_length !== 0); - s.strstart++; - } else { - s.strstart += s.match_length; - s.match_length = 0; - s.ins_h = s.window[s.strstart]; - /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */ - s.ins_h = (s.ins_h << s.hash_shift ^ s.window[s.strstart + 1]) & s.hash_mask; - - //#if MIN_MATCH != 3 - // Call UPDATE_HASH() MIN_MATCH-3 more times - //#endif - /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not - * matter since it will be recomputed at next deflate call. - */ - } - } else { - /* No match, output a literal byte */ - //Tracevv((stderr,"%c", s.window[s.strstart])); - /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ - bflush = trees._tr_tally(s, 0, s.window[s.strstart]); - s.lookahead--; - s.strstart++; - } - if (bflush) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - } - s.insert = s.strstart < MIN_MATCH - 1 ? s.strstart : MIN_MATCH - 1; - if (flush === Z_FINISH$1) { - /*** FLUSH_BLOCK(s, 1); ***/ - flush_block_only(s, true); - if (s.strm.avail_out === 0) { - return BS_FINISH_STARTED; - } - /***/ - return BS_FINISH_DONE; - } - if (s.last_lit) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - return BS_BLOCK_DONE; -} - -/* =========================================================================== - * Same as above, but achieves better compression. We use a lazy - * evaluation for matches: a match is finally adopted only if there is - * no better match at the next window position. - */ -function deflate_slow(s, flush) { - var hash_head; /* head of hash chain */ - var bflush; /* set if current block must be flushed */ - - var max_insert; - - /* Process the input block. */ - for (;;) { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the next match, plus MIN_MATCH bytes to insert the - * string following the next match. - */ - if (s.lookahead < MIN_LOOKAHEAD) { - fill_window(s); - if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) { - return BS_NEED_MORE; - } - if (s.lookahead === 0) { - break; - } /* flush the current block */ - } - - /* Insert the string window[strstart .. strstart+2] in the - * dictionary, and set hash_head to the head of the hash chain: - */ - hash_head = 0 /*NIL*/; - if (s.lookahead >= MIN_MATCH) { - /*** INSERT_STRING(s, s.strstart, hash_head); ***/ - s.ins_h = (s.ins_h << s.hash_shift ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask; - hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = s.strstart; - /***/ - } - - /* Find the longest match, discarding those <= prev_length. - */ - s.prev_length = s.match_length; - s.prev_match = s.match_start; - s.match_length = MIN_MATCH - 1; - if (hash_head !== 0 /*NIL*/ && s.prev_length < s.max_lazy_match && s.strstart - hash_head <= s.w_size - MIN_LOOKAHEAD /*MAX_DIST(s)*/) { - /* To simplify the code, we prevent matches with the string - * of window index 0 (in particular we have to avoid a match - * of the string with itself at the start of the input file). - */ - s.match_length = longest_match(s, hash_head); - /* longest_match() sets match_start */ - - if (s.match_length <= 5 && (s.strategy === Z_FILTERED || s.match_length === MIN_MATCH && s.strstart - s.match_start > 4096 /*TOO_FAR*/)) { - /* If prev_match is also MIN_MATCH, match_start is garbage - * but we will ignore the current match anyway. - */ - s.match_length = MIN_MATCH - 1; - } - } - /* If there was a match at the previous step and the current - * match is not better, output the previous match: - */ - if (s.prev_length >= MIN_MATCH && s.match_length <= s.prev_length) { - max_insert = s.strstart + s.lookahead - MIN_MATCH; - /* Do not insert strings in hash table beyond this. */ - - //check_match(s, s.strstart-1, s.prev_match, s.prev_length); - - /***_tr_tally_dist(s, s.strstart - 1 - s.prev_match, - s.prev_length - MIN_MATCH, bflush);***/ - bflush = trees._tr_tally(s, s.strstart - 1 - s.prev_match, s.prev_length - MIN_MATCH); - /* Insert in hash table all strings up to the end of the match. - * strstart-1 and strstart are already inserted. If there is not - * enough lookahead, the last two strings are not inserted in - * the hash table. - */ - s.lookahead -= s.prev_length - 1; - s.prev_length -= 2; - do { - if (++s.strstart <= max_insert) { - /*** INSERT_STRING(s, s.strstart, hash_head); ***/ - s.ins_h = (s.ins_h << s.hash_shift ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask; - hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = s.strstart; - /***/ - } - } while (--s.prev_length !== 0); - s.match_available = 0; - s.match_length = MIN_MATCH - 1; - s.strstart++; - if (bflush) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - } else if (s.match_available) { - /* If there was no match at the previous position, output a - * single literal. If there was a match but the current match - * is longer, truncate the previous match to a single literal. - */ - //Tracevv((stderr,"%c", s->window[s->strstart-1])); - /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/ - bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]); - if (bflush) { - /*** FLUSH_BLOCK_ONLY(s, 0) ***/ - flush_block_only(s, false); - /***/ - } - s.strstart++; - s.lookahead--; - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - } else { - /* There is no previous match to compare with, wait for - * the next step to decide. - */ - s.match_available = 1; - s.strstart++; - s.lookahead--; - } - } - //Assert (flush != Z_NO_FLUSH, "no flush?"); - if (s.match_available) { - //Tracevv((stderr,"%c", s->window[s->strstart-1])); - /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/ - bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]); - s.match_available = 0; - } - s.insert = s.strstart < MIN_MATCH - 1 ? s.strstart : MIN_MATCH - 1; - if (flush === Z_FINISH$1) { - /*** FLUSH_BLOCK(s, 1); ***/ - flush_block_only(s, true); - if (s.strm.avail_out === 0) { - return BS_FINISH_STARTED; - } - /***/ - return BS_FINISH_DONE; - } - if (s.last_lit) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - return BS_BLOCK_DONE; -} - -/* =========================================================================== - * For Z_RLE, simply look for runs of bytes, generate matches only of distance - * one. Do not maintain a hash table. (It will be regenerated if this run of - * deflate switches away from Z_RLE.) - */ -function deflate_rle(s, flush) { - var bflush; /* set if current block must be flushed */ - var prev; /* byte at distance one to match */ - var scan, strend; /* scan goes up to strend for length of run */ - - var _win = s.window; - for (;;) { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the longest run, plus one for the unrolled loop. - */ - if (s.lookahead <= MAX_MATCH) { - fill_window(s); - if (s.lookahead <= MAX_MATCH && flush === Z_NO_FLUSH) { - return BS_NEED_MORE; - } - if (s.lookahead === 0) { - break; - } /* flush the current block */ - } - - /* See how many times the previous byte repeats */ - s.match_length = 0; - if (s.lookahead >= MIN_MATCH && s.strstart > 0) { - scan = s.strstart - 1; - prev = _win[scan]; - if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) { - strend = s.strstart + MAX_MATCH; - do { - /*jshint noempty:false*/ - } while (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan] && scan < strend); - s.match_length = MAX_MATCH - (strend - scan); - if (s.match_length > s.lookahead) { - s.match_length = s.lookahead; - } - } - //Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan"); - } - - /* Emit match if have run of MIN_MATCH or longer, else emit literal */ - if (s.match_length >= MIN_MATCH) { - //check_match(s, s.strstart, s.strstart - 1, s.match_length); - - /*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/ - bflush = trees._tr_tally(s, 1, s.match_length - MIN_MATCH); - s.lookahead -= s.match_length; - s.strstart += s.match_length; - s.match_length = 0; - } else { - /* No match, output a literal byte */ - //Tracevv((stderr,"%c", s->window[s->strstart])); - /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ - bflush = trees._tr_tally(s, 0, s.window[s.strstart]); - s.lookahead--; - s.strstart++; - } - if (bflush) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - } - s.insert = 0; - if (flush === Z_FINISH$1) { - /*** FLUSH_BLOCK(s, 1); ***/ - flush_block_only(s, true); - if (s.strm.avail_out === 0) { - return BS_FINISH_STARTED; - } - /***/ - return BS_FINISH_DONE; - } - if (s.last_lit) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - return BS_BLOCK_DONE; -} - -/* =========================================================================== - * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table. - * (It will be regenerated if this run of deflate switches away from Huffman.) - */ -function deflate_huff(s, flush) { - var bflush; /* set if current block must be flushed */ - - for (;;) { - /* Make sure that we have a literal to write. */ - if (s.lookahead === 0) { - fill_window(s); - if (s.lookahead === 0) { - if (flush === Z_NO_FLUSH) { - return BS_NEED_MORE; - } - break; /* flush the current block */ - } - } - - /* Output a literal byte */ - s.match_length = 0; - //Tracevv((stderr,"%c", s->window[s->strstart])); - /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ - bflush = trees._tr_tally(s, 0, s.window[s.strstart]); - s.lookahead--; - s.strstart++; - if (bflush) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - } - s.insert = 0; - if (flush === Z_FINISH$1) { - /*** FLUSH_BLOCK(s, 1); ***/ - flush_block_only(s, true); - if (s.strm.avail_out === 0) { - return BS_FINISH_STARTED; - } - /***/ - return BS_FINISH_DONE; - } - if (s.last_lit) { - /*** FLUSH_BLOCK(s, 0); ***/ - flush_block_only(s, false); - if (s.strm.avail_out === 0) { - return BS_NEED_MORE; - } - /***/ - } - return BS_BLOCK_DONE; -} - -/* Values for max_lazy_match, good_match and max_chain_length, depending on - * the desired pack level (0..9). The values given below have been tuned to - * exclude worst case performance for pathological files. Better values may be - * found for specific files. - */ -function Config(good_length, max_lazy, nice_length, max_chain, func) { - this.good_length = good_length; - this.max_lazy = max_lazy; - this.nice_length = nice_length; - this.max_chain = max_chain; - this.func = func; -} -var configuration_table; -configuration_table = [/* good lazy nice chain */ -new Config(0, 0, 0, 0, deflate_stored), /* 0 store only */ -new Config(4, 4, 8, 4, deflate_fast), /* 1 max speed, no lazy matches */ -new Config(4, 5, 16, 8, deflate_fast), /* 2 */ -new Config(4, 6, 32, 32, deflate_fast), /* 3 */ - -new Config(4, 4, 16, 16, deflate_slow), /* 4 lazy matches */ -new Config(8, 16, 32, 32, deflate_slow), /* 5 */ -new Config(8, 16, 128, 128, deflate_slow), /* 6 */ -new Config(8, 32, 128, 256, deflate_slow), /* 7 */ -new Config(32, 128, 258, 1024, deflate_slow), /* 8 */ -new Config(32, 258, 258, 4096, deflate_slow) /* 9 max compression */]; - -/* =========================================================================== - * Initialize the "longest match" routines for a new zlib stream - */ -function lm_init(s) { - s.window_size = 2 * s.w_size; - - /*** CLEAR_HASH(s); ***/ - zero(s.head); // Fill with NIL (= 0); - - /* Set the default configuration parameters: - */ - s.max_lazy_match = configuration_table[s.level].max_lazy; - s.good_match = configuration_table[s.level].good_length; - s.nice_match = configuration_table[s.level].nice_length; - s.max_chain_length = configuration_table[s.level].max_chain; - s.strstart = 0; - s.block_start = 0; - s.lookahead = 0; - s.insert = 0; - s.match_length = s.prev_length = MIN_MATCH - 1; - s.match_available = 0; - s.ins_h = 0; -} -function DeflateState() { - this.strm = null; /* pointer back to this zlib stream */ - this.status = 0; /* as the name implies */ - this.pending_buf = null; /* output still pending */ - this.pending_buf_size = 0; /* size of pending_buf */ - this.pending_out = 0; /* next pending byte to output to the stream */ - this.pending = 0; /* nb of bytes in the pending buffer */ - this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */ - this.gzhead = null; /* gzip header information to write */ - this.gzindex = 0; /* where in extra, name, or comment */ - this.method = Z_DEFLATED$1; /* can only be DEFLATED */ - this.last_flush = -1; /* value of flush param for previous deflate call */ - - this.w_size = 0; /* LZ77 window size (32K by default) */ - this.w_bits = 0; /* log2(w_size) (8..16) */ - this.w_mask = 0; /* w_size - 1 */ - - this.window = null; - /* Sliding window. Input bytes are read into the second half of the window, - * and move to the first half later to keep a dictionary of at least wSize - * bytes. With this organization, matches are limited to a distance of - * wSize-MAX_MATCH bytes, but this ensures that IO is always - * performed with a length multiple of the block size. - */ - - this.window_size = 0; - /* Actual size of window: 2*wSize, except when the user input buffer - * is directly used as sliding window. - */ - - this.prev = null; - /* Link to older string with same hash index. To limit the size of this - * array to 64K, this link is maintained only for the last 32K strings. - * An index in this array is thus a window index modulo 32K. - */ - - this.head = null; /* Heads of the hash chains or NIL. */ - - this.ins_h = 0; /* hash index of string to be inserted */ - this.hash_size = 0; /* number of elements in hash table */ - this.hash_bits = 0; /* log2(hash_size) */ - this.hash_mask = 0; /* hash_size-1 */ - - this.hash_shift = 0; - /* Number of bits by which ins_h must be shifted at each input - * step. It must be such that after MIN_MATCH steps, the oldest - * byte no longer takes part in the hash key, that is: - * hash_shift * MIN_MATCH >= hash_bits - */ - - this.block_start = 0; - /* Window position at the beginning of the current output block. Gets - * negative when the window is moved backwards. - */ - - this.match_length = 0; /* length of best match */ - this.prev_match = 0; /* previous match */ - this.match_available = 0; /* set if previous match exists */ - this.strstart = 0; /* start of string to insert */ - this.match_start = 0; /* start of matching string */ - this.lookahead = 0; /* number of valid bytes ahead in window */ - - this.prev_length = 0; - /* Length of the best match at previous step. Matches not greater than this - * are discarded. This is used in the lazy match evaluation. - */ - - this.max_chain_length = 0; - /* To speed up deflation, hash chains are never searched beyond this - * length. A higher limit improves compression ratio but degrades the - * speed. - */ - - this.max_lazy_match = 0; - /* Attempt to find a better match only when the current match is strictly - * smaller than this value. This mechanism is used only for compression - * levels >= 4. - */ - // That's alias to max_lazy_match, don't use directly - //this.max_insert_length = 0; - /* Insert new strings in the hash table only if the match length is not - * greater than this length. This saves time but degrades compression. - * max_insert_length is used only for compression levels <= 3. - */ - - this.level = 0; /* compression level (1..9) */ - this.strategy = 0; /* favor or force Huffman coding*/ - - this.good_match = 0; - /* Use a faster search when the previous match is longer than this */ - - this.nice_match = 0; /* Stop searching when current match exceeds this */ - - /* used by trees.c: */ - - /* Didn't use ct_data typedef below to suppress compiler warning */ - - // struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ - // struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ - // struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ - - // Use flat array of DOUBLE size, with interleaved fata, - // because JS does not support effective - this.dyn_ltree = new utils$2.Buf16(HEAP_SIZE * 2); - this.dyn_dtree = new utils$2.Buf16((2 * D_CODES + 1) * 2); - this.bl_tree = new utils$2.Buf16((2 * BL_CODES + 1) * 2); - zero(this.dyn_ltree); - zero(this.dyn_dtree); - zero(this.bl_tree); - this.l_desc = null; /* desc. for literal tree */ - this.d_desc = null; /* desc. for distance tree */ - this.bl_desc = null; /* desc. for bit length tree */ - - //ush bl_count[MAX_BITS+1]; - this.bl_count = new utils$2.Buf16(MAX_BITS + 1); - /* number of codes at each bit length for an optimal tree */ - - //int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ - this.heap = new utils$2.Buf16(2 * L_CODES + 1); /* heap used to build the Huffman trees */ - zero(this.heap); - this.heap_len = 0; /* number of elements in the heap */ - this.heap_max = 0; /* element of largest frequency */ - /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. - * The same heap array is used to build all trees. - */ - - this.depth = new utils$2.Buf16(2 * L_CODES + 1); //uch depth[2*L_CODES+1]; - zero(this.depth); - /* Depth of each subtree used as tie breaker for trees of equal frequency - */ - - this.l_buf = 0; /* buffer index for literals or lengths */ - - this.lit_bufsize = 0; - /* Size of match buffer for literals/lengths. There are 4 reasons for - * limiting lit_bufsize to 64K: - * - frequencies can be kept in 16 bit counters - * - if compression is not successful for the first block, all input - * data is still in the window so we can still emit a stored block even - * when input comes from standard input. (This can also be done for - * all blocks if lit_bufsize is not greater than 32K.) - * - if compression is not successful for a file smaller than 64K, we can - * even emit a stored file instead of a stored block (saving 5 bytes). - * This is applicable only for zip (not gzip or zlib). - * - creating new Huffman trees less frequently may not provide fast - * adaptation to changes in the input data statistics. (Take for - * example a binary file with poorly compressible code followed by - * a highly compressible string table.) Smaller buffer sizes give - * fast adaptation but have of course the overhead of transmitting - * trees more frequently. - * - I can't count above 4 - */ - - this.last_lit = 0; /* running index in l_buf */ - - this.d_buf = 0; - /* Buffer index for distances. To simplify the code, d_buf and l_buf have - * the same number of elements. To use different lengths, an extra flag - * array would be necessary. - */ - - this.opt_len = 0; /* bit length of current block with optimal trees */ - this.static_len = 0; /* bit length of current block with static trees */ - this.matches = 0; /* number of string matches in current block */ - this.insert = 0; /* bytes at end of window left to insert */ - - this.bi_buf = 0; - /* Output buffer. bits are inserted starting at the bottom (least - * significant bits). - */ - this.bi_valid = 0; - /* Number of valid bits in bi_buf. All bits above the last valid bit - * are always zero. - */ - - // Used for window memory init. We safely ignore it for JS. That makes - // sense only for pointers and memory check tools. - //this.high_water = 0; - /* High water mark offset in window for initialized bytes -- bytes above - * this are set to zero in order to avoid memory check warnings when - * longest match routines access bytes past the input. This is then - * updated to the new high water mark. - */ -} -function deflateResetKeep(strm) { - var s; - if (!strm || !strm.state) { - return err(strm, Z_STREAM_ERROR$1); - } - strm.total_in = strm.total_out = 0; - strm.data_type = Z_UNKNOWN; - s = strm.state; - s.pending = 0; - s.pending_out = 0; - if (s.wrap < 0) { - s.wrap = -s.wrap; - /* was made negative by deflate(..., Z_FINISH); */ - } - s.status = s.wrap ? INIT_STATE : BUSY_STATE; - strm.adler = s.wrap === 2 ? 0 // crc32(0, Z_NULL, 0) - : 1; // adler32(0, Z_NULL, 0) - s.last_flush = Z_NO_FLUSH; - trees._tr_init(s); - return Z_OK$1; -} -function deflateReset(strm) { - var ret = deflateResetKeep(strm); - if (ret === Z_OK$1) { - lm_init(strm.state); - } - return ret; -} -function deflateSetHeader(strm, head) { - if (!strm || !strm.state) { - return Z_STREAM_ERROR$1; - } - if (strm.state.wrap !== 2) { - return Z_STREAM_ERROR$1; - } - strm.state.gzhead = head; - return Z_OK$1; -} -function deflateInit2(strm, level, method, windowBits, memLevel, strategy) { - if (!strm) { - // === Z_NULL - return Z_STREAM_ERROR$1; - } - var wrap = 1; - if (level === Z_DEFAULT_COMPRESSION) { - level = 6; - } - if (windowBits < 0) { - /* suppress zlib wrapper */ - wrap = 0; - windowBits = -windowBits; - } else if (windowBits > 15) { - wrap = 2; /* write gzip wrapper instead */ - windowBits -= 16; - } - if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED$1 || windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) { - return err(strm, Z_STREAM_ERROR$1); - } - if (windowBits === 8) { - windowBits = 9; - } - /* until 256-byte window bug fixed */ - - var s = new DeflateState(); - strm.state = s; - s.strm = strm; - s.wrap = wrap; - s.gzhead = null; - s.w_bits = windowBits; - s.w_size = 1 << s.w_bits; - s.w_mask = s.w_size - 1; - s.hash_bits = memLevel + 7; - s.hash_size = 1 << s.hash_bits; - s.hash_mask = s.hash_size - 1; - s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH); - s.window = new utils$2.Buf8(s.w_size * 2); - s.head = new utils$2.Buf16(s.hash_size); - s.prev = new utils$2.Buf16(s.w_size); - - // Don't need mem init magic for JS. - //s.high_water = 0; /* nothing written to s->window yet */ - - s.lit_bufsize = 1 << memLevel + 6; /* 16K elements by default */ - - s.pending_buf_size = s.lit_bufsize * 4; - - //overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); - //s->pending_buf = (uchf *) overlay; - s.pending_buf = new utils$2.Buf8(s.pending_buf_size); - - // It is offset from `s.pending_buf` (size is `s.lit_bufsize * 2`) - //s->d_buf = overlay + s->lit_bufsize/sizeof(ush); - s.d_buf = 1 * s.lit_bufsize; - - //s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; - s.l_buf = (1 + 2) * s.lit_bufsize; - s.level = level; - s.strategy = strategy; - s.method = method; - return deflateReset(strm); -} -function deflateInit(strm, level) { - return deflateInit2(strm, level, Z_DEFLATED$1, MAX_WBITS$1, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY); -} -function deflate(strm, flush) { - var old_flush, s; - var beg, val; // for gzip header write only - - if (!strm || !strm.state || flush > Z_BLOCK$1 || flush < 0) { - return strm ? err(strm, Z_STREAM_ERROR$1) : Z_STREAM_ERROR$1; - } - s = strm.state; - if (!strm.output || !strm.input && strm.avail_in !== 0 || s.status === FINISH_STATE && flush !== Z_FINISH$1) { - return err(strm, strm.avail_out === 0 ? Z_BUF_ERROR$1 : Z_STREAM_ERROR$1); - } - s.strm = strm; /* just in case */ - old_flush = s.last_flush; - s.last_flush = flush; - - /* Write the header */ - if (s.status === INIT_STATE) { - if (s.wrap === 2) { - // GZIP header - strm.adler = 0; //crc32(0L, Z_NULL, 0); - put_byte(s, 31); - put_byte(s, 139); - put_byte(s, 8); - if (!s.gzhead) { - // s->gzhead == Z_NULL - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, s.level === 9 ? 2 : s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ? 4 : 0); - put_byte(s, OS_CODE); - s.status = BUSY_STATE; - } else { - put_byte(s, (s.gzhead.text ? 1 : 0) + (s.gzhead.hcrc ? 2 : 0) + (!s.gzhead.extra ? 0 : 4) + (!s.gzhead.name ? 0 : 8) + (!s.gzhead.comment ? 0 : 16)); - put_byte(s, s.gzhead.time & 0xff); - put_byte(s, s.gzhead.time >> 8 & 0xff); - put_byte(s, s.gzhead.time >> 16 & 0xff); - put_byte(s, s.gzhead.time >> 24 & 0xff); - put_byte(s, s.level === 9 ? 2 : s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ? 4 : 0); - put_byte(s, s.gzhead.os & 0xff); - if (s.gzhead.extra && s.gzhead.extra.length) { - put_byte(s, s.gzhead.extra.length & 0xff); - put_byte(s, s.gzhead.extra.length >> 8 & 0xff); - } - if (s.gzhead.hcrc) { - strm.adler = crc32$1(strm.adler, s.pending_buf, s.pending, 0); - } - s.gzindex = 0; - s.status = EXTRA_STATE; - } - } else - // DEFLATE header - { - var header = Z_DEFLATED$1 + (s.w_bits - 8 << 4) << 8; - var level_flags = -1; - if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) { - level_flags = 0; - } else if (s.level < 6) { - level_flags = 1; - } else if (s.level === 6) { - level_flags = 2; - } else { - level_flags = 3; - } - header |= level_flags << 6; - if (s.strstart !== 0) { - header |= PRESET_DICT; - } - header += 31 - header % 31; - s.status = BUSY_STATE; - putShortMSB(s, header); - - /* Save the adler32 of the preset dictionary: */ - if (s.strstart !== 0) { - putShortMSB(s, strm.adler >>> 16); - putShortMSB(s, strm.adler & 0xffff); - } - strm.adler = 1; // adler32(0L, Z_NULL, 0); - } - } - - //#ifdef GZIP - if (s.status === EXTRA_STATE) { - if (s.gzhead.extra /* != Z_NULL*/) { - beg = s.pending; /* start of bytes to update crc */ - - while (s.gzindex < (s.gzhead.extra.length & 0xffff)) { - if (s.pending === s.pending_buf_size) { - if (s.gzhead.hcrc && s.pending > beg) { - strm.adler = crc32$1(strm.adler, s.pending_buf, s.pending - beg, beg); - } - flush_pending(strm); - beg = s.pending; - if (s.pending === s.pending_buf_size) { - break; - } - } - put_byte(s, s.gzhead.extra[s.gzindex] & 0xff); - s.gzindex++; - } - if (s.gzhead.hcrc && s.pending > beg) { - strm.adler = crc32$1(strm.adler, s.pending_buf, s.pending - beg, beg); - } - if (s.gzindex === s.gzhead.extra.length) { - s.gzindex = 0; - s.status = NAME_STATE; - } - } else { - s.status = NAME_STATE; - } - } - if (s.status === NAME_STATE) { - if (s.gzhead.name /* != Z_NULL*/) { - beg = s.pending; /* start of bytes to update crc */ - //int val; - - do { - if (s.pending === s.pending_buf_size) { - if (s.gzhead.hcrc && s.pending > beg) { - strm.adler = crc32$1(strm.adler, s.pending_buf, s.pending - beg, beg); - } - flush_pending(strm); - beg = s.pending; - if (s.pending === s.pending_buf_size) { - val = 1; - break; - } - } - // JS specific: little magic to add zero terminator to end of string - if (s.gzindex < s.gzhead.name.length) { - val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff; - } else { - val = 0; - } - put_byte(s, val); - } while (val !== 0); - if (s.gzhead.hcrc && s.pending > beg) { - strm.adler = crc32$1(strm.adler, s.pending_buf, s.pending - beg, beg); - } - if (val === 0) { - s.gzindex = 0; - s.status = COMMENT_STATE; - } - } else { - s.status = COMMENT_STATE; - } - } - if (s.status === COMMENT_STATE) { - if (s.gzhead.comment /* != Z_NULL*/) { - beg = s.pending; /* start of bytes to update crc */ - //int val; - - do { - if (s.pending === s.pending_buf_size) { - if (s.gzhead.hcrc && s.pending > beg) { - strm.adler = crc32$1(strm.adler, s.pending_buf, s.pending - beg, beg); - } - flush_pending(strm); - beg = s.pending; - if (s.pending === s.pending_buf_size) { - val = 1; - break; - } - } - // JS specific: little magic to add zero terminator to end of string - if (s.gzindex < s.gzhead.comment.length) { - val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff; - } else { - val = 0; - } - put_byte(s, val); - } while (val !== 0); - if (s.gzhead.hcrc && s.pending > beg) { - strm.adler = crc32$1(strm.adler, s.pending_buf, s.pending - beg, beg); - } - if (val === 0) { - s.status = HCRC_STATE; - } - } else { - s.status = HCRC_STATE; - } - } - if (s.status === HCRC_STATE) { - if (s.gzhead.hcrc) { - if (s.pending + 2 > s.pending_buf_size) { - flush_pending(strm); - } - if (s.pending + 2 <= s.pending_buf_size) { - put_byte(s, strm.adler & 0xff); - put_byte(s, strm.adler >> 8 & 0xff); - strm.adler = 0; //crc32(0L, Z_NULL, 0); - s.status = BUSY_STATE; - } - } else { - s.status = BUSY_STATE; - } - } - //#endif - - /* Flush as much pending output as possible */ - if (s.pending !== 0) { - flush_pending(strm); - if (strm.avail_out === 0) { - /* Since avail_out is 0, deflate will be called again with - * more output space, but possibly with both pending and - * avail_in equal to zero. There won't be anything to do, - * but this is not an error situation so make sure we - * return OK instead of BUF_ERROR at next call of deflate: - */ - s.last_flush = -1; - return Z_OK$1; - } - - /* Make sure there is something to do and avoid duplicate consecutive - * flushes. For repeated and useless calls with Z_FINISH, we keep - * returning Z_STREAM_END instead of Z_BUF_ERROR. - */ - } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) && flush !== Z_FINISH$1) { - return err(strm, Z_BUF_ERROR$1); - } - - /* User must not provide more input after the first FINISH: */ - if (s.status === FINISH_STATE && strm.avail_in !== 0) { - return err(strm, Z_BUF_ERROR$1); - } - - /* Start a new block or continue the current one. - */ - if (strm.avail_in !== 0 || s.lookahead !== 0 || flush !== Z_NO_FLUSH && s.status !== FINISH_STATE) { - var bstate = s.strategy === Z_HUFFMAN_ONLY ? deflate_huff(s, flush) : s.strategy === Z_RLE ? deflate_rle(s, flush) : configuration_table[s.level].func(s, flush); - if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) { - s.status = FINISH_STATE; - } - if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) { - if (strm.avail_out === 0) { - s.last_flush = -1; - /* avoid BUF_ERROR next call, see above */ - } - return Z_OK$1; - /* If flush != Z_NO_FLUSH && avail_out == 0, the next call - * of deflate should use the same flush parameter to make sure - * that the flush is complete. So we don't have to output an - * empty block here, this will be done at next call. This also - * ensures that for a very small output buffer, we emit at most - * one empty block. - */ - } - if (bstate === BS_BLOCK_DONE) { - if (flush === Z_PARTIAL_FLUSH) { - trees._tr_align(s); - } else if (flush !== Z_BLOCK$1) { - /* FULL_FLUSH or SYNC_FLUSH */ - - trees._tr_stored_block(s, 0, 0, false); - /* For a full flush, this empty block will be recognized - * as a special marker by inflate_sync(). - */ - if (flush === Z_FULL_FLUSH) { - /*** CLEAR_HASH(s); ***/ /* forget history */ - zero(s.head); // Fill with NIL (= 0); - - if (s.lookahead === 0) { - s.strstart = 0; - s.block_start = 0; - s.insert = 0; - } - } - } - flush_pending(strm); - if (strm.avail_out === 0) { - s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */ - return Z_OK$1; - } - } - } - //Assert(strm->avail_out > 0, "bug2"); - //if (strm.avail_out <= 0) { throw new Error("bug2");} - - if (flush !== Z_FINISH$1) { - return Z_OK$1; - } - if (s.wrap <= 0) { - return Z_STREAM_END$1; - } - - /* Write the trailer */ - if (s.wrap === 2) { - put_byte(s, strm.adler & 0xff); - put_byte(s, strm.adler >> 8 & 0xff); - put_byte(s, strm.adler >> 16 & 0xff); - put_byte(s, strm.adler >> 24 & 0xff); - put_byte(s, strm.total_in & 0xff); - put_byte(s, strm.total_in >> 8 & 0xff); - put_byte(s, strm.total_in >> 16 & 0xff); - put_byte(s, strm.total_in >> 24 & 0xff); - } else { - putShortMSB(s, strm.adler >>> 16); - putShortMSB(s, strm.adler & 0xffff); - } - flush_pending(strm); - /* If avail_out is zero, the application will call deflate again - * to flush the rest. - */ - if (s.wrap > 0) { - s.wrap = -s.wrap; - } - /* write the trailer only once! */ - return s.pending !== 0 ? Z_OK$1 : Z_STREAM_END$1; -} -function deflateEnd(strm) { - var status; - if (!strm /*== Z_NULL*/ || !strm.state /*== Z_NULL*/) { - return Z_STREAM_ERROR$1; - } - status = strm.state.status; - if (status !== INIT_STATE && status !== EXTRA_STATE && status !== NAME_STATE && status !== COMMENT_STATE && status !== HCRC_STATE && status !== BUSY_STATE && status !== FINISH_STATE) { - return err(strm, Z_STREAM_ERROR$1); - } - strm.state = null; - return status === BUSY_STATE ? err(strm, Z_DATA_ERROR$1) : Z_OK$1; -} - -/* ========================================================================= - * Initializes the compression dictionary from the given byte - * sequence without producing any compressed output. - */ -function deflateSetDictionary(strm, dictionary) { - var dictLength = dictionary.length; - var s; - var str, n; - var wrap; - var avail; - var next; - var input; - var tmpDict; - if (!strm /*== Z_NULL*/ || !strm.state /*== Z_NULL*/) { - return Z_STREAM_ERROR$1; - } - s = strm.state; - wrap = s.wrap; - if (wrap === 2 || wrap === 1 && s.status !== INIT_STATE || s.lookahead) { - return Z_STREAM_ERROR$1; - } - - /* when using zlib wrappers, compute Adler-32 for provided dictionary */ - if (wrap === 1) { - /* adler32(strm->adler, dictionary, dictLength); */ - strm.adler = adler32$1(strm.adler, dictionary, dictLength, 0); - } - s.wrap = 0; /* avoid computing Adler-32 in read_buf */ - - /* if dictionary would fill window, just replace the history */ - if (dictLength >= s.w_size) { - if (wrap === 0) { - /* already empty otherwise */ - /*** CLEAR_HASH(s); ***/ - zero(s.head); // Fill with NIL (= 0); - s.strstart = 0; - s.block_start = 0; - s.insert = 0; - } - /* use the tail */ - // dictionary = dictionary.slice(dictLength - s.w_size); - tmpDict = new utils$2.Buf8(s.w_size); - utils$2.arraySet(tmpDict, dictionary, dictLength - s.w_size, s.w_size, 0); - dictionary = tmpDict; - dictLength = s.w_size; - } - /* insert dictionary into window and hash */ - avail = strm.avail_in; - next = strm.next_in; - input = strm.input; - strm.avail_in = dictLength; - strm.next_in = 0; - strm.input = dictionary; - fill_window(s); - while (s.lookahead >= MIN_MATCH) { - str = s.strstart; - n = s.lookahead - (MIN_MATCH - 1); - do { - /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */ - s.ins_h = (s.ins_h << s.hash_shift ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask; - s.prev[str & s.w_mask] = s.head[s.ins_h]; - s.head[s.ins_h] = str; - str++; - } while (--n); - s.strstart = str; - s.lookahead = MIN_MATCH - 1; - fill_window(s); - } - s.strstart += s.lookahead; - s.block_start = s.strstart; - s.insert = s.lookahead; - s.lookahead = 0; - s.match_length = s.prev_length = MIN_MATCH - 1; - s.match_available = 0; - strm.next_in = next; - strm.input = input; - strm.avail_in = avail; - s.wrap = wrap; - return Z_OK$1; -} -deflate$1.deflateInit = deflateInit; -deflate$1.deflateInit2 = deflateInit2; -deflate$1.deflateReset = deflateReset; -deflate$1.deflateResetKeep = deflateResetKeep; -deflate$1.deflateSetHeader = deflateSetHeader; -deflate$1.deflate = deflate; -deflate$1.deflateEnd = deflateEnd; -deflate$1.deflateSetDictionary = deflateSetDictionary; -deflate$1.deflateInfo = 'pako deflate (from Nodeca project)'; - -var inflate$1 = {}; - -// (C) 1995-2013 Jean-loup Gailly and Mark Adler -// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// 3. This notice may not be removed or altered from any source distribution. - -// See state defs from inflate.js -var BAD$1 = 30; /* got a data error -- remain here until reset */ -var TYPE$1 = 12; /* i: waiting for type bits, including last-flag bit */ - -/* - Decode literal, length, and distance codes and write out the resulting - literal and match bytes until either not enough input or output is - available, an end-of-block is encountered, or a data error is encountered. - When large enough input and output buffers are supplied to inflate(), for - example, a 16K input buffer and a 64K output buffer, more than 95% of the - inflate execution time is spent in this routine. - - Entry assumptions: - - state.mode === LEN - strm.avail_in >= 6 - strm.avail_out >= 258 - start >= strm.avail_out - state.bits < 8 - - On return, state.mode is one of: - - LEN -- ran out of enough output space or enough available input - TYPE -- reached end of block code, inflate() to interpret next block - BAD -- error in block data - - Notes: - - - The maximum input bits used by a length/distance pair is 15 bits for the - length code, 5 bits for the length extra, 15 bits for the distance code, - and 13 bits for the distance extra. This totals 48 bits, or six bytes. - Therefore if strm.avail_in >= 6, then there is enough input to avoid - checking for available input while decoding. - - - The maximum bytes that a single length/distance pair can output is 258 - bytes, which is the maximum length that can be coded. inflate_fast() - requires strm.avail_out >= 258 for each loop to avoid checking for - output space. - */ -var inffast = function inflate_fast(strm, start) { - var state; - var _in; /* local strm.input */ - var last; /* have enough input while in < last */ - var _out; /* local strm.output */ - var beg; /* inflate()'s initial strm.output */ - var end; /* while out < end, enough space available */ - //#ifdef INFLATE_STRICT - var dmax; /* maximum distance from zlib header */ - //#endif - var wsize; /* window size or zero if not using window */ - var whave; /* valid bytes in the window */ - var wnext; /* window write index */ - // Use `s_window` instead `window`, avoid conflict with instrumentation tools - var s_window; /* allocated sliding window, if wsize != 0 */ - var hold; /* local strm.hold */ - var bits; /* local strm.bits */ - var lcode; /* local strm.lencode */ - var dcode; /* local strm.distcode */ - var lmask; /* mask for first level of length codes */ - var dmask; /* mask for first level of distance codes */ - var here; /* retrieved table entry */ - var op; /* code bits, operation, extra bits, or */ - /* window position, window bytes to copy */ - var len; /* match length, unused bytes */ - var dist; /* match distance */ - var from; /* where to copy match from */ - var from_source; - var input, output; // JS specific, because we have no pointers - - /* copy state to local variables */ - state = strm.state; - //here = state.here; - _in = strm.next_in; - input = strm.input; - last = _in + (strm.avail_in - 5); - _out = strm.next_out; - output = strm.output; - beg = _out - (start - strm.avail_out); - end = _out + (strm.avail_out - 257); - //#ifdef INFLATE_STRICT - dmax = state.dmax; - //#endif - wsize = state.wsize; - whave = state.whave; - wnext = state.wnext; - s_window = state.window; - hold = state.hold; - bits = state.bits; - lcode = state.lencode; - dcode = state.distcode; - lmask = (1 << state.lenbits) - 1; - dmask = (1 << state.distbits) - 1; - - /* decode literals and length/distances until end-of-block or not enough - input data or output space */ - - top: do { - if (bits < 15) { - hold += input[_in++] << bits; - bits += 8; - hold += input[_in++] << bits; - bits += 8; - } - here = lcode[hold & lmask]; - dolen: for (;;) { - // Goto emulation - op = here >>> 24 /*here.bits*/; - hold >>>= op; - bits -= op; - op = here >>> 16 & 0xff /*here.op*/; - if (op === 0) { - /* literal */ - //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? - // "inflate: literal '%c'\n" : - // "inflate: literal 0x%02x\n", here.val)); - output[_out++] = here & 0xffff /*here.val*/; - } else if (op & 16) { - /* length base */ - len = here & 0xffff /*here.val*/; - op &= 15; /* number of extra bits */ - if (op) { - if (bits < op) { - hold += input[_in++] << bits; - bits += 8; - } - len += hold & (1 << op) - 1; - hold >>>= op; - bits -= op; - } - //Tracevv((stderr, "inflate: length %u\n", len)); - if (bits < 15) { - hold += input[_in++] << bits; - bits += 8; - hold += input[_in++] << bits; - bits += 8; - } - here = dcode[hold & dmask]; - dodist: for (;;) { - // goto emulation - op = here >>> 24 /*here.bits*/; - hold >>>= op; - bits -= op; - op = here >>> 16 & 0xff /*here.op*/; - if (op & 16) { - /* distance base */ - dist = here & 0xffff /*here.val*/; - op &= 15; /* number of extra bits */ - if (bits < op) { - hold += input[_in++] << bits; - bits += 8; - if (bits < op) { - hold += input[_in++] << bits; - bits += 8; - } - } - dist += hold & (1 << op) - 1; - //#ifdef INFLATE_STRICT - if (dist > dmax) { - strm.msg = 'invalid distance too far back'; - state.mode = BAD$1; - break top; - } - //#endif - hold >>>= op; - bits -= op; - //Tracevv((stderr, "inflate: distance %u\n", dist)); - op = _out - beg; /* max distance in output */ - if (dist > op) { - /* see if copy from window */ - op = dist - op; /* distance back in window */ - if (op > whave) { - if (state.sane) { - strm.msg = 'invalid distance too far back'; - state.mode = BAD$1; - break top; - } - - // (!) This block is disabled in zlib defaults, - // don't enable it for binary compatibility - //#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR - // if (len <= op - whave) { - // do { - // output[_out++] = 0; - // } while (--len); - // continue top; - // } - // len -= op - whave; - // do { - // output[_out++] = 0; - // } while (--op > whave); - // if (op === 0) { - // from = _out - dist; - // do { - // output[_out++] = output[from++]; - // } while (--len); - // continue top; - // } - //#endif - } - from = 0; // window index - from_source = s_window; - if (wnext === 0) { - /* very common case */ - from += wsize - op; - if (op < len) { - /* some from window */ - len -= op; - do { - output[_out++] = s_window[from++]; - } while (--op); - from = _out - dist; /* rest from output */ - from_source = output; - } - } else if (wnext < op) { - /* wrap around window */ - from += wsize + wnext - op; - op -= wnext; - if (op < len) { - /* some from end of window */ - len -= op; - do { - output[_out++] = s_window[from++]; - } while (--op); - from = 0; - if (wnext < len) { - /* some from start of window */ - op = wnext; - len -= op; - do { - output[_out++] = s_window[from++]; - } while (--op); - from = _out - dist; /* rest from output */ - from_source = output; - } - } - } else { - /* contiguous in window */ - from += wnext - op; - if (op < len) { - /* some from window */ - len -= op; - do { - output[_out++] = s_window[from++]; - } while (--op); - from = _out - dist; /* rest from output */ - from_source = output; - } - } - while (len > 2) { - output[_out++] = from_source[from++]; - output[_out++] = from_source[from++]; - output[_out++] = from_source[from++]; - len -= 3; - } - if (len) { - output[_out++] = from_source[from++]; - if (len > 1) { - output[_out++] = from_source[from++]; - } - } - } else { - from = _out - dist; /* copy direct from output */ - do { - /* minimum length is three */ - output[_out++] = output[from++]; - output[_out++] = output[from++]; - output[_out++] = output[from++]; - len -= 3; - } while (len > 2); - if (len) { - output[_out++] = output[from++]; - if (len > 1) { - output[_out++] = output[from++]; - } - } - } - } else if ((op & 64) === 0) { - /* 2nd level distance code */ - here = dcode[(here & 0xffff /*here.val*/) + (hold & (1 << op) - 1)]; - continue dodist; - } else { - strm.msg = 'invalid distance code'; - state.mode = BAD$1; - break top; - } - break; // need to emulate goto via "continue" - } - } else if ((op & 64) === 0) { - /* 2nd level length code */ - here = lcode[(here & 0xffff /*here.val*/) + (hold & (1 << op) - 1)]; - continue dolen; - } else if (op & 32) { - /* end-of-block */ - //Tracevv((stderr, "inflate: end of block\n")); - state.mode = TYPE$1; - break top; - } else { - strm.msg = 'invalid literal/length code'; - state.mode = BAD$1; - break top; - } - break; // need to emulate goto via "continue" - } - } while (_in < last && _out < end); - - /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ - len = bits >> 3; - _in -= len; - bits -= len << 3; - hold &= (1 << bits) - 1; - - /* update state and return */ - strm.next_in = _in; - strm.next_out = _out; - strm.avail_in = _in < last ? 5 + (last - _in) : 5 - (_in - last); - strm.avail_out = _out < end ? 257 + (end - _out) : 257 - (_out - end); - state.hold = hold; - state.bits = bits; - return; -}; - -// (C) 1995-2013 Jean-loup Gailly and Mark Adler -// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// 3. This notice may not be removed or altered from any source distribution. - -var utils$1 = common; -var MAXBITS = 15; -var ENOUGH_LENS$1 = 852; -var ENOUGH_DISTS$1 = 592; -//var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS); - -var CODES$1 = 0; -var LENS$1 = 1; -var DISTS$1 = 2; -var lbase = [/* Length codes 257..285 base */ -3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0]; -var lext = [/* Length codes 257..285 extra */ -16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78]; -var dbase = [/* Distance codes 0..29 base */ -1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577, 0, 0]; -var dext = [/* Distance codes 0..29 extra */ -16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 64, 64]; -var inftrees = function inflate_table(type, lens, lens_index, codes, table, table_index, work, opts) { - var bits = opts.bits; - //here = opts.here; /* table entry for duplication */ - - var len = 0; /* a code's length in bits */ - var sym = 0; /* index of code symbols */ - var min = 0, - max = 0; /* minimum and maximum code lengths */ - var root = 0; /* number of index bits for root table */ - var curr = 0; /* number of index bits for current table */ - var drop = 0; /* code bits to drop for sub-table */ - var left = 0; /* number of prefix codes available */ - var used = 0; /* code entries in table used */ - var huff = 0; /* Huffman code */ - var incr; /* for incrementing code, index */ - var fill; /* index for replicating entries */ - var low; /* low bits for current root entry */ - var mask; /* mask for low root bits */ - var next; /* next available space in table */ - var base = null; /* base value table to use */ - var base_index = 0; - // var shoextra; /* extra bits table to use */ - var end; /* use base and extra for symbol > end */ - var count = new utils$1.Buf16(MAXBITS + 1); //[MAXBITS+1]; /* number of codes of each length */ - var offs = new utils$1.Buf16(MAXBITS + 1); //[MAXBITS+1]; /* offsets in table for each length */ - var extra = null; - var extra_index = 0; - var here_bits, here_op, here_val; - - /* - Process a set of code lengths to create a canonical Huffman code. The - code lengths are lens[0..codes-1]. Each length corresponds to the - symbols 0..codes-1. The Huffman code is generated by first sorting the - symbols by length from short to long, and retaining the symbol order - for codes with equal lengths. Then the code starts with all zero bits - for the first code of the shortest length, and the codes are integer - increments for the same length, and zeros are appended as the length - increases. For the deflate format, these bits are stored backwards - from their more natural integer increment ordering, and so when the - decoding tables are built in the large loop below, the integer codes - are incremented backwards. - This routine assumes, but does not check, that all of the entries in - lens[] are in the range 0..MAXBITS. The caller must assure this. - 1..MAXBITS is interpreted as that code length. zero means that that - symbol does not occur in this code. - The codes are sorted by computing a count of codes for each length, - creating from that a table of starting indices for each length in the - sorted table, and then entering the symbols in order in the sorted - table. The sorted table is work[], with that space being provided by - the caller. - The length counts are used for other purposes as well, i.e. finding - the minimum and maximum length codes, determining if there are any - codes at all, checking for a valid set of lengths, and looking ahead - at length counts to determine sub-table sizes when building the - decoding tables. - */ - - /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ - for (len = 0; len <= MAXBITS; len++) { - count[len] = 0; - } - for (sym = 0; sym < codes; sym++) { - count[lens[lens_index + sym]]++; - } - - /* bound code lengths, force root to be within code lengths */ - root = bits; - for (max = MAXBITS; max >= 1; max--) { - if (count[max] !== 0) { - break; - } - } - if (root > max) { - root = max; - } - if (max === 0) { - /* no symbols to code at all */ - //table.op[opts.table_index] = 64; //here.op = (var char)64; /* invalid code marker */ - //table.bits[opts.table_index] = 1; //here.bits = (var char)1; - //table.val[opts.table_index++] = 0; //here.val = (var short)0; - table[table_index++] = 1 << 24 | 64 << 16 | 0; - - //table.op[opts.table_index] = 64; - //table.bits[opts.table_index] = 1; - //table.val[opts.table_index++] = 0; - table[table_index++] = 1 << 24 | 64 << 16 | 0; - opts.bits = 1; - return 0; /* no symbols, but wait for decoding to report error */ - } - for (min = 1; min < max; min++) { - if (count[min] !== 0) { - break; - } - } - if (root < min) { - root = min; - } - - /* check for an over-subscribed or incomplete set of lengths */ - left = 1; - for (len = 1; len <= MAXBITS; len++) { - left <<= 1; - left -= count[len]; - if (left < 0) { - return -1; - } /* over-subscribed */ - } - if (left > 0 && (type === CODES$1 || max !== 1)) { - return -1; /* incomplete set */ - } - - /* generate offsets into symbol table for each length for sorting */ - offs[1] = 0; - for (len = 1; len < MAXBITS; len++) { - offs[len + 1] = offs[len] + count[len]; - } - - /* sort symbols by length, by symbol order within each length */ - for (sym = 0; sym < codes; sym++) { - if (lens[lens_index + sym] !== 0) { - work[offs[lens[lens_index + sym]]++] = sym; - } - } - - /* - Create and fill in decoding tables. In this loop, the table being - filled is at next and has curr index bits. The code being used is huff - with length len. That code is converted to an index by dropping drop - bits off of the bottom. For codes where len is less than drop + curr, - those top drop + curr - len bits are incremented through all values to - fill the table with replicated entries. - root is the number of index bits for the root table. When len exceeds - root, sub-tables are created pointed to by the root entry with an index - of the low root bits of huff. This is saved in low to check for when a - new sub-table should be started. drop is zero when the root table is - being filled, and drop is root when sub-tables are being filled. - When a new sub-table is needed, it is necessary to look ahead in the - code lengths to determine what size sub-table is needed. The length - counts are used for this, and so count[] is decremented as codes are - entered in the tables. - used keeps track of how many table entries have been allocated from the - provided *table space. It is checked for LENS and DIST tables against - the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in - the initial root table size constants. See the comments in inftrees.h - for more information. - sym increments through all symbols, and the loop terminates when - all codes of length max, i.e. all codes, have been processed. This - routine permits incomplete codes, so another loop after this one fills - in the rest of the decoding tables with invalid code markers. - */ - - /* set up for code type */ - // poor man optimization - use if-else instead of switch, - // to avoid deopts in old v8 - if (type === CODES$1) { - base = extra = work; /* dummy value--not used */ - end = 19; - } else if (type === LENS$1) { - base = lbase; - base_index -= 257; - extra = lext; - extra_index -= 257; - end = 256; - } else { - /* DISTS */ - base = dbase; - extra = dext; - end = -1; - } - - /* initialize opts for loop */ - huff = 0; /* starting code */ - sym = 0; /* starting code symbol */ - len = min; /* starting code length */ - next = table_index; /* current table to fill in */ - curr = root; /* current table index bits */ - drop = 0; /* current bits to drop from code for index */ - low = -1; /* trigger new sub-table when len > root */ - used = 1 << root; /* use root table entries */ - mask = used - 1; /* mask for comparing low */ - - /* check available table space */ - if (type === LENS$1 && used > ENOUGH_LENS$1 || type === DISTS$1 && used > ENOUGH_DISTS$1) { - return 1; - } - - /* process all codes and make table entries */ - for (;;) { - /* create table entry */ - here_bits = len - drop; - if (work[sym] < end) { - here_op = 0; - here_val = work[sym]; - } else if (work[sym] > end) { - here_op = extra[extra_index + work[sym]]; - here_val = base[base_index + work[sym]]; - } else { - here_op = 32 + 64; /* end of block */ - here_val = 0; - } - - /* replicate for those indices with low len bits equal to huff */ - incr = 1 << len - drop; - fill = 1 << curr; - min = fill; /* save offset to next table */ - do { - fill -= incr; - table[next + (huff >> drop) + fill] = here_bits << 24 | here_op << 16 | here_val | 0; - } while (fill !== 0); - - /* backwards increment the len-bit code huff */ - incr = 1 << len - 1; - while (huff & incr) { - incr >>= 1; - } - if (incr !== 0) { - huff &= incr - 1; - huff += incr; - } else { - huff = 0; - } - - /* go to next symbol, update count, len */ - sym++; - if (--count[len] === 0) { - if (len === max) { - break; - } - len = lens[lens_index + work[sym]]; - } - - /* create new sub-table if needed */ - if (len > root && (huff & mask) !== low) { - /* if first time, transition to sub-tables */ - if (drop === 0) { - drop = root; - } - - /* increment past last table */ - next += min; /* here min is 1 << curr */ - - /* determine length of next table */ - curr = len - drop; - left = 1 << curr; - while (curr + drop < max) { - left -= count[curr + drop]; - if (left <= 0) { - break; - } - curr++; - left <<= 1; - } - - /* check for enough space */ - used += 1 << curr; - if (type === LENS$1 && used > ENOUGH_LENS$1 || type === DISTS$1 && used > ENOUGH_DISTS$1) { - return 1; - } - - /* point entry in root table to sub-table */ - low = huff & mask; - /*table.op[low] = curr; - table.bits[low] = root; - table.val[low] = next - opts.table_index;*/ - table[low] = root << 24 | curr << 16 | next - table_index | 0; - } - } - - /* fill in remaining table entry if code is incomplete (guaranteed to have - at most one remaining entry, since if the code is incomplete, the - maximum code length that was allowed to get this far is one bit) */ - if (huff !== 0) { - //table.op[next + huff] = 64; /* invalid code marker */ - //table.bits[next + huff] = len - drop; - //table.val[next + huff] = 0; - table[next + huff] = len - drop << 24 | 64 << 16 | 0; - } - - /* set return parameters */ - //opts.table_index += used; - opts.bits = root; - return 0; -}; - -// (C) 1995-2013 Jean-loup Gailly and Mark Adler -// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// 3. This notice may not be removed or altered from any source distribution. - -var utils = common; -var adler32 = adler32_1; -var crc32 = crc32_1; -var inflate_fast = inffast; -var inflate_table = inftrees; -var CODES = 0; -var LENS = 1; -var DISTS = 2; - -/* Public constants ==========================================================*/ -/* ===========================================================================*/ - -/* Allowed flush values; see deflate() and inflate() below for details */ -//var Z_NO_FLUSH = 0; -//var Z_PARTIAL_FLUSH = 1; -//var Z_SYNC_FLUSH = 2; -//var Z_FULL_FLUSH = 3; -var Z_FINISH = 4; -var Z_BLOCK = 5; -var Z_TREES = 6; - -/* Return codes for the compression/decompression functions. Negative values - * are errors, positive values are used for special but normal events. - */ -var Z_OK = 0; -var Z_STREAM_END = 1; -var Z_NEED_DICT = 2; -//var Z_ERRNO = -1; -var Z_STREAM_ERROR = -2; -var Z_DATA_ERROR = -3; -var Z_MEM_ERROR = -4; -var Z_BUF_ERROR = -5; -//var Z_VERSION_ERROR = -6; - -/* The deflate compression method */ -var Z_DEFLATED = 8; - -/* STATES ====================================================================*/ -/* ===========================================================================*/ - -var HEAD = 1; /* i: waiting for magic header */ -var FLAGS = 2; /* i: waiting for method and flags (gzip) */ -var TIME = 3; /* i: waiting for modification time (gzip) */ -var OS = 4; /* i: waiting for extra flags and operating system (gzip) */ -var EXLEN = 5; /* i: waiting for extra length (gzip) */ -var EXTRA = 6; /* i: waiting for extra bytes (gzip) */ -var NAME = 7; /* i: waiting for end of file name (gzip) */ -var COMMENT = 8; /* i: waiting for end of comment (gzip) */ -var HCRC = 9; /* i: waiting for header crc (gzip) */ -var DICTID = 10; /* i: waiting for dictionary check value */ -var DICT = 11; /* waiting for inflateSetDictionary() call */ -var TYPE = 12; /* i: waiting for type bits, including last-flag bit */ -var TYPEDO = 13; /* i: same, but skip check to exit inflate on new block */ -var STORED = 14; /* i: waiting for stored size (length and complement) */ -var COPY_ = 15; /* i/o: same as COPY below, but only first time in */ -var COPY = 16; /* i/o: waiting for input or output to copy stored block */ -var TABLE = 17; /* i: waiting for dynamic block table lengths */ -var LENLENS = 18; /* i: waiting for code length code lengths */ -var CODELENS = 19; /* i: waiting for length/lit and distance code lengths */ -var LEN_ = 20; /* i: same as LEN below, but only first time in */ -var LEN = 21; /* i: waiting for length/lit/eob code */ -var LENEXT = 22; /* i: waiting for length extra bits */ -var DIST = 23; /* i: waiting for distance code */ -var DISTEXT = 24; /* i: waiting for distance extra bits */ -var MATCH = 25; /* o: waiting for output space to copy string */ -var LIT = 26; /* o: waiting for output space to write literal */ -var CHECK = 27; /* i: waiting for 32-bit check value */ -var LENGTH = 28; /* i: waiting for 32-bit length (gzip) */ -var DONE = 29; /* finished check, done -- remain here until reset */ -var BAD = 30; /* got a data error -- remain here until reset */ -var MEM = 31; /* got an inflate() memory error -- remain here until reset */ -var SYNC = 32; /* looking for synchronization bytes to restart inflate() */ - -/* ===========================================================================*/ - -var ENOUGH_LENS = 852; -var ENOUGH_DISTS = 592; -//var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS); - -var MAX_WBITS = 15; -/* 32K LZ77 window */ -var DEF_WBITS = MAX_WBITS; -function zswap32(q) { - return (q >>> 24 & 0xff) + (q >>> 8 & 0xff00) + ((q & 0xff00) << 8) + ((q & 0xff) << 24); -} -function InflateState() { - this.mode = 0; /* current inflate mode */ - this.last = false; /* true if processing last block */ - this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */ - this.havedict = false; /* true if dictionary provided */ - this.flags = 0; /* gzip header method and flags (0 if zlib) */ - this.dmax = 0; /* zlib header max distance (INFLATE_STRICT) */ - this.check = 0; /* protected copy of check value */ - this.total = 0; /* protected copy of output count */ - // TODO: may be {} - this.head = null; /* where to save gzip header information */ - - /* sliding window */ - this.wbits = 0; /* log base 2 of requested window size */ - this.wsize = 0; /* window size or zero if not using window */ - this.whave = 0; /* valid bytes in the window */ - this.wnext = 0; /* window write index */ - this.window = null; /* allocated sliding window, if needed */ - - /* bit accumulator */ - this.hold = 0; /* input bit accumulator */ - this.bits = 0; /* number of bits in "in" */ - - /* for string and stored block copying */ - this.length = 0; /* literal or length of data to copy */ - this.offset = 0; /* distance back to copy string from */ - - /* for table and code decoding */ - this.extra = 0; /* extra bits needed */ - - /* fixed and dynamic code tables */ - this.lencode = null; /* starting table for length/literal codes */ - this.distcode = null; /* starting table for distance codes */ - this.lenbits = 0; /* index bits for lencode */ - this.distbits = 0; /* index bits for distcode */ - - /* dynamic table building */ - this.ncode = 0; /* number of code length code lengths */ - this.nlen = 0; /* number of length code lengths */ - this.ndist = 0; /* number of distance code lengths */ - this.have = 0; /* number of code lengths in lens[] */ - this.next = null; /* next available space in codes[] */ - - this.lens = new utils.Buf16(320); /* temporary storage for code lengths */ - this.work = new utils.Buf16(288); /* work area for code table building */ - - /* - because we don't have pointers in js, we use lencode and distcode directly - as buffers so we don't need codes - */ - //this.codes = new utils.Buf32(ENOUGH); /* space for code tables */ - this.lendyn = null; /* dynamic table for length/literal codes (JS specific) */ - this.distdyn = null; /* dynamic table for distance codes (JS specific) */ - this.sane = 0; /* if false, allow invalid distance too far */ - this.back = 0; /* bits back of last unprocessed length/lit */ - this.was = 0; /* initial length of match */ -} -function inflateResetKeep(strm) { - var state; - if (!strm || !strm.state) { - return Z_STREAM_ERROR; - } - state = strm.state; - strm.total_in = strm.total_out = state.total = 0; - strm.msg = ''; /*Z_NULL*/ - if (state.wrap) { - /* to support ill-conceived Java test suite */ - strm.adler = state.wrap & 1; - } - state.mode = HEAD; - state.last = 0; - state.havedict = 0; - state.dmax = 32768; - state.head = null /*Z_NULL*/; - state.hold = 0; - state.bits = 0; - //state.lencode = state.distcode = state.next = state.codes; - state.lencode = state.lendyn = new utils.Buf32(ENOUGH_LENS); - state.distcode = state.distdyn = new utils.Buf32(ENOUGH_DISTS); - state.sane = 1; - state.back = -1; - //Tracev((stderr, "inflate: reset\n")); - return Z_OK; -} -function inflateReset(strm) { - var state; - if (!strm || !strm.state) { - return Z_STREAM_ERROR; - } - state = strm.state; - state.wsize = 0; - state.whave = 0; - state.wnext = 0; - return inflateResetKeep(strm); -} -function inflateReset2(strm, windowBits) { - var wrap; - var state; - - /* get the state */ - if (!strm || !strm.state) { - return Z_STREAM_ERROR; - } - state = strm.state; - - /* extract wrap request from windowBits parameter */ - if (windowBits < 0) { - wrap = 0; - windowBits = -windowBits; - } else { - wrap = (windowBits >> 4) + 1; - if (windowBits < 48) { - windowBits &= 15; - } - } - - /* set number of window bits, free window if different */ - if (windowBits && (windowBits < 8 || windowBits > 15)) { - return Z_STREAM_ERROR; - } - if (state.window !== null && state.wbits !== windowBits) { - state.window = null; - } - - /* update state and reset the rest of it */ - state.wrap = wrap; - state.wbits = windowBits; - return inflateReset(strm); -} -function inflateInit2(strm, windowBits) { - var ret; - var state; - if (!strm) { - return Z_STREAM_ERROR; - } - //strm.msg = Z_NULL; /* in case we return an error */ - - state = new InflateState(); - - //if (state === Z_NULL) return Z_MEM_ERROR; - //Tracev((stderr, "inflate: allocated\n")); - strm.state = state; - state.window = null /*Z_NULL*/; - ret = inflateReset2(strm, windowBits); - if (ret !== Z_OK) { - strm.state = null /*Z_NULL*/; - } - return ret; -} -function inflateInit(strm) { - return inflateInit2(strm, DEF_WBITS); -} - -/* - Return state with length and distance decoding tables and index sizes set to - fixed code decoding. Normally this returns fixed tables from inffixed.h. - If BUILDFIXED is defined, then instead this routine builds the tables the - first time it's called, and returns those tables the first time and - thereafter. This reduces the size of the code by about 2K bytes, in - exchange for a little execution time. However, BUILDFIXED should not be - used for threaded applications, since the rewriting of the tables and virgin - may not be thread-safe. - */ -var virgin = true; -var lenfix, distfix; // We have no pointers in JS, so keep tables separate - -function fixedtables(state) { - /* build fixed huffman tables if first call (may not be thread safe) */ - if (virgin) { - var sym; - lenfix = new utils.Buf32(512); - distfix = new utils.Buf32(32); - - /* literal/length table */ - sym = 0; - while (sym < 144) { - state.lens[sym++] = 8; - } - while (sym < 256) { - state.lens[sym++] = 9; - } - while (sym < 280) { - state.lens[sym++] = 7; - } - while (sym < 288) { - state.lens[sym++] = 8; - } - inflate_table(LENS, state.lens, 0, 288, lenfix, 0, state.work, { - bits: 9 - }); - - /* distance table */ - sym = 0; - while (sym < 32) { - state.lens[sym++] = 5; - } - inflate_table(DISTS, state.lens, 0, 32, distfix, 0, state.work, { - bits: 5 - }); - - /* do this just once */ - virgin = false; - } - state.lencode = lenfix; - state.lenbits = 9; - state.distcode = distfix; - state.distbits = 5; -} - -/* - Update the window with the last wsize (normally 32K) bytes written before - returning. If window does not exist yet, create it. This is only called - when a window is already in use, or when output has been written during this - inflate call, but the end of the deflate stream has not been reached yet. - It is also called to create a window for dictionary data when a dictionary - is loaded. - - Providing output buffers larger than 32K to inflate() should provide a speed - advantage, since only the last 32K of output is copied to the sliding window - upon return from inflate(), and since all distances after the first 32K of - output will fall in the output data, making match copies simpler and faster. - The advantage may be dependent on the size of the processor's data caches. - */ -function updatewindow(strm, src, end, copy) { - var dist; - var state = strm.state; - - /* if it hasn't been done already, allocate space for the window */ - if (state.window === null) { - state.wsize = 1 << state.wbits; - state.wnext = 0; - state.whave = 0; - state.window = new utils.Buf8(state.wsize); - } - - /* copy state->wsize or less output bytes into the circular window */ - if (copy >= state.wsize) { - utils.arraySet(state.window, src, end - state.wsize, state.wsize, 0); - state.wnext = 0; - state.whave = state.wsize; - } else { - dist = state.wsize - state.wnext; - if (dist > copy) { - dist = copy; - } - //zmemcpy(state->window + state->wnext, end - copy, dist); - utils.arraySet(state.window, src, end - copy, dist, state.wnext); - copy -= dist; - if (copy) { - //zmemcpy(state->window, end - copy, copy); - utils.arraySet(state.window, src, end - copy, copy, 0); - state.wnext = copy; - state.whave = state.wsize; - } else { - state.wnext += dist; - if (state.wnext === state.wsize) { - state.wnext = 0; - } - if (state.whave < state.wsize) { - state.whave += dist; - } - } - } - return 0; -} -function inflate(strm, flush) { - var state; - var input, output; // input/output buffers - var next; /* next input INDEX */ - var put; /* next output INDEX */ - var have, left; /* available input and output */ - var hold; /* bit buffer */ - var bits; /* bits in bit buffer */ - var _in, _out; /* save starting available input and output */ - var copy; /* number of stored or match bytes to copy */ - var from; /* where to copy match bytes from */ - var from_source; - var here = 0; /* current decoding table entry */ - var here_bits, here_op, here_val; // paked "here" denormalized (JS specific) - //var last; /* parent table entry */ - var last_bits, last_op, last_val; // paked "last" denormalized (JS specific) - var len; /* length to copy for repeats, bits to drop */ - var ret; /* return code */ - var hbuf = new utils.Buf8(4); /* buffer for gzip header crc calculation */ - var opts; - var n; // temporary var for NEED_BITS - - var order = /* permutation of code lengths */ - [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]; - if (!strm || !strm.state || !strm.output || !strm.input && strm.avail_in !== 0) { - return Z_STREAM_ERROR; - } - state = strm.state; - if (state.mode === TYPE) { - state.mode = TYPEDO; - } /* skip check */ - - //--- LOAD() --- - put = strm.next_out; - output = strm.output; - left = strm.avail_out; - next = strm.next_in; - input = strm.input; - have = strm.avail_in; - hold = state.hold; - bits = state.bits; - //--- - - _in = have; - _out = left; - ret = Z_OK; - inf_leave: - // goto emulation - for (;;) { - switch (state.mode) { - case HEAD: - if (state.wrap === 0) { - state.mode = TYPEDO; - break; - } - //=== NEEDBITS(16); - while (bits < 16) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if (state.wrap & 2 && hold === 0x8b1f) { - /* gzip header */ - state.check = 0 /*crc32(0L, Z_NULL, 0)*/; - //=== CRC2(state.check, hold); - hbuf[0] = hold & 0xff; - hbuf[1] = hold >>> 8 & 0xff; - state.check = crc32(state.check, hbuf, 2, 0); - //===// - - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = FLAGS; - break; - } - state.flags = 0; /* expect zlib header */ - if (state.head) { - state.head.done = false; - } - if (!(state.wrap & 1) || /* check if zlib header allowed */ - (((hold & 0xff /*BITS(8)*/) << 8) + (hold >> 8)) % 31) { - strm.msg = 'incorrect header check'; - state.mode = BAD; - break; - } - if ((hold & 0x0f /*BITS(4)*/) !== Z_DEFLATED) { - strm.msg = 'unknown compression method'; - state.mode = BAD; - break; - } - //--- DROPBITS(4) ---// - hold >>>= 4; - bits -= 4; - //---// - len = (hold & 0x0f /*BITS(4)*/) + 8; - if (state.wbits === 0) { - state.wbits = len; - } else if (len > state.wbits) { - strm.msg = 'invalid window size'; - state.mode = BAD; - break; - } - state.dmax = 1 << len; - //Tracev((stderr, "inflate: zlib header ok\n")); - strm.adler = state.check = 1 /*adler32(0L, Z_NULL, 0)*/; - state.mode = hold & 0x200 ? DICTID : TYPE; - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - break; - case FLAGS: - //=== NEEDBITS(16); */ - while (bits < 16) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.flags = hold; - if ((state.flags & 0xff) !== Z_DEFLATED) { - strm.msg = 'unknown compression method'; - state.mode = BAD; - break; - } - if (state.flags & 0xe000) { - strm.msg = 'unknown header flags set'; - state.mode = BAD; - break; - } - if (state.head) { - state.head.text = hold >> 8 & 1; - } - if (state.flags & 0x0200) { - //=== CRC2(state.check, hold); - hbuf[0] = hold & 0xff; - hbuf[1] = hold >>> 8 & 0xff; - state.check = crc32(state.check, hbuf, 2, 0); - //===// - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = TIME; - /* falls through */ - case TIME: - //=== NEEDBITS(32); */ - while (bits < 32) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if (state.head) { - state.head.time = hold; - } - if (state.flags & 0x0200) { - //=== CRC4(state.check, hold) - hbuf[0] = hold & 0xff; - hbuf[1] = hold >>> 8 & 0xff; - hbuf[2] = hold >>> 16 & 0xff; - hbuf[3] = hold >>> 24 & 0xff; - state.check = crc32(state.check, hbuf, 4, 0); - //=== - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = OS; - /* falls through */ - case OS: - //=== NEEDBITS(16); */ - while (bits < 16) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if (state.head) { - state.head.xflags = hold & 0xff; - state.head.os = hold >> 8; - } - if (state.flags & 0x0200) { - //=== CRC2(state.check, hold); - hbuf[0] = hold & 0xff; - hbuf[1] = hold >>> 8 & 0xff; - state.check = crc32(state.check, hbuf, 2, 0); - //===// - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = EXLEN; - /* falls through */ - case EXLEN: - if (state.flags & 0x0400) { - //=== NEEDBITS(16); */ - while (bits < 16) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.length = hold; - if (state.head) { - state.head.extra_len = hold; - } - if (state.flags & 0x0200) { - //=== CRC2(state.check, hold); - hbuf[0] = hold & 0xff; - hbuf[1] = hold >>> 8 & 0xff; - state.check = crc32(state.check, hbuf, 2, 0); - //===// - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - } else if (state.head) { - state.head.extra = null /*Z_NULL*/; - } - state.mode = EXTRA; - /* falls through */ - case EXTRA: - if (state.flags & 0x0400) { - copy = state.length; - if (copy > have) { - copy = have; - } - if (copy) { - if (state.head) { - len = state.head.extra_len - state.length; - if (!state.head.extra) { - // Use untyped array for more convenient processing later - state.head.extra = new Array(state.head.extra_len); - } - utils.arraySet(state.head.extra, input, next, - // extra field is limited to 65536 bytes - // - no need for additional size check - copy, /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/ - len); - //zmemcpy(state.head.extra + len, next, - // len + copy > state.head.extra_max ? - // state.head.extra_max - len : copy); - } - if (state.flags & 0x0200) { - state.check = crc32(state.check, input, copy, next); - } - have -= copy; - next += copy; - state.length -= copy; - } - if (state.length) { - break inf_leave; - } - } - state.length = 0; - state.mode = NAME; - /* falls through */ - case NAME: - if (state.flags & 0x0800) { - if (have === 0) { - break inf_leave; - } - copy = 0; - do { - // TODO: 2 or 1 bytes? - len = input[next + copy++]; - /* use constant limit because in js we should not preallocate memory */ - if (state.head && len && state.length < 65536 /*state.head.name_max*/) { - state.head.name += String.fromCharCode(len); - } - } while (len && copy < have); - if (state.flags & 0x0200) { - state.check = crc32(state.check, input, copy, next); - } - have -= copy; - next += copy; - if (len) { - break inf_leave; - } - } else if (state.head) { - state.head.name = null; - } - state.length = 0; - state.mode = COMMENT; - /* falls through */ - case COMMENT: - if (state.flags & 0x1000) { - if (have === 0) { - break inf_leave; - } - copy = 0; - do { - len = input[next + copy++]; - /* use constant limit because in js we should not preallocate memory */ - if (state.head && len && state.length < 65536 /*state.head.comm_max*/) { - state.head.comment += String.fromCharCode(len); - } - } while (len && copy < have); - if (state.flags & 0x0200) { - state.check = crc32(state.check, input, copy, next); - } - have -= copy; - next += copy; - if (len) { - break inf_leave; - } - } else if (state.head) { - state.head.comment = null; - } - state.mode = HCRC; - /* falls through */ - case HCRC: - if (state.flags & 0x0200) { - //=== NEEDBITS(16); */ - while (bits < 16) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if (hold !== (state.check & 0xffff)) { - strm.msg = 'header crc mismatch'; - state.mode = BAD; - break; - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - } - if (state.head) { - state.head.hcrc = state.flags >> 9 & 1; - state.head.done = true; - } - strm.adler = state.check = 0; - state.mode = TYPE; - break; - case DICTID: - //=== NEEDBITS(32); */ - while (bits < 32) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - strm.adler = state.check = zswap32(hold); - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = DICT; - /* falls through */ - case DICT: - if (state.havedict === 0) { - //--- RESTORE() --- - strm.next_out = put; - strm.avail_out = left; - strm.next_in = next; - strm.avail_in = have; - state.hold = hold; - state.bits = bits; - //--- - return Z_NEED_DICT; - } - strm.adler = state.check = 1 /*adler32(0L, Z_NULL, 0)*/; - state.mode = TYPE; - /* falls through */ - case TYPE: - if (flush === Z_BLOCK || flush === Z_TREES) { - break inf_leave; - } - /* falls through */ - case TYPEDO: - if (state.last) { - //--- BYTEBITS() ---// - hold >>>= bits & 7; - bits -= bits & 7; - //---// - state.mode = CHECK; - break; - } - //=== NEEDBITS(3); */ - while (bits < 3) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.last = hold & 0x01 /*BITS(1)*/; - //--- DROPBITS(1) ---// - hold >>>= 1; - bits -= 1; - //---// - - switch (hold & 0x03 /*BITS(2)*/) { - case 0: - /* stored block */ - //Tracev((stderr, "inflate: stored block%s\n", - // state.last ? " (last)" : "")); - state.mode = STORED; - break; - case 1: - /* fixed block */ - fixedtables(state); - //Tracev((stderr, "inflate: fixed codes block%s\n", - // state.last ? " (last)" : "")); - state.mode = LEN_; /* decode codes */ - if (flush === Z_TREES) { - //--- DROPBITS(2) ---// - hold >>>= 2; - bits -= 2; - //---// - break inf_leave; - } - break; - case 2: - /* dynamic block */ - //Tracev((stderr, "inflate: dynamic codes block%s\n", - // state.last ? " (last)" : "")); - state.mode = TABLE; - break; - case 3: - strm.msg = 'invalid block type'; - state.mode = BAD; - } - //--- DROPBITS(2) ---// - hold >>>= 2; - bits -= 2; - //---// - break; - case STORED: - //--- BYTEBITS() ---// /* go to byte boundary */ - hold >>>= bits & 7; - bits -= bits & 7; - //---// - //=== NEEDBITS(32); */ - while (bits < 32) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if ((hold & 0xffff) !== (hold >>> 16 ^ 0xffff)) { - strm.msg = 'invalid stored block lengths'; - state.mode = BAD; - break; - } - state.length = hold & 0xffff; - //Tracev((stderr, "inflate: stored length %u\n", - // state.length)); - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - state.mode = COPY_; - if (flush === Z_TREES) { - break inf_leave; - } - /* falls through */ - case COPY_: - state.mode = COPY; - /* falls through */ - case COPY: - copy = state.length; - if (copy) { - if (copy > have) { - copy = have; - } - if (copy > left) { - copy = left; - } - if (copy === 0) { - break inf_leave; - } - //--- zmemcpy(put, next, copy); --- - utils.arraySet(output, input, next, copy, put); - //---// - have -= copy; - next += copy; - left -= copy; - put += copy; - state.length -= copy; - break; - } - //Tracev((stderr, "inflate: stored end\n")); - state.mode = TYPE; - break; - case TABLE: - //=== NEEDBITS(14); */ - while (bits < 14) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.nlen = (hold & 0x1f /*BITS(5)*/) + 257; - //--- DROPBITS(5) ---// - hold >>>= 5; - bits -= 5; - //---// - state.ndist = (hold & 0x1f /*BITS(5)*/) + 1; - //--- DROPBITS(5) ---// - hold >>>= 5; - bits -= 5; - //---// - state.ncode = (hold & 0x0f /*BITS(4)*/) + 4; - //--- DROPBITS(4) ---// - hold >>>= 4; - bits -= 4; - //---// - //#ifndef PKZIP_BUG_WORKAROUND - if (state.nlen > 286 || state.ndist > 30) { - strm.msg = 'too many length or distance symbols'; - state.mode = BAD; - break; - } - //#endif - //Tracev((stderr, "inflate: table sizes ok\n")); - state.have = 0; - state.mode = LENLENS; - /* falls through */ - case LENLENS: - while (state.have < state.ncode) { - //=== NEEDBITS(3); - while (bits < 3) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.lens[order[state.have++]] = hold & 0x07; //BITS(3); - //--- DROPBITS(3) ---// - hold >>>= 3; - bits -= 3; - //---// - } - while (state.have < 19) { - state.lens[order[state.have++]] = 0; - } - // We have separate tables & no pointers. 2 commented lines below not needed. - //state.next = state.codes; - //state.lencode = state.next; - // Switch to use dynamic table - state.lencode = state.lendyn; - state.lenbits = 7; - opts = { - bits: state.lenbits - }; - ret = inflate_table(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts); - state.lenbits = opts.bits; - if (ret) { - strm.msg = 'invalid code lengths set'; - state.mode = BAD; - break; - } - //Tracev((stderr, "inflate: code lengths ok\n")); - state.have = 0; - state.mode = CODELENS; - /* falls through */ - case CODELENS: - while (state.have < state.nlen + state.ndist) { - for (;;) { - here = state.lencode[hold & (1 << state.lenbits) - 1]; /*BITS(state.lenbits)*/ - here_bits = here >>> 24; - here_op = here >>> 16 & 0xff; - here_val = here & 0xffff; - if (here_bits <= bits) { - break; - } - //--- PULLBYTE() ---// - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - //---// - } - if (here_val < 16) { - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - state.lens[state.have++] = here_val; - } else { - if (here_val === 16) { - //=== NEEDBITS(here.bits + 2); - n = here_bits + 2; - while (bits < n) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - if (state.have === 0) { - strm.msg = 'invalid bit length repeat'; - state.mode = BAD; - break; - } - len = state.lens[state.have - 1]; - copy = 3 + (hold & 0x03); //BITS(2); - //--- DROPBITS(2) ---// - hold >>>= 2; - bits -= 2; - //---// - } else if (here_val === 17) { - //=== NEEDBITS(here.bits + 3); - n = here_bits + 3; - while (bits < n) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - len = 0; - copy = 3 + (hold & 0x07); //BITS(3); - //--- DROPBITS(3) ---// - hold >>>= 3; - bits -= 3; - //---// - } else { - //=== NEEDBITS(here.bits + 7); - n = here_bits + 7; - while (bits < n) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - len = 0; - copy = 11 + (hold & 0x7f); //BITS(7); - //--- DROPBITS(7) ---// - hold >>>= 7; - bits -= 7; - //---// - } - if (state.have + copy > state.nlen + state.ndist) { - strm.msg = 'invalid bit length repeat'; - state.mode = BAD; - break; - } - while (copy--) { - state.lens[state.have++] = len; - } - } - } - - /* handle error breaks in while */ - if (state.mode === BAD) { - break; - } - - /* check for end-of-block code (better have one) */ - if (state.lens[256] === 0) { - strm.msg = 'invalid code -- missing end-of-block'; - state.mode = BAD; - break; - } - - /* build code tables -- note: do not change the lenbits or distbits - values here (9 and 6) without reading the comments in inftrees.h - concerning the ENOUGH constants, which depend on those values */ - state.lenbits = 9; - opts = { - bits: state.lenbits - }; - ret = inflate_table(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts); - // We have separate tables & no pointers. 2 commented lines below not needed. - // state.next_index = opts.table_index; - state.lenbits = opts.bits; - // state.lencode = state.next; - - if (ret) { - strm.msg = 'invalid literal/lengths set'; - state.mode = BAD; - break; - } - state.distbits = 6; - //state.distcode.copy(state.codes); - // Switch to use dynamic table - state.distcode = state.distdyn; - opts = { - bits: state.distbits - }; - ret = inflate_table(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts); - // We have separate tables & no pointers. 2 commented lines below not needed. - // state.next_index = opts.table_index; - state.distbits = opts.bits; - // state.distcode = state.next; - - if (ret) { - strm.msg = 'invalid distances set'; - state.mode = BAD; - break; - } - //Tracev((stderr, 'inflate: codes ok\n')); - state.mode = LEN_; - if (flush === Z_TREES) { - break inf_leave; - } - /* falls through */ - case LEN_: - state.mode = LEN; - /* falls through */ - case LEN: - if (have >= 6 && left >= 258) { - //--- RESTORE() --- - strm.next_out = put; - strm.avail_out = left; - strm.next_in = next; - strm.avail_in = have; - state.hold = hold; - state.bits = bits; - //--- - inflate_fast(strm, _out); - //--- LOAD() --- - put = strm.next_out; - output = strm.output; - left = strm.avail_out; - next = strm.next_in; - input = strm.input; - have = strm.avail_in; - hold = state.hold; - bits = state.bits; - //--- - - if (state.mode === TYPE) { - state.back = -1; - } - break; - } - state.back = 0; - for (;;) { - here = state.lencode[hold & (1 << state.lenbits) - 1]; /*BITS(state.lenbits)*/ - here_bits = here >>> 24; - here_op = here >>> 16 & 0xff; - here_val = here & 0xffff; - if (here_bits <= bits) { - break; - } - //--- PULLBYTE() ---// - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - //---// - } - if (here_op && (here_op & 0xf0) === 0) { - last_bits = here_bits; - last_op = here_op; - last_val = here_val; - for (;;) { - here = state.lencode[last_val + ((hold & (1 << last_bits + last_op) - 1 /*BITS(last.bits + last.op)*/) >> last_bits)]; - here_bits = here >>> 24; - here_op = here >>> 16 & 0xff; - here_val = here & 0xffff; - if (last_bits + here_bits <= bits) { - break; - } - //--- PULLBYTE() ---// - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - //---// - } - //--- DROPBITS(last.bits) ---// - hold >>>= last_bits; - bits -= last_bits; - //---// - state.back += last_bits; - } - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - state.back += here_bits; - state.length = here_val; - if (here_op === 0) { - //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? - // "inflate: literal '%c'\n" : - // "inflate: literal 0x%02x\n", here.val)); - state.mode = LIT; - break; - } - if (here_op & 32) { - //Tracevv((stderr, "inflate: end of block\n")); - state.back = -1; - state.mode = TYPE; - break; - } - if (here_op & 64) { - strm.msg = 'invalid literal/length code'; - state.mode = BAD; - break; - } - state.extra = here_op & 15; - state.mode = LENEXT; - /* falls through */ - case LENEXT: - if (state.extra) { - //=== NEEDBITS(state.extra); - n = state.extra; - while (bits < n) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.length += hold & (1 << state.extra) - 1 /*BITS(state.extra)*/; - //--- DROPBITS(state.extra) ---// - hold >>>= state.extra; - bits -= state.extra; - //---// - state.back += state.extra; - } - //Tracevv((stderr, "inflate: length %u\n", state.length)); - state.was = state.length; - state.mode = DIST; - /* falls through */ - case DIST: - for (;;) { - here = state.distcode[hold & (1 << state.distbits) - 1]; /*BITS(state.distbits)*/ - here_bits = here >>> 24; - here_op = here >>> 16 & 0xff; - here_val = here & 0xffff; - if (here_bits <= bits) { - break; - } - //--- PULLBYTE() ---// - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - //---// - } - if ((here_op & 0xf0) === 0) { - last_bits = here_bits; - last_op = here_op; - last_val = here_val; - for (;;) { - here = state.distcode[last_val + ((hold & (1 << last_bits + last_op) - 1 /*BITS(last.bits + last.op)*/) >> last_bits)]; - here_bits = here >>> 24; - here_op = here >>> 16 & 0xff; - here_val = here & 0xffff; - if (last_bits + here_bits <= bits) { - break; - } - //--- PULLBYTE() ---// - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - //---// - } - //--- DROPBITS(last.bits) ---// - hold >>>= last_bits; - bits -= last_bits; - //---// - state.back += last_bits; - } - //--- DROPBITS(here.bits) ---// - hold >>>= here_bits; - bits -= here_bits; - //---// - state.back += here_bits; - if (here_op & 64) { - strm.msg = 'invalid distance code'; - state.mode = BAD; - break; - } - state.offset = here_val; - state.extra = here_op & 15; - state.mode = DISTEXT; - /* falls through */ - case DISTEXT: - if (state.extra) { - //=== NEEDBITS(state.extra); - n = state.extra; - while (bits < n) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - state.offset += hold & (1 << state.extra) - 1 /*BITS(state.extra)*/; - //--- DROPBITS(state.extra) ---// - hold >>>= state.extra; - bits -= state.extra; - //---// - state.back += state.extra; - } - //#ifdef INFLATE_STRICT - if (state.offset > state.dmax) { - strm.msg = 'invalid distance too far back'; - state.mode = BAD; - break; - } - //#endif - //Tracevv((stderr, "inflate: distance %u\n", state.offset)); - state.mode = MATCH; - /* falls through */ - case MATCH: - if (left === 0) { - break inf_leave; - } - copy = _out - left; - if (state.offset > copy) { - /* copy from window */ - copy = state.offset - copy; - if (copy > state.whave) { - if (state.sane) { - strm.msg = 'invalid distance too far back'; - state.mode = BAD; - break; - } - // (!) This block is disabled in zlib defaults, - // don't enable it for binary compatibility - //#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR - // Trace((stderr, "inflate.c too far\n")); - // copy -= state.whave; - // if (copy > state.length) { copy = state.length; } - // if (copy > left) { copy = left; } - // left -= copy; - // state.length -= copy; - // do { - // output[put++] = 0; - // } while (--copy); - // if (state.length === 0) { state.mode = LEN; } - // break; - //#endif - } - if (copy > state.wnext) { - copy -= state.wnext; - from = state.wsize - copy; - } else { - from = state.wnext - copy; - } - if (copy > state.length) { - copy = state.length; - } - from_source = state.window; - } else { - /* copy from output */ - from_source = output; - from = put - state.offset; - copy = state.length; - } - if (copy > left) { - copy = left; - } - left -= copy; - state.length -= copy; - do { - output[put++] = from_source[from++]; - } while (--copy); - if (state.length === 0) { - state.mode = LEN; - } - break; - case LIT: - if (left === 0) { - break inf_leave; - } - output[put++] = state.length; - left--; - state.mode = LEN; - break; - case CHECK: - if (state.wrap) { - //=== NEEDBITS(32); - while (bits < 32) { - if (have === 0) { - break inf_leave; - } - have--; - // Use '|' instead of '+' to make sure that result is signed - hold |= input[next++] << bits; - bits += 8; - } - //===// - _out -= left; - strm.total_out += _out; - state.total += _out; - if (_out) { - strm.adler = state.check = /*UPDATE(state.check, put - _out, _out);*/ - state.flags ? crc32(state.check, output, _out, put - _out) : adler32(state.check, output, _out, put - _out); - } - _out = left; - // NB: crc32 stored as signed 32-bit int, zswap32 returns signed too - if ((state.flags ? hold : zswap32(hold)) !== state.check) { - strm.msg = 'incorrect data check'; - state.mode = BAD; - break; - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - //Tracev((stderr, "inflate: check matches trailer\n")); - } - state.mode = LENGTH; - /* falls through */ - case LENGTH: - if (state.wrap && state.flags) { - //=== NEEDBITS(32); - while (bits < 32) { - if (have === 0) { - break inf_leave; - } - have--; - hold += input[next++] << bits; - bits += 8; - } - //===// - if (hold !== (state.total & 0xffffffff)) { - strm.msg = 'incorrect length check'; - state.mode = BAD; - break; - } - //=== INITBITS(); - hold = 0; - bits = 0; - //===// - //Tracev((stderr, "inflate: length matches trailer\n")); - } - state.mode = DONE; - /* falls through */ - case DONE: - ret = Z_STREAM_END; - break inf_leave; - case BAD: - ret = Z_DATA_ERROR; - break inf_leave; - case MEM: - return Z_MEM_ERROR; - case SYNC: - /* falls through */ - default: - return Z_STREAM_ERROR; - } - } - - // inf_leave <- here is real place for "goto inf_leave", emulated via "break inf_leave" - - /* - Return from inflate(), updating the total counts and the check value. - If there was no progress during the inflate() call, return a buffer - error. Call updatewindow() to create and/or update the window state. - Note: a memory error from inflate() is non-recoverable. - */ - - //--- RESTORE() --- - strm.next_out = put; - strm.avail_out = left; - strm.next_in = next; - strm.avail_in = have; - state.hold = hold; - state.bits = bits; - //--- - - if (state.wsize || _out !== strm.avail_out && state.mode < BAD && (state.mode < CHECK || flush !== Z_FINISH)) { - if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) ; - } - _in -= strm.avail_in; - _out -= strm.avail_out; - strm.total_in += _in; - strm.total_out += _out; - state.total += _out; - if (state.wrap && _out) { - strm.adler = state.check = /*UPDATE(state.check, strm.next_out - _out, _out);*/ - state.flags ? crc32(state.check, output, _out, strm.next_out - _out) : adler32(state.check, output, _out, strm.next_out - _out); - } - strm.data_type = state.bits + (state.last ? 64 : 0) + (state.mode === TYPE ? 128 : 0) + (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0); - if ((_in === 0 && _out === 0 || flush === Z_FINISH) && ret === Z_OK) { - ret = Z_BUF_ERROR; - } - return ret; -} -function inflateEnd(strm) { - if (!strm || !strm.state /*|| strm->zfree == (free_func)0*/) { - return Z_STREAM_ERROR; - } - var state = strm.state; - if (state.window) { - state.window = null; - } - strm.state = null; - return Z_OK; -} -function inflateGetHeader(strm, head) { - var state; - - /* check state */ - if (!strm || !strm.state) { - return Z_STREAM_ERROR; - } - state = strm.state; - if ((state.wrap & 2) === 0) { - return Z_STREAM_ERROR; - } - - /* save header structure */ - state.head = head; - head.done = false; - return Z_OK; -} -function inflateSetDictionary(strm, dictionary) { - var dictLength = dictionary.length; - var state; - var dictid; - var ret; - - /* check state */ - if (!strm /* == Z_NULL */ || !strm.state /* == Z_NULL */) { - return Z_STREAM_ERROR; - } - state = strm.state; - if (state.wrap !== 0 && state.mode !== DICT) { - return Z_STREAM_ERROR; - } - - /* check for correct dictionary identifier */ - if (state.mode === DICT) { - dictid = 1; /* adler32(0, null, 0)*/ - /* dictid = adler32(dictid, dictionary, dictLength); */ - dictid = adler32(dictid, dictionary, dictLength, 0); - if (dictid !== state.check) { - return Z_DATA_ERROR; - } - } - /* copy dictionary to window using updatewindow(), which will amend the - existing dictionary if appropriate */ - ret = updatewindow(strm, dictionary, dictLength, dictLength); - if (ret) { - state.mode = MEM; - return Z_MEM_ERROR; - } - state.havedict = 1; - // Tracev((stderr, "inflate: dictionary set\n")); - return Z_OK; -} -inflate$1.inflateReset = inflateReset; -inflate$1.inflateReset2 = inflateReset2; -inflate$1.inflateResetKeep = inflateResetKeep; -inflate$1.inflateInit = inflateInit; -inflate$1.inflateInit2 = inflateInit2; -inflate$1.inflate = inflate; -inflate$1.inflateEnd = inflateEnd; -inflate$1.inflateGetHeader = inflateGetHeader; -inflate$1.inflateSetDictionary = inflateSetDictionary; -inflate$1.inflateInfo = 'pako inflate (from Nodeca project)'; - -// (C) 1995-2013 Jean-loup Gailly and Mark Adler -// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// 3. This notice may not be removed or altered from any source distribution. - -var constants = { - /* Allowed flush values; see deflate() and inflate() below for details */ - Z_NO_FLUSH: 0, - Z_PARTIAL_FLUSH: 1, - Z_SYNC_FLUSH: 2, - Z_FULL_FLUSH: 3, - Z_FINISH: 4, - Z_BLOCK: 5, - Z_TREES: 6, - /* Return codes for the compression/decompression functions. Negative values - * are errors, positive values are used for special but normal events. - */ - Z_OK: 0, - Z_STREAM_END: 1, - Z_NEED_DICT: 2, - Z_ERRNO: -1, - Z_STREAM_ERROR: -2, - Z_DATA_ERROR: -3, - //Z_MEM_ERROR: -4, - Z_BUF_ERROR: -5, - //Z_VERSION_ERROR: -6, - - /* compression levels */ - Z_NO_COMPRESSION: 0, - Z_BEST_SPEED: 1, - Z_BEST_COMPRESSION: 9, - Z_DEFAULT_COMPRESSION: -1, - Z_FILTERED: 1, - Z_HUFFMAN_ONLY: 2, - Z_RLE: 3, - Z_FIXED: 4, - Z_DEFAULT_STRATEGY: 0, - /* Possible values of the data_type field (though see inflate()) */ - Z_BINARY: 0, - Z_TEXT: 1, - //Z_ASCII: 1, // = Z_TEXT (deprecated) - Z_UNKNOWN: 2, - /* The deflate compression method */ - Z_DEFLATED: 8 - //Z_NULL: null // Use -1 or null inline, depending on var type -}; - -(function (exports) { - - /* eslint camelcase: "off" */ - var assert = require$$4; - var Zstream = zstream; - var zlib_deflate = deflate$1; - var zlib_inflate = inflate$1; - var constants$1 = constants; - for (var key in constants$1) { - exports[key] = constants$1[key]; - } - - // zlib modes - exports.NONE = 0; - exports.DEFLATE = 1; - exports.INFLATE = 2; - exports.GZIP = 3; - exports.GUNZIP = 4; - exports.DEFLATERAW = 5; - exports.INFLATERAW = 6; - exports.UNZIP = 7; - var GZIP_HEADER_ID1 = 0x1f; - var GZIP_HEADER_ID2 = 0x8b; - - /** - * Emulate Node's zlib C++ layer for use by the JS layer in index.js - */ - function Zlib(mode) { - if (typeof mode !== 'number' || mode < exports.DEFLATE || mode > exports.UNZIP) { - throw new TypeError('Bad argument'); - } - this.dictionary = null; - this.err = 0; - this.flush = 0; - this.init_done = false; - this.level = 0; - this.memLevel = 0; - this.mode = mode; - this.strategy = 0; - this.windowBits = 0; - this.write_in_progress = false; - this.pending_close = false; - this.gzip_id_bytes_read = 0; - } - Zlib.prototype.close = function () { - if (this.write_in_progress) { - this.pending_close = true; - return; - } - this.pending_close = false; - assert(this.init_done, 'close before init'); - assert(this.mode <= exports.UNZIP); - if (this.mode === exports.DEFLATE || this.mode === exports.GZIP || this.mode === exports.DEFLATERAW) { - zlib_deflate.deflateEnd(this.strm); - } else if (this.mode === exports.INFLATE || this.mode === exports.GUNZIP || this.mode === exports.INFLATERAW || this.mode === exports.UNZIP) { - zlib_inflate.inflateEnd(this.strm); - } - this.mode = exports.NONE; - this.dictionary = null; - }; - Zlib.prototype.write = function (flush, input, in_off, in_len, out, out_off, out_len) { - return this._write(true, flush, input, in_off, in_len, out, out_off, out_len); - }; - Zlib.prototype.writeSync = function (flush, input, in_off, in_len, out, out_off, out_len) { - return this._write(false, flush, input, in_off, in_len, out, out_off, out_len); - }; - Zlib.prototype._write = function (async, flush, input, in_off, in_len, out, out_off, out_len) { - assert.equal(arguments.length, 8); - assert(this.init_done, 'write before init'); - assert(this.mode !== exports.NONE, 'already finalized'); - assert.equal(false, this.write_in_progress, 'write already in progress'); - assert.equal(false, this.pending_close, 'close is pending'); - this.write_in_progress = true; - assert.equal(false, flush === undefined, 'must provide flush value'); - this.write_in_progress = true; - if (flush !== exports.Z_NO_FLUSH && flush !== exports.Z_PARTIAL_FLUSH && flush !== exports.Z_SYNC_FLUSH && flush !== exports.Z_FULL_FLUSH && flush !== exports.Z_FINISH && flush !== exports.Z_BLOCK) { - throw new Error('Invalid flush value'); - } - if (input == null) { - input = Buffer.alloc(0); - in_len = 0; - in_off = 0; - } - this.strm.avail_in = in_len; - this.strm.input = input; - this.strm.next_in = in_off; - this.strm.avail_out = out_len; - this.strm.output = out; - this.strm.next_out = out_off; - this.flush = flush; - if (!async) { - // sync version - this._process(); - if (this._checkError()) { - return this._afterSync(); - } - return; - } - - // async version - var self = this; - browser$1.nextTick(function () { - self._process(); - self._after(); - }); - return this; - }; - Zlib.prototype._afterSync = function () { - var avail_out = this.strm.avail_out; - var avail_in = this.strm.avail_in; - this.write_in_progress = false; - return [avail_in, avail_out]; - }; - Zlib.prototype._process = function () { - var next_expected_header_byte = null; - - // If the avail_out is left at 0, then it means that it ran out - // of room. If there was avail_out left over, then it means - // that all of the input was consumed. - switch (this.mode) { - case exports.DEFLATE: - case exports.GZIP: - case exports.DEFLATERAW: - this.err = zlib_deflate.deflate(this.strm, this.flush); - break; - case exports.UNZIP: - if (this.strm.avail_in > 0) { - next_expected_header_byte = this.strm.next_in; - } - switch (this.gzip_id_bytes_read) { - case 0: - if (next_expected_header_byte === null) { - break; - } - if (this.strm.input[next_expected_header_byte] === GZIP_HEADER_ID1) { - this.gzip_id_bytes_read = 1; - next_expected_header_byte++; - if (this.strm.avail_in === 1) { - // The only available byte was already read. - break; - } - } else { - this.mode = exports.INFLATE; - break; - } - - // fallthrough - case 1: - if (next_expected_header_byte === null) { - break; - } - if (this.strm.input[next_expected_header_byte] === GZIP_HEADER_ID2) { - this.gzip_id_bytes_read = 2; - this.mode = exports.GUNZIP; - } else { - // There is no actual difference between INFLATE and INFLATERAW - // (after initialization). - this.mode = exports.INFLATE; - } - break; - default: - throw new Error('invalid number of gzip magic number bytes read'); - } - - // fallthrough - case exports.INFLATE: - case exports.GUNZIP: - case exports.INFLATERAW: - this.err = zlib_inflate.inflate(this.strm, this.flush - - // If data was encoded with dictionary - ); - if (this.err === exports.Z_NEED_DICT && this.dictionary) { - // Load it - this.err = zlib_inflate.inflateSetDictionary(this.strm, this.dictionary); - if (this.err === exports.Z_OK) { - // And try to decode again - this.err = zlib_inflate.inflate(this.strm, this.flush); - } else if (this.err === exports.Z_DATA_ERROR) { - // Both inflateSetDictionary() and inflate() return Z_DATA_ERROR. - // Make it possible for After() to tell a bad dictionary from bad - // input. - this.err = exports.Z_NEED_DICT; - } - } - while (this.strm.avail_in > 0 && this.mode === exports.GUNZIP && this.err === exports.Z_STREAM_END && this.strm.next_in[0] !== 0x00) { - // Bytes remain in input buffer. Perhaps this is another compressed - // member in the same archive, or just trailing garbage. - // Trailing zero bytes are okay, though, since they are frequently - // used for padding. - - this.reset(); - this.err = zlib_inflate.inflate(this.strm, this.flush); - } - break; - default: - throw new Error('Unknown mode ' + this.mode); - } - }; - Zlib.prototype._checkError = function () { - // Acceptable error states depend on the type of zlib stream. - switch (this.err) { - case exports.Z_OK: - case exports.Z_BUF_ERROR: - if (this.strm.avail_out !== 0 && this.flush === exports.Z_FINISH) { - this._error('unexpected end of file'); - return false; - } - break; - case exports.Z_STREAM_END: - // normal statuses, not fatal - break; - case exports.Z_NEED_DICT: - if (this.dictionary == null) { - this._error('Missing dictionary'); - } else { - this._error('Bad dictionary'); - } - return false; - default: - // something else. - this._error('Zlib error'); - return false; - } - return true; - }; - Zlib.prototype._after = function () { - if (!this._checkError()) { - return; - } - var avail_out = this.strm.avail_out; - var avail_in = this.strm.avail_in; - this.write_in_progress = false; - - // call the write() cb - this.callback(avail_in, avail_out); - if (this.pending_close) { - this.close(); - } - }; - Zlib.prototype._error = function (message) { - if (this.strm.msg) { - message = this.strm.msg; - } - this.onerror(message, this.err - - // no hope of rescue. - ); - this.write_in_progress = false; - if (this.pending_close) { - this.close(); - } - }; - Zlib.prototype.init = function (windowBits, level, memLevel, strategy, dictionary) { - assert(arguments.length === 4 || arguments.length === 5, 'init(windowBits, level, memLevel, strategy, [dictionary])'); - assert(windowBits >= 8 && windowBits <= 15, 'invalid windowBits'); - assert(level >= -1 && level <= 9, 'invalid compression level'); - assert(memLevel >= 1 && memLevel <= 9, 'invalid memlevel'); - assert(strategy === exports.Z_FILTERED || strategy === exports.Z_HUFFMAN_ONLY || strategy === exports.Z_RLE || strategy === exports.Z_FIXED || strategy === exports.Z_DEFAULT_STRATEGY, 'invalid strategy'); - this._init(level, windowBits, memLevel, strategy, dictionary); - this._setDictionary(); - }; - Zlib.prototype.params = function () { - throw new Error('deflateParams Not supported'); - }; - Zlib.prototype.reset = function () { - this._reset(); - this._setDictionary(); - }; - Zlib.prototype._init = function (level, windowBits, memLevel, strategy, dictionary) { - this.level = level; - this.windowBits = windowBits; - this.memLevel = memLevel; - this.strategy = strategy; - this.flush = exports.Z_NO_FLUSH; - this.err = exports.Z_OK; - if (this.mode === exports.GZIP || this.mode === exports.GUNZIP) { - this.windowBits += 16; - } - if (this.mode === exports.UNZIP) { - this.windowBits += 32; - } - if (this.mode === exports.DEFLATERAW || this.mode === exports.INFLATERAW) { - this.windowBits = -1 * this.windowBits; - } - this.strm = new Zstream(); - switch (this.mode) { - case exports.DEFLATE: - case exports.GZIP: - case exports.DEFLATERAW: - this.err = zlib_deflate.deflateInit2(this.strm, this.level, exports.Z_DEFLATED, this.windowBits, this.memLevel, this.strategy); - break; - case exports.INFLATE: - case exports.GUNZIP: - case exports.INFLATERAW: - case exports.UNZIP: - this.err = zlib_inflate.inflateInit2(this.strm, this.windowBits); - break; - default: - throw new Error('Unknown mode ' + this.mode); - } - if (this.err !== exports.Z_OK) { - this._error('Init error'); - } - this.dictionary = dictionary; - this.write_in_progress = false; - this.init_done = true; - }; - Zlib.prototype._setDictionary = function () { - if (this.dictionary == null) { - return; - } - this.err = exports.Z_OK; - switch (this.mode) { - case exports.DEFLATE: - case exports.DEFLATERAW: - this.err = zlib_deflate.deflateSetDictionary(this.strm, this.dictionary); - break; - } - if (this.err !== exports.Z_OK) { - this._error('Failed to set dictionary'); - } - }; - Zlib.prototype._reset = function () { - this.err = exports.Z_OK; - switch (this.mode) { - case exports.DEFLATE: - case exports.DEFLATERAW: - case exports.GZIP: - this.err = zlib_deflate.deflateReset(this.strm); - break; - case exports.INFLATE: - case exports.INFLATERAW: - case exports.GUNZIP: - this.err = zlib_inflate.inflateReset(this.strm); - break; - } - if (this.err !== exports.Z_OK) { - this._error('Failed to reset stream'); - } - }; - exports.Zlib = Zlib; -})(binding); - -var require$$3 = /*@__PURE__*/getAugmentedNamespace(_polyfillNode_util$1); - -(function (exports) { - - var Buffer = require$$0.Buffer; - var Transform = require$$1.Transform; - var binding$1 = binding; - var util = require$$3; - var assert = require$$4.ok; - var kMaxLength = require$$0.kMaxLength; - var kRangeErrorMessage = 'Cannot create final Buffer. It would be larger ' + 'than 0x' + kMaxLength.toString(16) + ' bytes'; - - // zlib doesn't provide these, so kludge them in following the same - // const naming scheme zlib uses. - binding$1.Z_MIN_WINDOWBITS = 8; - binding$1.Z_MAX_WINDOWBITS = 15; - binding$1.Z_DEFAULT_WINDOWBITS = 15; - - // fewer than 64 bytes per chunk is stupid. - // technically it could work with as few as 8, but even 64 bytes - // is absurdly low. Usually a MB or more is best. - binding$1.Z_MIN_CHUNK = 64; - binding$1.Z_MAX_CHUNK = Infinity; - binding$1.Z_DEFAULT_CHUNK = 16 * 1024; - binding$1.Z_MIN_MEMLEVEL = 1; - binding$1.Z_MAX_MEMLEVEL = 9; - binding$1.Z_DEFAULT_MEMLEVEL = 8; - binding$1.Z_MIN_LEVEL = -1; - binding$1.Z_MAX_LEVEL = 9; - binding$1.Z_DEFAULT_LEVEL = binding$1.Z_DEFAULT_COMPRESSION; - - // expose all the zlib constants - var bkeys = Object.keys(binding$1); - for (var bk = 0; bk < bkeys.length; bk++) { - var bkey = bkeys[bk]; - if (bkey.match(/^Z/)) { - Object.defineProperty(exports, bkey, { - enumerable: true, - value: binding$1[bkey], - writable: false - }); - } - } - - // translation table for return codes. - var codes = { - Z_OK: binding$1.Z_OK, - Z_STREAM_END: binding$1.Z_STREAM_END, - Z_NEED_DICT: binding$1.Z_NEED_DICT, - Z_ERRNO: binding$1.Z_ERRNO, - Z_STREAM_ERROR: binding$1.Z_STREAM_ERROR, - Z_DATA_ERROR: binding$1.Z_DATA_ERROR, - Z_MEM_ERROR: binding$1.Z_MEM_ERROR, - Z_BUF_ERROR: binding$1.Z_BUF_ERROR, - Z_VERSION_ERROR: binding$1.Z_VERSION_ERROR - }; - var ckeys = Object.keys(codes); - for (var ck = 0; ck < ckeys.length; ck++) { - var ckey = ckeys[ck]; - codes[codes[ckey]] = ckey; - } - Object.defineProperty(exports, 'codes', { - enumerable: true, - value: Object.freeze(codes), - writable: false - }); - exports.Deflate = Deflate; - exports.Inflate = Inflate; - exports.Gzip = Gzip; - exports.Gunzip = Gunzip; - exports.DeflateRaw = DeflateRaw; - exports.InflateRaw = InflateRaw; - exports.Unzip = Unzip; - exports.createDeflate = function (o) { - return new Deflate(o); - }; - exports.createInflate = function (o) { - return new Inflate(o); - }; - exports.createDeflateRaw = function (o) { - return new DeflateRaw(o); - }; - exports.createInflateRaw = function (o) { - return new InflateRaw(o); - }; - exports.createGzip = function (o) { - return new Gzip(o); - }; - exports.createGunzip = function (o) { - return new Gunzip(o); - }; - exports.createUnzip = function (o) { - return new Unzip(o); - }; - - // Convenience methods. - // compress/decompress a string or buffer in one step. - exports.deflate = function (buffer, opts, callback) { - if (typeof opts === 'function') { - callback = opts; - opts = {}; - } - return zlibBuffer(new Deflate(opts), buffer, callback); - }; - exports.deflateSync = function (buffer, opts) { - return zlibBufferSync(new Deflate(opts), buffer); - }; - exports.gzip = function (buffer, opts, callback) { - if (typeof opts === 'function') { - callback = opts; - opts = {}; - } - return zlibBuffer(new Gzip(opts), buffer, callback); - }; - exports.gzipSync = function (buffer, opts) { - return zlibBufferSync(new Gzip(opts), buffer); - }; - exports.deflateRaw = function (buffer, opts, callback) { - if (typeof opts === 'function') { - callback = opts; - opts = {}; - } - return zlibBuffer(new DeflateRaw(opts), buffer, callback); - }; - exports.deflateRawSync = function (buffer, opts) { - return zlibBufferSync(new DeflateRaw(opts), buffer); - }; - exports.unzip = function (buffer, opts, callback) { - if (typeof opts === 'function') { - callback = opts; - opts = {}; - } - return zlibBuffer(new Unzip(opts), buffer, callback); - }; - exports.unzipSync = function (buffer, opts) { - return zlibBufferSync(new Unzip(opts), buffer); - }; - exports.inflate = function (buffer, opts, callback) { - if (typeof opts === 'function') { - callback = opts; - opts = {}; - } - return zlibBuffer(new Inflate(opts), buffer, callback); - }; - exports.inflateSync = function (buffer, opts) { - return zlibBufferSync(new Inflate(opts), buffer); - }; - exports.gunzip = function (buffer, opts, callback) { - if (typeof opts === 'function') { - callback = opts; - opts = {}; - } - return zlibBuffer(new Gunzip(opts), buffer, callback); - }; - exports.gunzipSync = function (buffer, opts) { - return zlibBufferSync(new Gunzip(opts), buffer); - }; - exports.inflateRaw = function (buffer, opts, callback) { - if (typeof opts === 'function') { - callback = opts; - opts = {}; - } - return zlibBuffer(new InflateRaw(opts), buffer, callback); - }; - exports.inflateRawSync = function (buffer, opts) { - return zlibBufferSync(new InflateRaw(opts), buffer); - }; - function zlibBuffer(engine, buffer, callback) { - var buffers = []; - var nread = 0; - engine.on('error', onError); - engine.on('end', onEnd); - engine.end(buffer); - flow(); - function flow() { - var chunk; - while (null !== (chunk = engine.read())) { - buffers.push(chunk); - nread += chunk.length; - } - engine.once('readable', flow); - } - function onError(err) { - engine.removeListener('end', onEnd); - engine.removeListener('readable', flow); - callback(err); - } - function onEnd() { - var buf; - var err = null; - if (nread >= kMaxLength) { - err = new RangeError(kRangeErrorMessage); - } else { - buf = Buffer.concat(buffers, nread); - } - buffers = []; - engine.close(); - callback(err, buf); - } - } - function zlibBufferSync(engine, buffer) { - if (typeof buffer === 'string') buffer = Buffer.from(buffer); - if (!Buffer.isBuffer(buffer)) throw new TypeError('Not a string or buffer'); - var flushFlag = engine._finishFlushFlag; - return engine._processChunk(buffer, flushFlag); - } - - // generic zlib - // minimal 2-byte header - function Deflate(opts) { - if (!(this instanceof Deflate)) return new Deflate(opts); - Zlib.call(this, opts, binding$1.DEFLATE); - } - function Inflate(opts) { - if (!(this instanceof Inflate)) return new Inflate(opts); - Zlib.call(this, opts, binding$1.INFLATE); - } - - // gzip - bigger header, same deflate compression - function Gzip(opts) { - if (!(this instanceof Gzip)) return new Gzip(opts); - Zlib.call(this, opts, binding$1.GZIP); - } - function Gunzip(opts) { - if (!(this instanceof Gunzip)) return new Gunzip(opts); - Zlib.call(this, opts, binding$1.GUNZIP); - } - - // raw - no header - function DeflateRaw(opts) { - if (!(this instanceof DeflateRaw)) return new DeflateRaw(opts); - Zlib.call(this, opts, binding$1.DEFLATERAW); - } - function InflateRaw(opts) { - if (!(this instanceof InflateRaw)) return new InflateRaw(opts); - Zlib.call(this, opts, binding$1.INFLATERAW); - } - - // auto-detect header. - function Unzip(opts) { - if (!(this instanceof Unzip)) return new Unzip(opts); - Zlib.call(this, opts, binding$1.UNZIP); - } - function isValidFlushFlag(flag) { - return flag === binding$1.Z_NO_FLUSH || flag === binding$1.Z_PARTIAL_FLUSH || flag === binding$1.Z_SYNC_FLUSH || flag === binding$1.Z_FULL_FLUSH || flag === binding$1.Z_FINISH || flag === binding$1.Z_BLOCK; - } - - // the Zlib class they all inherit from - // This thing manages the queue of requests, and returns - // true or false if there is anything in the queue when - // you call the .write() method. - - function Zlib(opts, mode) { - var _this = this; - this._opts = opts = opts || {}; - this._chunkSize = opts.chunkSize || exports.Z_DEFAULT_CHUNK; - Transform.call(this, opts); - if (opts.flush && !isValidFlushFlag(opts.flush)) { - throw new Error('Invalid flush flag: ' + opts.flush); - } - if (opts.finishFlush && !isValidFlushFlag(opts.finishFlush)) { - throw new Error('Invalid flush flag: ' + opts.finishFlush); - } - this._flushFlag = opts.flush || binding$1.Z_NO_FLUSH; - this._finishFlushFlag = typeof opts.finishFlush !== 'undefined' ? opts.finishFlush : binding$1.Z_FINISH; - if (opts.chunkSize) { - if (opts.chunkSize < exports.Z_MIN_CHUNK || opts.chunkSize > exports.Z_MAX_CHUNK) { - throw new Error('Invalid chunk size: ' + opts.chunkSize); - } - } - if (opts.windowBits) { - if (opts.windowBits < exports.Z_MIN_WINDOWBITS || opts.windowBits > exports.Z_MAX_WINDOWBITS) { - throw new Error('Invalid windowBits: ' + opts.windowBits); - } - } - if (opts.level) { - if (opts.level < exports.Z_MIN_LEVEL || opts.level > exports.Z_MAX_LEVEL) { - throw new Error('Invalid compression level: ' + opts.level); - } - } - if (opts.memLevel) { - if (opts.memLevel < exports.Z_MIN_MEMLEVEL || opts.memLevel > exports.Z_MAX_MEMLEVEL) { - throw new Error('Invalid memLevel: ' + opts.memLevel); - } - } - if (opts.strategy) { - if (opts.strategy != exports.Z_FILTERED && opts.strategy != exports.Z_HUFFMAN_ONLY && opts.strategy != exports.Z_RLE && opts.strategy != exports.Z_FIXED && opts.strategy != exports.Z_DEFAULT_STRATEGY) { - throw new Error('Invalid strategy: ' + opts.strategy); - } - } - if (opts.dictionary) { - if (!Buffer.isBuffer(opts.dictionary)) { - throw new Error('Invalid dictionary: it should be a Buffer instance'); - } - } - this._handle = new binding$1.Zlib(mode); - var self = this; - this._hadError = false; - this._handle.onerror = function (message, errno) { - // there is no way to cleanly recover. - // continuing only obscures problems. - _close(self); - self._hadError = true; - var error = new Error(message); - error.errno = errno; - error.code = exports.codes[errno]; - self.emit('error', error); - }; - var level = exports.Z_DEFAULT_COMPRESSION; - if (typeof opts.level === 'number') level = opts.level; - var strategy = exports.Z_DEFAULT_STRATEGY; - if (typeof opts.strategy === 'number') strategy = opts.strategy; - this._handle.init(opts.windowBits || exports.Z_DEFAULT_WINDOWBITS, level, opts.memLevel || exports.Z_DEFAULT_MEMLEVEL, strategy, opts.dictionary); - this._buffer = Buffer.allocUnsafe(this._chunkSize); - this._offset = 0; - this._level = level; - this._strategy = strategy; - this.once('end', this.close); - Object.defineProperty(this, '_closed', { - get: function () { - return !_this._handle; - }, - configurable: true, - enumerable: true - }); - } - util.inherits(Zlib, Transform); - Zlib.prototype.params = function (level, strategy, callback) { - if (level < exports.Z_MIN_LEVEL || level > exports.Z_MAX_LEVEL) { - throw new RangeError('Invalid compression level: ' + level); - } - if (strategy != exports.Z_FILTERED && strategy != exports.Z_HUFFMAN_ONLY && strategy != exports.Z_RLE && strategy != exports.Z_FIXED && strategy != exports.Z_DEFAULT_STRATEGY) { - throw new TypeError('Invalid strategy: ' + strategy); - } - if (this._level !== level || this._strategy !== strategy) { - var self = this; - this.flush(binding$1.Z_SYNC_FLUSH, function () { - assert(self._handle, 'zlib binding closed'); - self._handle.params(level, strategy); - if (!self._hadError) { - self._level = level; - self._strategy = strategy; - if (callback) callback(); - } - }); - } else { - browser$1.nextTick(callback); - } - }; - Zlib.prototype.reset = function () { - assert(this._handle, 'zlib binding closed'); - return this._handle.reset(); - }; - - // This is the _flush function called by the transform class, - // internally, when the last chunk has been written. - Zlib.prototype._flush = function (callback) { - this._transform(Buffer.alloc(0), '', callback); - }; - Zlib.prototype.flush = function (kind, callback) { - var _this2 = this; - var ws = this._writableState; - if (typeof kind === 'function' || kind === undefined && !callback) { - callback = kind; - kind = binding$1.Z_FULL_FLUSH; - } - if (ws.ended) { - if (callback) browser$1.nextTick(callback); - } else if (ws.ending) { - if (callback) this.once('end', callback); - } else if (ws.needDrain) { - if (callback) { - this.once('drain', function () { - return _this2.flush(kind, callback); - }); - } - } else { - this._flushFlag = kind; - this.write(Buffer.alloc(0), '', callback); - } - }; - Zlib.prototype.close = function (callback) { - _close(this, callback); - browser$1.nextTick(emitCloseNT, this); - }; - function _close(engine, callback) { - if (callback) browser$1.nextTick(callback); - - // Caller may invoke .close after a zlib error (which will null _handle). - if (!engine._handle) return; - engine._handle.close(); - engine._handle = null; - } - function emitCloseNT(self) { - self.emit('close'); - } - Zlib.prototype._transform = function (chunk, encoding, cb) { - var flushFlag; - var ws = this._writableState; - var ending = ws.ending || ws.ended; - var last = ending && (!chunk || ws.length === chunk.length); - if (chunk !== null && !Buffer.isBuffer(chunk)) return cb(new Error('invalid input')); - if (!this._handle) return cb(new Error('zlib binding closed')); - - // If it's the last chunk, or a final flush, we use the Z_FINISH flush flag - // (or whatever flag was provided using opts.finishFlush). - // If it's explicitly flushing at some other time, then we use - // Z_FULL_FLUSH. Otherwise, use Z_NO_FLUSH for maximum compression - // goodness. - if (last) flushFlag = this._finishFlushFlag;else { - flushFlag = this._flushFlag; - // once we've flushed the last of the queue, stop flushing and - // go back to the normal behavior. - if (chunk.length >= ws.length) { - this._flushFlag = this._opts.flush || binding$1.Z_NO_FLUSH; - } - } - this._processChunk(chunk, flushFlag, cb); - }; - Zlib.prototype._processChunk = function (chunk, flushFlag, cb) { - var availInBefore = chunk && chunk.length; - var availOutBefore = this._chunkSize - this._offset; - var inOff = 0; - var self = this; - var async = typeof cb === 'function'; - if (!async) { - var buffers = []; - var nread = 0; - var error; - this.on('error', function (er) { - error = er; - }); - assert(this._handle, 'zlib binding closed'); - do { - var res = this._handle.writeSync(flushFlag, chunk, - // in - inOff, - // in_off - availInBefore, - // in_len - this._buffer, - // out - this._offset, - //out_off - availOutBefore); // out_len - } while (!this._hadError && callback(res[0], res[1])); - if (this._hadError) { - throw error; - } - if (nread >= kMaxLength) { - _close(this); - throw new RangeError(kRangeErrorMessage); - } - var buf = Buffer.concat(buffers, nread); - _close(this); - return buf; - } - assert(this._handle, 'zlib binding closed'); - var req = this._handle.write(flushFlag, chunk, - // in - inOff, - // in_off - availInBefore, - // in_len - this._buffer, - // out - this._offset, - //out_off - availOutBefore); // out_len - - req.buffer = chunk; - req.callback = callback; - function callback(availInAfter, availOutAfter) { - // When the callback is used in an async write, the callback's - // context is the `req` object that was created. The req object - // is === this._handle, and that's why it's important to null - // out the values after they are done being used. `this._handle` - // can stay in memory longer than the callback and buffer are needed. - if (this) { - this.buffer = null; - this.callback = null; - } - if (self._hadError) return; - var have = availOutBefore - availOutAfter; - assert(have >= 0, 'have should not go down'); - if (have > 0) { - var out = self._buffer.slice(self._offset, self._offset + have); - self._offset += have; - // serve some output to the consumer. - if (async) { - self.push(out); - } else { - buffers.push(out); - nread += out.length; - } - } - - // exhausted the output buffer, or used all the input create a new one. - if (availOutAfter === 0 || self._offset >= self._chunkSize) { - availOutBefore = self._chunkSize; - self._offset = 0; - self._buffer = Buffer.allocUnsafe(self._chunkSize); - } - if (availOutAfter === 0) { - // Not actually done. Need to reprocess. - // Also, update the availInBefore to the availInAfter value, - // so that if we have to hit it a third (fourth, etc.) time, - // it'll have the correct byte counts. - inOff += availInBefore - availInAfter; - availInBefore = availInAfter; - if (!async) return true; - var newReq = self._handle.write(flushFlag, chunk, inOff, availInBefore, self._buffer, self._offset, self._chunkSize); - newReq.callback = callback; // this same function - newReq.buffer = chunk; - return; - } - if (!async) return false; - - // finished with the chunk. - cb(); - } - }; - util.inherits(Deflate, Zlib); - util.inherits(Inflate, Zlib); - util.inherits(Gzip, Zlib); - util.inherits(Gunzip, Zlib); - util.inherits(DeflateRaw, Zlib); - util.inherits(InflateRaw, Zlib); - util.inherits(Unzip, Zlib); -})(lib); -var zlib = /*@__PURE__*/getDefaultExportFromCjs(lib); - -class PNG { - static decode(path, fn) { - { - throw new Error('PNG.decode not available in browser build'); - } - } - static load(path) { - { - throw new Error('PNG.load not available in browser build'); - } - } - constructor(data) { - let i; - this.data = data; - this.pos = 8; // Skip the default header - - this.palette = []; - this.imgData = []; - this.transparency = {}; - this.text = {}; - while (true) { - const chunkSize = this.readUInt32(); - let section = ''; - for (i = 0; i < 4; i++) { - section += String.fromCharCode(this.data[this.pos++]); - } - switch (section) { - case 'IHDR': - // we can grab interesting values from here (like width, height, etc) - this.width = this.readUInt32(); - this.height = this.readUInt32(); - this.bits = this.data[this.pos++]; - this.colorType = this.data[this.pos++]; - this.compressionMethod = this.data[this.pos++]; - this.filterMethod = this.data[this.pos++]; - this.interlaceMethod = this.data[this.pos++]; - break; - case 'PLTE': - this.palette = this.read(chunkSize); - break; - case 'IDAT': - for (i = 0; i < chunkSize; i++) { - this.imgData.push(this.data[this.pos++]); - } - break; - case 'tRNS': - // This chunk can only occur once and it must occur after the - // PLTE chunk and before the IDAT chunk. - this.transparency = {}; - switch (this.colorType) { - case 3: - // Indexed color, RGB. Each byte in this chunk is an alpha for - // the palette index in the PLTE ("palette") chunk up until the - // last non-opaque entry. Set up an array, stretching over all - // palette entries which will be 0 (opaque) or 1 (transparent). - this.transparency.indexed = this.read(chunkSize); - var short = 255 - this.transparency.indexed.length; - if (short > 0) { - for (i = 0; i < short; i++) { - this.transparency.indexed.push(255); - } - } - break; - case 0: - // Greyscale. Corresponding to entries in the PLTE chunk. - // Grey is two bytes, range 0 .. (2 ^ bit-depth) - 1 - this.transparency.grayscale = this.read(chunkSize)[0]; - break; - case 2: - // True color with proper alpha channel. - this.transparency.rgb = this.read(chunkSize); - break; - } - break; - case 'tEXt': - var text = this.read(chunkSize); - var index = text.indexOf(0); - var key = String.fromCharCode.apply(String, text.slice(0, index)); - this.text[key] = String.fromCharCode.apply(String, text.slice(index + 1)); - break; - case 'IEND': - // we've got everything we need! - switch (this.colorType) { - case 0: - case 3: - case 4: - this.colors = 1; - break; - case 2: - case 6: - this.colors = 3; - break; - } - this.hasAlphaChannel = [4, 6].includes(this.colorType); - var colors = this.colors + (this.hasAlphaChannel ? 1 : 0); - this.pixelBitlength = this.bits * colors; - switch (this.colors) { - case 1: - this.colorSpace = 'DeviceGray'; - break; - case 3: - this.colorSpace = 'DeviceRGB'; - break; - } - this.imgData = Buffer.from(this.imgData); - return; - default: - // unknown (or unimportant) section, skip it - this.pos += chunkSize; - } - this.pos += 4; // Skip the CRC - - if (this.pos > this.data.length) { - throw new Error('Incomplete or corrupt PNG file'); - } - } - } - read(bytes) { - const result = new Array(bytes); - for (let i = 0; i < bytes; i++) { - result[i] = this.data[this.pos++]; - } - return result; - } - readUInt32() { - const b1 = this.data[this.pos++] << 24; - const b2 = this.data[this.pos++] << 16; - const b3 = this.data[this.pos++] << 8; - const b4 = this.data[this.pos++]; - return b1 | b2 | b3 | b4; - } - readUInt16() { - const b1 = this.data[this.pos++] << 8; - const b2 = this.data[this.pos++]; - return b1 | b2; - } - decodePixels(fn) { - return zlib.inflate(this.imgData, (err, data) => { - if (err) throw err; - var pos = 0; - const { - width, - height - } = this; - var pixelBytes = this.pixelBitlength / 8; - const pixels = Buffer.alloc(width * height * pixelBytes); - function pass(x0, y0, dx, dy, singlePass) { - if (singlePass === void 0) { - singlePass = false; - } - const w = Math.ceil((width - x0) / dx); - const h = Math.ceil((height - y0) / dy); - const scanlineLength = pixelBytes * w; - const buffer = singlePass ? pixels : Buffer.alloc(scanlineLength * h); - let row = 0; - let c = 0; - while (row < h && pos < data.length) { - var byte; - var col; - var i; - var left; - var upper; - switch (data[pos++]) { - case 0: - // None - for (i = 0; i < scanlineLength; i++) { - buffer[c++] = data[pos++]; - } - break; - case 1: - // Sub - for (i = 0; i < scanlineLength; i++) { - byte = data[pos++]; - left = i < pixelBytes ? 0 : buffer[c - pixelBytes]; - buffer[c++] = (byte + left) % 256; - } - break; - case 2: - // Up - for (i = 0; i < scanlineLength; i++) { - byte = data[pos++]; - col = (i - i % pixelBytes) / pixelBytes; - upper = row && buffer[(row - 1) * scanlineLength + col * pixelBytes + i % pixelBytes]; - buffer[c++] = (upper + byte) % 256; - } - break; - case 3: - // Average - for (i = 0; i < scanlineLength; i++) { - byte = data[pos++]; - col = (i - i % pixelBytes) / pixelBytes; - left = i < pixelBytes ? 0 : buffer[c - pixelBytes]; - upper = row && buffer[(row - 1) * scanlineLength + col * pixelBytes + i % pixelBytes]; - buffer[c++] = (byte + Math.floor((left + upper) / 2)) % 256; - } - break; - case 4: - // Paeth - for (i = 0; i < scanlineLength; i++) { - var paeth; - var upperLeft; - byte = data[pos++]; - col = (i - i % pixelBytes) / pixelBytes; - left = i < pixelBytes ? 0 : buffer[c - pixelBytes]; - if (row === 0) { - upper = upperLeft = 0; - } else { - upper = buffer[(row - 1) * scanlineLength + col * pixelBytes + i % pixelBytes]; - upperLeft = col && buffer[(row - 1) * scanlineLength + (col - 1) * pixelBytes + i % pixelBytes]; - } - const p = left + upper - upperLeft; - const pa = Math.abs(p - left); - const pb = Math.abs(p - upper); - const pc = Math.abs(p - upperLeft); - if (pa <= pb && pa <= pc) { - paeth = left; - } else if (pb <= pc) { - paeth = upper; - } else { - paeth = upperLeft; - } - buffer[c++] = (byte + paeth) % 256; - } - break; - default: - throw new Error(`Invalid filter algorithm: ${data[pos - 1]}`); - } - if (!singlePass) { - let pixelsPos = ((y0 + row * dy) * width + x0) * pixelBytes; - let bufferPos = row * scanlineLength; - for (i = 0; i < w; i++) { - for (let j = 0; j < pixelBytes; j++) pixels[pixelsPos++] = buffer[bufferPos++]; - pixelsPos += (dx - 1) * pixelBytes; - } - } - row++; - } - } - if (this.interlaceMethod === 1) { - /* - 1 6 4 6 2 6 4 6 - 7 7 7 7 7 7 7 7 - 5 6 5 6 5 6 5 6 - 7 7 7 7 7 7 7 7 - 3 6 4 6 3 6 4 6 - 7 7 7 7 7 7 7 7 - 5 6 5 6 5 6 5 6 - 7 7 7 7 7 7 7 7 - */ - pass(0, 0, 8, 8); // 1 - pass(4, 0, 8, 8); // 2 - pass(0, 4, 4, 8); // 3 - pass(2, 0, 4, 4); // 4 - pass(0, 2, 2, 4); // 5 - pass(1, 0, 2, 2); // 6 - pass(0, 1, 1, 2); // 7 - } else { - pass(0, 0, 1, 1, true); - } - return fn(pixels); - }); - } - decodePalette() { - const { - palette - } = this; - const { - length - } = palette; - const transparency = this.transparency.indexed || []; - const ret = Buffer.alloc(transparency.length + length); - let pos = 0; - let c = 0; - for (let i = 0; i < length; i += 3) { - var left; - ret[pos++] = palette[i]; - ret[pos++] = palette[i + 1]; - ret[pos++] = palette[i + 2]; - ret[pos++] = (left = transparency[c++]) != null ? left : 255; - } - return ret; - } - copyToImageData(imageData, pixels) { - let j; - var k; - let { - colors - } = this; - let palette = null; - let alpha = this.hasAlphaChannel; - if (this.palette.length) { - palette = this._decodedPalette || (this._decodedPalette = this.decodePalette()); - colors = 4; - alpha = true; - } - const data = imageData.data || imageData; - const { - length - } = data; - const input = palette || pixels; - let i = j = 0; - if (colors === 1) { - while (i < length) { - k = palette ? pixels[i / 4] * 4 : j; - const v = input[k++]; - data[i++] = v; - data[i++] = v; - data[i++] = v; - data[i++] = alpha ? input[k++] : 255; - j = k; - } - } else { - while (i < length) { - k = palette ? pixels[i / 4] * 4 : j; - data[i++] = input[k++]; - data[i++] = input[k++]; - data[i++] = input[k++]; - data[i++] = alpha ? input[k++] : 255; - j = k; - } - } - } - decode(fn) { - const ret = Buffer.alloc(this.width * this.height * 4); - return this.decodePixels(pixels => { - this.copyToImageData(ret, pixels); - return fn(ret); - }); - } -} - -export { PNG as default }; diff --git a/packages/png-js/lib/png-js.js b/packages/png-js/lib/png-js.js deleted file mode 100644 index 1712949bf..000000000 --- a/packages/png-js/lib/png-js.js +++ /dev/null @@ -1,339 +0,0 @@ -import fs from 'fs'; -import zlib from 'zlib'; - -class PNG { - static decode(path, fn) { - { - return fs.readFile(path, (err, file) => { - const png = new PNG(file); - return png.decode(pixels => fn(pixels)); - }); - } - } - static load(path) { - { - const file = fs.readFileSync(path); - return new PNG(file); - } - } - constructor(data) { - let i; - this.data = data; - this.pos = 8; // Skip the default header - - this.palette = []; - this.imgData = []; - this.transparency = {}; - this.text = {}; - while (true) { - const chunkSize = this.readUInt32(); - let section = ''; - for (i = 0; i < 4; i++) { - section += String.fromCharCode(this.data[this.pos++]); - } - switch (section) { - case 'IHDR': - // we can grab interesting values from here (like width, height, etc) - this.width = this.readUInt32(); - this.height = this.readUInt32(); - this.bits = this.data[this.pos++]; - this.colorType = this.data[this.pos++]; - this.compressionMethod = this.data[this.pos++]; - this.filterMethod = this.data[this.pos++]; - this.interlaceMethod = this.data[this.pos++]; - break; - case 'PLTE': - this.palette = this.read(chunkSize); - break; - case 'IDAT': - for (i = 0; i < chunkSize; i++) { - this.imgData.push(this.data[this.pos++]); - } - break; - case 'tRNS': - // This chunk can only occur once and it must occur after the - // PLTE chunk and before the IDAT chunk. - this.transparency = {}; - switch (this.colorType) { - case 3: - // Indexed color, RGB. Each byte in this chunk is an alpha for - // the palette index in the PLTE ("palette") chunk up until the - // last non-opaque entry. Set up an array, stretching over all - // palette entries which will be 0 (opaque) or 1 (transparent). - this.transparency.indexed = this.read(chunkSize); - var short = 255 - this.transparency.indexed.length; - if (short > 0) { - for (i = 0; i < short; i++) { - this.transparency.indexed.push(255); - } - } - break; - case 0: - // Greyscale. Corresponding to entries in the PLTE chunk. - // Grey is two bytes, range 0 .. (2 ^ bit-depth) - 1 - this.transparency.grayscale = this.read(chunkSize)[0]; - break; - case 2: - // True color with proper alpha channel. - this.transparency.rgb = this.read(chunkSize); - break; - } - break; - case 'tEXt': - var text = this.read(chunkSize); - var index = text.indexOf(0); - var key = String.fromCharCode.apply(String, text.slice(0, index)); - this.text[key] = String.fromCharCode.apply(String, text.slice(index + 1)); - break; - case 'IEND': - // we've got everything we need! - switch (this.colorType) { - case 0: - case 3: - case 4: - this.colors = 1; - break; - case 2: - case 6: - this.colors = 3; - break; - } - this.hasAlphaChannel = [4, 6].includes(this.colorType); - var colors = this.colors + (this.hasAlphaChannel ? 1 : 0); - this.pixelBitlength = this.bits * colors; - switch (this.colors) { - case 1: - this.colorSpace = 'DeviceGray'; - break; - case 3: - this.colorSpace = 'DeviceRGB'; - break; - } - this.imgData = Buffer.from(this.imgData); - return; - default: - // unknown (or unimportant) section, skip it - this.pos += chunkSize; - } - this.pos += 4; // Skip the CRC - - if (this.pos > this.data.length) { - throw new Error('Incomplete or corrupt PNG file'); - } - } - } - read(bytes) { - const result = new Array(bytes); - for (let i = 0; i < bytes; i++) { - result[i] = this.data[this.pos++]; - } - return result; - } - readUInt32() { - const b1 = this.data[this.pos++] << 24; - const b2 = this.data[this.pos++] << 16; - const b3 = this.data[this.pos++] << 8; - const b4 = this.data[this.pos++]; - return b1 | b2 | b3 | b4; - } - readUInt16() { - const b1 = this.data[this.pos++] << 8; - const b2 = this.data[this.pos++]; - return b1 | b2; - } - decodePixels(fn) { - return zlib.inflate(this.imgData, (err, data) => { - if (err) throw err; - var pos = 0; - const { - width, - height - } = this; - var pixelBytes = this.pixelBitlength / 8; - const pixels = Buffer.alloc(width * height * pixelBytes); - function pass(x0, y0, dx, dy, singlePass) { - if (singlePass === void 0) { - singlePass = false; - } - const w = Math.ceil((width - x0) / dx); - const h = Math.ceil((height - y0) / dy); - const scanlineLength = pixelBytes * w; - const buffer = singlePass ? pixels : Buffer.alloc(scanlineLength * h); - let row = 0; - let c = 0; - while (row < h && pos < data.length) { - var byte; - var col; - var i; - var left; - var upper; - switch (data[pos++]) { - case 0: - // None - for (i = 0; i < scanlineLength; i++) { - buffer[c++] = data[pos++]; - } - break; - case 1: - // Sub - for (i = 0; i < scanlineLength; i++) { - byte = data[pos++]; - left = i < pixelBytes ? 0 : buffer[c - pixelBytes]; - buffer[c++] = (byte + left) % 256; - } - break; - case 2: - // Up - for (i = 0; i < scanlineLength; i++) { - byte = data[pos++]; - col = (i - i % pixelBytes) / pixelBytes; - upper = row && buffer[(row - 1) * scanlineLength + col * pixelBytes + i % pixelBytes]; - buffer[c++] = (upper + byte) % 256; - } - break; - case 3: - // Average - for (i = 0; i < scanlineLength; i++) { - byte = data[pos++]; - col = (i - i % pixelBytes) / pixelBytes; - left = i < pixelBytes ? 0 : buffer[c - pixelBytes]; - upper = row && buffer[(row - 1) * scanlineLength + col * pixelBytes + i % pixelBytes]; - buffer[c++] = (byte + Math.floor((left + upper) / 2)) % 256; - } - break; - case 4: - // Paeth - for (i = 0; i < scanlineLength; i++) { - var paeth; - var upperLeft; - byte = data[pos++]; - col = (i - i % pixelBytes) / pixelBytes; - left = i < pixelBytes ? 0 : buffer[c - pixelBytes]; - if (row === 0) { - upper = upperLeft = 0; - } else { - upper = buffer[(row - 1) * scanlineLength + col * pixelBytes + i % pixelBytes]; - upperLeft = col && buffer[(row - 1) * scanlineLength + (col - 1) * pixelBytes + i % pixelBytes]; - } - const p = left + upper - upperLeft; - const pa = Math.abs(p - left); - const pb = Math.abs(p - upper); - const pc = Math.abs(p - upperLeft); - if (pa <= pb && pa <= pc) { - paeth = left; - } else if (pb <= pc) { - paeth = upper; - } else { - paeth = upperLeft; - } - buffer[c++] = (byte + paeth) % 256; - } - break; - default: - throw new Error(`Invalid filter algorithm: ${data[pos - 1]}`); - } - if (!singlePass) { - let pixelsPos = ((y0 + row * dy) * width + x0) * pixelBytes; - let bufferPos = row * scanlineLength; - for (i = 0; i < w; i++) { - for (let j = 0; j < pixelBytes; j++) pixels[pixelsPos++] = buffer[bufferPos++]; - pixelsPos += (dx - 1) * pixelBytes; - } - } - row++; - } - } - if (this.interlaceMethod === 1) { - /* - 1 6 4 6 2 6 4 6 - 7 7 7 7 7 7 7 7 - 5 6 5 6 5 6 5 6 - 7 7 7 7 7 7 7 7 - 3 6 4 6 3 6 4 6 - 7 7 7 7 7 7 7 7 - 5 6 5 6 5 6 5 6 - 7 7 7 7 7 7 7 7 - */ - pass(0, 0, 8, 8); // 1 - pass(4, 0, 8, 8); // 2 - pass(0, 4, 4, 8); // 3 - pass(2, 0, 4, 4); // 4 - pass(0, 2, 2, 4); // 5 - pass(1, 0, 2, 2); // 6 - pass(0, 1, 1, 2); // 7 - } else { - pass(0, 0, 1, 1, true); - } - return fn(pixels); - }); - } - decodePalette() { - const { - palette - } = this; - const { - length - } = palette; - const transparency = this.transparency.indexed || []; - const ret = Buffer.alloc(transparency.length + length); - let pos = 0; - let c = 0; - for (let i = 0; i < length; i += 3) { - var left; - ret[pos++] = palette[i]; - ret[pos++] = palette[i + 1]; - ret[pos++] = palette[i + 2]; - ret[pos++] = (left = transparency[c++]) != null ? left : 255; - } - return ret; - } - copyToImageData(imageData, pixels) { - let j; - var k; - let { - colors - } = this; - let palette = null; - let alpha = this.hasAlphaChannel; - if (this.palette.length) { - palette = this._decodedPalette || (this._decodedPalette = this.decodePalette()); - colors = 4; - alpha = true; - } - const data = imageData.data || imageData; - const { - length - } = data; - const input = palette || pixels; - let i = j = 0; - if (colors === 1) { - while (i < length) { - k = palette ? pixels[i / 4] * 4 : j; - const v = input[k++]; - data[i++] = v; - data[i++] = v; - data[i++] = v; - data[i++] = alpha ? input[k++] : 255; - j = k; - } - } else { - while (i < length) { - k = palette ? pixels[i / 4] * 4 : j; - data[i++] = input[k++]; - data[i++] = input[k++]; - data[i++] = input[k++]; - data[i++] = alpha ? input[k++] : 255; - j = k; - } - } - } - decode(fn) { - const ret = Buffer.alloc(this.width * this.height * 4); - return this.decodePixels(pixels => { - this.copyToImageData(ret, pixels); - return fn(ret); - }); - } -} - -export { PNG as default }; diff --git a/packages/render/src/operations/addBookmarks.ts b/packages/render/src/operations/addBookmarks.ts index ab28dd002..fbc8f04ce 100644 --- a/packages/render/src/operations/addBookmarks.ts +++ b/packages/render/src/operations/addBookmarks.ts @@ -1,4 +1,4 @@ -import { SafeDocumentNode, SafeNode } from '@react-pdf/layout'; +import { Bookmark, SafeDocumentNode, SafeNode } from '@react-pdf/layout'; import { Context } from '../types'; @@ -14,7 +14,10 @@ const addNodeBookmark = ( if (!node.props) return; if ('bookmark' in node.props && node.props.bookmark) { - const bookmark = node.props.bookmark; + // resolveBookmarks expands plain string titles before rendering, but the + // prop type still admits one — normalize so that case stays sound here. + const raw = node.props.bookmark; + const bookmark: Bookmark = typeof raw === 'string' ? { title: raw } : raw; const { title, parent, expanded, zoom, fit } = bookmark; const outline = registry[parent!] || ctx.outline; const top = bookmark.top || node.box.top; diff --git a/packages/render/src/primitives/renderSvgImage.ts b/packages/render/src/primitives/renderSvgImage.ts index fc3e464f7..807c83395 100644 --- a/packages/render/src/primitives/renderSvgImage.ts +++ b/packages/render/src/primitives/renderSvgImage.ts @@ -6,6 +6,11 @@ const renderImage = (ctx: Context, node: SafeImageNode) => { if (!node.box) return; if (!node.image?.data) return; + // An SVG source resolves to a node tree rather than raster bytes, and + // ctx.image only takes the latter. + const data = node.image.data; + if (!Buffer.isBuffer(data)) return; + const { x = 0, y = 0 } = node.props; const { width, height, opacity } = node.style; const paddingTop = node.box.paddingLeft || 0; @@ -31,12 +36,10 @@ const renderImage = (ctx: Context, node: SafeImageNode) => { ctx.save(); - ctx - .fillOpacity(opacity || 1) - .image(node.image.data, x + paddingLeft, y + paddingTop, { - width, - height, - }); + ctx.fillOpacity(opacity || 1).image(data, x + paddingLeft, y + paddingTop, { + width, + height, + }); ctx.restore(); }; From 3c81bab4e22a6db7dd670617b4dee1b45054eb85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Harun=20=C4=86ati=C4=87?= Date: Thu, 17 Sep 2026 15:05:25 +0200 Subject: [PATCH 10/10] Verify fixed --- break-when-needed-demo.mjs | 85 ++++++++++ long-table-demo.mjs | 95 ++++++++++++ packages/layout/src/node/shouldBreak.ts | 19 ++- packages/layout/src/paginate/toFlow.ts | 15 ++ .../layout/src/steps/resolvePagination.ts | 47 +++++- .../layout/tests/node/shouldBreak.test.ts | 99 ++++++++++++ .../tests/steps/resolvePagination.test.ts | 146 ++++++++++++++++++ 7 files changed, 497 insertions(+), 9 deletions(-) create mode 100644 break-when-needed-demo.mjs create mode 100644 long-table-demo.mjs diff --git a/break-when-needed-demo.mjs b/break-when-needed-demo.mjs new file mode 100644 index 000000000..d23e5b142 --- /dev/null +++ b/break-when-needed-demo.mjs @@ -0,0 +1,85 @@ +/** + * Renders the same invoice-ish document three ways so the effect of + * breakWhenNeeded is visible side by side. + * + * node break-when-needed-demo.mjs [outputDir] + */ + +import path from 'path'; +import { createElement as h } from 'react'; +import { + Document, + Page, + View, + Text, + renderToFile, +} from '@react-pdf/renderer'; + +const outDir = process.argv[2] || process.cwd(); + +const row = (i) => + h( + View, + { + key: i, + style: { + flexDirection: 'row', + justifyContent: 'space-between', + paddingVertical: 6, + borderBottom: '1pt solid #dddddd', + }, + }, + h(Text, { style: { fontSize: 10 } }, `Position ${i + 1}`), + h(Text, { style: { fontSize: 10 } }, `${(i + 1) * 12.5} EUR`), + ); + +const build = ({ breakWhenNeeded, experimentalPagination }) => + h( + Document, + null, + h( + Page, + { + size: 'A4', + style: { padding: 40 }, + ...(experimentalPagination ? { experimentalPagination: true } : {}), + }, + // Tall enough to push the table near the bottom of page 1 + h( + View, + { + style: { + height: 520, + backgroundColor: '#f2f2f2', + marginBottom: 12, + }, + }, + h(Text, { style: { fontSize: 12, padding: 8 } }, 'Header / cover block'), + ), + // The table. Without the prop it starts splitting at the page bottom. + h( + View, + { + style: { border: '1pt solid #999999', padding: 8 }, + ...(breakWhenNeeded ? { breakWhenNeeded: true } : {}), + }, + h(Text, { style: { fontSize: 12, marginBottom: 6 } }, 'Invoice positions'), + ...Array.from({ length: 18 }, (_, i) => row(i)), + ), + ), + ); + +const cases = [ + ['without-breakWhenNeeded.pdf', {}], + ['with-breakWhenNeeded.pdf', { breakWhenNeeded: true }], + [ + 'with-breakWhenNeeded-new-engine.pdf', + { breakWhenNeeded: true, experimentalPagination: true }, + ], +]; + +for (const [name, opts] of cases) { + const file = path.join(outDir, name); + await renderToFile(build(opts), file); + console.log('wrote', file); +} diff --git a/long-table-demo.mjs b/long-table-demo.mjs new file mode 100644 index 000000000..cf5e86f67 --- /dev/null +++ b/long-table-demo.mjs @@ -0,0 +1,95 @@ +/** + * A long invoice table that spans several pages, rendered twice: + * + * wrap - the default: the table starts on page 1 and splits + * breakWhenNeeded - the table waits for page 2, then splits as usual + * + * Renders both PDFs and prints how the rows ended up distributed, so the + * difference is visible without opening anything. + * + * node long-table-demo.mjs [outputDir] [rowCount] + */ + +import fs from 'fs'; +import path from 'path'; +import { createElement as h } from 'react'; +import { Document, Page, View, Text, renderToFile } from '@react-pdf/renderer'; +import { getDocument } from 'pdfjs-dist/legacy/build/pdf.mjs'; + +const outDir = process.argv[2] || process.cwd(); +const ROWS = Number(process.argv[3] || 120); + +const row = (i) => + h( + View, + { + key: i, + style: { + flexDirection: 'row', + justifyContent: 'space-between', + paddingVertical: 6, + borderBottom: '1pt solid #dddddd', + }, + }, + h(Text, { style: { fontSize: 10 } }, `Position ${i + 1}`), + h(Text, { style: { fontSize: 10 } }, `${((i + 1) * 12.5).toFixed(2)} EUR`), + ); + +const build = (tableProps) => + h( + Document, + null, + h( + Page, + { size: 'A4', style: { padding: 40 } }, + // Tall cover block: leaves only a sliver of page 1 for the table + h( + View, + { + style: { + height: 520, + backgroundColor: '#f2f2f2', + marginBottom: 12, + }, + }, + h(Text, { style: { fontSize: 12, padding: 8 } }, 'Header / cover block'), + ), + h( + View, + { style: { border: '1pt solid #999999', padding: 8 }, ...tableProps }, + h( + Text, + { style: { fontSize: 12, marginBottom: 6 } }, + `Invoice positions (${ROWS} rows)`, + ), + ...Array.from({ length: ROWS }, (_, i) => row(i)), + ), + ), + ); + +const report = async (label, file) => { + const data = new Uint8Array(fs.readFileSync(file)); + const doc = await getDocument({ data, verbosity: 0 }).promise; + + const perPage = []; + for (let i = 1; i <= doc.numPages; i += 1) { + const page = await doc.getPage(i); + const items = (await page.getTextContent()).items.map((it) => it.str); + perPage.push(items.filter((s) => s.startsWith('Position')).length); + } + + console.log( + `${label.padEnd(16)} ${doc.numPages} pages | rows per page: [${perPage.join(', ')}]`, + ); +}; + +const cases = [ + ['wrap', { wrap: false }], + ['breakWhenNeeded', { wrap: true, breakWhenNeeded: true }], +]; + +for (const [label, props] of cases) { + const file = path.join(outDir, `long-table-${label}.pdf`); + await renderToFile(build(props), file); + await report(label, file); +} diff --git a/packages/layout/src/node/shouldBreak.ts b/packages/layout/src/node/shouldBreak.ts index 9bbe00033..e6fa47de2 100644 --- a/packages/layout/src/node/shouldBreak.ts +++ b/packages/layout/src/node/shouldBreak.ts @@ -2,6 +2,10 @@ import { SafeNode } from '../types'; import getWrap from './getWrap'; import isFixed from './isFixed'; +// Mirrors SAFETY_THRESHOLD in resolvePagination. An overflow smaller than this +// is not split there, so it must not cost a whole page here either. +const SAFETY_THRESHOLD = 0.001; + const getBreak = (node: SafeNode) => 'break' in node.props ? node.props.break : false; @@ -43,6 +47,7 @@ const shouldBreak = ( futureElements: SafeNode[], height: number, previousElements: SafeNode[], + contentAbove = false, ) => { if ('fixed' in child.props) return false; @@ -56,11 +61,21 @@ const shouldBreak = ( // (as long as react-pdf does not support breaking into differently sized containers) const breakingImprovesPresence = previousElements.filter((node: SafeNode) => !isFixed(node)).length > 0; + // Unlike minPresenceAhead, moving also pays off for a node that is the first + // child of its container, as long as something sits above that container on + // the page — it still gains a full page by waiting for the next one. + const movingImprovesPresence = contentAbove || breakingImprovesPresence; + + // Use the same tolerance as resolvePagination, so an overflow it would leave + // alone never moves the node to the next page. + const overflowsPage = + height + SAFETY_THRESHOLD < child.box.top + child.box.height; + const shouldBreakWhenNeeded = - shouldSplit && + overflowsPage && canWrap && getBreakWhenNeeded(child) && - breakingImprovesPresence; + movingImprovesPresence; return ( getBreak(child) || diff --git a/packages/layout/src/paginate/toFlow.ts b/packages/layout/src/paginate/toFlow.ts index 01de2b391..d9cf7822e 100644 --- a/packages/layout/src/paginate/toFlow.ts +++ b/packages/layout/src/paginate/toFlow.ts @@ -143,11 +143,26 @@ const absoluteOf = (node: SafeNode, ctx: PageCtx): FlowNode => { return { box: boxOf(node), id: node.type, data: node, absolute: true }; }; +// This engine has no notion of "do not split on the first attempt", so +// breakWhenNeeded cannot be honoured here. Say so once instead of silently +// laying the node out as if the prop were absent. +let warnedBreakWhenNeeded = false; + +const warnBreakWhenNeededUnsupported = () => { + if (warnedBreakWhenNeeded) return; + warnedBreakWhenNeeded = true; + console.warn( + 'breakWhenNeeded is not supported by the experimental pagination engine and will be ignored; the node splits as if the prop were absent.', + ); +}; + // Flags apply where a node enters a flow, never on split or materialized // fragments. const withFlags = (child: SafeNode, node: FlowNode): FlowNode => { const presence = (child.props as any).minPresenceAhead; + if ((child.props as any).breakWhenNeeded) warnBreakWhenNeededUnsupported(); + return { ...node, ...(isFixed(child) ? { repeat: true } : {}), diff --git a/packages/layout/src/steps/resolvePagination.ts b/packages/layout/src/steps/resolvePagination.ts index 9e679ecc6..d17a9e5f1 100644 --- a/packages/layout/src/steps/resolvePagination.ts +++ b/packages/layout/src/steps/resolvePagination.ts @@ -44,7 +44,16 @@ const warnUnavailableSpace = (node: SafeNode) => { ); }; -const splitNodes = (height: number, contentArea: number, nodes: SafeNode[]) => { +// `contentAbove` says whether anything is already placed above this group on +// the current page. Nested groups need it: a node can be the first child of its +// container and still gain a page by moving, when the container itself is not +// at the top of the page. +const splitNodes = ( + height: number, + contentArea: number, + nodes: SafeNode[], + contentAbove = false, +) => { const currentChildren: SafeNode[] = []; const nextChildren: SafeNode[] = []; @@ -61,6 +70,7 @@ const splitNodes = (height: number, contentArea: number, nodes: SafeNode[]) => { futureNodes, height, currentChildren, + contentAbove, ); const shouldSplit = height + SAFETY_THRESHOLD < nodeTop + nodeHeight; const canWrap = canNodeWrap(child); @@ -100,7 +110,12 @@ const splitNodes = (height: number, contentArea: number, nodes: SafeNode[]) => { } if (shouldSplit) { - const [currentChild, nextChild] = split(child, height, contentArea); + const [currentChild, nextChild] = split( + child, + height, + contentArea, + contentAbove || currentChildren.some((node) => !isFixed(node)), + ); // All children are moved to the next page, it doesn't make sense to show the parent on the current page if (child.children.length > 0 && currentChild.children.length === 0) { @@ -132,18 +147,29 @@ const splitNodes = (height: number, contentArea: number, nodes: SafeNode[]) => { return [currentChildren, nextChildren]; }; -const splitChildren = (height: number, contentArea: number, node: SafeNode) => { +const splitChildren = ( + height: number, + contentArea: number, + node: SafeNode, + contentAbove: boolean, +) => { const children = node.children || []; const availableHeight = height - getTop(node); - return splitNodes(availableHeight, contentArea, children); + return splitNodes(availableHeight, contentArea, children, contentAbove); }; -const splitView = (node: SafeNode, height: number, contentArea: number) => { +const splitView = ( + node: SafeNode, + height: number, + contentArea: number, + contentAbove: boolean, +) => { const [currentNode, nextNode] = splitNode(node, height); const [currentChilds, nextChildren] = splitChildren( height, contentArea, node, + contentAbove, ); return [ @@ -152,8 +178,15 @@ const splitView = (node: SafeNode, height: number, contentArea: number) => { ]; }; -const split = (node: SafeNode, height: number, contentArea: number) => - isText(node) ? splitText(node, height) : splitView(node, height, contentArea); +const split = ( + node: SafeNode, + height: number, + contentArea: number, + contentAbove: boolean, +) => + isText(node) + ? splitText(node, height) + : splitView(node, height, contentArea, contentAbove); const shouldResolveDynamicNodes = (node: SafeNode) => { const children = node.children || []; diff --git a/packages/layout/tests/node/shouldBreak.test.ts b/packages/layout/tests/node/shouldBreak.test.ts index 877c4ee36..e746d903a 100644 --- a/packages/layout/tests/node/shouldBreak.test.ts +++ b/packages/layout/tests/node/shouldBreak.test.ts @@ -1098,4 +1098,103 @@ describe('node shouldBreak', () => { // endOfPresence = 600 + 200 + 0 + 300 = 1100 > 1000 expect(result).toEqual(true); }); + + test('should not break for breakWhenNeeded when the overflow is below the safety threshold', () => { + // 20 + 40.0005 = 60.0005 against a height of 60: resolvePagination + // tolerates this, so moving the node to the next page would be wrong. + const result = shouldBreak( + { + type: 'VIEW', + props: { wrap: true, breakWhenNeeded: true }, + style: {}, + children: [], + box: { + top: 20, + right: 0, + bottom: 0, + left: 0, + height: 40.0005, + width: 5, + marginTop: 0, + marginBottom: 0, + }, + }, + [], + 60, + [ + { + type: 'VIEW', + props: {}, + style: {}, + children: [], + box: { + top: 0, + right: 0, + bottom: 0, + left: 0, + height: 20, + width: 5, + }, + }, + ], + ); + + expect(result).toEqual(false); + }); + + test('should break for breakWhenNeeded on a first child when content sits above its container', () => { + // No previous siblings inside the container, but contentAbove is true, + // so the node still gains a full page by moving. + const result = shouldBreak( + { + type: 'VIEW', + props: { wrap: true, breakWhenNeeded: true }, + style: {}, + children: [], + box: { + top: 0, + right: 0, + bottom: 0, + left: 0, + height: 90, + width: 5, + marginTop: 0, + marginBottom: 0, + }, + }, + [], + 40, + [], + true, + ); + + expect(result).toEqual(true); + }); + + test('should not break for breakWhenNeeded when nothing sits above the node', () => { + const result = shouldBreak( + { + type: 'VIEW', + props: { wrap: true, breakWhenNeeded: true }, + style: {}, + children: [], + box: { + top: 0, + right: 0, + bottom: 0, + left: 0, + height: 90, + width: 5, + marginTop: 0, + marginBottom: 0, + }, + }, + [], + 40, + [], + false, + ); + + expect(result).toEqual(false); + }); }); diff --git a/packages/layout/tests/steps/resolvePagination.test.ts b/packages/layout/tests/steps/resolvePagination.test.ts index 830dc8456..ab631d439 100644 --- a/packages/layout/tests/steps/resolvePagination.test.ts +++ b/packages/layout/tests/steps/resolvePagination.test.ts @@ -535,4 +535,150 @@ describe('pagination step', () => { expect(subChapter3.props!.bookmark).toEqual(bookmarkSubChapter3); }); + + test('should move a nested breakWhenNeeded container that is the first child of its wrapper', async () => { + const yoga = await loadYoga(); + + // The wrapper starts 20pt down the page, so its first child has nothing + // above it inside the wrapper but still gains a page by moving. + const layout = calcLayout({ + type: 'DOCUMENT', + yoga, + props: {}, + children: [ + { + type: 'PAGE', + props: {}, + style: { width: 5, height: 60 }, + children: [ + { + type: 'VIEW', + style: { width: 5, height: 20 }, + props: {}, + children: [], + }, + { + type: 'VIEW', + style: { width: 5 }, + props: {}, + children: [ + { + type: 'VIEW', + style: { width: 5 }, + props: { breakWhenNeeded: true }, + children: [ + { + type: 'VIEW', + style: { height: 30 }, + props: {}, + children: [], + }, + { + type: 'VIEW', + style: { height: 30 }, + props: {}, + children: [], + }, + { + type: 'VIEW', + style: { height: 30 }, + props: {}, + children: [], + }, + ], + }, + ], + }, + ], + }, + ], + }); + + expect(layout.children).toHaveLength(3); + + // Page 1 keeps only the 20pt sibling: the wrapper moved whole + expect(layout.children[0].children).toHaveLength(1); + + // The container splits from page 2 onwards, never on page 1 + const onPage2 = layout.children[1].children![0].children![0]; + const onPage3 = layout.children[2].children![0].children![0]; + + expect(onPage2.children).toHaveLength(2); + expect(onPage3.children).toHaveLength(1); + }); + + // A table long enough to run over five pages. The cover block above it is + // 60 tall on a 100 tall page, so only two rows fit in what is left of + // page 1; every later page holds five. + const LONG_TABLE_ROWS = 20; + + const longTableDocument = (yoga: any, tableProps: any): any => ({ + type: 'DOCUMENT', + yoga, + props: {}, + children: [ + { + type: 'PAGE', + props: {}, + style: { width: 10, height: 100 }, + children: [ + { + type: 'VIEW', + style: { width: 10, height: 60 }, + props: {}, + children: [], + }, + { + type: 'VIEW', + style: { width: 10 }, + props: tableProps, + children: Array.from({ length: LONG_TABLE_ROWS }, () => ({ + type: 'VIEW', + style: { height: 20 }, + props: {}, + children: [], + })), + }, + ], + }, + ], + }); + + // How many table rows landed on each page. The cover block has no + // children, so the table is the only node with any. + const rowsPerPage = (layout: any): number[] => + layout.children.map((page: any) => { + const table = (page.children || []).find( + (child: any) => (child.children || []).length > 0, + ); + + return table ? table.children.length : 0; + }); + + test('should split a long wrapping table starting at the bottom of page 1', async () => { + const yoga = await loadYoga(); + + const layout = calcLayout(longTableDocument(yoga, { wrap: true })); + + expect(layout.children).toHaveLength(5); + + // Two rows are stranded under the cover block before the first split + expect(rowsPerPage(layout)).toEqual([2, 5, 5, 5, 3]); + }); + + test('should move a long breakWhenNeeded table to page 2 and split it from there', async () => { + const yoga = await loadYoga(); + + const layout = calcLayout( + longTableDocument(yoga, { wrap: true, breakWhenNeeded: true }), + ); + + // Same row count and same page count, but page 1 keeps none of them + expect(layout.children).toHaveLength(5); + expect(rowsPerPage(layout)).toEqual([0, 5, 5, 5, 5]); + + // Every row still gets rendered, just starting one page later + const total = rowsPerPage(layout).reduce((a, b) => a + b, 0); + expect(total).toBe(LONG_TABLE_ROWS); + }); });