diff --git a/.browserslistrc b/.browserslistrc deleted file mode 100644 index 9defcdad..00000000 --- a/.browserslistrc +++ /dev/null @@ -1 +0,0 @@ -last 2 year, firefox esr diff --git a/.editorconfig b/.editorconfig index d18cc919..7907cdff 100644 --- a/.editorconfig +++ b/.editorconfig @@ -6,7 +6,6 @@ root = true [*] indent_style = tab -indent_size = 4 end_of_line = lf charset = utf-8 @@ -16,6 +15,10 @@ insert_final_newline = true [*.md] trim_trailing_whitespace = false -[*.{json,md,yml}] +[*.{json,yml}] +indent_style = space +indent_size = 2 + +[.eslintrc] indent_style = space indent_size = 2 diff --git a/.eslintignore b/.eslintignore index 219bb10b..512bdec8 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,3 +1,9 @@ -public/ +# built by tools +client/js/libs.min.js +client/js/lounge.templates.js + +# third party +client/js/libs/jquery/*.js +client/js/libs/*.js + coverage/ -dist/ diff --git a/.eslintrc.cjs b/.eslintrc.cjs deleted file mode 100644 index 11d3112e..00000000 --- a/.eslintrc.cjs +++ /dev/null @@ -1,193 +0,0 @@ -// @ts-check -const {defineConfig} = require("eslint-define-config"); - -const projects = defineConfig({ - parserOptions: { - project: [ - "./tsconfig.json", - "./client/tsconfig.json", - "./server/tsconfig.json", - "./shared/tsconfig.json", - "./test/tsconfig.json", - ], - }, -}).parserOptions.project; - -const baseRules = defineConfig({ - rules: { - "block-scoped-var": "error", - curly: ["error", "all"], - "dot-notation": "error", - eqeqeq: "error", - "handle-callback-err": "error", - "no-alert": "error", - "no-catch-shadow": "error", - "no-control-regex": "off", - "no-console": "error", - "no-duplicate-imports": "error", - "no-else-return": "error", - "no-implicit-globals": "error", - "no-restricted-globals": ["error", "event", "fdescribe"], - "no-template-curly-in-string": "error", - "no-unsafe-negation": "error", - "no-useless-computed-key": "error", - "no-useless-constructor": "error", - "no-useless-return": "error", - "no-use-before-define": [ - "error", - { - functions: false, - }, - ], - "no-var": "error", - "object-shorthand": [ - "error", - "methods", - { - avoidExplicitReturnArrows: true, - }, - ], - "padding-line-between-statements": [ - "error", - { - blankLine: "always", - prev: ["block", "block-like"], - next: "*", - }, - { - blankLine: "always", - prev: "*", - next: ["block", "block-like"], - }, - ], - "prefer-const": "error", - "prefer-rest-params": "error", - "prefer-spread": "error", - "spaced-comment": ["error", "always"], - strict: "off", - yoda: "error", - }, -}).rules; - -const vueRules = defineConfig({ - rules: { - "import/no-default-export": 0, - "import/unambiguous": 0, // vue SFC can miss script tags - "@typescript-eslint/prefer-readonly": 0, // can be used in template - "vue/component-tags-order": [ - "error", - { - order: ["template", "style", "script"], - }, - ], - "vue/multi-word-component-names": "off", - "vue/no-mutating-props": "off", - "vue/no-v-html": "off", - "vue/require-default-prop": "off", - "vue/v-slot-style": ["error", "longform"], - }, -}).rules; - -const tsRules = defineConfig({ - rules: { - // note you must disable the base rule as it can report incorrect errors - "no-shadow": "off", - "@typescript-eslint/no-shadow": ["error"], - "@typescript-eslint/no-redundant-type-constituents": "off", - }, -}).rules; - -const tsRulesTemp = defineConfig({ - rules: { - // TODO: eventually remove these - "@typescript-eslint/ban-ts-comment": "off", - "@typescript-eslint/no-explicit-any": "off", - "@typescript-eslint/no-non-null-assertion": "off", - "@typescript-eslint/no-this-alias": "off", - "@typescript-eslint/no-unnecessary-type-assertion": "off", - "@typescript-eslint/no-unsafe-argument": "off", - "@typescript-eslint/no-unsafe-assignment": "off", - "@typescript-eslint/no-unsafe-call": "off", - "@typescript-eslint/no-unsafe-member-access": "off", - "@typescript-eslint/no-unused-vars": "off", - }, -}).rules; - -const tsTestRulesTemp = defineConfig({ - rules: { - // TODO: remove these - "@typescript-eslint/no-unsafe-return": "off", - "@typescript-eslint/no-empty-function": "off", - "@typescript-eslint/restrict-plus-operands": "off", - }, -}).rules; - -module.exports = defineConfig({ - root: true, - parserOptions: { - ecmaVersion: 2022, - }, - overrides: [ - { - files: ["**/*.ts", "**/*.vue"], - parser: "@typescript-eslint/parser", - parserOptions: { - tsconfigRootDir: __dirname, - project: projects, - extraFileExtensions: [".vue"], - }, - plugins: ["@typescript-eslint"], - extends: [ - "eslint:recommended", - "plugin:@typescript-eslint/recommended", - "plugin:@typescript-eslint/recommended-requiring-type-checking", - "prettier", - ], - rules: { - ...baseRules, - ...tsRules, - ...tsRulesTemp, - }, - }, - { - files: ["**/*.vue"], - parser: "vue-eslint-parser", - parserOptions: { - ecmaVersion: 2022, - ecmaFeatures: { - jsx: true, - }, - parser: "@typescript-eslint/parser", - tsconfigRootDir: __dirname, - project: projects, - }, - plugins: ["vue"], - extends: [ - "eslint:recommended", - "plugin:vue/vue3-recommended", - "plugin:@typescript-eslint/recommended", - "plugin:@typescript-eslint/recommended-requiring-type-checking", - "prettier", - ], - rules: {...baseRules, ...tsRules, ...tsRulesTemp, ...vueRules}, - }, - { - files: ["./tests/**/*.ts"], - parser: "@typescript-eslint/parser", - rules: { - ...baseRules, - ...tsRules, - ...tsRulesTemp, - ...tsTestRulesTemp, - }, - }, - ], - env: { - es6: true, - browser: true, - mocha: true, - node: true, - }, - extends: ["eslint:recommended", "prettier"], - rules: baseRules, -}); diff --git a/.eslintrc.yml b/.eslintrc.yml new file mode 100644 index 00000000..971713e2 --- /dev/null +++ b/.eslintrc.yml @@ -0,0 +1,43 @@ +--- + +root: true + +env: + browser: true + mocha: true + node: true + +rules: + block-spacing: [2, always] + brace-style: [2, 1tbs] + comma-dangle: 0 + curly: [2, all] + eqeqeq: 2 + indent: [2, tab] + key-spacing: [2, {beforeColon: false, afterColon: true}] + keyword-spacing: [2, {before: true, after: true}] + linebreak-style: [2, unix] + no-console: 0 + no-control-regex: 0 + no-inner-declarations: 2 + no-invalid-regexp: 2 + no-irregular-whitespace: 2 + no-trailing-spaces: 2 + no-unexpected-multiline: 2 + no-unreachable: 2 + object-curly-spacing: [2, never] + quotes: [2, double, avoid-escape] + semi: [2, always] + space-before-blocks: 2 + space-infix-ops: 2 + spaced-comment: [2, always] + +globals: + log: false + $: false + Favico: false + Handlebars: false + io: false + Mousetrap: false + +extends: eslint:recommended diff --git a/.github/ISSUE_TEMPLATE/Bug_Report.md b/.github/ISSUE_TEMPLATE/Bug_Report.md deleted file mode 100644 index 22efc625..00000000 --- a/.github/ISSUE_TEMPLATE/Bug_Report.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -name: Bug Report -about: Create a bug report -labels: "Type: Bug" ---- - - - -- _Node version:_ -- _Browser version:_ -- _Device, operating system:_ -- _The Lounge version:_ - ---- diff --git a/.github/ISSUE_TEMPLATE/Feature_Request.md b/.github/ISSUE_TEMPLATE/Feature_Request.md deleted file mode 100644 index a0ea13c3..00000000 --- a/.github/ISSUE_TEMPLATE/Feature_Request.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -name: Feature Request -about: Request a new feature -labels: "Type: Feature" ---- - - - - -### Feature Description diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml deleted file mode 100644 index a06afb86..00000000 --- a/.github/ISSUE_TEMPLATE/config.yml +++ /dev/null @@ -1,16 +0,0 @@ -contact_links: - - name: Docker container issues - url: https://github.com/thelounge/thelounge-docker/issues - about: Report issues related to the Docker container here - - - name: Debian package issues - url: https://github.com/thelounge/thelounge-deb/issues - about: Report issues related to the Debian package here - - - name: Arch Linux package issues - url: https://github.com/thelounge/thelounge-archlinux/issues - about: Report issues related to the Arch Linux package here - - - name: General support - url: https://demo.thelounge.chat/?join=%23thelounge - about: "Join #thelounge on Libera.Chat to ask a question before creating an issue" diff --git a/.github/SUPPORT.md b/.github/SUPPORT.md deleted file mode 100644 index 62c3148e..00000000 --- a/.github/SUPPORT.md +++ /dev/null @@ -1,11 +0,0 @@ -## Support - -Welcome to The Lounge, it's great to have you here! If you have a question, or -need help, you have a few options: - -- Check out [existing questions on Stack Overflow](https://stackoverflow.com/questions/tagged/thelounge) - to see if yours has been answered before. If not, feel free to [ask for a new question](https://stackoverflow.com/questions/ask?tags=thelounge) - (using `thelounge` tag so that other people can easily find it). -- Find us on the Libera.Chat channel `#thelounge`. You might not get an answer - right away, but this channel is full of nice people who will be happy to - help you. diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml deleted file mode 100644 index c2d7665b..00000000 --- a/.github/workflows/build.yml +++ /dev/null @@ -1,48 +0,0 @@ -name: Build - -permissions: - contents: read - -on: [push, pull_request] - -jobs: - build: - name: Node ${{ matrix.node_version }} on ${{ matrix.os }} - - strategy: - matrix: - include: - # EOL: April 2025 - - os: macOS-latest - node_version: 18.x - - os: windows-latest - node_version: 18.x - - os: ubuntu-latest - node_version: 18.x - # EOL: April 2026 - - os: ubuntu-latest - node_version: 20.x - # EOL: April June 2024 - - os: ubuntu-latest - node_version: 21.x - - runs-on: ${{ matrix.os }} - - steps: - - uses: actions/checkout@master - - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: ${{ matrix.node_version }} - - - name: Install - run: yarn --frozen-lockfile --non-interactive - - - name: Build - run: yarn build - env: - NODE_ENV: production - - - name: Test - run: yarn test diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml deleted file mode 100644 index 370178fe..00000000 --- a/.github/workflows/release.yml +++ /dev/null @@ -1,53 +0,0 @@ -name: Release - -permissions: - contents: read - id-token: write - -on: - push: - tags: v* - -jobs: - release: - name: Release workflow - - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@master - - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: "latest" - registry-url: "https://registry.npmjs.org/" - - - name: Install - run: yarn --frozen-lockfile --non-interactive - - - name: Build - run: yarn build - env: - NODE_ENV: production - - - name: Test - run: yarn test - - - name: Publish latest - if: "!contains(github.ref, '-')" - run: npm publish --tag latest --provenance - env: - NODE_AUTH_TOKEN: ${{ secrets.NODE_AUTH_TOKEN }} - - - name: Publish next - if: contains(github.ref, '-') - run: npm publish --tag next --provenance - env: - NODE_AUTH_TOKEN: ${{ secrets.NODE_AUTH_TOKEN }} - - - name: Remove next tag - if: "!contains(github.ref, '-')" - run: npm dist-tag rm thelounge next || true - env: - NODE_AUTH_TOKEN: ${{ secrets.NODE_AUTH_TOKEN }} diff --git a/.gitignore b/.gitignore index 2f36fb37..082fcf7b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,11 @@ node_modules/ -npm-debug.log* -yarn-debug.log* -yarn-error.log* -package-lock.json +npm-debug.log coverage/ -public/ -dist/ + +# Built assets created at npm install/prepublish time +# See https://docs.npmjs.com/misc/scripts +client/fonts/ +client/js/libs.min.js.map +client/js/libs.min.js +client/js/lounge.templates.js diff --git a/.istanbul.yml b/.istanbul.yml new file mode 100644 index 00000000..e6e79229 --- /dev/null +++ b/.istanbul.yml @@ -0,0 +1,8 @@ +instrumentation: + include-all-sources: true + excludes: + - Gruntfile.js + - client/js/libs/*.js + - client/js/libs/jquery/*.js + - client/js/libs.min.js + - client/js/lounge.js diff --git a/.npmignore b/.npmignore new file mode 100644 index 00000000..6115c65f --- /dev/null +++ b/.npmignore @@ -0,0 +1,19 @@ +# This file must not contain generated assets listed in .gitignore. +# npm-debug.log and node_modules/ are ignored by default. +# See https://docs.npmjs.com/misc/developers#keeping-files-out-of-your-package + +client/views/ +coverage/ +scripts/ +test/ +.editorconfig +.eslintignore +.eslintrc.yml +.gitattributes +.gitignore +.istanbul.yml +.npmignore +.stylelintrc +.travis.yml +appveyor.yml +Gruntfile.js diff --git a/.npmrc b/.npmrc deleted file mode 100644 index 8863826c..00000000 --- a/.npmrc +++ /dev/null @@ -1,2 +0,0 @@ -save-exact = true -sign-git-tag = true diff --git a/.prettierignore b/.prettierignore deleted file mode 100644 index 5dabdfae..00000000 --- a/.prettierignore +++ /dev/null @@ -1,28 +0,0 @@ -coverage/ -public/ -dist/ -test/fixtures/.thelounge/logs/ -test/fixtures/.thelounge/certificates/ -test/fixtures/.thelounge/storage/ -test/fixtures/.thelounge/sts-policies.json -*.log -*.png -*.svg -*.ico -*.wav -*.tpl -*.sh -*.opts -*.txt -yarn.lock -.gitignore -.npmrc -.npmignore -.prettierignore -.thelounge_home -.editorconfig -.eslintignore -.gitattributes -.browserslistrc - -*.css diff --git a/.stylelintrc b/.stylelintrc new file mode 100644 index 00000000..d346c411 --- /dev/null +++ b/.stylelintrc @@ -0,0 +1,74 @@ +{ + "ignoreFiles": [ + "client/css/bootstrap.css", + "coverage/**/*.css" + ], + "rules": { + "at-rule-empty-line-before": ["always", { + "except": ["blockless-group", "first-nested"], + "ignore": ["after-comment"] + }], + "block-closing-brace-newline-after": "always", + "block-closing-brace-newline-before": "always-multi-line", + "block-closing-brace-space-before": "always-single-line", + "block-no-empty": true, + "block-opening-brace-newline-after": "always-multi-line", + "block-opening-brace-space-after": "always-single-line", + "block-opening-brace-space-before": "always", + "color-hex-case": "lower", + "color-hex-length": "short", + "color-no-invalid-hex": true, + "comment-empty-line-before": ["always", { + "except": ["first-nested"], + "ignore": ["stylelint-commands"] + }], + "comment-whitespace-inside": "always", + "declaration-bang-space-after": "never", + "declaration-bang-space-before": "always", + "declaration-block-semicolon-newline-after": "always-multi-line", + "declaration-block-semicolon-space-after": "always-single-line", + "declaration-block-semicolon-space-before": "never", + "declaration-block-single-line-max-declarations": 1, + "declaration-colon-newline-after": "always-multi-line", + "declaration-colon-space-after": "always-single-line", + "declaration-colon-space-before": "never", + "function-calc-no-unspaced-operator": true, + "function-comma-newline-after": "always-multi-line", + "function-comma-space-after": "always-single-line", + "function-comma-space-before": "never", + "function-parentheses-newline-inside": "always-multi-line", + "function-parentheses-space-inside": "never-single-line", + "function-whitespace-after": "always", + "function-url-quotes": "always", + "indentation": "tab", + "max-empty-lines": 1, + "media-feature-colon-space-after": "always", + "media-feature-colon-space-before": "never", + "media-feature-range-operator-space-after": "always", + "media-feature-range-operator-space-before": "always", + "media-query-list-comma-newline-after": "always-multi-line", + "media-query-list-comma-space-after": "always-single-line", + "media-query-list-comma-space-before": "never", + "media-query-parentheses-space-inside": "never", + "no-eol-whitespace": true, + "no-missing-eof-newline": true, + "number-leading-zero": "never", + "number-no-trailing-zeros": true, + "length-zero-no-unit": true, + "declaration-block-no-duplicate-properties": true, + "declaration-block-no-shorthand-property-overrides": true, + "rule-non-nested-empty-line-before": ["always-multi-line", { + "ignore": ["after-comment"] + }], + "declaration-block-trailing-semicolon": "always", + "selector-combinator-space-after": "always", + "selector-combinator-space-before": "always", + "selector-list-comma-newline-after": "always", + "selector-list-comma-space-before": "never", + "selector-pseudo-element-colon-notation": "single", + "string-quotes": "double", + "value-list-comma-newline-after": "always-multi-line", + "value-list-comma-space-after": "always-single-line", + "value-list-comma-space-before": "never" + } +} diff --git a/.thelounge_home b/.thelounge_home deleted file mode 100644 index 88044472..00000000 --- a/.thelounge_home +++ /dev/null @@ -1 +0,0 @@ -~/.thelounge diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000..6c8bce0f --- /dev/null +++ b/.travis.yml @@ -0,0 +1,30 @@ +language: node_js +node_js: +- 6 +- 4 + +matrix: + fast_finish: true + include: + - os: osx + node_js: 4 + +cache: + directories: + - node_modules + +notifications: + email: + on_success: never + on_failure: always + +deploy: + provider: npm + email: + secure: Eb/dO3VEnuG5CFSJbiTBDZ4X29o1bTITqfzc4SZJqkSKHLZ5/l0VHyd1In7T2U9yBtysnmm+dsOWYFwnH5NMt5kvGkkX754HBDz0QXO//IqADA/1cH1MMXuzJjRvHNrtbq3c6Iv0vO827kXfvqwkfGTmXfreT5w+xF7Y+0SjF8pfu2d/Z5omrmoy9J9SF/kfmahKYZwakc3h8p29JPmnFMUAR0JiZS/2gLSHQnGA3mCcnlO+U3bQuTVW3Z9RhiG51f/EMFfNZ8pBttM6CgE2Zth3AT50jbKjRgYdYN2ee/Z3qUJIoA6dfPALC7B+Z2UekqTiKx4SCk+9vZJJXqT8J+Fe67Dki/FgNWnEZaTn8eFs+Gfh2nnokNZUMd/2mMT0y0KbRaOYQarn6lFw+/Cn9hD6e8uRCqY0+YspMvGtV3LuHFy+br6YphlG6YKxJzExtGDvrwlDD70xJtqcgnlET3XOdzvfCpRSskh7FmVJMoL39f/j9r4FzWVDmfnRnDT6Cac2dSdbQM0Ldw3+65l/57K/Km7NeHbLA3LsnjSJqXuysYwosd6iUOQen59Dy+TvwKafEfAGXWcZNguFURIMf2LRZ4rwTZl6pp30nj23U6rmkWm3JTRZC95i/O4yP2rVoljNUEuMlHVts63r3lwXtuGQVo3+lQCYErK4Ceo7cQc= + api_key: + secure: I9iN31GWI+Mz0xPw81N7qh1M6uidB+3BmiPUXt8QigX45zwp9EhvfZ0U/AIdUyQwzK2RK1zLRQSt+2/1jyeVi+U+AAsRRmaAUx8iqKaQPAkPnQtElolgRP04WSgo7fvNejfM7zS939bQNKG3RlSm04yPgu+ke2igf799p2bpFe2LtyoEeIiUfrUkBiMSpMguN9XF8a7jqCyIouTKjXHR24RmzJ9r7ZoMV27yQauS7XlD81bontzNRZxTytDKdJpZ+sxGIT9mbbtM4LUFX8MeNe3p/bjWavEhrO0ZIpkbOfS/L/w1375YDoNPXxCs288lnGUH+NbGNAEfn+BTz8cmUp7jI7QWR/kNACPeopdAX4OdZxT8wfQcfQZrfCuSpKciOMC7vGgPpQqjQ61t1RKcKs9VUnwC0SwWjyo8LlzkFKnP1ks0eDGYsSoPLdpC9+76UmePkQdxMhscO8TOgkOCcsTMLiyt6ABGOGKu2iE5SsjUYtPiSiRzSBAQENoO560+xBSVTKwqvvhzUAIt4AuAQSgsFjAylDdyzKoObHX12hBdALrqSOOSVwwIQ5/jTgNAsilURHo7KPD407PhRnLOsvumL0qg4sr9S1hjuUKnNla5dg9GY8FVjJ+b2t0A2vgfG1pR1e3vrJRXrpkfRorhmjvKAk2o5you5pQ1Itty7rM= + on: + node: '4' + tags: true + repo: thelounge/lounge diff --git a/.vscode/extensions.json b/.vscode/extensions.json deleted file mode 100644 index 6e4bf808..00000000 --- a/.vscode/extensions.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "recommendations": [ - "EditorConfig.EditorConfig", - "esbenp.prettier-vscode", - "dbaeumer.vscode-eslint", - "Vue.volar", - "Vue.vscode-typescript-vue-plugin" - ], - "unwantedRecommendations": [] -} diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index cb73945b..00000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "configurations": [ - { - "type": "node-terminal", - "name": "Run Dev", - "request": "launch", - "command": "yarn dev", - "cwd": "${workspaceFolder}" - } - ] -} diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index a7e07398..00000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "editor.formatOnSave": true, - "prettier.useEditorConfig": true, - "prettier.requireConfig": true, - "prettier.disableLanguages": [], - "eslint.packageManager": "yarn", - "eslint.codeActionsOnSave.mode": "all", - "[typescript]": {"editor.defaultFormatter": "esbenp.prettier-vscode"}, - "[vue]": {"editor.defaultFormatter": "esbenp.prettier-vscode"} -} diff --git a/CHANGELOG.md b/CHANGELOG.md index 3cf3b73d..af6ca99d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4086 +1,38 @@ # Change Log All notable changes to this project will be documented in this file. +This project adheres to [Semantic Versioning](http://semver.org/). - + -[See the full changelog](https://github.com/thelounge/thelounge/compare/v3.0.0-rc.3...v3.0.0-rc.4) +## 2.0.0-pre.5 - 2016-08-07 [Pre-release] -This is a release candidate (RC) for v3.0.0 to ensure maximum stability for public release. -Bugs may be fixed, but no further features will be added until the next stable version. - -Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry. - -As with all pre-releases, this version requires explicit use of the `next` tag to be installed: - -```sh -yarn global add thelounge@next -``` - -## v3.0.0-rc.3 - 2018-10-10 [Pre-release] - -[See the full changelog](https://github.com/thelounge/thelounge/compare/v3.0.0-rc.2...v3.0.0-rc.3) - -This is a release candidate (RC) for v3.0.0 to ensure maximum stability for public release. -Bugs may be fixed, but no further features will be added until the next stable version. - -Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry. - -As with all pre-releases, this version requires explicit use of the `next` tag to be installed: - -```sh -yarn global add thelounge@next -``` - -## v3.0.0-rc.2 - 2018-10-08 [Pre-release] - -[See the full changelog](https://github.com/thelounge/thelounge/compare/v3.0.0-rc.1...v3.0.0-rc.2) - -This is a release candidate (RC) for v3.0.0 to ensure maximum stability for public release. -Bugs may be fixed, but no further features will be added until the next stable version. - -Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry. - -As with all pre-releases, this version requires explicit use of the `next` tag to be installed: - -```sh -yarn global add thelounge@next -``` - -## v3.0.0-rc.1 - 2018-09-20 [Pre-release] - -[See the full changelog](https://github.com/thelounge/thelounge/compare/v3.0.0-pre.8...v3.0.0-rc.1) - -This is a release candidate (RC) for v3.0.0 to ensure maximum stability for public release. -Bugs may be fixed, but no further features will be added until the next stable version. - -Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry. - -As with all pre-releases, this version requires explicit use of the `next` tag to be installed: - -```sh -yarn global add thelounge@next -``` - -## v3.0.0-pre.8 - 2018-08-25 [Pre-release] - -[See the full changelog](https://github.com/thelounge/thelounge/compare/v3.0.0-pre.7...v3.0.0-pre.8) - -This is a pre-release for v3.0.0 to offer latest changes without having to wait for a stable release. -At this stage, features may still be added or modified until the first release candidate for this version gets released. - -Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry. - -As with all pre-releases, this version requires explicit use of the `next` tag to be installed: - -```sh -yarn global add thelounge@next -``` - -## v3.0.0-pre.7 - 2018-06-19 [Pre-release] - -[See the full changelog](https://github.com/thelounge/thelounge/compare/v3.0.0-pre.6...v3.0.0-pre.7) - -This is a pre-release for v3.0.0 to offer latest changes without having to wait for a stable release. -At this stage, features may still be added or modified until the first release candidate for this version gets released. - -Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry. - -As with all pre-releases, this version requires explicit use of the `next` tag to be installed: - -```sh -npm install -g thelounge@next -``` - -## v3.0.0-pre.6 - 2018-05-26 [Pre-release] - -[See the full changelog](https://github.com/thelounge/thelounge/compare/v3.0.0-pre.5...v3.0.0-pre.6) - -This is a pre-release for v3.0.0 to offer latest changes without having to wait for a stable release. -At this stage, features may still be added or modified until the first release candidate for this version gets released. - -Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry. - -As with all pre-releases, this version requires explicit use of the `next` tag to be installed: - -```sh -npm install -g thelounge@next -``` - -## v3.0.0-pre.5 - 2018-03-28 [Pre-release] - -[See the full changelog](https://github.com/thelounge/thelounge/compare/v3.0.0-pre.4...v3.0.0-pre.5) - -This is a pre-release for v3.0.0 to offer latest changes without having to wait for a stable release. -At this stage, features may still be added or modified until the first release candidate for this version gets released. - -Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry. - -As with all pre-releases, this version requires explicit use of the `next` tag to be installed: - -```sh -npm install -g thelounge@next -``` - -## v3.0.0-pre.4 - 2018-03-27 [Pre-release] - -[See the full changelog](https://github.com/thelounge/thelounge/compare/v3.0.0-pre.3...v3.0.0-pre.4) - -This is a pre-release for v3.0.0 to offer latest changes without having to wait for a stable release. -At this stage, features may still be added or modified until the first release candidate for this version gets released. - -Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry. - -As with all pre-releases, this version requires explicit use of the `next` tag to be installed: - -```sh -npm install -g thelounge@next -``` - -## v3.0.0-pre.3 - 2018-03-08 [Pre-release] - -[See the full changelog](https://github.com/thelounge/thelounge/compare/v3.0.0-pre.2...v3.0.0-pre.3) - -This is a pre-release for v3.0.0 to offer latest changes without having to wait for a stable release. -At this stage, features may still be added or modified until the first release candidate for this version gets released. - -Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry. - -As with all pre-releases, this version requires explicit use of the `next` tag to be installed: - -```sh -npm install -g thelounge@next -``` - -## v3.0.0-pre.2 - 2018-03-03 [Pre-release] - -[See the full changelog](https://github.com/thelounge/thelounge/compare/v3.0.0-pre.1...v3.0.0-pre.2) - -This is a pre-release for v3.0.0 to offer latest changes without having to wait for a stable release. -At this stage, features may still be added or modified until the first release candidate for this version gets released. - -Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry. - -As with all pre-releases, this version requires explicit use of the `next` tag to be installed: - -```sh -npm install -g thelounge@next -``` - -## v3.0.0-pre.1 - 2018-02-21 [Pre-release] - -[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.7.1...v3.0.0-pre.1) - -This is a pre-release for v3.0.0 to offer latest changes without having to wait for a stable release. -At this stage, features may still be added or modified until the first release candidate for this version gets released. - -Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry. - -As with all pre-releases, this version requires explicit use of the `next` tag to be installed: - -```sh -npm install -g thelounge@next -``` - -## v2.7.1 - 2018-02-18 - -For more details, [see the full changelog](https://github.com/thelounge/thelounge/compare/v2.7.0...v2.7.1) and [milestone](https://github.com/thelounge/thelounge/milestone/29?closed=1). - -This releases mainly fixes bugs that were introduced by previous versions, and comes with very minor improvements to the UI. Among other things, we fixed the unread markers showing multiple times, which in turn fixes memory leaks when keeping The Lounge open for long periods of time (e.g. overnight). - -This simply ensures we did not leave any unattended bugs before going for The Lounge v3. - -### Changed - -- Autocomplete channels on the current network ([#1993](https://github.com/thelounge/thelounge/pull/1993) by [@milindl](https://github.com/milindl)) -- Set `decoding="async"` on image previews ([#1924](https://github.com/thelounge/thelounge/pull/1924) by [@xPaw](https://github.com/xPaw)) -- Add tooltip to channel close button ([#1856](https://github.com/thelounge/thelounge/pull/1856) by [@MaxLeiter](https://github.com/MaxLeiter)) -- Show channel name on channel-related errors ([#1933](https://github.com/thelounge/thelounge/pull/1933) by [@RockyTV](https://github.com/RockyTV)) -- Display password field when `displayNetwork` is false ([#2066](https://github.com/thelounge/thelounge/pull/2066) by [@xPaw](https://github.com/xPaw)) -- Update production dependencies to their latest versions, by [Greenkeeper](https://greenkeeper.io/) 🚀: - - `semver` ([#1985](https://github.com/thelounge/thelounge/pull/1985)) - - `primer-tooltips` ([#1988](https://github.com/thelounge/thelounge/pull/1988)) - - `lodash` ([#2032](https://github.com/thelounge/thelounge/pull/2032)) - - `commander` ([#2038](https://github.com/thelounge/thelounge/pull/2038), [#2041](https://github.com/thelounge/thelounge/pull/2041)) - - `urijs` ([#2053](https://github.com/thelounge/thelounge/pull/2053)) - - `mime-types` ([#2067](https://github.com/thelounge/thelounge/pull/2067)) - -### Fixed - -- Prevent user context menu from opening while selecting text ([#1955](https://github.com/thelounge/thelounge/pull/1955) by [@xPaw](https://github.com/xPaw)) -- Fix timestamp tooltips not aligning correctly with timestamps ([#1999](https://github.com/thelounge/thelounge/pull/1999) by [@astorije](https://github.com/astorije)) -- Set `start_url` in `manifest.json` so that The Lounge always opens the correct window ([#2010](https://github.com/thelounge/thelounge/pull/2010) by [@xPaw](https://github.com/xPaw)) -- Do not statically serve the index template prior to rendering it ([#1979](https://github.com/thelounge/thelounge/pull/1979) by [@astorije](https://github.com/astorije)) -- Persist query windows between server restarts ([#2019](https://github.com/thelounge/thelounge/pull/2019) by [@McInkay](https://github.com/McInkay)) -- Preload preview images before appending them to DOM ([#1925](https://github.com/thelounge/thelounge/pull/1925) by [@xPaw](https://github.com/xPaw)) -- Fix `textcomplete` reference in `autocompletion.disable` ([#2023](https://github.com/thelounge/thelounge/pull/2023) by [@xPaw](https://github.com/xPaw)) -- Send visible defaults when `displayNetwork` is `false` ([#2025](https://github.com/thelounge/thelounge/pull/2025) by [@xPaw](https://github.com/xPaw)) -- Wait for server response when parting channels ([#2020](https://github.com/thelounge/thelounge/pull/2020) by [@xPaw](https://github.com/xPaw)) -- Fix auto-open media option not working ([#2027](https://github.com/thelounge/thelounge/pull/2027) by [@xPaw](https://github.com/xPaw)) -- Do not block `/join` command from being sent ([#2013](https://github.com/thelounge/thelounge/pull/2013) by [@xPaw](https://github.com/xPaw)) -- Define which message types should not be logged ([#2022](https://github.com/thelounge/thelounge/pull/2022) by [@xPaw](https://github.com/xPaw)) -- Fix messages not being condensed correctly ([#2030](https://github.com/thelounge/thelounge/pull/2030) by [@xPaw](https://github.com/xPaw)) -- Fix queries going to lobby if the network name matches user name ([#2037](https://github.com/thelounge/thelounge/pull/2037) by [@xPaw](https://github.com/xPaw)) -- Fix default theme not being correct ([#2033](https://github.com/thelounge/thelounge/pull/2033) by [@xPaw](https://github.com/xPaw)) -- Fix duplicate chat containers and unread markers when reconnecting ([#2039](https://github.com/thelounge/thelounge/pull/2039) by [@xPaw](https://github.com/xPaw)) -- Fix crash when hostname is changed in lockNetwork mode ([#2042](https://github.com/thelounge/thelounge/pull/2042) by [@xPaw](https://github.com/xPaw)) -- Still render link previews if image fails to load ([#2043](https://github.com/thelounge/thelounge/pull/2043) by [@xPaw](https://github.com/xPaw)) -- Make sure packages can be referenced in subfolders ([#2045](https://github.com/thelounge/thelounge/pull/2045) by [@xPaw](https://github.com/xPaw)) -- Ensure packages loaded are directories ([#2035](https://github.com/thelounge/thelounge/pull/2035) by [@astorije](https://github.com/astorije), [#2060](https://github.com/thelounge/thelounge/pull/2060) by [@xPaw](https://github.com/xPaw)) -- Fix border after nickname not taking full height ([#2055](https://github.com/thelounge/thelounge/pull/2055) by [@xPaw](https://github.com/xPaw)) -- Provide exact version into `npm install` command ([#2063](https://github.com/thelounge/thelounge/pull/2063) by [@xPaw](https://github.com/xPaw)) -- Track channel state to allow removing channels user is not in ([#2058](https://github.com/thelounge/thelounge/pull/2058) by [@xPaw](https://github.com/xPaw)) -- Allow scaling the page ([#1910](https://github.com/thelounge/thelounge/pull/1910) by [@xPaw](https://github.com/xPaw)) -- Fix `bind` not being passed to `irc-framework` ([#2071](https://github.com/thelounge/thelounge/pull/2071) by [@xPaw](https://github.com/xPaw)) - -### Security - -- Allow stylesheets to be served behind HTTPS in CSP rules ([#2014](https://github.com/thelounge/thelounge/pull/2014) by [@McInkay](https://github.com/McInkay)) - -### Internals - -- Build template list at Webpack time instead of manually keeping this in sync with the views folders ([#1931](https://github.com/thelounge/thelounge/pull/1931) by [@astorije](https://github.com/astorije)) -- Remove deprecated jQuery calls ([#2015](https://github.com/thelounge/thelounge/pull/2015) by [@xPaw](https://github.com/xPaw)) -- Unbind image events after the image is loaded ([#2047](https://github.com/thelounge/thelounge/pull/2047) by [@xPaw](https://github.com/xPaw)) -- Use forked ldapjs to remove dtrace ([#2021](https://github.com/thelounge/thelounge/pull/2021) by [@xPaw](https://github.com/xPaw)) -- Update development dependencies to their latest versions, by [Greenkeeper](https://greenkeeper.io/) 🚀: - - `eslint` ([#1992](https://github.com/thelounge/thelounge/pull/1992), [#2029](https://github.com/thelounge/thelounge/pull/2029), [#2068](https://github.com/thelounge/thelounge/pull/2068)) - - `mocha` ([#1989](https://github.com/thelounge/thelounge/pull/1989), [#2061](https://github.com/thelounge/thelounge/pull/2061)) - - `jquery` ([#1994](https://github.com/thelounge/thelounge/pull/1994)) - - `copy-webpack-plugin` ([#2046](https://github.com/thelounge/thelounge/pull/2046), [#2048](https://github.com/thelounge/thelounge/pull/2048)) - - `webpack` ([#2052](https://github.com/thelounge/thelounge/pull/2052)) - - `stylelint-config-standard` ([#2070](https://github.com/thelounge/thelounge/pull/2070)) - -## v2.7.0 - 2018-01-28 - -For more details, [see the full changelog](https://github.com/thelounge/thelounge/compare/v2.6.0...v2.7.0) and [milestone](https://github.com/thelounge/thelounge/milestone/27?closed=1). - -The Lounge v2.7.0 is out, and it's a big one! Here is a shortlist of the most notable additions and changes, but as usual, a comprehensive list is available below. - -It is now possible to join a channel directly from the UI: - -

- A tooltip saying Join a channel shows up when hovering the + next to a network name in the channel list A form lets the user type a channel name, an optional password, which can then be joined by clicking the submit button -
- The + button next to any network opens a form to join a channel. -

- -Nicks mentioned in messages are now clickable: - -

- A user mentions someone else's nick in a message, which is now clickable and takes the user's color -

- -Context menu actions have been improved, and new actions have been added: - -

- Available actions in user context menu: User information, Direct messages, Kick Available actions in channel context menu: List banned users, Leave Available actions in network context menu: List all channels, Join a channel, Disconnect -
- Available actions on nicks in the chat window, and on channels and networks in the channel list -

- -A long-awaited feature, it is now possible to add customizable strings when auto-completing nicks at the beginning of a message: - -

- When comma+whitespace is set in the Settings, auto-completing nicks will add a comma and a space at the beginning of the message, and a space otherwise -
- To achieve this, set , in your client settings. -

- -The user information available when sending the `/whois` command (or clicking the corresponding action in a user context menu) has been enhanced: - -

- User information is now displayed as a definition list -

- -Message styling now supports strikethrough text, monospace font, and additional colors: - -

- 'Hello world' in a message, where 'Hello' is striked through, and 'world' is monospace -
- Strikethrough is achieved with Ctrl/ + S. Monospace is achieved with Ctrl/ + M. -

- -The Help window gains a version checker, to inform you if a new version was released: - -

- A version checker says: 'The Lounge v2.7.0 is now available. Read more on GitHub'. There is also a link to release notes of the current version displayed in the UI. -

- -By clicking on the "release notes" link that can be seen above, all the details about the current version appear directly in the client: - -

- A Release notes page displays the changelog for the current version. -

- -The link previewer now supports WebP images, as well as audio and video links: - -

- Big Buck Bunny video on an embedded video player -

- -Another noticeable change is the new message alignment in the main chat window, in order to improve visual experience and reduce flickering when loading a page: - -

- screen shot 2018-01-21 at 23 53 26 -

- -There were other changes on the client: accessibility of the application has been improved, notices and errors are now displayed in the current channel (then sent to the corresponding network window when reloading), and many bug fixes. - -The Lounge v2.7.0 finally comes with its first package API, letting packages register stylesheets in the client. It is in its very early stage at the moment and is subject to change in future releases, so use it at your own risk. There will not be an official documentation before the API stabilizes in v3, but for more information, [refer to the corresponding PR](https://github.com/thelounge/thelounge/pull/1619). - -The CLI has also been improved: - -- When a password gets changed using the `reset` command, the new password takes effect immediately, it is not necessary to restart the server anymore. -- A new `uninstall` command has been added to remove themes and packages. -- A new `--config`/`-c` option is available to override entries of the configuration file. - -⚠️ This version also comes with a few **deprecations**. All deprecated features are still supported in The Lounge v2.7.0 but be removed from The Lounge v3 (the next version). We recommend upgrading to v2.7.0 **before** upgrading to the future v3, as v2.7.0 will warn you about deprecated configurations in the server output. Those deprecations are: - -- Support for Node.js v4 is being removed, making Node.js v6 the oldest version we will support. -- The `LOUNGE_HOME` environment variable is getting replaced with `THELOUNGE_HOME`. Use this in lieu of the deprecated `--home` option as well. -- In the unlikely situation that you are relying on the `.lounge_home` file (mainly useful for package maintainers), it is being renamed to `.thelounge_home`. -- The CLI command is being changed from `lounge` to `thelounge`. -- All options for the `start` command are being removed, replaced with the `--config`/`-c` option mentioned above. For example, `--public` becomes `-c public=true`, `--port 9001` becomes `-c port=9001`, etc. -- Referring to themes in the `theme` option of the configuration file is now done through their name, not their CSS file name. - -And finally... **The Lounge has its own logo!** 🎉 - -

- The Lounge logos on dark and white backgrounds -

- -A huge thank you to **Francesca Segantini**, the artist who designed it! -We will start rolling out our new logo in all the relevant places as of The Lounge v3. In the meantime, you can find details about the logo (and stickers!) on [the corresponding issue](https://github.com/thelounge/thelounge/issues/282#issuecomment-360368920). - -### Added - -- Link and color nicks mentioned in messages ([#1709](https://github.com/thelounge/thelounge/pull/1709), [#1758](https://github.com/thelounge/thelounge/pull/1758) by [@MaxLeiter](https://github.com/MaxLeiter), [#1779](https://github.com/thelounge/thelounge/pull/1779), [#1901](https://github.com/thelounge/thelounge/pull/1901) by [@xPaw](https://github.com/xPaw)) -- Detect `image/webp` as an image ([#1753](https://github.com/thelounge/thelounge/pull/1753) by [@xPaw](https://github.com/xPaw)) -- Implement strikethrough and monospace formatting ([#1792](https://github.com/thelounge/thelounge/pull/1792) by [@grissly-man](https://github.com/grissly-man), [#1814](https://github.com/thelounge/thelounge/pull/1814) by [@xPaw](https://github.com/xPaw)) -- Add the user's actual IP in the result of `/whois` ([#1788](https://github.com/thelounge/thelounge/pull/1788) by [@PolarizedIons](https://github.com/PolarizedIons)) -- Handle `CHGHOST` cap ([#1578](https://github.com/thelounge/thelounge/pull/1578) by [@xPaw](https://github.com/xPaw)) -- Handle JavaScript errors while loading ([#1794](https://github.com/thelounge/thelounge/pull/1794) by [@xPaw](https://github.com/xPaw), [#1845](https://github.com/thelounge/thelounge/pull/1845) by [@astorije](https://github.com/astorije)) -- Add actions to user context menu ([#1722](https://github.com/thelounge/thelounge/pull/1722) by [@creesch](https://github.com/creesch)) -- Add styling for 16-98 colors ([#1831](https://github.com/thelounge/thelounge/pull/1831) by [@xPaw](https://github.com/xPaw)) -- Add "Channel list" to network context menu ([#1802](https://github.com/thelounge/thelounge/pull/1802) by [@MaxLeiter](https://github.com/MaxLeiter)) -- Support audio file previews ([#1806](https://github.com/thelounge/thelounge/pull/1806) by [@MaxLeiter](https://github.com/MaxLeiter)) -- Support video file previews ([#1817](https://github.com/thelounge/thelounge/pull/1817) by [@MaxLeiter](https://github.com/MaxLeiter), [#1904](https://github.com/thelounge/thelounge/pull/1904) by [@astorije](https://github.com/astorije)) -- Insert user-configurable string when autocompleting nicks ([#1799](https://github.com/thelounge/thelounge/pull/1799) by [@xPaw](https://github.com/xPaw)) -- Add banlist action to channel context menus ([#1858](https://github.com/thelounge/thelounge/pull/1858) by [@YaManicKill](https://github.com/YaManicKill)) -- Join a channel from the UI ([#1836](https://github.com/thelounge/thelounge/pull/1836) by [@MaxLeiter](https://github.com/MaxLeiter), [#1881](https://github.com/thelounge/thelounge/pull/1881), [#1882](https://github.com/thelounge/thelounge/pull/1882) by [@astorije](https://github.com/astorije), [#1916](https://github.com/thelounge/thelounge/pull/1916), [#1917](https://github.com/thelounge/thelounge/pull/1917) by [@williamboman](https://github.com/williamboman)) -- Changelog viewer and updater checker in the client ([#1327](https://github.com/thelounge/thelounge/pull/1327) by [@xPaw](https://github.com/xPaw), [#1897](https://github.com/thelounge/thelounge/pull/1897) by [@astorije](https://github.com/astorije)) -- Add a `thelounge uninstall` command to remove themes and packages ([#1938](https://github.com/thelounge/thelounge/pull/1938), [#1974](https://github.com/thelounge/thelounge/pull/1974) by [@astorije](https://github.com/astorije)) -- Add a package API for custom CSS ([#1619](https://github.com/thelounge/thelounge/pull/1619) by [@YaManicKill](https://github.com/YaManicKill), [#1970](https://github.com/thelounge/thelounge/pull/1970) by [@astorije](https://github.com/astorije)) - -### Changed - -- Parse formatting in real name ([#1689](https://github.com/thelounge/thelounge/pull/1689) by [@xPaw](https://github.com/xPaw)) -- Use service worker to display notifications if available ([#1580](https://github.com/thelounge/thelounge/pull/1580) by [@xPaw](https://github.com/xPaw)) -- Include all available whois info ([#1681](https://github.com/thelounge/thelounge/pull/1681) by [@creesch](https://github.com/creesch), [#1743](https://github.com/thelounge/thelounge/pull/1743) by [@MaxLeiter](https://github.com/MaxLeiter)) -- Focus a channel by joining it, refactor user commands #1189 ([#1491](https://github.com/thelounge/thelounge/pull/1491) by [@realies](https://github.com/realies)) -- Handle hex colors when cleaning string ([#1731](https://github.com/thelounge/thelounge/pull/1731) by [@xPaw](https://github.com/xPaw)) -- Trim channel messages in active channel and when switching channels ([#1738](https://github.com/thelounge/thelounge/pull/1738) by [@xPaw](https://github.com/xPaw)) -- Do not keep scroll to bottom in inactive channels ([#1739](https://github.com/thelounge/thelounge/pull/1739) by [@xPaw](https://github.com/xPaw)) -- Show notices and errors inline ([#1380](https://github.com/thelounge/thelounge/pull/1380) by [@xPaw](https://github.com/xPaw)) -- Ensure passwords are reloaded when updated via CLI ([#1593](https://github.com/thelounge/thelounge/pull/1593) by [@RJacksonm1](https://github.com/RJacksonm1)) -- Warn if user configuration being loaded is empty ([#1821](https://github.com/thelounge/thelounge/pull/1821) by [@astorije](https://github.com/astorije)) -- Align message container to the bottom ([#1787](https://github.com/thelounge/thelounge/pull/1787) by [@xPaw](https://github.com/xPaw)) -- Clear storage folder after successful start and graceful exit ([#1853](https://github.com/thelounge/thelounge/pull/1853) by [@xPaw](https://github.com/xPaw)) -- Format whois as a definition list ([#1850](https://github.com/thelounge/thelounge/pull/1850) by [@xPaw](https://github.com/xPaw)) -- Rename "Client Settings" into "Settings" in tooltip + cleanup ([#1880](https://github.com/thelounge/thelounge/pull/1880) by [@astorije](https://github.com/astorije)) -- Open and focus correct channel when clicking on push notifications ([#1895](https://github.com/thelounge/thelounge/pull/1895) by [@xPaw](https://github.com/xPaw)) -- Add screen reader label for custom css textarea ([#1908](https://github.com/thelounge/thelounge/pull/1908) by [@xPaw](https://github.com/xPaw)) -- Set `aria-label` on main input ([#1906](https://github.com/thelounge/thelounge/pull/1906) by [@xPaw](https://github.com/xPaw)) -- Mute disabled inputs ([#1905](https://github.com/thelounge/thelounge/pull/1905) by [@xPaw](https://github.com/xPaw)) -- Update production dependencies to their latest versions, by [Greenkeeper](https://greenkeeper.io/) 🚀: - - `commander` ([#1736](https://github.com/thelounge/thelounge/pull/1736), [#1763](https://github.com/thelounge/thelounge/pull/1763), [#1963](https://github.com/thelounge/thelounge/pull/1963)) - - `moment` ([#1775](https://github.com/thelounge/thelounge/pull/1775), [#1822](https://github.com/thelounge/thelounge/pull/1822), [#1848](https://github.com/thelounge/thelounge/pull/1848), [#1857](https://github.com/thelounge/thelounge/pull/1857)) - - `web-push` ([#1781](https://github.com/thelounge/thelounge/pull/1781)) - - `irc-framework` ([#1782](https://github.com/thelounge/thelounge/pull/1782), [#1937](https://github.com/thelounge/thelounge/pull/1937)) - - `fs-extra` ([#1798](https://github.com/thelounge/thelounge/pull/1798), [#1826](https://github.com/thelounge/thelounge/pull/1826)) - - `ldapjs` ([#1965](https://github.com/thelounge/thelounge/pull/1965)) - - `primer-tooltips` ([#1923](https://github.com/thelounge/thelounge/pull/1923)) - -### Deprecated - -- Deprecate support of Node.js v4 in preparation of The Lounge v3 ([#1715](https://github.com/thelounge/thelounge/pull/1715) by [@astorije](https://github.com/astorije)) -- Deprecate `LOUNGE_HOME` environment variable in favor of `THELOUNGE_HOME`, `.lounge_home` file in favor of `.thelounge_home` ([#1717](https://github.com/thelounge/thelounge/pull/1717), [#1785](https://github.com/thelounge/thelounge/pull/1785) by [@astorije](https://github.com/astorije)) -- Switch CLI tool from `lounge` to `thelounge`, deprecate `lounge` ([#1708](https://github.com/thelounge/thelounge/pull/1708) by [@astorije](https://github.com/astorije)) -- Deprecate existing options of `thelounge start` and add a generic `--config` override ([#1820](https://github.com/thelounge/thelounge/pull/1820) by [@astorije](https://github.com/astorije)) -- Rename thumbnail/image option to more general `media` ([#1832](https://github.com/thelounge/thelounge/pull/1832) by [@MaxLeiter](https://github.com/MaxLeiter)) - -### Removed - -- Remove lobby close button ([#1833](https://github.com/thelounge/thelounge/pull/1833) by [@Cldfire](https://github.com/Cldfire)) - -### Fixed - -- Handle empty client queries ([#1676](https://github.com/thelounge/thelounge/pull/1676) by [@realies](https://github.com/realies)) -- Call callback on fetch error ([#1742](https://github.com/thelounge/thelounge/pull/1742) by [@xPaw](https://github.com/xPaw)) -- Trigger keep to bottom for previews correctly ([#1746](https://github.com/thelounge/thelounge/pull/1746) by [@xPaw](https://github.com/xPaw)) -- Fix duplicate text generated when sending channel and link together ([#1747](https://github.com/thelounge/thelounge/pull/1747) by [@astorije](https://github.com/astorije)) -- Fix text highlighting when clicking on condensed message toggles ([#1748](https://github.com/thelounge/thelounge/pull/1748) by [@MaxLeiter](https://github.com/MaxLeiter)) -- Do not keep sign-in and loader references in memory ([#1757](https://github.com/thelounge/thelounge/pull/1757) by [@xPaw](https://github.com/xPaw)) -- Fix nick changes wrongly reported ([#1772](https://github.com/thelounge/thelounge/pull/1772) by [@astorije](https://github.com/astorije)) -- Clone instances of `User` in `Msg` to avoid unintentional mutations ([#1771](https://github.com/thelounge/thelounge/pull/1771) by [@astorije](https://github.com/astorije), [#1859](https://github.com/thelounge/thelounge/pull/1859), [#1865](https://github.com/thelounge/thelounge/pull/1865) by [@xPaw](https://github.com/xPaw)) -- Ask for notification permission on page load if setting is enabled ([#1789](https://github.com/thelounge/thelounge/pull/1789) by [@xPaw](https://github.com/xPaw)) -- Merge condensed messages when loading more history ([#1803](https://github.com/thelounge/thelounge/pull/1803) by [@xPaw](https://github.com/xPaw)) -- Proper network icon in context menu ([#1816](https://github.com/thelounge/thelounge/pull/1816) by [@MaxLeiter](https://github.com/MaxLeiter)) -- Implement reverse style ([#1797](https://github.com/thelounge/thelounge/pull/1797) by [@grissly-man](https://github.com/grissly-man)) -- Do not load user commands or display them on `--help` if public mode or using LDAP ([#1807](https://github.com/thelounge/thelounge/pull/1807) by [@astorije](https://github.com/astorije)) -- Improve user and channel icons in channel list and context menu ([#1824](https://github.com/thelounge/thelounge/pull/1824) by [@astorije](https://github.com/astorije)) -- Use better icons for channel/query list and context menu actions ([#1829](https://github.com/thelounge/thelounge/pull/1829) by [@astorije](https://github.com/astorije)) -- Fix UI issues with special channels ([#1849](https://github.com/thelounge/thelounge/pull/1849) by [@astorije](https://github.com/astorije)) -- Fix gap between `#sidebar` and `#footer` ([#1691](https://github.com/thelounge/thelounge/pull/1691) by [@realies](https://github.com/realies)) -- Add missing time (and icon) of status messages on mobile ([#1843](https://github.com/thelounge/thelounge/pull/1843) by [@astorije](https://github.com/astorije)) -- Add visual feedback on focused buttons, for example when tabbing to it ([#1871](https://github.com/thelounge/thelounge/pull/1871) by [@astorije](https://github.com/astorije)) -- Fix missing messages when reconnecting ([#1884](https://github.com/thelounge/thelounge/pull/1884) by [@xPaw](https://github.com/xPaw)) -- Fix slideout not closing on mobile when hitting a footer icon ([#1892](https://github.com/thelounge/thelounge/pull/1892) by [@astorije](https://github.com/astorije)) -- Display the correct window on page reload ([#1889](https://github.com/thelounge/thelounge/pull/1889) by [@astorije](https://github.com/astorije)) -- Fix error not showing up in failed push subscription ([#1896](https://github.com/thelounge/thelounge/pull/1896) by [@xPaw](https://github.com/xPaw)) -- Only emit "more" history to the client that requested it ([#1949](https://github.com/thelounge/thelounge/pull/1949) by [@xPaw](https://github.com/xPaw)) -- Provide correct timestamp to browser notifications ([#1956](https://github.com/thelounge/thelounge/pull/1956) by [@xPaw](https://github.com/xPaw)) -- Fix enabling push notifications on Firefox ([#1975](https://github.com/thelounge/thelounge/pull/1975) by [@xPaw](https://github.com/xPaw)) -- Add missing execution of callback in `ClientManager.updateUser` ([#1978](https://github.com/thelounge/thelounge/pull/1978) by [@merlinthp](https://github.com/merlinthp)) -- Make sure existing packages (and themes) are not deleted when installing a new one on Node.js v8 ([#1986](https://github.com/thelounge/thelounge/pull/1986) by [@astorije](https://github.com/astorije)) -- Stop expanding condensed messages on `/expand` ([#2006](https://github.com/thelounge/thelounge/pull/2006) by [@YaManicKill](https://github.com/YaManicKill)) - -### Security - -- Harden content security policy even further ([#1810](https://github.com/thelounge/thelounge/pull/1810) by [@xPaw](https://github.com/xPaw)) -- Stop LDAP authentication from succeeding without password ([#1725](https://github.com/thelounge/thelounge/pull/1725) by [@keegan](https://github.com/keegan)) -- Store images with correct file extension ([#1926](https://github.com/thelounge/thelounge/pull/1926) by [@xPaw](https://github.com/xPaw)) -- Hash user tokens, increase token entropy ([#1940](https://github.com/thelounge/thelounge/pull/1940) by [@xPaw](https://github.com/xPaw)) - -### Documentation - -In the main repository: - -- Fix incorrect documentation URL in default config ([#1875](https://github.com/thelounge/thelounge/pull/1875) by [@MiniDigger](https://github.com/MiniDigger)) -- Allow keywords as changelog script version argument, e.g. `node scripts/changelog pre` ([#1913](https://github.com/thelounge/thelounge/pull/1913) by [@astorije](https://github.com/astorije)) -- Separate and improve wording for `pre` and `rc` pre-release versions ([#1914](https://github.com/thelounge/thelounge/pull/1914) by [@astorije](https://github.com/astorije)) -- Add SECURITY guidelines about security vulnerability disclosures, and link them from the CONTRIBUTING guidelines ([#1984](https://github.com/thelounge/thelounge/pull/1984) by [@astorije](https://github.com/astorije)) - -### Internals - -- Enforce dangling commas with ESLint ([#1711](https://github.com/thelounge/thelounge/pull/1711) by [@astorije](https://github.com/astorije)) -- Refactor how user object is sent to the client ([#1698](https://github.com/thelounge/thelounge/pull/1698), [#1716](https://github.com/thelounge/thelounge/pull/1716), [#1720](https://github.com/thelounge/thelounge/pull/1720), [#1764](https://github.com/thelounge/thelounge/pull/1764), [#1941](https://github.com/thelounge/thelounge/pull/1941) by [@xPaw](https://github.com/xPaw), [#1773](https://github.com/thelounge/thelounge/pull/1773) by [@astorije](https://github.com/astorije)) -- Convert users list to map ([#1712](https://github.com/thelounge/thelounge/pull/1712) by [@xPaw](https://github.com/xPaw)) -- Split `index.html` into components ([#1683](https://github.com/thelounge/thelounge/pull/1683) by [@xPaw](https://github.com/xPaw)) -- Parallelize `npm test` ([#1750](https://github.com/thelounge/thelounge/pull/1750) by [@astorije](https://github.com/astorije)) -- Avoid using `npm-run-all` for build ([#1752](https://github.com/thelounge/thelounge/pull/1752) by [@xPaw](https://github.com/xPaw)) -- Avoid escaping quotes whenever possible ([#1749](https://github.com/thelounge/thelounge/pull/1749), [#1759](https://github.com/thelounge/thelounge/pull/1759) by [@astorije](https://github.com/astorije)) -- Mark slow tests as such to reduce noise on test report ([#1761](https://github.com/thelounge/thelounge/pull/1761) by [@astorije](https://github.com/astorije)) -- Increase timeout of server tests ([#1769](https://github.com/thelounge/thelounge/pull/1769) by [@astorije](https://github.com/astorije)) -- Add a bunch of client tests ([#1770](https://github.com/thelounge/thelounge/pull/1770) by [@astorije](https://github.com/astorije)) -- Heavily improve performance of "init" event ([#1778](https://github.com/thelounge/thelounge/pull/1778) by [@xPaw](https://github.com/xPaw)) -- Enable `no-use-before-define` rule ([#1804](https://github.com/thelounge/thelounge/pull/1804) by [@xPaw](https://github.com/xPaw)) -- Update textcomplete library and rewrite tabcomplete ([#1800](https://github.com/thelounge/thelounge/pull/1800) by [@xPaw](https://github.com/xPaw)) -- Clean up path helpers, expand defaults location in `thelounge --help`, add tests for `expandHome` ([#1811](https://github.com/thelounge/thelounge/pull/1811) by [@astorije](https://github.com/astorije)) -- Remove dead code in tests, and fix a link test ([#1818](https://github.com/thelounge/thelounge/pull/1818) by [@astorije](https://github.com/astorije)) -- Use cross-platform modifier shortcut for Mousetrap when possible ([#1844](https://github.com/thelounge/thelounge/pull/1844) by [@astorije](https://github.com/astorije)) -- Update to primer on npm ([#1855](https://github.com/thelounge/thelounge/pull/1855) by [@MaxLeiter](https://github.com/MaxLeiter)) -- Add a `notEqual` block helper for Handlebars and tests for `equal` ([#1874](https://github.com/thelounge/thelounge/pull/1874) by [@astorije](https://github.com/astorije)) -- Use `notEqual` helper for close button ([#1876](https://github.com/thelounge/thelounge/pull/1876) by [@xPaw](https://github.com/xPaw)) -- Improve a bit window loading on init ([#1899](https://github.com/thelounge/thelounge/pull/1899) by [@astorije](https://github.com/astorije)) -- Fix stylelint ([#1921](https://github.com/thelounge/thelounge/pull/1921) by [@astorije](https://github.com/astorije)) -- Set `sign-git-tag` to true in `.npmrc` ([#1964](https://github.com/thelounge/thelounge/pull/1964) by [@xPaw](https://github.com/xPaw)) -- Update development dependencies to their latest versions, by [Greenkeeper](https://greenkeeper.io/) 🚀: - - `copy-webpack-plugin` ([#1713](https://github.com/thelounge/thelounge/pull/1713), [#1737](https://github.com/thelounge/thelounge/pull/1737), [#1837](https://github.com/thelounge/thelounge/pull/1837), [#1877](https://github.com/thelounge/thelounge/pull/1877)) - - `eslint` ([#1744](https://github.com/thelounge/thelounge/pull/1744), [#1777](https://github.com/thelounge/thelounge/pull/1777), [#1815](https://github.com/thelounge/thelounge/pull/1815), [#1828](https://github.com/thelounge/thelounge/pull/1828), [#1887](https://github.com/thelounge/thelounge/pull/1887), [#1947](https://github.com/thelounge/thelounge/pull/1947)) - - `stylelint` ([#1745](https://github.com/thelounge/thelounge/pull/1745), [#1751](https://github.com/thelounge/thelounge/pull/1751), [#1841](https://github.com/thelounge/thelounge/pull/1841)) - - `webpack` ([#1780](https://github.com/thelounge/thelounge/pull/1780), [#1796](https://github.com/thelounge/thelounge/pull/1796)) - - `intersection-observer` ([#1790](https://github.com/thelounge/thelounge/pull/1790)) - - `textcomplete` ([#1835](https://github.com/thelounge/thelounge/pull/1835), [#1854](https://github.com/thelounge/thelounge/pull/1854)) - - `nyc` ([#1863](https://github.com/thelounge/thelounge/pull/1863)) - - `graphql-request` ([#1903](https://github.com/thelounge/thelounge/pull/1903)) - - `mocha` ([#1922](https://github.com/thelounge/thelounge/pull/1922)) - -## v2.7.0-rc.3 - 2018-01-27 [Pre-release] - -[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.7.0-rc.2...v2.7.0-rc.3) - -This is a release candidate (RC) for v2.7.0 to ensure maximum stability for public release. -Bugs may be fixed, but no further features will be added until the next stable version. - -Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry. - -As with all pre-releases, this version requires explicit use of the `next` tag to be installed: - -```sh -npm install -g thelounge@next -``` - -## v2.7.0-rc.2 - 2018-01-19 [Pre-release] - -[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.7.0-rc.1...v2.7.0-rc.2) - -This is a release candidate (RC) for v2.7.0 to ensure maximum stability for public release. -Bugs may be fixed, but no further features will be added until the next stable version. - -Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry. - -As with all pre-releases, this version requires explicit use of the `next` tag to be installed: - -```sh -npm install -g thelounge@next -``` - -## v2.7.0-rc.1 - 2018-01-13 [Pre-release] - -[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.7.0-pre.4...v2.7.0-rc.1) - -This is a release candidate (RC) for v2.7.0 to ensure maximum stability for public release. -Bugs may be fixed, but no further features will be added until the next stable version. - -Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry. - -As with all pre-releases, this version requires explicit use of the `next` tag to be installed: - -```sh -npm install -g thelounge@next -``` - -## v2.7.0-pre.4 - 2017-12-27 [Pre-release] - -[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.7.0-pre.3...v2.7.0-pre.4) - -This is a pre-release for v2.7.0 to ensure maximum stability for public release. -Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry. - -As with all pre-releases, this version requires explicit use of the `next` tag to be installed: - -```sh -npm install -g thelounge@next -``` - -## v2.7.0-pre.3 - 2017-12-15 [Pre-release] - -[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.7.0-pre.2...v2.7.0-pre.3) - -This is a pre-release for v2.7.0 to ensure maximum stability for public release. -Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry. - -As with all pre-releases, this version requires explicit use of the `next` tag to be installed: - -```sh -npm install -g thelounge@next -``` - -## v2.7.0-pre.2 - 2017-12-01 [Pre-release] - -[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.7.0-pre.1...v2.7.0-pre.2) - -This is a pre-release for v2.7.0 to ensure maximum stability for public release. -Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry. - -As with all pre-releases, this version requires explicit use of the `next` tag to be installed: - -```sh -npm install -g thelounge@next -``` - -## v2.7.0-pre.1 - 2017-11-30 [Pre-release] - -[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.6.0...v2.7.0-pre.1) - -This is a pre-release for v2.7.0 to ensure maximum stability for public release. -Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry. - -As with all pre-releases, this version requires explicit use of the `next` tag to be installed: - -```sh -npm install -g thelounge@next -``` - -## v2.6.0 - 2017-11-18 - -For more details, [see the full changelog](https://github.com/thelounge/thelounge/compare/v2.5.0...v2.6.0) and [milestone](https://github.com/thelounge/thelounge/milestone/26?closed=1). - -This release is very small, as we focused it on bug fixes. You may notice slight improvements to the auto-completion menu (new commands, more accurate emoji list, documentation in the help window), as well as small UI improvements. - -Additionally, this release is the first one with official support of Node.js v9. - -### Added - -- Add service aliases to command list for completion ([#1627](https://github.com/thelounge/thelounge/pull/1627) by [@dgw](https://github.com/dgw)) - -### Changed - -- Mark channels as read when receiving self-messages ([#1615](https://github.com/thelounge/thelounge/pull/1615) by [@dgw](https://github.com/dgw)) -- Remove content borders on mobile to maximize use of space ([#1599](https://github.com/thelounge/thelounge/pull/1599) by [@RJacksonm1](https://github.com/RJacksonm1)) -- Reduced padding around page titles ([#1637](https://github.com/thelounge/thelounge/pull/1637) by [@Swapnull](https://github.com/Swapnull)) -- Generate emoji map from EmojiOne data ([#1651](https://github.com/thelounge/thelounge/pull/1651), [#1670](https://github.com/thelounge/thelounge/pull/1670) by [@xPaw](https://github.com/xPaw)) -- Update production dependencies to their latest versions, by [Greenkeeper](https://greenkeeper.io/) 🚀: - - `moment` ([#1624](https://github.com/thelounge/thelounge/pull/1624), [#1638](https://github.com/thelounge/thelounge/pull/1638), [#1702](https://github.com/thelounge/thelounge/pull/1702)) - - `socket.io` ([#1625](https://github.com/thelounge/thelounge/pull/1625), [#1660](https://github.com/thelounge/thelounge/pull/1660)) - - `express` ([#1638](https://github.com/thelounge/thelounge/pull/1638)) - - `ua-parser-js` ([#1638](https://github.com/thelounge/thelounge/pull/1638)) - - `web-push` ([#1654](https://github.com/thelounge/thelounge/pull/1654)) - -### Removed - -- Remove Inconsolata ([#1602](https://github.com/thelounge/thelounge/pull/1602) by [@xPaw](https://github.com/xPaw)) - -### Fixed - -- Fix possible race condition when attaching clients ([#1639](https://github.com/thelounge/thelounge/pull/1639) by [@xPaw](https://github.com/xPaw)) -- Synchronize unread marker when client reconnects ([#1600](https://github.com/thelounge/thelounge/pull/1600) by [@xPaw](https://github.com/xPaw)) -- Synchronize unread marker when other client opens a channel ([#1598](https://github.com/thelounge/thelounge/pull/1598) by [@xPaw](https://github.com/xPaw)) -- Fix loading app with autocomplete disabled ([#1650](https://github.com/thelounge/thelounge/pull/1650) by [@dgw](https://github.com/dgw)) -- Fix URL query parameters in public mode ([#1661](https://github.com/thelounge/thelounge/pull/1661) by [@MaxLeiter](https://github.com/MaxLeiter)) -- Fix hyphenated names overflowing (#1667) ([#1671](https://github.com/thelounge/thelounge/pull/1671) by [@LFlare](https://github.com/LFlare)) -- Fix missing attributes on unhandled messages ([#1695](https://github.com/thelounge/thelounge/pull/1695) by [@xPaw](https://github.com/xPaw)) -- Correctly display kicks when kicker is server ([#1693](https://github.com/thelounge/thelounge/pull/1693) by [@xPaw](https://github.com/xPaw)) -- Go back to writing user files synchronously ([#1701](https://github.com/thelounge/thelounge/pull/1701) by [@xPaw](https://github.com/xPaw)) -- Fix local theme folder ([#1706](https://github.com/thelounge/thelounge/pull/1706) by [@xPaw](https://github.com/xPaw)) - -### Documentation - -In the main repository: - -- Fix "help wanted" link in CONTRIBUTING file ([#1673](https://github.com/thelounge/thelounge/pull/1673) by [@timmw](https://github.com/timmw)) -- Document autocompletion in the help page ([#1609](https://github.com/thelounge/thelounge/pull/1609) by [@dgw](https://github.com/dgw)) -- Add a script to pre-generate changelog entries ([#1707](https://github.com/thelounge/thelounge/pull/1707) by [@astorije](https://github.com/astorije)) - -### Internals - -- Remove channel containers from DOM after quitting network ([#1607](https://github.com/thelounge/thelounge/pull/1607) by [@PolarizedIons](https://github.com/PolarizedIons)) -- Create public folder with Webpack ([#1611](https://github.com/thelounge/thelounge/pull/1611), [#1682](https://github.com/thelounge/thelounge/pull/1682), [#1704](https://github.com/thelounge/thelounge/pull/1704) by [@xPaw](https://github.com/xPaw), [#1705](https://github.com/thelounge/thelounge/pull/1705) by [@astorije](https://github.com/astorije)) -- Cleanup client manager functions ([#1636](https://github.com/thelounge/thelounge/pull/1636) by [@xPaw](https://github.com/xPaw)) -- Add Node.js v9 testing to Travis builds ([#1678](https://github.com/thelounge/thelounge/pull/1678) by [@astorije](https://github.com/astorije)) -- Allow `run-pr` script to pass arguments to `npm start` ([#1662](https://github.com/thelounge/thelounge/pull/1662) by [@MaxLeiter](https://github.com/MaxLeiter)) -- Update development dependencies to their latest versions, by [Greenkeeper](https://greenkeeper.io/) 🚀: - - `webpack` ([#1626](https://github.com/thelounge/thelounge/pull/1626), [#1638](https://github.com/thelounge/thelounge/pull/1638), [#1643](https://github.com/thelounge/thelounge/pull/1643)) - - `mocha` ([#1617](https://github.com/thelounge/thelounge/pull/1617)) - - `stylelint` ([#1616](https://github.com/thelounge/thelounge/pull/1616)) - - `eslint` ([#1632](https://github.com/thelounge/thelounge/pull/1632), [#1666](https://github.com/thelounge/thelounge/pull/1666), [#1699](https://github.com/thelounge/thelounge/pull/1699)) - - `babel-preset-env` ([#1641](https://github.com/thelounge/thelounge/pull/1641)) - - `handlebars` ([#1645](https://github.com/thelounge/thelounge/pull/1645)) - - `socket.io-client` ([#1659](https://github.com/thelounge/thelounge/pull/1659)) - - `copy-webpack-plugin` ([#1653](https://github.com/thelounge/thelounge/pull/1653)) - - `nyc` ([#1680](https://github.com/thelounge/thelounge/pull/1680)) - - `npm-run-all` ([#1688](https://github.com/thelounge/thelounge/pull/1688)) - - `intersection-observer` ([#1697](https://github.com/thelounge/thelounge/pull/1697)) - -## v2.6.0-rc.4 - 2017-11-12 [Pre-release] - -[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.6.0-rc.3...v2.6.0-rc.4) - -This is a release candidate for v2.6.0 to ensure maximum stability for public release. -Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry. - -As with all pre-releases, this version requires explicit use of the `next` tag to be installed: - -```sh -npm install -g thelounge@next -``` - -## v2.6.0-rc.3 - 2017-11-12 [Pre-release] - -[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.6.0-rc.2...v2.6.0-rc.3) - -This is a release candidate for v2.6.0 to ensure maximum stability for public release. -Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry. - -As with all pre-releases, this version requires explicit use of the `next` tag to be installed: - -```sh -npm install -g thelounge@next -``` - -## v2.6.0-rc.2 - 2017-11-12 [Pre-release] - -[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.6.0-rc.1...v2.6.0-rc.2) - -This is a release candidate for v2.6.0 to ensure maximum stability for public release. -Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry. - -As with all pre-releases, this version requires explicit use of the `next` tag to be installed: - -```sh -npm install -g thelounge@next -``` - -## v2.6.0-rc.1 - 2017-11-11 [Pre-release - DEPRECATED] - -[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.5.0...v2.6.0-rc.1) - -This is a release candidate for v2.6.0 to ensure maximum stability for public release. -Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry. - -As with all pre-releases, this version requires explicit use of the `next` tag to be installed: - -```sh -npm install -g thelounge@next -``` - -## v2.5.0 - 2017-10-17 - -For more details, [see the full changelog](https://github.com/thelounge/thelounge/compare/v2.4.0...v2.5.0) and [milestone](https://github.com/thelounge/thelounge/milestone/22?closed=1). - -If you thought the [v2.3.0 release](https://github.com/thelounge/thelounge/releases/tag/v2.3.0) was big, well, v2.5.0 is even bigger! 🎉 - -If you are a client user, you will notice that The Lounge is now using your operating system's font, and that status messages (joins, parts, nick changes, etc.) are now condensed with each other. - -

- Condensed status messages displaying 3 users have joined the channel, 4 users have quit, and 1 user has changed nick -
- Condensed status messages -

- -After a while, you'll realize that the client now automatically reconnects when losing network connection (farewell, `Client connection lost — Click here to reconnect`!), and that the channel backlog now automatically loads when you scroll up. Unfortunately, that last bit forced us to phase out the `/clear` command for technical reasons. - -If you go to the _Settings_ page, you'll notice that The Lounge now supports push notifications (yes, even on mobile, except iOS), and that you can remotely log out open sessions. - -

- Session list with the ability to disconnect remote sessions -
- Current and remote sessions -

- -As a server administrator, you might be interested in a few new additions: - -- Themes can now be [retrieved from npm](https://www.npmjs.com/search?q=keywords%3Athelounge-theme) and installed using a new CLI command `lounge install ` -- Integration with LDAP has been completely refactored -- The Lounge can now be bound to Unix sockets - -⚠️ Note that `--home` is now deprecated in favor of the `$LOUNGE_HOME` environment variable (or the `.lounge_home` file in the installation directory). Also, if you are running The Lounge behind a proxy (like nginx or Apache), you will need to make sure that `reverseProxy` is set to `true` and the `X-Forwarded-For` header correctly set for session listing to work correctly on the client. - -Enjoy! 💬 - -### Added - -- Status message condensing ([#759](https://github.com/thelounge/thelounge/pull/759), [#1421](https://github.com/thelounge/thelounge/pull/1421) by [@YaManicKill](https://github.com/YaManicKill), [#1437](https://github.com/thelounge/thelounge/pull/1437), [#1451](https://github.com/thelounge/thelounge/pull/1451), [#1475](https://github.com/thelounge/thelounge/pull/1475), [#1485](https://github.com/thelounge/thelounge/pull/1485) by [@xPaw](https://github.com/xPaw), [#1417](https://github.com/thelounge/thelounge/pull/1417), [#1442](https://github.com/thelounge/thelounge/pull/1442), [#1509](https://github.com/thelounge/thelounge/pull/1509), [#1524](https://github.com/thelounge/thelounge/pull/1524) by [@astorije](https://github.com/astorije)) -- Use `.lounge_home` to help distribution packages handle config paths right ([#1416](https://github.com/thelounge/thelounge/pull/1416), [#1587](https://github.com/thelounge/thelounge/pull/1587) by [@xPaw](https://github.com/xPaw), [#1418](https://github.com/thelounge/thelounge/pull/1418) by [@astorije](https://github.com/astorije)) -- Implement push notifications ([#1124](https://github.com/thelounge/thelounge/pull/1124), [#1445](https://github.com/thelounge/thelounge/pull/1445), [#1572](https://github.com/thelounge/thelounge/pull/1572), [#1468](https://github.com/thelounge/thelounge/pull/1468) by [@xPaw](https://github.com/xPaw), [#1463](https://github.com/thelounge/thelounge/pull/1463) by [@astorije](https://github.com/astorije)) -- Set default `/quit` message ([#1448](https://github.com/thelounge/thelounge/pull/1448) by [@xPaw](https://github.com/xPaw)) -- Gracefully quit on Ctrl+C ([#1477](https://github.com/thelounge/thelounge/pull/1477) by [@xPaw](https://github.com/xPaw)) -- Add `/rejoin` command (a.k.a. `/cycle`) ([#1449](https://github.com/thelounge/thelounge/pull/1449) by [@dgw](https://github.com/dgw)) -- Add support for binding to Unix sockets ([#1479](https://github.com/thelounge/thelounge/pull/1479) by [@xPaw](https://github.com/xPaw)) -- Automatically load history when scrolling upwards ([#1318](https://github.com/thelounge/thelounge/pull/1318) by [@xPaw](https://github.com/xPaw)) -- Use `away-notify` to show updates on users away state ([#845](https://github.com/thelounge/thelounge/pull/845) by [@MaxLeiter](https://github.com/MaxLeiter)) -- Allow themes from npm ([#1266](https://github.com/thelounge/thelounge/pull/1266) by [@YaManicKill](https://github.com/YaManicKill), [#1542](https://github.com/thelounge/thelounge/pull/1542) by [@xPaw](https://github.com/xPaw)) -- Add anchor tag to URL to signify open page for reloading ([#1283](https://github.com/thelounge/thelounge/pull/1283) by [@MaxLeiter](https://github.com/MaxLeiter)) -- Automatic client reconnection ([#1471](https://github.com/thelounge/thelounge/pull/1471), [#1549](https://github.com/thelounge/thelounge/pull/1549) by [@xPaw](https://github.com/xPaw)) -- Create `lounge install` command ([#1539](https://github.com/thelounge/thelounge/pull/1539), [#1579](https://github.com/thelounge/thelounge/pull/1579) by [@xPaw](https://github.com/xPaw), [#1583](https://github.com/thelounge/thelounge/pull/1583) by [@astorije](https://github.com/astorije)) - -### Changed - -- Change history button text while loading ([#1403](https://github.com/thelounge/thelounge/pull/1403) by [@xPaw](https://github.com/xPaw)) -- Resolve relative URIs in link previewer ([#1410](https://github.com/thelounge/thelounge/pull/1410) by [@xPaw](https://github.com/xPaw)) -- Remove 10-second interval to trim buffer ([#1409](https://github.com/thelounge/thelounge/pull/1409) by [@xPaw](https://github.com/xPaw)) -- Refactor authentication flow ([#1411](https://github.com/thelounge/thelounge/pull/1411) by [@xPaw](https://github.com/xPaw)) -- Only match emoji autocomplete after two characters ([#1356](https://github.com/thelounge/thelounge/pull/1356) by [@MaxLeiter](https://github.com/MaxLeiter)) -- Improve CLI user management ([#1443](https://github.com/thelounge/thelounge/pull/1443) by [@astorije](https://github.com/astorije)) -- Bigger font size ([#1153](https://github.com/thelounge/thelounge/pull/1153) by [@bews](https://github.com/bews), [#1553](https://github.com/thelounge/thelounge/pull/1553), [#1561](https://github.com/thelounge/thelounge/pull/1561), [#1610](https://github.com/thelounge/thelounge/pull/1610) by [@astorije](https://github.com/astorije)) -- Extend fuzzy search in autocomplete to all strategies ([#1387](https://github.com/thelounge/thelounge/pull/1387) by [@yashsriv](https://github.com/yashsriv)) -- Only create config folder in `start` command ([#1350](https://github.com/thelounge/thelounge/pull/1350) by [@xPaw](https://github.com/xPaw)) -- Parse emoji to make them bigger ([#1446](https://github.com/thelounge/thelounge/pull/1446) by [@xPaw](https://github.com/xPaw), [#1481](https://github.com/thelounge/thelounge/pull/1481) by [@MaxLeiter](https://github.com/MaxLeiter)) -- Process chat messages in `requestIdleCallback` if available ([#1457](https://github.com/thelounge/thelounge/pull/1457) by [@xPaw](https://github.com/xPaw)) -- Completely refactor how date markers are inserted ([#1452](https://github.com/thelounge/thelounge/pull/1452) by [@xPaw](https://github.com/xPaw)) -- Bump default image prefetch limit ([#1490](https://github.com/thelounge/thelounge/pull/1490) by [@astorije](https://github.com/astorije)) -- Take an optional argument in `/part` ([#1476](https://github.com/thelounge/thelounge/pull/1476) by [@eliemichel](https://github.com/eliemichel)) -- Checkered background for transparent images in image viewer ([#1511](https://github.com/thelounge/thelounge/pull/1511) by [@xPaw](https://github.com/xPaw)) -- Use native font stack ([#1540](https://github.com/thelounge/thelounge/pull/1540) by [@xPaw](https://github.com/xPaw), [#1597](https://github.com/thelounge/thelounge/pull/1597) by [@astorije](https://github.com/astorije)) -- Add `touch-action` to messages, sidebar, and user list ([#1520](https://github.com/thelounge/thelounge/pull/1520) by [@iamstratos](https://github.com/iamstratos)) -- Handle browser history when opening/closing image preview ([#1503](https://github.com/thelounge/thelounge/pull/1503) by [@astorije](https://github.com/astorije)) -- Abort image prefetch if `Content-Length` exceeds limit ([#1567](https://github.com/thelounge/thelounge/pull/1567) by [@dgw](https://github.com/dgw)) -- Use monospace font in custom CSS textarea ([#1552](https://github.com/thelounge/thelounge/pull/1552) by [@astorije](https://github.com/astorije)) -- Update production dependencies to their latest versions, by [Greenkeeper](https://greenkeeper.io/) 🚀: - - `irc-framework` ([#1379](https://github.com/thelounge/thelounge/pull/1379), [#1385](https://github.com/thelounge/thelounge/pull/1385)) - - `fs-extra` ([#1386](https://github.com/thelounge/thelounge/pull/1386), [#1521](https://github.com/thelounge/thelounge/pull/1521)) - - `urijs` ([#1401](https://github.com/thelounge/thelounge/pull/1401), [#1405](https://github.com/thelounge/thelounge/pull/1405), [#1604](https://github.com/thelounge/thelounge/pull/1604)) - - `express` ([#1426](https://github.com/thelounge/thelounge/pull/1426), [#1589](https://github.com/thelounge/thelounge/pull/1589)) - - `ua-parser-js` ([#1426](https://github.com/thelounge/thelounge/pull/1426)) - - `web-push` ([#1516](https://github.com/thelounge/thelounge/pull/1516)) - - `request` ([#1546](https://github.com/thelounge/thelounge/pull/1546), [#1577](https://github.com/thelounge/thelounge/pull/1577)) - -### Removed - -- Remove `os.homedir()` polyfill ([#1419](https://github.com/thelounge/thelounge/pull/1419) by [@xPaw](https://github.com/xPaw)) -- Get rid of `/clear` command and keybind ([#1526](https://github.com/thelounge/thelounge/pull/1526) by [@astorije](https://github.com/astorije)) - -### Fixed - -- Correctly append OS name ([#1399](https://github.com/thelounge/thelounge/pull/1399) by [@xPaw](https://github.com/xPaw)) -- Correctly dereference stored images when leaving channels ([#1406](https://github.com/thelounge/thelounge/pull/1406) by [@xPaw](https://github.com/xPaw)) -- Do not throw an exception when URI parsing fails ([#1412](https://github.com/thelounge/thelounge/pull/1412) by [@xPaw](https://github.com/xPaw)) -- Take into account word boundaries for custom highlighting ([#1358](https://github.com/thelounge/thelounge/pull/1358) by [@starquake](https://github.com/starquake)) -- Do not unintentionally send incorrect messages from history ([#1444](https://github.com/thelounge/thelounge/pull/1444) by [@xPaw](https://github.com/xPaw)) -- Escape channel names in slugify helper correctly ([#1472](https://github.com/thelounge/thelounge/pull/1472) by [@xPaw](https://github.com/xPaw)) -- Format messages on copy ([#1464](https://github.com/thelounge/thelounge/pull/1464) by [@xPaw](https://github.com/xPaw)) -- Add `/list` to autocomplete ([#1496](https://github.com/thelounge/thelounge/pull/1496) by [@MaxLeiter](https://github.com/MaxLeiter)) -- Only change nick autocompletion when receiving a message ([#1495](https://github.com/thelounge/thelounge/pull/1495) by [@xPaw](https://github.com/xPaw)) -- Render link previews in browser idle event ([#1508](https://github.com/thelounge/thelounge/pull/1508) by [@xPaw](https://github.com/xPaw)) -- Fix image viewer turning black sometimes ([#1512](https://github.com/thelounge/thelounge/pull/1512) by [@xPaw](https://github.com/xPaw)) -- Fix requesting last messages when no message `id` is known ([#1519](https://github.com/thelounge/thelounge/pull/1519), [#1544](https://github.com/thelounge/thelounge/pull/1544) by [@xPaw](https://github.com/xPaw)) -- Display correct kick modes ([#1527](https://github.com/thelounge/thelounge/pull/1527) by [@dgw](https://github.com/dgw)) -- Move unread marker when loading more history ([#1517](https://github.com/thelounge/thelounge/pull/1517) by [@xPaw](https://github.com/xPaw)) -- Fix wrongly positioned menu when opening it and switching to landscape ([#1565](https://github.com/thelounge/thelounge/pull/1565) by [@astorije](https://github.com/astorije)) -- Fix flickering on link hovering, and inconsistencies between chat links and UI links ([#1573](https://github.com/thelounge/thelounge/pull/1573) by [@astorije](https://github.com/astorije)) -- Fix nick change on Safari for Mac and iOS ([#1568](https://github.com/thelounge/thelounge/pull/1568) by [@Gilles123](https://github.com/Gilles123)) -- Make sure channel list close button is really absent when channel is not selected ([#1623](https://github.com/thelounge/thelounge/pull/1623) by [@astorije](https://github.com/astorije)) - -### Security - -- Implement a proper LDAP authentication process ([#1478](https://github.com/thelounge/thelounge/pull/1478) by [@eliemichel](https://github.com/eliemichel)) -- Implement multiple sessions for users ([#1199](https://github.com/thelounge/thelounge/pull/1199) by [@xPaw](https://github.com/xPaw)) -- Deleting a user should log them out ([#1474](https://github.com/thelounge/thelounge/pull/1474) by [@xPaw](https://github.com/xPaw)) -- Remove the "Stay signed in" checkbox at login ([#1465](https://github.com/thelounge/thelounge/pull/1465) by [@astorije](https://github.com/astorije)) -- Implement session list and allow signing out other clients ([#1536](https://github.com/thelounge/thelounge/pull/1536) by [@xPaw](https://github.com/xPaw)) - -### Documentation - -In the main repository: - -- Add Stack Overflow link in CONTRIBUTING file ([#1373](https://github.com/thelounge/thelounge/pull/1373) by [@astorije](https://github.com/astorije)) -- Add feature overview in README ([#1427](https://github.com/thelounge/thelounge/pull/1427) by [@xPaw](https://github.com/xPaw)) -- Add documentation for `LOUNGE_HOME` environment variable in the CLI helper ([#1438](https://github.com/thelounge/thelounge/pull/1438) by [@astorije](https://github.com/astorije)) -- Fix general spelling errors ([#1458](https://github.com/thelounge/thelounge/pull/1458) by [@PolarizedIons](https://github.com/PolarizedIons)) -- Remove duplicate keybindings help ([#1543](https://github.com/thelounge/thelounge/pull/1543) by [@xPaw](https://github.com/xPaw)) - -On the [website repository](https://github.com/thelounge/thelounge.chat): - -- Remove wrong and inexistent home option from configuration documentation ([#72](https://github.com/thelounge/thelounge.chat/pull/72) by [@astorije](https://github.com/astorije)) -- Deprecate `--home` in favor of `LOUNGE_HOME` environment variable ([#73](https://github.com/thelounge/thelounge.chat/pull/73) by [@astorije](https://github.com/astorije)) -- Add themes docs ([#69](https://github.com/thelounge/thelounge.chat/pull/69) by [@YaManicKill](https://github.com/YaManicKill)) -- Add missing `prefetchStorage` configuration option to docs ([#74](https://github.com/thelounge/thelounge.chat/pull/74) by [@MiniDigger](https://github.com/MiniDigger)) - -### Internals - -- Get closer to stylelint's standard config ([#1439](https://github.com/thelounge/thelounge/pull/1439) by [@astorije](https://github.com/astorije)) -- Move all auto completion code to a separate file ([#1453](https://github.com/thelounge/thelounge/pull/1453) by [@xPaw](https://github.com/xPaw)) -- Enforce semicolon spacing ([#1488](https://github.com/thelounge/thelounge/pull/1488) by [@xPaw](https://github.com/xPaw)) -- One line server startup errors ([#1492](https://github.com/thelounge/thelounge/pull/1492) by [@xPaw](https://github.com/xPaw)) -- Move even more code out of `lounge.js` ([#1500](https://github.com/thelounge/thelounge/pull/1500) by [@xPaw](https://github.com/xPaw)) -- Remove unnecessary `end()` calls ([#1518](https://github.com/thelounge/thelounge/pull/1518) by [@xPaw](https://github.com/xPaw)) -- Move user log function where it belongs ([#1528](https://github.com/thelounge/thelounge/pull/1528), [#1585](https://github.com/thelounge/thelounge/pull/1585) by [@xPaw](https://github.com/xPaw), [#1535](https://github.com/thelounge/thelounge/pull/1535) by [@astorije](https://github.com/astorije)) -- Enable `no-console` and `no-alert` ESLint rules ([#1538](https://github.com/thelounge/thelounge/pull/1538) by [@astorije](https://github.com/astorije)) -- Use `Mousetrap` for image viewer shortcuts ([#1566](https://github.com/thelounge/thelounge/pull/1566) by [@astorije](https://github.com/astorije)) -- Remove `event-stream` dependency in favor of plain `Buffers` ([#1554](https://github.com/thelounge/thelounge/pull/1554) by [@astorije](https://github.com/astorije)) -- Skip cleanup on Travis ([`da31317`](https://github.com/thelounge/thelounge/commit/da31317156047000819fa0363c435005104aa572) by [@xPaw](https://github.com/xPaw)) -- Remove `--progress` from webpack ([#1608](https://github.com/thelounge/thelounge/pull/1608) by [@xPaw](https://github.com/xPaw)) -- Add tests for invalid URLs ([#1620](https://github.com/thelounge/thelounge/pull/1620) by [@xPaw](https://github.com/xPaw)) -- Update development dependencies to their latest versions, by [Greenkeeper](https://greenkeeper.io/) 🚀: - - `nyc` ([#1382](https://github.com/thelounge/thelounge/pull/1382), [#1498](https://github.com/thelounge/thelounge/pull/1498), [#1505](https://github.com/thelounge/thelounge/pull/1505)) - - `mocha` ([#1388](https://github.com/thelounge/thelounge/pull/1388), [#1513](https://github.com/thelounge/thelounge/pull/1513), [#1514](https://github.com/thelounge/thelounge/pull/1514), [#1515](https://github.com/thelounge/thelounge/pull/1515)) - - `chai` ([#1394](https://github.com/thelounge/thelounge/pull/1394), [#1482](https://github.com/thelounge/thelounge/pull/1482)) - - `eslint` ([#1395](https://github.com/thelounge/thelounge/pull/1395), [#1435](https://github.com/thelounge/thelounge/pull/1435), [#1493](https://github.com/thelounge/thelounge/pull/1493), [#1532](https://github.com/thelounge/thelounge/pull/1532), [#1541](https://github.com/thelounge/thelounge/pull/1541), [#1555](https://github.com/thelounge/thelounge/pull/1555), [#1591](https://github.com/thelounge/thelounge/pull/1591)) - - `webpack` ([#1397](https://github.com/thelounge/thelounge/pull/1397), [#1407](https://github.com/thelounge/thelounge/pull/1407), [#1424](https://github.com/thelounge/thelounge/pull/1424), [#1507](https://github.com/thelounge/thelounge/pull/1507), [#1531](https://github.com/thelounge/thelounge/pull/1531)) - - `babel-core` ([#1425](https://github.com/thelounge/thelounge/pull/1425)) - - `babel-loader` ([#1434](https://github.com/thelounge/thelounge/pull/1434)) - - `npm-run-all` ([#1462](https://github.com/thelounge/thelounge/pull/1462), [#1466](https://github.com/thelounge/thelounge/pull/1466)) - - `jquery-textcomplete` ([#1473](https://github.com/thelounge/thelounge/pull/1473)) - - `handlebars-loader` ([#1487](https://github.com/thelounge/thelounge/pull/1487)) - - `stylelint` ([#1499](https://github.com/thelounge/thelounge/pull/1499)) - -## v2.5.0-rc.5 - 2017-10-11 [Pre-release] - -[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.5.0-rc.4...v2.5.0-rc.5) - -This is a release candidate for v2.5.0 to ensure maximum stability for public release. -Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry. - -As with all pre-releases, this version requires explicit use of the `next` tag to be installed: - -```sh -npm install -g thelounge@next -``` - -## v2.5.0-rc.4 - 2017-10-06 [Pre-release] - -[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.5.0-rc.3...v2.5.0-rc.4) - -This is a release candidate for v2.5.0 to ensure maximum stability for public release. -Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry. - -As with all pre-releases, this version requires explicit use of the `next` tag to be installed: - -```sh -npm install -g thelounge@next -``` - -## v2.5.0-rc.3 - 2017-10-04 [Pre-release] - -[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.5.0-rc.2...v2.5.0-rc.3) - -This is a release candidate for v2.5.0 to ensure maximum stability for public release. -Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry. - -As with all pre-releases, this version requires explicit use of the `next` tag to be installed: - -```sh -npm install -g thelounge@next -``` - -## v2.5.0-rc.2 - 2017-10-01 [Pre-release] - -[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.5.0-rc.1...v2.5.0-rc.2) - -This is a release candidate for v2.5.0 to ensure maximum stability for public release. -Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry. - -As with all pre-releases, this version requires explicit use of the `next` tag to be installed: - -```sh -npm install -g thelounge@next -``` - -## v2.5.0-rc.1 - 2017-09-26 [Pre-release] - -[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.4.0...v2.5.0-rc.1) - -This is a release candidate for v2.5.0 to ensure maximum stability for public release. -Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry. - -As with all pre-releases, this version requires explicit use of the `next` tag to be installed: - -```sh -npm install -g thelounge@next -``` - -## v2.4.0 - 2017-07-30 - -For more details, [see the full changelog](https://github.com/thelounge/thelounge/compare/v2.3.2...v2.4.0) and [milestone](https://github.com/thelounge/thelounge/milestone/25?closed=1). - -This release improves link and image previews a great deal! On the menu: - -- Up to 5 previews are now displayed instead of 1 -- All previews on the current channel can now be hidden or displayed using the `/collapse` and `/expand` commands -- Thumbnails can be opened in a fullscreen viewer without leaving the app by clicking on them, and cycled using the previous/next buttons or by hitting and -- Say bye to mixed content warnings: The Lounge can now proxy all images (opt-in option in the server settings) for better privacy -- Title and description are improved overall - -Also in this release, auto-complete feature now has an opt-out option in the client settings, and emoji can be searched using fuzzy-matching: - -The Lounge - Emoji fuzzy-matching - -### Added - -- Add `title` attributes to previews ([#1291](https://github.com/thelounge/thelounge/pull/1291) by [@astorije](https://github.com/astorije)) -- Allow opting out of autocomplete ([#1294](https://github.com/thelounge/thelounge/pull/1294) by [@awalgarg](https://github.com/awalgarg)) -- Add collapse/expand commands to toggle all previews ([#1309](https://github.com/thelounge/thelounge/pull/1309) by [@astorije](https://github.com/astorije)) -- An image viewer popup for thumbnails and image previews, with buttons to previous/next images ([#1325](https://github.com/thelounge/thelounge/pull/1325), [#1365](https://github.com/thelounge/thelounge/pull/1365), [#1368](https://github.com/thelounge/thelounge/pull/1368), [#1367](https://github.com/thelounge/thelounge/pull/1367) by [@astorije](https://github.com/astorije), [#1370](https://github.com/thelounge/thelounge/pull/1370) by [@xPaw](https://github.com/xPaw)) -- Store preview images on disk for privacy, security and caching ([#1307](https://github.com/thelounge/thelounge/pull/1307) by [@xPaw](https://github.com/xPaw)) -- Emoji fuzzy-matching ([#1334](https://github.com/thelounge/thelounge/pull/1334) by [@MaxLeiter](https://github.com/MaxLeiter)) - -### Changed - -- Check status code in link prefetcher ([#1260](https://github.com/thelounge/thelounge/pull/1260) by [@xPaw](https://github.com/xPaw)) -- Check `og:description` before `description` tag in previews ([#1255](https://github.com/thelounge/thelounge/pull/1255) by [@xPaw](https://github.com/xPaw)) -- Check `og:title` before `title` tag in previews ([#1256](https://github.com/thelounge/thelounge/pull/1256) by [@xPaw](https://github.com/xPaw)) -- Do not display preview if there is nothing to preview ([#1273](https://github.com/thelounge/thelounge/pull/1273) by [@xPaw](https://github.com/xPaw)) -- Increase max downloaded bytes for link preview ([#1274](https://github.com/thelounge/thelounge/pull/1274) by [@xPaw](https://github.com/xPaw)) -- Refactor link previews ([#1276](https://github.com/thelounge/thelounge/pull/1276) by [@xPaw](https://github.com/xPaw), [#1378](https://github.com/thelounge/thelounge/pull/1378) by [@astorije](https://github.com/astorije)) -- Support multiple previews per message ([#1303](https://github.com/thelounge/thelounge/pull/1303), [#1324](https://github.com/thelounge/thelounge/pull/1324), [#1335](https://github.com/thelounge/thelounge/pull/1335), [#1348](https://github.com/thelounge/thelounge/pull/1348), [#1347](https://github.com/thelounge/thelounge/pull/1347), [#1353](https://github.com/thelounge/thelounge/pull/1353) by [@astorije](https://github.com/astorije)) -- Add `mask-icon` for pinned safari tab ([#1329](https://github.com/thelounge/thelounge/pull/1329) by [@MaxLeiter](https://github.com/MaxLeiter)) -- Lazily load user list in channels on init, keep autocompletion sort on server ([#1194](https://github.com/thelounge/thelounge/pull/1194) by [@xPaw](https://github.com/xPaw)) -- Keep track of preview visibility on the server so it persists at page reload ([#1366](https://github.com/thelounge/thelounge/pull/1366) by [@astorije](https://github.com/astorije)) -- Bump express and socket.io to their latest patch versions ([#1312](https://github.com/thelounge/thelounge/pull/1312) by [@astorije](https://github.com/astorije)) -- Update production dependencies to their latest versions, by [Greenkeeper](https://greenkeeper.io/) 🚀: - - `commander` ([#1257](https://github.com/thelounge/thelounge/pull/1257), [#1292](https://github.com/thelounge/thelounge/pull/1292)) - - `jquery-textcomplete` ([#1279](https://github.com/thelounge/thelounge/pull/1279), [#1321](https://github.com/thelounge/thelounge/pull/1321)) - - `fs-extra` ([#1332](https://github.com/thelounge/thelounge/pull/1332)) - - `semver` ([#1369](https://github.com/thelounge/thelounge/pull/1369)) - -### Removed - -- Remove hostname prettifier ([#1306](https://github.com/thelounge/thelounge/pull/1306) by [@xPaw](https://github.com/xPaw)) -- Remove `X-UA-Compatible` ([#1328](https://github.com/thelounge/thelounge/pull/1328) by [@xPaw](https://github.com/xPaw)) - -### Fixed - -- Make sure thumbnail is a valid image in previews ([#1254](https://github.com/thelounge/thelounge/pull/1254) by [@xPaw](https://github.com/xPaw)) -- Parse `X-Forwarded-For` header correctly ([#1202](https://github.com/thelounge/thelounge/pull/1202) by [@xPaw](https://github.com/xPaw)) -- Do not truncate link previews if viewport can fit more text ([#1293](https://github.com/thelounge/thelounge/pull/1293) by [@xPaw](https://github.com/xPaw)) -- Fix too big line height previews text on Crypto ([#1296](https://github.com/thelounge/thelounge/pull/1296) by [@astorije](https://github.com/astorije)) -- Fix background color contrast on Zenburn previews ([#1297](https://github.com/thelounge/thelounge/pull/1297) by [@astorije](https://github.com/astorije)) -- Fix jumps when toggling link preview ([#1298](https://github.com/thelounge/thelounge/pull/1298) by [@xPaw](https://github.com/xPaw)) -- Fix losing network settings ([#1305](https://github.com/thelounge/thelounge/pull/1305) by [@xPaw](https://github.com/xPaw)) -- Fix missing transitions ([#1314](https://github.com/thelounge/thelounge/pull/1314), [#1336](https://github.com/thelounge/thelounge/pull/1336), [#1374](https://github.com/thelounge/thelounge/pull/1374) by [@astorije](https://github.com/astorije), [#1117](https://github.com/thelounge/thelounge/pull/1117) by [@bews](https://github.com/bews)) -- Fix incorrect mode on kick target ([#1352](https://github.com/thelounge/thelounge/pull/1352) by [@xPaw](https://github.com/xPaw)) -- Correctly show whitespace and newlines in messages ([#1242](https://github.com/thelounge/thelounge/pull/1242) by [@starquake](https://github.com/starquake), [#1359](https://github.com/thelounge/thelounge/pull/1359) by [@xPaw](https://github.com/xPaw)) -- Hide overflow on entire message row ([#1361](https://github.com/thelounge/thelounge/pull/1361) by [@starquake](https://github.com/starquake)) -- Fix link previews not truncating correctly ([#1363](https://github.com/thelounge/thelounge/pull/1363) by [@xPaw](https://github.com/xPaw)) - -### Documentation - -In the main repository: - -- Remove mention in CHANGELOG that The Lounge uses Semantic Versioning ([#1269](https://github.com/thelounge/thelounge/pull/1269) by [@astorije](https://github.com/astorije)) -- Remove `devDependencies` badge on README ([#1267](https://github.com/thelounge/thelounge/pull/1267) by [@astorije](https://github.com/astorije)) -- Reword link preview settings to better match reality ([#1310](https://github.com/thelounge/thelounge/pull/1310) by [@astorije](https://github.com/astorije)) -- Update screenshot in README ([#1326](https://github.com/thelounge/thelounge/pull/1326) by [@MaxLeiter](https://github.com/MaxLeiter)) -- Update README badge to new demo URL ([#1345](https://github.com/thelounge/thelounge/pull/1345) by [@MaxLeiter](https://github.com/MaxLeiter)) -- Update README for when to run `npm run build` ([#1319](https://github.com/thelounge/thelounge/pull/1319) by [@MaxLeiter](https://github.com/MaxLeiter)) - -On the website: - -- Update demo URL to new demo ([#70](https://github.com/thelounge/thelounge.chat/pull/70) by [@MaxLeiter](https://github.com/MaxLeiter)) - -### Internals - -- Move nickname rendering to a single template ([#1252](https://github.com/thelounge/thelounge/pull/1252) by [@xPaw](https://github.com/xPaw)) -- Ignore all dotfiles in `.npmignore` ([#1287](https://github.com/thelounge/thelounge/pull/1287) by [@xPaw](https://github.com/xPaw)) -- Add `.npmrc` file with `save-exact` set to `true` so packages are saved already pinned ([#1284](https://github.com/thelounge/thelounge/pull/1284) by [@MaxLeiter](https://github.com/MaxLeiter)) -- Do not hardcode vendor bundles in webpack configuration ([#1280](https://github.com/thelounge/thelounge/pull/1280) by [@xPaw](https://github.com/xPaw)) -- Prepare for `SOURCE` CTCP command, when `irc-framework` supports it ([#1284](https://github.com/thelounge/thelounge/pull/1284) by [@MaxLeiter](https://github.com/MaxLeiter)) -- Change "Show older messages" to use `id` rather than count ([#1354](https://github.com/thelounge/thelounge/pull/1354) by [@YaManicKill](https://github.com/YaManicKill)) -- Update development dependencies to their latest versions, by [Greenkeeper](https://greenkeeper.io/) 🚀: - - `eslint` ([#1264](https://github.com/thelounge/thelounge/pull/1264), [#1272](https://github.com/thelounge/thelounge/pull/1272), [#1315](https://github.com/thelounge/thelounge/pull/1315), [#1362](https://github.com/thelounge/thelounge/pull/1362)) - - `nyc` ([#1277](https://github.com/thelounge/thelounge/pull/1277)) - - `stylelint` ([#1278](https://github.com/thelounge/thelounge/pull/1278), [#1320](https://github.com/thelounge/thelounge/pull/1320), [#1340](https://github.com/thelounge/thelounge/pull/1340)) - - `babel-loader` ([#1282](https://github.com/thelounge/thelounge/pull/1282)) - - `babel-preset-env` ([#1295](https://github.com/thelounge/thelounge/pull/1295)) - - `webpack` ([#1308](https://github.com/thelounge/thelounge/pull/1308), [#1322](https://github.com/thelounge/thelounge/pull/1322), [#1338](https://github.com/thelounge/thelounge/pull/1338), [#1371](https://github.com/thelounge/thelounge/pull/1371), [#1376](https://github.com/thelounge/thelounge/pull/1376)) - - `chai` ([#1323](https://github.com/thelounge/thelounge/pull/1323)) - -## v2.4.0-rc.2 - 2017-07-27 [Pre-release] - -[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.4.0-rc.1...v2.4.0-rc.2) - -This is a release candidate for v2.4.0 to ensure maximum stability for public release. -Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry. - -As with all pre-releases, this version requires explicit use of the `next` tag to be installed: - -```sh -npm install -g thelounge@next -``` - -## v2.4.0-rc.1 - 2017-07-27 [Pre-release] - -[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.3.2...v2.4.0-rc.1) - -This is a release candidate for v2.4.0 to ensure maximum stability for public release. -Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry. - -As with all pre-releases, this version requires explicit use of the `next` tag to be installed: - -```sh -npm install -g thelounge@next -``` - -## v2.3.2 - 2017-06-25 - -For more details, [see the full changelog](https://github.com/thelounge/thelounge/compare/v2.3.1...v2.3.2) and [milestone](https://github.com/thelounge/thelounge/milestone/24?closed=1). - -This patch releases brings a lot of fixes and small improvements here and there, as well as the ability to display seconds in timestamps, a long-awaited feature! - -### Added - -- Add a client option to display seconds in timestamps ([#1141](https://github.com/thelounge/thelounge/pull/1141) by [@bews](https://github.com/bews)) -- Add "Reload page" button when the client fails to load ([#1150](https://github.com/thelounge/thelounge/pull/1150) by [@bews](https://github.com/bews)) - -### Changed - -- Treat `click` as a read activity ([#1214](https://github.com/thelounge/thelounge/pull/1214) by [@xPaw](https://github.com/xPaw)) -- Fade out for long nicks ([#1158](https://github.com/thelounge/thelounge/pull/1158) by [@bews](https://github.com/bews), [#1253](https://github.com/thelounge/thelounge/pull/1253) by [@xPaw](https://github.com/xPaw)) -- Include trickery to reduce paints and improve performance ([#1120](https://github.com/thelounge/thelounge/pull/1120) by [@xPaw](https://github.com/xPaw), [#1083](https://github.com/thelounge/thelounge/pull/1083) by [@bews](https://github.com/bews)) -- Make everything un-selectable by default ([#1233](https://github.com/thelounge/thelounge/pull/1233) by [@xPaw](https://github.com/xPaw)) -- Handle images with unknown size in prefetch ([#1246](https://github.com/thelounge/thelounge/pull/1246) by [@bews](https://github.com/bews)) -- Update production dependencies to their latest versions, by [Greenkeeper](https://greenkeeper.io/) 🚀: - - `spdy` ([#1184](https://github.com/thelounge/thelounge/pull/1184)) - -### Fixed - -- Stop showing the unread messages marker when `joins`/`parts`/`quits`/etc. are hidden ([#1016](https://github.com/thelounge/thelounge/pull/1016) by [@swordbeta](https://github.com/swordbeta)) -- Correctly finish scroll animation when using page keys ([#1244](https://github.com/thelounge/thelounge/pull/1244) by [@xPaw](https://github.com/xPaw)) -- Hide link time element on small devices ([#1261](https://github.com/thelounge/thelounge/pull/1261) by [@xPaw](https://github.com/xPaw)) -- Fix MOTD underline in Safari ([#1217](https://github.com/thelounge/thelounge/pull/1217) by [@MaxLeiter](https://github.com/MaxLeiter)) - -### Documentation - -In the main repository: - -- Clarify kilobyte ambiguity ([#1248](https://github.com/thelounge/thelounge/pull/1248) by [@xPaw](https://github.com/xPaw)) -- Fix stray end tag ([#1251](https://github.com/thelounge/thelounge/pull/1251) by [@xPaw](https://github.com/xPaw)) - -### Internals - -- Update to ESLint 4 and enforce extra rules ([#1231](https://github.com/thelounge/thelounge/pull/1231) by [@xPaw](https://github.com/xPaw)) -- Improve the PR tester script a bit ([#1240](https://github.com/thelounge/thelounge/pull/1240) by [@astorije](https://github.com/astorije)) -- Add modules for socket events ([#1175](https://github.com/thelounge/thelounge/pull/1175) by [@YaManicKill](https://github.com/YaManicKill)) -- Ignore `package-lock.json` ([#1247](https://github.com/thelounge/thelounge/pull/1247) by [@xPaw](https://github.com/xPaw)) -- Use `stylelint-config-standard` ([#1249](https://github.com/thelounge/thelounge/pull/1249) by [@xPaw](https://github.com/xPaw)) -- Update development dependencies to their latest versions, by [Greenkeeper](https://greenkeeper.io/) 🚀: - - `babel-core` ([#1212](https://github.com/thelounge/thelounge/pull/1212)) - - `babel-loader` ([#1245](https://github.com/thelounge/thelounge/pull/1245)) - - `nyc` ([#1198](https://github.com/thelounge/thelounge/pull/1198)) - - `stylelint` ([#1215](https://github.com/thelounge/thelounge/pull/1215), [#1230](https://github.com/thelounge/thelounge/pull/1230)) - - `chai` ([#1206](https://github.com/thelounge/thelounge/pull/1206)) - - `webpack` ([#1238](https://github.com/thelounge/thelounge/pull/1238)) - -## v2.3.1 - 2017-06-09 - -For more details, [see the full changelog](https://github.com/thelounge/thelounge/compare/v2.3.0...v2.3.1) and [milestone](https://github.com/thelounge/thelounge/milestone/23?closed=1). - -This release mostly fixes a few bugs, as listed below. - -### Changed - -- Keep original `` name when changing the title ([#1205](https://github.com/thelounge/thelounge/pull/1205) by [@xPaw](https://github.com/xPaw)) -- Update production dependencies to their latest versions, by [Greenkeeper](https://greenkeeper.io/) 🚀: - - `handlebars` ([#1179](https://github.com/thelounge/thelounge/pull/1179)) - -### Fixed - -- Do not store unnecessary information in user objects ([#1195](https://github.com/thelounge/thelounge/pull/1195) by [@xPaw](https://github.com/xPaw)) -- Correctly configure client socket transports ([#1197](https://github.com/thelounge/thelounge/pull/1197) by [@xPaw](https://github.com/xPaw)) -- Fix network name not being set when `displayNetwork` is `false` ([#1211](https://github.com/thelounge/thelounge/pull/1211) by [@xPaw](https://github.com/xPaw)) - -### Security - -- Do not store passwords in settings storage ([#1204](https://github.com/thelounge/thelounge/pull/1204) by [@xPaw](https://github.com/xPaw)) - -### Internals - -- Fix `localtime` test to correctly use UTC ([#1201](https://github.com/thelounge/thelounge/pull/1201) by [@xPaw](https://github.com/xPaw)) -- Update Node.js versions for Travis CI ([#1191](https://github.com/thelounge/thelounge/pull/1191) by [@YaManicKill](https://github.com/YaManicKill)) -- Update development dependencies to their latest versions, by [Greenkeeper](https://greenkeeper.io/) 🚀: - - `mocha` ([#1170](https://github.com/thelounge/thelounge/pull/1170)) - - `webpack` ([#1183](https://github.com/thelounge/thelounge/pull/1183)) - - `babel-preset-env` ([#1177](https://github.com/thelounge/thelounge/pull/1177)) - -## v2.3.0 - 2017-06-08 - -For more details, [see the full changelog](https://github.com/thelounge/thelounge/compare/v2.2.2...v2.3.0) and [milestone](https://github.com/thelounge/thelounge/milestone/9?closed=1). - -What a release! Our biggest one since the v2.0.0 [release](https://github.com/thelounge/thelounge/releases/tag/v2.0.0) / [milestone](https://github.com/thelounge/thelounge/milestone/1?closed=1)! -Expect a lot of new cool stuff, tons of bug fixes and performance improvements. -Thanks to all 16 contributors (!!) who pitched in for this release, open source at its finest! - -On the server side, The Lounge now supports an auto-away mechanism, stores channel keys across restarts and key changes, and supports a new SSL CA bundle option in the configuration file. - -Users of the client will notice some changes as well: - -- A bunch of new hotkeys to style messages (bold, italic, underline, foreground/background color), all listed in the Help window - -- A new autocomplete mechanism for emoji, users, channels, commands, and colors: - - <img alt="The Lounge - Auto-completion" src="https://user-images.githubusercontent.com/113730/26863276-a565fad8-4b1f-11e7-8aa4-21bb812c2568.gif" width=500> - - Note that due to the new nick autocomplete, we removed the now unnecessary nick cycle button that was temporarily added in the meantime. Lots of users have reported it had been broken by a previous release anyway. - -- Support of page up/down keys to browse the current chat - -- Friendliness-bump of time-related tooltips and date marker: - - ![The Lounge - Timestamp tooltips](https://user-images.githubusercontent.com/113730/26863323-f57cb85e-4b1f-11e7-9b4c-27b62d518af5.gif)     ![The Lounge - Friendly date marker](https://user-images.githubusercontent.com/113730/26863322-f577f634-4b1f-11e7-8131-c1b3f3ffe743.gif) - -- Support of browsers' Back/Forward actions: - - <img alt="The Lounge - Support of browser Back/Forward" src="https://user-images.githubusercontent.com/113730/26863320-f5761efe-4b1f-11e7-8fb4-de2c5c34cca3.gif" width=300> - -- Better and more discreet inline previews for links and images: - - <img alt="The Lounge - Link preview" src="https://user-images.githubusercontent.com/113730/26863418-887b9364-4b20-11e7-8016-1b5367690d7e.png" width=400><br> - <img alt="The Lounge - Image preview" src="https://user-images.githubusercontent.com/113730/26863419-887bcc4e-4b20-11e7-9055-1913a9aba0e4.png" width=300> - -- Improved channel list with `/list` - -- Support for `/ban`, `/unban` and `/banlist` - -- Fuzzy-matching of the user list search to find folks more easily: - - ![The Lounge - Fuzzy matching in the user list](https://user-images.githubusercontent.com/113730/26863472-c86b58c4-4b20-11e7-84c1-f66ee8d3e99b.gif) - -That's all for this release, and onto the next one now! - -### Added - -- Add `data-from` attribute to allow styling messages from specific users ([#978](https://github.com/thelounge/thelounge/pull/978) by [@williamboman](https://github.com/williamboman)) -- Auto away when no clients are connected ([#775](https://github.com/thelounge/thelounge/pull/775), [#1104](https://github.com/thelounge/thelounge/pull/1104) by [@xPaw](https://github.com/xPaw)) -- Implement color hotkeys ([#810](https://github.com/thelounge/thelounge/pull/810) by [@xPaw](https://github.com/xPaw)) -- Store channel keys ([#1003](https://github.com/thelounge/thelounge/pull/1003) by [@xPaw](https://github.com/xPaw), [#715](https://github.com/thelounge/thelounge/pull/715) by [@spookhurb](https://github.com/spookhurb)) -- Implement <kbd>pgup</kbd>/<kbd>pgdown</kbd> keys ([#955](https://github.com/thelounge/thelounge/pull/955) by [@xPaw](https://github.com/xPaw), [#1078](https://github.com/thelounge/thelounge/pull/1078) by [@YaManicKill](https://github.com/YaManicKill)) -- Add CSS tooltips on time elements to give ability to view time on mobile ([#824](https://github.com/thelounge/thelounge/pull/824) by [@xPaw](https://github.com/xPaw)) -- Add SSL CA bundle option ([#1024](https://github.com/thelounge/thelounge/pull/1024) by [@metsjeesus](https://github.com/metsjeesus)) -- Implement History Web API ([#575](https://github.com/thelounge/thelounge/pull/575) by [@williamboman](https://github.com/williamboman), [#1080](https://github.com/thelounge/thelounge/pull/1080) by [@YaManicKill](https://github.com/YaManicKill)) -- Add slug with command to unhandled messages ([#816](https://github.com/thelounge/thelounge/pull/816) by [@DanielOaks](https://github.com/DanielOaks), [#1044](https://github.com/thelounge/thelounge/pull/1044) by [@YaManicKill](https://github.com/YaManicKill)) -- Add support for the `/banlist` command ([#1009](https://github.com/thelounge/thelounge/pull/1009) by [@YaManicKill](https://github.com/YaManicKill)) -- Add support for `/ban` and `/unban` commands ([#1077](https://github.com/thelounge/thelounge/pull/1077) by [@YaManicKill](https://github.com/YaManicKill)) -- Add autocompletion for emoji, users, channels, and commands ([#787](https://github.com/thelounge/thelounge/pull/787) by [@yashsriv](https://github.com/yashsriv), [#1138](https://github.com/thelounge/thelounge/pull/1138), [#1095](https://github.com/thelounge/thelounge/pull/1095) by [@xPaw](https://github.com/xPaw)) -- Add autocomplete strategy for foreground and background colors ([#1109](https://github.com/thelounge/thelounge/pull/1109) by [@astorije](https://github.com/astorije)) -- Add support for `0x04` hex colors ([#1100](https://github.com/thelounge/thelounge/pull/1100) by [@xPaw](https://github.com/xPaw)) - -### Changed - -- Remove table layout for chat messages (and fix layout issues yet again) ([#523](https://github.com/thelounge/thelounge/pull/523) by [@maxpoulin64](https://github.com/maxpoulin64)) -- Improve inline previews for links and images ([#524](https://github.com/thelounge/thelounge/pull/524) by [@maxpoulin64](https://github.com/maxpoulin64)) -- Use local variables to check length ([#1028](https://github.com/thelounge/thelounge/pull/1028) by [@xPaw](https://github.com/xPaw)) -- Add `rel="noopener"` to URLs in `index.html` and replace mIRC colors URL to [@DanielOaks](https://github.com/DanielOaks)'s [documentation](https://modern.ircdocs.horse/formatting.html#colors) ([#1034](https://github.com/thelounge/thelounge/pull/1034) by [@xPaw](https://github.com/xPaw), [#1051](https://github.com/thelounge/thelounge/pull/1051) by [@astorije](https://github.com/astorije)) -- Preload scripts as soon as possible ([#1033](https://github.com/thelounge/thelounge/pull/1033) by [@xPaw](https://github.com/xPaw)) -- Improve channels list ([#1018](https://github.com/thelounge/thelounge/pull/1018) by [@swordbeta](https://github.com/swordbeta)) -- Show MOTD by default ([#1052](https://github.com/thelounge/thelounge/pull/1052) by [@KlipperKyle](https://github.com/KlipperKyle), [#1157](https://github.com/thelounge/thelounge/pull/1157) by [@astorije](https://github.com/astorije)) -- Switch to a new IRC message parser ([#972](https://github.com/thelounge/thelounge/pull/972) by [@xPaw](https://github.com/xPaw), [#699](https://github.com/thelounge/thelounge/pull/699) by [@Bonuspunkt](https://github.com/Bonuspunkt)) -- Use moment on the client to display friendly dates ([#1054](https://github.com/thelounge/thelounge/pull/1054) by [@astorije](https://github.com/astorije)) -- Implement fuzzy-matching for the user list ([#856](https://github.com/thelounge/thelounge/pull/856), [#1093](https://github.com/thelounge/thelounge/pull/1093), [#1167](https://github.com/thelounge/thelounge/pull/1167) by [@astorije](https://github.com/astorije), [#1091](https://github.com/thelounge/thelounge/pull/1091) by [@PolarizedIons](https://github.com/PolarizedIons), [#1107](https://github.com/thelounge/thelounge/pull/1107) by [@xPaw](https://github.com/xPaw)) -- Use moment to render dates everywhere ([#1114](https://github.com/thelounge/thelounge/pull/1114) by [@xPaw](https://github.com/xPaw)) -- Update production dependencies to their latest versions, by [Greenkeeper](https://greenkeeper.io/) 🚀: - - `moment` ([#976](https://github.com/thelounge/thelounge/pull/976), [#999](https://github.com/thelounge/thelounge/pull/999)) - - `fs-extra` ([#964](https://github.com/thelounge/thelounge/pull/964), [#1098](https://github.com/thelounge/thelounge/pull/1098), [#1136](https://github.com/thelounge/thelounge/pull/1136)) - - `jquery` ([#969](https://github.com/thelounge/thelounge/pull/969), [#998](https://github.com/thelounge/thelounge/pull/998)) - - `urijs` ([#995](https://github.com/thelounge/thelounge/pull/995)) - - `mousetrap` ([#1006](https://github.com/thelounge/thelounge/pull/1006)) - - `irc-framework` ([#1070](https://github.com/thelounge/thelounge/pull/1070), [#1074](https://github.com/thelounge/thelounge/pull/1074), [#1123](https://github.com/thelounge/thelounge/pull/1123)) - - `handlebars` ([#1116](https://github.com/thelounge/thelounge/pull/1116), [#1129](https://github.com/thelounge/thelounge/pull/1129)) - -### Removed - -- Remove invalid CSS perspective properties ([#1027](https://github.com/thelounge/thelounge/pull/1027) by [@astorije](https://github.com/astorije)) -- Remove cycle nicks button ([#1062](https://github.com/thelounge/thelounge/pull/1062) by [@xPaw](https://github.com/xPaw)) - -### Fixed - -- Rewrite identd server, combine with oidentd ([#804](https://github.com/thelounge/thelounge/pull/804), [#970](https://github.com/thelounge/thelounge/pull/970) by [@xPaw](https://github.com/xPaw)) -- Fix wrong font size in help center labels ([#994](https://github.com/thelounge/thelounge/pull/994) by [@astorije](https://github.com/astorije)) -- Fix filling in the nickname, overriding the username in the New Network window ([#873](https://github.com/thelounge/thelounge/pull/873) by [@PolarizedIons](https://github.com/PolarizedIons)) -- Correctly append date marker when receiving a message ([#1002](https://github.com/thelounge/thelounge/pull/1002) by [@xPaw](https://github.com/xPaw)) -- Count only message items for when loading more messages ([#1013](https://github.com/thelounge/thelounge/pull/1013) by [@awalgarg](https://github.com/awalgarg)) -- Fix Zenburn and Morning channel list font color ([#1017](https://github.com/thelounge/thelounge/pull/1017) by [@swordbeta](https://github.com/swordbeta)) -- Stick to bottom when opening user list ([#1032](https://github.com/thelounge/thelounge/pull/1032) by [@xPaw](https://github.com/xPaw)) -- Reset notification markers on document focus ([#1040](https://github.com/thelounge/thelounge/pull/1040) by [@xPaw](https://github.com/xPaw)) -- Disable show more button when loading messages ([#1045](https://github.com/thelounge/thelounge/pull/1045) by [@YaManicKill](https://github.com/YaManicKill)) -- Fix to `helper.expandhome` to correctly resolve `""` and `undefined` ([#1050](https://github.com/thelounge/thelounge/pull/1050) by [@metsjeesus](https://github.com/metsjeesus)) -- Fix displayNetwork to work correctly ([#1069](https://github.com/thelounge/thelounge/pull/1069) by [@xPaw](https://github.com/xPaw)) -- Enable show more button correctly ([#1068](https://github.com/thelounge/thelounge/pull/1068) by [@xPaw](https://github.com/xPaw)) -- Rewrite server code of channel sorting ([#1064](https://github.com/thelounge/thelounge/pull/1064) by [@xPaw](https://github.com/xPaw) and ([#1115](https://github.com/thelounge/thelounge/pull/1115) by [@PolarizedIons](https://github.com/PolarizedIons))) -- Fix showing prefetch options ([#1087](https://github.com/thelounge/thelounge/pull/1087) by [@YaManicKill](https://github.com/YaManicKill)) -- Add `/ctcp` command to constants and auto-completion ([#1108](https://github.com/thelounge/thelounge/pull/1108) by [@MaxLeiter](https://github.com/MaxLeiter)) -- Disable `tabindex` on user list search input ([#1122](https://github.com/thelounge/thelounge/pull/1122) by [@xPaw](https://github.com/xPaw)) -- Fix date-marker not being removed on loading new messages ([#1132](https://github.com/thelounge/thelounge/pull/1132), [#1156](https://github.com/thelounge/thelounge/pull/1156) by [@PolarizedIons](https://github.com/PolarizedIons)) - -### Security - -- Switch to `bcryptjs` and make password comparison asynchronous ([#985](https://github.com/thelounge/thelounge/pull/985) by [@rockhouse](https://github.com/rockhouse), [`b46f92c`](https://github.com/thelounge/thelounge/commit/b46f92c7d8a07e84f49a550b32204c0a0672e831) by [@xPaw](https://github.com/xPaw)) -- Use Referrer-Policy header instead of CSP referrer ([#1015](https://github.com/thelounge/thelounge/pull/1015) by [@astorije](https://github.com/astorije)) - -### Internals - -- Enforce more space and new line rules ([#975](https://github.com/thelounge/thelounge/pull/975) by [@xPaw](https://github.com/xPaw)) -- Setup ESLint to make sure an EOF feed is always present ([#991](https://github.com/thelounge/thelounge/pull/991) by [@astorije](https://github.com/astorije)) -- Do not build json3 module with Webpack ([#977](https://github.com/thelounge/thelounge/pull/977) by [@xPaw](https://github.com/xPaw)) -- Remove extra newline to please ESLint ([#997](https://github.com/thelounge/thelounge/pull/997) by [@astorije](https://github.com/astorije)) -- Use `require()` instead of import in client code ([#973](https://github.com/thelounge/thelounge/pull/973) by [@xPaw](https://github.com/xPaw)) -- Do not build feature branch with open pull requests on AppVeyor ([`934400f`](https://github.com/thelounge/thelounge/commit/934400f5ee094e61c62dd0304cb55ea9f9666078) by [@xPaw](https://github.com/xPaw)) -- Exclude Webpack config from coverage report ([#1053](https://github.com/thelounge/thelounge/pull/1053) by [@astorije](https://github.com/astorije)) -- Create socket module ([#1060](https://github.com/thelounge/thelounge/pull/1060) by [@YaManicKill](https://github.com/YaManicKill)) -- Change index.html to be rendered using handlebars ([#1057](https://github.com/thelounge/thelounge/pull/1057) by [@YaManicKill](https://github.com/YaManicKill)) -- Move commands into constants module ([#1067](https://github.com/thelounge/thelounge/pull/1067) by [@YaManicKill](https://github.com/YaManicKill)) -- Use `babel-preset-env` ([#1072](https://github.com/thelounge/thelounge/pull/1072) by [@xPaw](https://github.com/xPaw)) -- Use `irc-framework`'s `setTopic()` for topic command ([#1082](https://github.com/thelounge/thelounge/pull/1082) by [@MaxLeiter](https://github.com/MaxLeiter)) -- Create options module ([#1066](https://github.com/thelounge/thelounge/pull/1066) by [@YaManicKill](https://github.com/YaManicKill)) -- Update development dependencies to their latest versions, by [Greenkeeper](https://greenkeeper.io/) 🚀: - - `babel-core` ([#958](https://github.com/thelounge/thelounge/pull/958), [#1021](https://github.com/thelounge/thelounge/pull/1021)) - - `babel-loader` ([#968](https://github.com/thelounge/thelounge/pull/968), [#1020](https://github.com/thelounge/thelounge/pull/1020), [#1063](https://github.com/thelounge/thelounge/pull/1063)) - - `babel-preset-es2015` ([#960](https://github.com/thelounge/thelounge/pull/960)) - - `eslint` ([#971](https://github.com/thelounge/thelounge/pull/971), [#1000](https://github.com/thelounge/thelounge/pull/1000)) - - `nyc` ([#989](https://github.com/thelounge/thelounge/pull/989), [#1113](https://github.com/thelounge/thelounge/pull/1113), [#1140](https://github.com/thelounge/thelounge/pull/1140)) - - `webpack` ([#981](https://github.com/thelounge/thelounge/pull/981), [#1007](https://github.com/thelounge/thelounge/pull/1007), [#1030](https://github.com/thelounge/thelounge/pull/1030), [#1133](https://github.com/thelounge/thelounge/pull/1133), [#1142](https://github.com/thelounge/thelounge/pull/1142)) - - `stylelint` ([#1004](https://github.com/thelounge/thelounge/pull/1004), [#1005](https://github.com/thelounge/thelounge/pull/1005)) - - `handlebars-loader` ([#1058](https://github.com/thelounge/thelounge/pull/1058)) - - `mocha` ([#1079](https://github.com/thelounge/thelounge/pull/1079)) - -## v2.3.0-rc.2 - 2017-05-16 [Pre-release] - -[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.3.0-rc.1...v2.3.0-rc.2) - -This is a release candidate for v2.3.0 to ensure maximum stability for public release. -Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry. - -As with all pre-releases, this version requires explicit use of the `next` tag to be installed: - -```sh -npm install -g thelounge@next -``` - -## v2.3.0-rc.1 - 2017-05-07 [Pre-release] - -[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.2.2...v2.3.0-rc.1) - -This is a release candidate for v2.3.0 to ensure maximum stability for public release. -Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry. - -As with all pre-releases, this version requires explicit use of the `next` tag to be installed: - -```sh -npm install -g thelounge@next -``` - -## v2.2.2 - 2017-03-13 - -For more details, [see the full changelog](https://github.com/thelounge/thelounge/compare/v2.2.1...v2.2.2) and [milestone](https://github.com/thelounge/thelounge/milestone/11?closed=1). - -This patch release brings a lot of dependency upgrades and a few fixes. Passing options to the `lounge` CLI (`lounge start --port 8080`, etc.) now works as expected without requiring `--`. We have also disabled ping timeouts for now to hopefully fix automatic reconnection. Finally, upgrading `irc-framework` allows us to fix an extra couple of bugs. - -You will now notice a new `(?)` icon at the bottom of the sidebar. It is home of a help center that currently details supported shortcuts and commands. It will be improved over time, but we encourage contributors to help us improve it. - -Note that as of this release, `lounge` without any arguments wil display the help information (mirroring `lounge --help`). Prior to this release, it used to start a server, which must now be done explicitly using `lounge start`. - -### Changed - -- Update to `jQuery` 3 ([#931](https://github.com/thelounge/thelounge/pull/931) by [@xPaw](https://github.com/xPaw)) -- Update `express` and `nyc` to latest versions ([#954](https://github.com/thelounge/thelounge/pull/954) by [@xPaw](https://github.com/xPaw)) -- Update production dependencies to their latest versions, by [Greenkeeper](https://greenkeeper.io/) 🚀: - - `mousetrap` ([#881](https://github.com/thelounge/thelounge/pull/881)) - - `fs-extra` ([#878](https://github.com/thelounge/thelounge/pull/878)) - - `irc-framework` ([#918](https://github.com/thelounge/thelounge/pull/918) and [#952](https://github.com/thelounge/thelounge/pull/952)) - - `urijs` ([#921](https://github.com/thelounge/thelounge/pull/921), [#940](https://github.com/thelounge/thelounge/pull/940) and [#946](https://github.com/thelounge/thelounge/pull/946)) - - `socket.io` and `socket.io-client` ([#926](https://github.com/thelounge/thelounge/pull/926)) - - `request` ([#944](https://github.com/thelounge/thelounge/pull/944)) - -### Fixed - -- Disable (temporarily) client ping timeouts ([#939](https://github.com/thelounge/thelounge/pull/939) by [@xPaw](https://github.com/xPaw)) -- Update arg parsing and default `lounge` to `lounge --help` ([#929](https://github.com/thelounge/thelounge/pull/929) by [@msaun008](https://github.com/msaun008)) -- Prevent message sending in lobbies ([#957](https://github.com/thelounge/thelounge/pull/957) by [@xPaw](https://github.com/xPaw)) - -### Documentation - -In the main repository: - -- Help window with supported commands and shortcuts ([#941](https://github.com/thelounge/thelounge/pull/941) by [@astorije](https://github.com/astorije)) - -On the website: - -- Add notes about moving client docs to the app itself ([#63](https://github.com/thelounge/thelounge.chat/pull/63) by [@astorije](https://github.com/astorije)) -- Deprecate (and attempt one last fixing) documentations of Heroku and Passenger ([#61](https://github.com/thelounge/thelounge.chat/pull/61) by [@astorije](https://github.com/astorije)) - -### Internals - -- Fix `run_pr.sh` script ([#919](https://github.com/thelounge/thelounge/pull/919) by [@astorije](https://github.com/astorije)) -- Make sure multiline chains of calls are correctly indented ([#930](https://github.com/thelounge/thelounge/pull/930) by [@astorije](https://github.com/astorije)) -- Update development dependencies to their latest versions, by [Greenkeeper](https://greenkeeper.io/) 🚀: - - `babel-core`, `babel-loader` and `babel-preset-es2015` ([#922](https://github.com/thelounge/thelounge/pull/922) and [#947](https://github.com/thelounge/thelounge/pull/947)) - - `webpack` ([#905](https://github.com/thelounge/thelounge/pull/905)) - - `stylelint` ([#934](https://github.com/thelounge/thelounge/pull/934)) - - `npm-run-all` ([#938](https://github.com/thelounge/thelounge/pull/938)) - - `eslint` ([#937](https://github.com/thelounge/thelounge/pull/937) and [#943](https://github.com/thelounge/thelounge/pull/943)) - -## v2.2.1 - 2017-02-12 - -For more details, [see the full changelog](https://github.com/thelounge/thelounge/compare/v2.2.0...v2.2.1) and [milestone](https://github.com/thelounge/thelounge/milestone/10?closed=1). - -This patch release packs up a change of the default value of `maxHistory`, an interactive prompt when creating a user to enable/disable user logging, a UI bug fix, and a few dependency upgrades. - -### Changed - -- Change default `maxHistory` to 10000 ([#899](https://github.com/thelounge/thelounge/pull/899) by [@xPaw](https://github.com/xPaw)) -- Prompt admin for user log at user creation ([#903](https://github.com/thelounge/thelounge/pull/903) by [@astorije](https://github.com/astorije)) -- Update `irc-framework` to the latest version 🚀 ([#902](https://github.com/thelounge/thelounge/pull/902) by [Greenkeeper](https://greenkeeper.io/)) -- Update `urijs` to the latest version 🚀 ([#904](https://github.com/thelounge/thelounge/pull/904) by [Greenkeeper](https://greenkeeper.io/)) -- Update `express` to the latest version 🚀 ([#898](https://github.com/thelounge/thelounge/pull/898) by [Greenkeeper](https://greenkeeper.io/)) - -### Fixed - -- Fix body height, regression from v2.2.0 ([#913](https://github.com/thelounge/thelounge/pull/913) by [@YaManicKill](https://github.com/YaManicKill)) - -### Documentation - -In the main repository: - -- Explain about `lounge` command in dev installations ([#887](https://github.com/thelounge/thelounge/pull/887) by [@drkitty](https://github.com/drkitty)) - -On the website: - -- Port recent changes to `maxHistory` from default config file ([#60](https://github.com/thelounge/thelounge.chat/pull/60) by [@astorije](https://github.com/astorije)) - -### Internals - -- Sort depedencies in `package.json` ([#896](https://github.com/thelounge/thelounge/pull/896) by [@xPaw](https://github.com/xPaw)) -- Update `nyc` to the latest version 🚀 ([#882](https://github.com/thelounge/thelounge/pull/882) by [Greenkeeper](https://greenkeeper.io/)) -- Update `npm-run-all` to the latest version 🚀 ([#880](https://github.com/thelounge/thelounge/pull/880) by [Greenkeeper](https://greenkeeper.io/)) -- Add nyc and Webpack config files to the files ignored when releasing ([#906](https://github.com/thelounge/thelounge/pull/906) by [@astorije](https://github.com/astorije)) -- Update `stylelint` to the latest version 🚀 ([#907](https://github.com/thelounge/thelounge/pull/907) by [Greenkeeper](https://greenkeeper.io/)) -- Update `eslint` to the latest version 🚀 ([#910](https://github.com/thelounge/thelounge/pull/910) by [Greenkeeper](https://greenkeeper.io/)) - -## v2.2.0 - 2017-01-31 - -For more details, [see the full changelog](https://github.com/thelounge/thelounge/compare/v2.1.0...v2.2.0) and [milestone](https://github.com/thelounge/thelounge/milestone/2?closed=1). - -Another long-overdue release for The Lounge! - -On the client, it is now possible to generate URLs that pre-fill connection inputs in public mode, a date separator makes it into the chats, `/away` and `/back` commands are now supported, idle time gets displayed on `/whois`.<br> -Also, the client does not abruptly refresh when connection is lost anymore, and user search has been slightly improved. Note however that these last 2 items are still not optimal, but improvements are underway! - -On the server, more logging! The `debug` option is now an object instead of a boolean, so make sure to update your configuration file accordingly. More details [here](https://github.com/thelounge/thelounge/blob/v2.2.0/defaults/config.js#L364-L383).<br> -There are changes revolving around user configuration autoloading: it has been greatly improved and therefore it is now enabled by default. Make sure to remove the `autoload` option from your configuration files. - -And of course, tons of fixes and less noticeable feature additions and changes, so make sure to check the full list below! - -### Added - -- Override network connection inputs with URL parameters ([#674](https://github.com/thelounge/thelounge/pull/674) by [@MaxLeiter](https://github.com/MaxLeiter)) -- Add `id` to submit button ([#717](https://github.com/thelounge/thelounge/pull/717) by [@xPaw](https://github.com/xPaw)) -- Add a UI element to cycle through nick completions on mobile ([#708](https://github.com/thelounge/thelounge/pull/708) by [@astorije](https://github.com/astorije)) -- Report configuration file path, Node.js version and OS platform on server start-up ([#736](https://github.com/thelounge/thelounge/pull/736) by [@williamboman](https://github.com/williamboman) and [#743](https://github.com/thelounge/thelounge/pull/743) by [@xPaw](https://github.com/xPaw)) -- Add `lounge` keyword to npm registry ([#747](https://github.com/thelounge/thelounge/pull/747) by [@xPaw](https://github.com/xPaw)) -- Add a date separator to channels/PMs ([#671](https://github.com/thelounge/thelounge/pull/671) and [#765](https://github.com/thelounge/thelounge/pull/765) by [@PolarizedIons](https://github.com/PolarizedIons)) -- Add support for hexip ilines and fix storing client IP address in configuration file ([#749](https://github.com/thelounge/thelounge/pull/749) and [#822](https://github.com/thelounge/thelounge/pull/822) by [@xPaw](https://github.com/xPaw)) -- Implement `/away` and `/back` commands ([#745](https://github.com/thelounge/thelounge/pull/745) by [@xPaw](https://github.com/xPaw)) -- Remind channel name or nick in input placeholder ([#832](https://github.com/thelounge/thelounge/pull/832) and [#889](https://github.com/thelounge/thelounge/pull/889) by [@astorije](https://github.com/astorije)) -- Add human-readable idle time in whois info ([#721](https://github.com/thelounge/thelounge/pull/721) by [@astorije](https://github.com/astorije)) -- Option to log raw IRC traffic ([#783](https://github.com/thelounge/thelounge/pull/783) by [@astorije](https://github.com/astorije)) - -### Changed - -- Improve support for opening multiple clients at once ([#636](https://github.com/thelounge/thelounge/pull/636) by [@xPaw](https://github.com/xPaw)) -- Match window title border line to text color ([#716](https://github.com/thelounge/thelounge/pull/716) by [@xPaw](https://github.com/xPaw)) -- Focus input after chat form submit ([#483](https://github.com/thelounge/thelounge/pull/483) by [@williamboman](https://github.com/williamboman)) -- Refactor user autoload to use `fs.watch` and make it more transparent in the app ([#751](https://github.com/thelounge/thelounge/pull/751) by [@xPaw](https://github.com/xPaw) and [#779](https://github.com/thelounge/thelounge/pull/779) by [@astorije](https://github.com/astorije)) -- Sync reordering of channels/networks to other clients in real-time ([#757](https://github.com/thelounge/thelounge/pull/757) by [@PolarizedIons](https://github.com/PolarizedIons)) -- Do not accept empty password when adding new user ([#795](https://github.com/thelounge/thelounge/pull/795) by [@MaxLeiter](https://github.com/MaxLeiter)) -- Stop refreshing the page on every socket.io error ([#784](https://github.com/thelounge/thelounge/pull/784) by [@xPaw](https://github.com/xPaw)) -- Only append "says" to notifications if it is a message ([#805](https://github.com/thelounge/thelounge/pull/805) by [@xPaw](https://github.com/xPaw)) -- Allow user search to find a pattern anywhere in the nicks ([#855](https://github.com/thelounge/thelounge/pull/855) by [@MaxLeiter](https://github.com/MaxLeiter)) - -### Removed - -- Remove browser notification polyfill and inform user when unsupported ([#709](https://github.com/thelounge/thelounge/pull/709) by [@astorije](https://github.com/astorije)) -- Remove erroneous classname from password field ([#748](https://github.com/thelounge/thelounge/pull/748) by [@xPaw](https://github.com/xPaw)) -- Do not dismiss native web notifications programmatically after 5s ([#739](https://github.com/thelounge/thelounge/pull/739) by [@williamboman](https://github.com/williamboman)) - -### Fixed - -- Fix `/mode` command to correctly assume target ([#679](https://github.com/thelounge/thelounge/pull/679) by [@xPaw](https://github.com/xPaw)) -- Fix crash when LDAP server is unreachable ([#697](https://github.com/thelounge/thelounge/pull/697) by [@gramakri](https://github.com/gramakri)) -- Fix channels behaving strangely while dragging ([#697](https://github.com/thelounge/thelounge/pull/697) by [@PolarizedIons](https://github.com/PolarizedIons)) -- Fix unread counters resetting when they should not ([#720](https://github.com/thelounge/thelounge/pull/720) by [@PolarizedIons](https://github.com/PolarizedIons)) -- Silence failures to trigger notifications when not available ([#732](https://github.com/thelounge/thelounge/pull/732) by [@astorije](https://github.com/astorije)) -- Avoid unnecessary disk writes when saving user ([#750](https://github.com/thelounge/thelounge/pull/750) by [@xPaw](https://github.com/xPaw)) -- Use correct channel when pushing link prefetch messages ([#782](https://github.com/thelounge/thelounge/pull/782) by [@xPaw](https://github.com/xPaw)) -- Correctly remove closed sockets from oident file, remove unused functions ([#753](https://github.com/thelounge/thelounge/pull/753) by [@xPaw](https://github.com/xPaw)) -- Do not automatically focus on touch devices ([#801](https://github.com/thelounge/thelounge/pull/801) by [@xPaw](https://github.com/xPaw)) -- Strip control characters from notifications ([#818](https://github.com/thelounge/thelounge/pull/818) by [@xPaw](https://github.com/xPaw)) -- Improve CLI a bit (output formatting and subcommand/option bug fix) ([#799](https://github.com/thelounge/thelounge/pull/799) and [#868](https://github.com/thelounge/thelounge/pull/868) by [@astorije](https://github.com/astorije)) -- Make HTML container take the entire screen estate ([#821](https://github.com/thelounge/thelounge/pull/821) by [@xPaw](https://github.com/xPaw)) -- Fix unread marker being removed from DOM ([#820](https://github.com/thelounge/thelounge/pull/820) by [@xPaw](https://github.com/xPaw)) -- Remove margin on date marker on smallest screen size ([#830](https://github.com/thelounge/thelounge/pull/830) by [@xPaw](https://github.com/xPaw)) -- Do not ignore window opens when considering active channels ([#834](https://github.com/thelounge/thelounge/pull/834) by [@xPaw](https://github.com/xPaw)) -- Calculate menu width on touch start ([#836](https://github.com/thelounge/thelounge/pull/836) by [@xPaw](https://github.com/xPaw)) -- Increase IRC colors contrast ([#829](https://github.com/thelounge/thelounge/pull/829) by [@xPaw](https://github.com/xPaw)) -- Do not prefetch URLs unless they are messages or `/me` actions ([#812](https://github.com/thelounge/thelounge/pull/812) by [@birkof](https://github.com/birkof)) -- Bump `irc-framework` to bring a couple of fixes ([#790](https://github.com/thelounge/thelounge/pull/790) by [@astorije](https://github.com/astorije), [#802](https://github.com/thelounge/thelounge/pull/802) by [@xPaw](https://github.com/xPaw) and [#852](https://github.com/thelounge/thelounge/pull/852) by [Greenkeeper](https://greenkeeper.io/)) - -### Security - -- Change bcrypt rounds from 8 to 11 ([#711](https://github.com/thelounge/thelounge/pull/711) by [@xPaw](https://github.com/xPaw)) - -### Documentation - -In the main repository: - -- Warn against running from source as root in README ([#725](https://github.com/thelounge/thelounge/pull/725) by [@astorije](https://github.com/astorije)) -- Add screenshot to README ([#694](https://github.com/thelounge/thelounge/pull/694) by [@MaxLeiter](https://github.com/MaxLeiter)) -- Simplify introduction on README ([#789](https://github.com/thelounge/thelounge/pull/789) by [@astorije](https://github.com/astorije)) - -On the website: - -- Remove distribution-specific install instructions of Node.js ([#49](https://github.com/thelounge/thelounge.chat/pull/49) by [@astorije](https://github.com/astorije)) -- Remove wrong information about setting up password along with creating a user ([#50](https://github.com/thelounge/thelounge.chat/pull/50) by [@astorije](https://github.com/astorije)) -- Update documentation of the configuration file ([#43](https://github.com/thelounge/thelounge.chat/pull/43) by [@daftaupe](https://github.com/daftaupe)) -- Document the `/away` and `/back` commands ([#59](https://github.com/thelounge/thelounge.chat/pull/59) by [@drkitty](https://github.com/drkitty)) - -### Internals - -- Fix AppVeyor cache never being successfully built and unblock AppVeyor ([#700](https://github.com/thelounge/thelounge/pull/700) by [@astorije](https://github.com/astorije) and [#755](https://github.com/thelounge/thelounge/pull/755) by [@IlyaFinkelshteyn](https://github.com/IlyaFinkelshteyn)) -- Add a simple (first) test for `localetime` Handlebars helper ([#703](https://github.com/thelounge/thelounge/pull/703) by [@astorije](https://github.com/astorije)) -- Get rid of OSX CI builds until they get much faster ([#707](https://github.com/thelounge/thelounge/pull/707) by [@astorije](https://github.com/astorije)) -- Update badges in README ([#713](https://github.com/thelounge/thelounge/pull/713) by [@xPaw](https://github.com/xPaw) and [#780](https://github.com/thelounge/thelounge/pull/780) by [@astorije](https://github.com/astorije)) -- Add Node.js v7, current stable, to Travis CI ([#800](https://github.com/thelounge/thelounge/pull/800) by [@astorije](https://github.com/astorije)) -- Use Webpack to build our client code and dependencies ([#640](https://github.com/thelounge/thelounge/pull/640) by [@nornagon](https://github.com/nornagon) and [#817](https://github.com/thelounge/thelounge/pull/817) by [@xPaw](https://github.com/xPaw)) -- Switch `istanbul` code coverage CLI to more recent `nyc` one ([#850](https://github.com/thelounge/thelounge/pull/850) by [@astorije](https://github.com/astorije)) -- Add web server tests ([#838](https://github.com/thelounge/thelounge/pull/838) by [@xPaw](https://github.com/xPaw)) -- Fix stuff that breaks in jQuery 3 ([#854](https://github.com/thelounge/thelounge/pull/854) by [@xPaw](https://github.com/xPaw)) -- Do not uglify builds when running start-dev ([#858](https://github.com/thelounge/thelounge/pull/858) by [@xPaw](https://github.com/xPaw)) -- Update dependencies to latest stable versions ([#746](https://github.com/thelounge/thelounge/pull/746) by [@xPaw](https://github.com/xPaw)) -- Update dependencies to enable Greenkeeper 🌴 ([#826](https://github.com/thelounge/thelounge/pull/826) by [Greenkeeper](https://greenkeeper.io/)) -- Update `lodash` to the latest version 🚀 ([#840](https://github.com/thelounge/thelounge/pull/840) and [#862](https://github.com/thelounge/thelounge/pull/862) by [Greenkeeper](https://greenkeeper.io/)) -- Update `stylelint` to the latest version 🚀 ([#861](https://github.com/thelounge/thelounge/pull/861) by [Greenkeeper](https://greenkeeper.io/)) -- Update `npm-run-all` to the latest version 🚀 ([#860](https://github.com/thelounge/thelounge/pull/860) by [Greenkeeper](https://greenkeeper.io/)) -- Update `eslint` to the latest version 🚀 ([#875](https://github.com/thelounge/thelounge/pull/875) by [Greenkeeper](https://greenkeeper.io/)) -- Update `babel-core` to the latest version 🚀 ([#883](https://github.com/thelounge/thelounge/pull/883) by [Greenkeeper](https://greenkeeper.io/)) - -## v2.1.0 - 2016-10-17 - -[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.0.1...v2.1.0) - -Here comes another release with some nice additions! - -While the administrators will notice some bug fixes, most of the changes are client-side: support for `/list`, a slideout menu on mobile, editing one's nick from the UI, wallops message handling. - -Enjoy! - -### Added - -- Implement `/list` ([#258](https://github.com/thelounge/thelounge/pull/258) by [@maxpoulin64](https://github.com/maxpoulin64)) -- Add touch slideout menu for mobile ([#400](https://github.com/thelounge/thelounge/pull/400) by [@maxpoulin64](https://github.com/maxpoulin64)) -- Display extra steps when loading the app ([#637](https://github.com/thelounge/thelounge/pull/637) by [@xPaw](https://github.com/xPaw)) -- Display localized timestamp in title of message times ([#660](https://github.com/thelounge/thelounge/pull/660) by [@astorije](https://github.com/astorije)) -- Changing nick in the UI ([#551](https://github.com/thelounge/thelounge/pull/551) by [@astorije](https://github.com/astorije)) -- Add hostmasks in logs when possible ([#670](https://github.com/thelounge/thelounge/pull/670) by [@astorije](https://github.com/astorije)) -- Display wallops in server window ([#658](https://github.com/thelounge/thelounge/pull/658) by [@xPaw](https://github.com/xPaw)) - -### Changed - -- Make use of multi-prefix cap and remove NAMES spam on mode changes ([#632](https://github.com/thelounge/thelounge/pull/632) by [@xPaw](https://github.com/xPaw)) -- Strict mode for all JS files ([#684](https://github.com/thelounge/thelounge/pull/684) by [@astorije](https://github.com/astorije)) -- Enforce more ESLint rules ([#681](https://github.com/thelounge/thelounge/pull/681) by [@xPaw](https://github.com/xPaw)) -- Use CI caches for downloaded files instead of installed ones ([#687](https://github.com/thelounge/thelounge/pull/687) by [@astorije](https://github.com/astorije)) -- Consolidate version numbers throughout all interfaces ([#592](https://github.com/thelounge/thelounge/pull/592) by [@williamboman](https://github.com/williamboman)) -- Replace lodash's each/map with ES5 native forEach/map ([#689](https://github.com/thelounge/thelounge/pull/689) by [@astorije](https://github.com/astorije)) - -### Removed - -- Remove all font files except WOFF ([#682](https://github.com/thelounge/thelounge/pull/682) by [@xPaw](https://github.com/xPaw)) - -### Fixed - -- Themes: Fixed CSS rule selectors for highlight messages ([#652](https://github.com/thelounge/thelounge/pull/652) by [@DamonGant](https://github.com/DamonGant)) -- Fix unhandled message color in default and Crypto themes ([#653](https://github.com/thelounge/thelounge/pull/653) by [@MaxLeiter](https://github.com/MaxLeiter)) -- Check if SSL key and certificate files exist ([#673](https://github.com/thelounge/thelounge/pull/673) by [@toXel](https://github.com/toXel)) -- Fix loading fonts in Microsoft Edge ([#683](https://github.com/thelounge/thelounge/pull/683) by [@xPaw](https://github.com/xPaw)) -- Fill in prefixLookup on network initialization ([#647](https://github.com/thelounge/thelounge/pull/647) by [@nornagon](https://github.com/nornagon)) -- Fix nick changes not being properly reported in the logs ([#685](https://github.com/thelounge/thelounge/pull/685) by [@astorije](https://github.com/astorije)) -- Fix memory and reference shuffling when creating models ([#664](https://github.com/thelounge/thelounge/pull/664) by [@xPaw](https://github.com/xPaw)) - -## v2.0.1 - 2016-09-28 - -[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.0.0...v2.0.1) - -This is a minor house-keeping release with mostly two sets of changes. - -First, a few bugs were fixed, including one simply preventing The Lounge to run in Safari's private browsing. - -Additionally, the developer experience has been made a tiny bit better, with better documentation, lighter dependencies and simpler theme creation. - -### Changed - -- Add info on README about how to run from source, how to upgrade ([#621](https://github.com/thelounge/thelounge/pull/621) by [@astorije](https://github.com/astorije)) -- Move uglify invocation into npm scripts and remove grunt ([#628](https://github.com/thelounge/thelounge/pull/628) by [@nornagon](https://github.com/nornagon)) -- Move Shout theme borders to example theme ([#359](https://github.com/thelounge/thelounge/pull/359) by [@xPaw](https://github.com/xPaw)) -- Update developer dependencies ([#639](https://github.com/thelounge/thelounge/pull/639) by [@xPaw](https://github.com/xPaw)) - -### Fixed - -- Remove -ms-transform and add missed -webkit-transform ([#629](https://github.com/thelounge/thelounge/pull/629) by [@xPaw](https://github.com/xPaw)) -- Ensure localStorage cannot fail because of quota or Safari private browsing ([#625](https://github.com/thelounge/thelounge/pull/625) by [@astorije](https://github.com/astorije)) -- Disable pull-to-refresh on mobile that conflicts with scrolling the message list ([#618](https://github.com/thelounge/thelounge/pull/618) by [@astorije](https://github.com/astorije)) -- Handle stderr when using edit or config command ([#622](https://github.com/thelounge/thelounge/pull/622) by [@MaxLeiter](https://github.com/MaxLeiter)) - -## v2.0.0 - 2016-09-24 - -[See the full changelog](https://github.com/thelounge/thelounge/compare/v1.5.0...v2.0.0) - -After more than 5 months in the works, v2.0.0 is finally happening, and it's shipping with lots of new and enhanced features! 🎉 - -First of all, the backend IRC library is completely different, which was the first step to deciding on a major release. -This change brings many improvements and fixes, including support for auto-reconnection! This also allows us to easily improve our [IRCv3 compliance](http://ircv3.net/software/clients.html#web-clients). - -Main changes on the server include support for WEBIRC, oidentd and LDAP. On the client, users will notice a lot of improvements about reporting unseen activity (notifications, markers, etc.), support for custom highlights, a new loading page, an auto-expanding message input, a theme selector, and more. - -Administrators should note that the channel list format in user configuration files has changed. The old format is deprecated, but it will be automatically converted when the server starts (support may or may not be removed later). Additionally, The Lounge now only runs on Node v4 and up. - -The above is only a small subset of changes. A more detailed list can be found below. -The following list features the most noticeable changes only, and more details can be found on all [v2.0.0 pre-releases](https://www.github.com/thelounge/thelounge/releases). - -### Added - -- Add tooltips on every clickable icons ([#540](https://github.com/thelounge/thelounge/pull/540) by [@astorije](https://github.com/astorije)) -- Add debug config option for `irc-framework` debug log ([#547](https://github.com/thelounge/thelounge/pull/547) by [@maxpoulin64](https://github.com/maxpoulin64)) -- Client-side theme selector ([#568](https://github.com/thelounge/thelounge/pull/568) by [@astorije](https://github.com/astorije)) -- LDAP support ([#477](https://github.com/thelounge/thelounge/pull/477) by [@thisisdarshan](https://github.com/thisisdarshan) and [@lindskogen](https://github.com/lindskogen)) -- Add custom highlights ([#425](https://github.com/thelounge/thelounge/pull/425) by [@YaManicKill](https://github.com/YaManicKill)) -- Add auto-grow textarea support ([#379](https://github.com/thelounge/thelounge/pull/379) by [@maxpoulin64](https://github.com/maxpoulin64)) -- Display unhandled numerics on the client ([#286](https://github.com/thelounge/thelounge/pull/286) by [@xPaw](https://github.com/xPaw)) -- A proper unread marker ([#332](https://github.com/thelounge/thelounge/pull/332) by [@xPaw](https://github.com/xPaw)) -- Add information on the About section of the client ([#497](https://github.com/thelounge/thelounge/pull/497) by [@astorije](https://github.com/astorije)) -- Add a red dot to the mobile menu icon when being notified ([#486](https://github.com/thelounge/thelounge/pull/486) by [@astorije](https://github.com/astorije)) -- Add "The Lounge" label to the landing pages ([#487](https://github.com/thelounge/thelounge/pull/487) by [@astorije](https://github.com/astorije)) -- Display network name on Connect page when network is locked and info is hidden ([#488](https://github.com/thelounge/thelounge/pull/488) by [@astorije](https://github.com/astorije)) -- Display a loading message instead of blank page ([#386](https://github.com/thelounge/thelounge/pull/386) by [@xPaw](https://github.com/xPaw)) -- Fall back to LOUNGE_HOME env variable when using the CLI ([#402](https://github.com/thelounge/thelounge/pull/402) by [@williamboman](https://github.com/williamboman)) -- Enable auto reconnection ([#254](https://github.com/thelounge/thelounge/pull/254) by [@xPaw](https://github.com/xPaw)) -- Add "!" modechar for admin ([#354](https://github.com/thelounge/thelounge/pull/354) by [@omnicons](https://github.com/omnicons)) -- Add support for oidentd spoofing ([#256](https://github.com/thelounge/thelounge/pull/256) by [@maxpoulin64](https://github.com/maxpoulin64)) -- Log enabled capabilities ([#272](https://github.com/thelounge/thelounge/pull/272) by [@xPaw](https://github.com/xPaw)) -- Add support for `~` home folder expansion ([#284](https://github.com/thelounge/thelounge/pull/284) by [@maxpoulin64](https://github.com/maxpoulin64)) -- Document supported node version ([#280](https://github.com/thelounge/thelounge/pull/280) by [@xPaw](https://github.com/xPaw)) -- Implement WEBIRC ([#240](https://github.com/thelounge/thelounge/pull/240) by [@maxpoulin64](https://github.com/maxpoulin64)) -- Add `manifest.json` for nicer mobile experience ([#310](https://github.com/thelounge/thelounge/pull/310) by [@xPaw](https://github.com/xPaw)) - -### Changed - -- Cache loaded config and merge it with defaults ([#387](https://github.com/thelounge/thelounge/pull/387) by [@xPaw](https://github.com/xPaw)) -- Ignore unnecessary files at release time ([#499](https://github.com/thelounge/thelounge/pull/499) by [@astorije](https://github.com/astorije)) -- Improve font icon management, sizing and sharpness ([#493](https://github.com/thelounge/thelounge/pull/493) by [@astorije](https://github.com/astorije)) -- Maintain scroll position after loading previous messages ([#496](https://github.com/thelounge/thelounge/pull/496) by [@davibe](https://github.com/davibe)) -- Perform node version check as soon as possible ([#409](https://github.com/thelounge/thelounge/pull/409) by [@xPaw](https://github.com/xPaw)) -- Prepend http protocol to www. links in chat ([#410](https://github.com/thelounge/thelounge/pull/410) by [@xPaw](https://github.com/xPaw)) -- Change default configuration for `host` to allow OS to decide and use both IPv4 and IPv6 ([#432](https://github.com/thelounge/thelounge/pull/432) by [@maxpoulin64](https://github.com/maxpoulin64)) -- Do not hide timestamps on small viewports ([#376](https://github.com/thelounge/thelounge/pull/376) by [@xPaw](https://github.com/xPaw)) -- Drop `slate-irc`, switch to `irc-framework` ([#167](https://github.com/thelounge/thelounge/pull/167) by [@xPaw](https://github.com/xPaw)) -- Improve sticky scroll ([#262](https://github.com/thelounge/thelounge/pull/262) by [@xPaw](https://github.com/xPaw)) -- Minor wording changes for better clarity ([#305](https://github.com/thelounge/thelounge/pull/305) by [@astorije](https://github.com/astorije)) -- Improve nick highlights ([#327](https://github.com/thelounge/thelounge/pull/327) by [@xPaw](https://github.com/xPaw)) -- CSS classes in themes for nick colors ([#325](https://github.com/thelounge/thelounge/pull/325) by [@astorije](https://github.com/astorije)) -- Replace all concatenated paths with Node's path.join ([#307](https://github.com/thelounge/thelounge/pull/307) by [@astorije](https://github.com/astorije)) - -### Deprecated - -- Store channels in array format in user configuration files, deprecating previous format ([#417](https://github.com/thelounge/thelounge/pull/417) by [@xPaw](https://github.com/xPaw)) - -### Removed - -- Disable tooltips on mobile to prevent them to stay after clicking ([#612](https://github.com/thelounge/thelounge/pull/612) by [@astorije](https://github.com/astorije)) -- Remove Docker-related files now that we have a dedicated repository ([#288](https://github.com/thelounge/thelounge/pull/288) by [@astorije](https://github.com/astorije)) -- Remove JavaScript scrollbar library ([#429](https://github.com/thelounge/thelounge/pull/429) by [@xPaw](https://github.com/xPaw)) -- Remove navigator.standalone detection ([#427](https://github.com/thelounge/thelounge/pull/427) by [@xPaw](https://github.com/xPaw)) -- Do not increase font size on highlight in morning theme ([#321](https://github.com/thelounge/thelounge/pull/321) by [@xPaw](https://github.com/xPaw)) - -### Fixed - -- Remove font family redundancy, fix missed fonts, remove Open Sans ([#562](https://github.com/thelounge/thelounge/pull/562) by [@astorije](https://github.com/astorije)) -- Stop propagation when hiding the chat through click/tapping the chat ([#455](https://github.com/thelounge/thelounge/pull/455) by [@williamboman](https://github.com/williamboman)) -- Improve click handling on users and inline channels ([#366](https://github.com/thelounge/thelounge/pull/366) by [@xPaw](https://github.com/xPaw)) -- Only load config if it exists ([#461](https://github.com/thelounge/thelounge/pull/461) by [@xPaw](https://github.com/xPaw)) -- Send user to lobby of deleted chan when parting from active chan ([#489](https://github.com/thelounge/thelounge/pull/489) by [@astorije](https://github.com/astorije)) -- Set title attribute on topic on initial page load ([#515](https://github.com/thelounge/thelounge/pull/515) by [@williamboman](https://github.com/williamboman)) -- Save user's channels when they sort the channel list ([#401](https://github.com/thelounge/thelounge/pull/401) by [@xPaw](https://github.com/xPaw)) -- Turn favicon red on page load if there are highlights ([#344](https://github.com/thelounge/thelounge/pull/344) by [@xPaw](https://github.com/xPaw)) -- Keep chat stickied to the bottom on resize ([#346](https://github.com/thelounge/thelounge/pull/346) by [@maxpoulin64](https://github.com/maxpoulin64)) -- Only increase unread counter for whitelisted actions ([#273](https://github.com/thelounge/thelounge/pull/273) by [@xPaw](https://github.com/xPaw)) -- Parse CTCP replies ([#278](https://github.com/thelounge/thelounge/pull/278) by [@xPaw](https://github.com/xPaw)) -- Do not count your own messages as unread ([#279](https://github.com/thelounge/thelounge/pull/279) by [@xPaw](https://github.com/xPaw)) -- Do not display incorrect nick when switching to a non connected network ([#252](https://github.com/thelounge/thelounge/pull/252) by [@xPaw](https://github.com/xPaw)) -- Keep autocompletion sort whenever user list updates ([#217](https://github.com/thelounge/thelounge/pull/217) by [@xPaw](https://github.com/xPaw)) -- Save user when parting channels ([#297](https://github.com/thelounge/thelounge/pull/297) by [@xPaw](https://github.com/xPaw)) -- Add labels in connect window ([#300](https://github.com/thelounge/thelounge/pull/300) by [@xPaw](https://github.com/xPaw)) -- Add missing `aria-label` on icon buttons ([#303](https://github.com/thelounge/thelounge/pull/303) by [@astorije](https://github.com/astorije)) -- Fix missing colors in action messages ([#317](https://github.com/thelounge/thelounge/pull/317) by [@astorije](https://github.com/astorije)) -- Don't falsely report failed write if it didn't fail ([`e6990e0`](https://github.com/thelounge/thelounge/commit/e6990e0fc7641d18a5bcbabddca1aacf2254ae52) by [@xPaw](https://github.com/xPaw)) -- Fix sending messages starting with a space ([#320](https://github.com/thelounge/thelounge/pull/320) by [@maxpoulin64](https://github.com/maxpoulin64)) -- Fix notifications in query windows ([#334](https://github.com/thelounge/thelounge/pull/334) by [@xPaw](https://github.com/xPaw)) - -### Security - -- Implement user token persistency ([#370](https://github.com/thelounge/thelounge/pull/370) by [@xPaw](https://github.com/xPaw)) -- Restrict access to the home directory by default ([#205](https://github.com/thelounge/thelounge/pull/205) by [@maxpoulin64](https://github.com/maxpoulin64)) -- Add security headers to minimize XSS damage ([#292](https://github.com/thelounge/thelounge/pull/292) by [@xPaw](https://github.com/xPaw)) -- Do not write user configs outside of the app's users directory ([#238](https://github.com/thelounge/thelounge/pull/238) by [@williamboman](https://github.com/williamboman)) -- Don't check for existing password emptiness ([#315](https://github.com/thelounge/thelounge/pull/315) by [@maxpoulin64](https://github.com/maxpoulin64)) - -## v2.0.0-rc.2 - 2016-09-21 [Pre-release] - -[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.0.0-rc.1...v2.0.0-rc.2) - -This release candidate only fixes a UI bug affecting iOS 8 users, introduced in v2.0.0-pre.5. - -### Fixed - -- Fix flexboxes to work on iOS 8 ([#626](https://github.com/thelounge/thelounge/pull/626) by [@Gilles123](https://github.com/Gilles123)) - -## v2.0.0-rc.1 - 2016-09-17 [Pre-release] - -[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.0.0-pre.7...v2.0.0-rc.1) - -Prior to this release, users of Safari 10 were not able to access The Lounge anymore, because of a conscious change the WebKit made to their support of CSP, as [explained here](https://webkit.org/blog/6830/a-refined-content-security-policy/). This release addresses this issue. - -Another notable change is the removal of tooltips on mobiles, as hovering states on mobile devices breaks in different kind of ways. Hopefully there will be a better solution in the future, or better support across mobiles. - -This is also the first release candidate for v2.0.0. This means only critical bug fixes will be merged before releasing v2.0.0. - -### Changed - -- Explicitly authorize websockets in CSP header ([#597](https://github.com/thelounge/thelounge/pull/597) by [@astorije](https://github.com/astorije)) - -### Removed - -- Disable tooltips on mobile to prevent them to stay after clicking ([#612](https://github.com/thelounge/thelounge/pull/612) by [@astorije](https://github.com/astorije)) - -### Fixed - -- Fix small input text on Morning and Zenburn ([#601](https://github.com/thelounge/thelounge/pull/601) by [@astorije](https://github.com/astorije)) -- Fix a left margin appearing on all non-default themes ([#615](https://github.com/thelounge/thelounge/pull/615) by [@astorije](https://github.com/astorije)) - -## v2.0.0-pre.7 - 2016-09-08 [Pre-release] - -[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.0.0-pre.6...v2.0.0-pre.7) - -This prerelease fixes a lot of bugs on both the server and the client. It also adds a theme selector on the client and connection debug log level on the server. Additionally, custom highlights are now case-insensitive. - -### Added - -- Add tooltips on every clickable icons ([#540](https://github.com/thelounge/thelounge/pull/540) by [@astorije](https://github.com/astorije)) -- Add debug config option for `irc-framework` debug log ([#547](https://github.com/thelounge/thelounge/pull/547) by [@maxpoulin64](https://github.com/maxpoulin64)) -- Client-side theme selector ([#568](https://github.com/thelounge/thelounge/pull/568) by [@astorije](https://github.com/astorije)) - -### Changed - -- Use our logger instead of `console.log` and `console.error` for LDAP logs ([#552](https://github.com/thelounge/thelounge/pull/552) by [@astorije](https://github.com/astorije)) -- Make custom highlights case-insensitive ([#565](https://github.com/thelounge/thelounge/pull/565) by [@astorije](https://github.com/astorije)) -- Bump `request` dependency to 2.74.0 ([#563](https://github.com/thelounge/thelounge/pull/563) by [@astorije](https://github.com/astorije)) -- Mention wiki in README ([#548](https://github.com/thelounge/thelounge/pull/548) by [@MaxLeiter](https://github.com/MaxLeiter)) -- Support ES6 features in JS linting outside of client code ([#593](https://github.com/thelounge/thelounge/pull/593) by [@williamboman](https://github.com/williamboman)) - -### Fixed - -- Fix token persistency across server refreshes ([#553](https://github.com/thelounge/thelounge/pull/553) by [@astorije](https://github.com/astorije)) -- Make sure input height is reset when submitting with icon ([#555](https://github.com/thelounge/thelounge/pull/555) by [@astorije](https://github.com/astorije)) -- Fix webirc and 4-in-6 addresses ([#535](https://github.com/thelounge/thelounge/pull/535) by [@maxpoulin64](https://github.com/maxpoulin64)) -- Allow long URLs to break onto next line on Chrome ([#576](https://github.com/thelounge/thelounge/pull/576) by [@astorije](https://github.com/astorije)) -- Make sure users with wrong tokens are locked out instead of crashing the app ([#570](https://github.com/thelounge/thelounge/pull/570) by [@astorije](https://github.com/astorije)) -- Remove font family redundancy, fix missed fonts, remove Open Sans ([#562](https://github.com/thelounge/thelounge/pull/562) by [@astorije](https://github.com/astorije)) -- Do not set app orientation in manifest to use user setting at OS level ([#587](https://github.com/thelounge/thelounge/pull/587) by [@astorije](https://github.com/astorije)) -- Move border-radius from `#main` to `.window elements` to fix radius once and for all ([#572](https://github.com/thelounge/thelounge/pull/572) by [@astorije](https://github.com/astorije)) - -## v2.0.0-pre.6 - 2016-08-10 [Pre-release] - -[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.0.0-pre.5...v2.0.0-pre.6) - -LDAP! That's all there is to be found in this pre-release, but it should please some administrators out there. Big thanks to [@thisisdarshan](https://github.com/thisisdarshan) and [@lindskogen](https://github.com/lindskogen) for sticking with us on this one. - -This feature will remain in beta version until the official v2.0.0 release. - -### Added - -- LDAP support ([#477](https://github.com/thelounge/thelounge/pull/477) by [@thisisdarshan](https://github.com/thisisdarshan) and [@lindskogen](https://github.com/lindskogen)) - -## v2.0.0-pre.5 - 2016-08-07 [Pre-release] - -[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.0.0-pre.4...v2.0.0-pre.5) +[See the full changelog](https://github.com/thelounge/lounge/compare/v2.0.0-pre.4...v2.0.0-pre.5) What an exciting release! It's been in the works for more than a month, but the perks are worth the wait. @@ -4091,61 +43,61 @@ Administrators will notice a different format for channels in the user configura ### Added -- Add custom highlights ([#425](https://github.com/thelounge/thelounge/pull/425) by [@YaManicKill](https://github.com/YaManicKill)) -- Add auto-grow textarea support ([#379](https://github.com/thelounge/thelounge/pull/379) by [@maxpoulin64](https://github.com/maxpoulin64)) -- Display unhandled numerics on the client ([#286](https://github.com/thelounge/thelounge/pull/286) by [@xPaw](https://github.com/xPaw)) -- A proper unread marker ([#332](https://github.com/thelounge/thelounge/pull/332) by [@xPaw](https://github.com/xPaw)) -- Add information on the About section of the client ([#497](https://github.com/thelounge/thelounge/pull/497) by [@astorije](https://github.com/astorije)) -- Add a red dot to the mobile menu icon when being notified ([#486](https://github.com/thelounge/thelounge/pull/486) by [@astorije](https://github.com/astorije)) -- Add "The Lounge" label to the landing pages ([#487](https://github.com/thelounge/thelounge/pull/487) by [@astorije](https://github.com/astorije)) -- Display network name on Connect page when network is locked and info is hidden ([#488](https://github.com/thelounge/thelounge/pull/488) by [@astorije](https://github.com/astorije)) +- Add custom highlights ([#425](https://github.com/thelounge/lounge/pull/425) by [@YaManicKill](https://github.com/YaManicKill)) +- Add auto-grow textarea support ([#379](https://github.com/thelounge/lounge/pull/379) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Display unhandled numerics on the client ([#286](https://github.com/thelounge/lounge/pull/286) by [@xPaw](https://github.com/xPaw)) +- A proper unread marker ([#332](https://github.com/thelounge/lounge/pull/332) by [@xPaw](https://github.com/xPaw)) +- Add information on the About section of the client ([#497](https://github.com/thelounge/lounge/pull/497) by [@astorije](https://github.com/astorije)) +- Add a red dot to the mobile menu icon when being notified ([#486](https://github.com/thelounge/lounge/pull/486) by [@astorije](https://github.com/astorije)) +- Add "The Lounge" label to the landing pages ([#487](https://github.com/thelounge/lounge/pull/487) by [@astorije](https://github.com/astorije)) +- Display network name on Connect page when network is locked and info is hidden ([#488](https://github.com/thelounge/lounge/pull/488) by [@astorije](https://github.com/astorije)) ### Changed -- Store channels in array format in user configuration files ([#417](https://github.com/thelounge/thelounge/pull/417) by [@xPaw](https://github.com/xPaw)) -- Cache loaded config and merge it with defaults ([#387](https://github.com/thelounge/thelounge/pull/387) by [@xPaw](https://github.com/xPaw)) -- Ignore unnecessary files at release time ([#499](https://github.com/thelounge/thelounge/pull/499) by [@astorije](https://github.com/astorije)) -- Improve font icon management, sizing and sharpness ([#493](https://github.com/thelounge/thelounge/pull/493) by [@astorije](https://github.com/astorije)) -- Maintain scroll position after loading previous messages ([#496](https://github.com/thelounge/thelounge/pull/496) by [@davibe](https://github.com/davibe)) +- Store channels in array format in user configuration files ([#417](https://github.com/thelounge/lounge/pull/417) by [@xPaw](https://github.com/xPaw)) +- Cache loaded config and merge it with defaults ([#387](https://github.com/thelounge/lounge/pull/387) by [@xPaw](https://github.com/xPaw)) +- Ignore unnecessary files at release time ([#499](https://github.com/thelounge/lounge/pull/499) by [@astorije](https://github.com/astorije)) +- Improve font icon management, sizing and sharpness ([#493](https://github.com/thelounge/lounge/pull/493) by [@astorije](https://github.com/astorije)) +- Maintain scroll position after loading previous messages ([#496](https://github.com/thelounge/lounge/pull/496) by [@davibe](https://github.com/davibe)) ### Removed -- Remove Docker-related files ([#288](https://github.com/thelounge/thelounge/pull/288) by [@astorije](https://github.com/astorije)) -- Remove JavaScript scrollbar library ([#429](https://github.com/thelounge/thelounge/pull/429) by [@xPaw](https://github.com/xPaw)) +- Remove Docker-related files ([#288](https://github.com/thelounge/lounge/pull/288) by [@astorije](https://github.com/astorije)) +- Remove JavaScript scrollbar library ([#429](https://github.com/thelounge/lounge/pull/429) by [@xPaw](https://github.com/xPaw)) ### Fixed -- Fix storing the updated authentication token ([#437](https://github.com/thelounge/thelounge/pull/437) by [@williamboman](https://github.com/williamboman)) -- Update `irc-framework` to 2.3.0 to fix a bug occurring when posting messages starting with a colon ([#449](https://github.com/thelounge/thelounge/pull/449) by [@xPaw](https://github.com/xPaw)) -- Update `irc-framework` to 2.4.0 to fix a buffering issue ([#451](https://github.com/thelounge/thelounge/pull/451) by [@maxpoulin64](https://github.com/maxpoulin64)) -- Only auto join actual channels ([#453](https://github.com/thelounge/thelounge/pull/453) by [@xPaw](https://github.com/xPaw)) -- Only trigger custom highlights for non-self messages and notices ([#454](https://github.com/thelounge/thelounge/pull/454) by [@xPaw](https://github.com/xPaw)) -- Stop propagation when hiding the chat through click/tapping the chat ([#455](https://github.com/thelounge/thelounge/pull/455) by [@williamboman](https://github.com/williamboman)) -- Improve click handling on users and inline channels ([#366](https://github.com/thelounge/thelounge/pull/366) by [@xPaw](https://github.com/xPaw)) -- Update `irc-framework` to 2.5.0 to fix reconnection counter not being reset ([#451](https://github.com/thelounge/thelounge/pull/451) by [@xPaw](https://github.com/xPaw)) -- Register irc-framework events before connecting ([#458](https://github.com/thelounge/thelounge/pull/458) by [@xPaw](https://github.com/xPaw)) -- Only load config if it exists ([#461](https://github.com/thelounge/thelounge/pull/461) by [@xPaw](https://github.com/xPaw)) -- Fix window layout a bit ([#465](https://github.com/thelounge/thelounge/pull/465) by [@maxpoulin64](https://github.com/maxpoulin64)) -- Fix slight bugs introduced by #379 and #465 ([#467](https://github.com/thelounge/thelounge/pull/467) by [@maxpoulin64](https://github.com/maxpoulin64)) -- Prevent the app from crashing when no theme is specified ([#474](https://github.com/thelounge/thelounge/pull/474) by [@astorije](https://github.com/astorije)) -- Fix unread marker disappearing when opacity set to 1 ([#471](https://github.com/thelounge/thelounge/pull/471) by [@astorije](https://github.com/astorije)) -- Fix breaking layout when switching portrait/landscape modes ([#478](https://github.com/thelounge/thelounge/pull/478) by [@astorije](https://github.com/astorije)) -- Fix chat not being "stickied" to the bottom when joining channel ([#484](https://github.com/thelounge/thelounge/pull/484) by [@williamboman](https://github.com/williamboman)) -- Add self info to TOGGLE messages to prevent unread marker to render for oneself ([#473](https://github.com/thelounge/thelounge/pull/473) by [@astorije](https://github.com/astorije)) -- Send user to lobby of deleted chan when parting from active chan ([#489](https://github.com/thelounge/thelounge/pull/489) by [@astorije](https://github.com/astorije)) -- Use `min-height` of textarea when computing auto-resize after deleting a char ([#504](https://github.com/thelounge/thelounge/pull/504) by [@astorije](https://github.com/astorije)) -- Set title attribute on topic on initial page load ([#515](https://github.com/thelounge/thelounge/pull/515) by [@williamboman](https://github.com/williamboman)) -- Make sure git commit check for the About section would not send stderr to the console ([#516](https://github.com/thelounge/thelounge/pull/516) by [@astorije](https://github.com/astorije)) -- Create a single function to render networks to reduce code duplication ([#445](https://github.com/thelounge/thelounge/pull/445) by [@xPaw](https://github.com/xPaw)) -- Reset the unread marker on channel change ([#527](https://github.com/thelounge/thelounge/pull/527) by [@maxpoulin64](https://github.com/maxpoulin64)) -- Fix accidentally removed border-radius ([#537](https://github.com/thelounge/thelounge/pull/537) by [@astorije](https://github.com/astorije)) -- Fix font size in themes for new textarea ([#536](https://github.com/thelounge/thelounge/pull/536) by [@maxpoulin64](https://github.com/maxpoulin64)) -- Restore padding and height of message input pre-textarea era ([#539](https://github.com/thelounge/thelounge/pull/539) by [@astorije](https://github.com/astorije)) -- Prevent Ctrl-Tab from triggering tab completion ([#541](https://github.com/thelounge/thelounge/pull/541) by [@hho](https://github.com/hho)) +- Fix storing the updated authentication token ([#437](https://github.com/thelounge/lounge/pull/437) by [@williamboman](https://github.com/williamboman)) +- Update `irc-framework` to 2.3.0 to fix a bug occurring when posting messages starting with a colon ([#449](https://github.com/thelounge/lounge/pull/449) by [@xPaw](https://github.com/xPaw)) +- Update `irc-framework` to 2.4.0 to fix a buffering issue ([#451](https://github.com/thelounge/lounge/pull/451) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Only auto join actual channels ([#453](https://github.com/thelounge/lounge/pull/453) by [@xPaw](https://github.com/xPaw)) +- Only trigger custom highlights for non-self messages and notices ([#454](https://github.com/thelounge/lounge/pull/454) by [@xPaw](https://github.com/xPaw)) +- Stop propagation when hiding the chat through click/tapping the chat ([#455](https://github.com/thelounge/lounge/pull/455) by [@williamboman](https://github.com/williamboman)) +- Improve click handling on users and inline channels ([#366](https://github.com/thelounge/lounge/pull/366) by [@xPaw](https://github.com/xPaw)) +- Update `irc-framework` to 2.5.0 to fix reconnection counter not being reset ([#451](https://github.com/thelounge/lounge/pull/451) by [@xPaw](https://github.com/xPaw)) +- Register irc-framework events before connecting ([#458](https://github.com/thelounge/lounge/pull/458) by [@xPaw](https://github.com/xPaw)) +- Only load config if it exists ([#461](https://github.com/thelounge/lounge/pull/461) by [@xPaw](https://github.com/xPaw)) +- Fix window layout a bit ([#465](https://github.com/thelounge/lounge/pull/465) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Fix slight bugs introduced by #379 and #465 ([#467](https://github.com/thelounge/lounge/pull/467) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Prevent the app from crashing when no theme is specified ([#474](https://github.com/thelounge/lounge/pull/474) by [@astorije](https://github.com/astorije)) +- Fix unread marker disappearing when opacity set to 1 ([#471](https://github.com/thelounge/lounge/pull/471) by [@astorije](https://github.com/astorije)) +- Fix breaking layout when switching portrait/landscape modes ([#478](https://github.com/thelounge/lounge/pull/478) by [@astorije](https://github.com/astorije)) +- Fix chat not being "stickied" to the bottom when joining channel ([#484](https://github.com/thelounge/lounge/pull/484) by [@williamboman](https://github.com/williamboman)) +- Add self info to TOGGLE messages to prevent unread marker to render for oneself ([#473](https://github.com/thelounge/lounge/pull/473) by [@astorije](https://github.com/astorije)) +- Send user to lobby of deleted chan when parting from active chan ([#489](https://github.com/thelounge/lounge/pull/489) by [@astorije](https://github.com/astorije)) +- Use `min-height` of textarea when computing auto-resize after deleting a char ([#504](https://github.com/thelounge/lounge/pull/504) by [@astorije](https://github.com/astorije)) +- Set title attribute on topic on initial page load ([#515](https://github.com/thelounge/lounge/pull/515) by [@williamboman](https://github.com/williamboman)) +- Make sure git commit check for the About section would not send stderr to the console ([#516](https://github.com/thelounge/lounge/pull/516) by [@astorije](https://github.com/astorije)) +- Create a single function to render networks to reduce code duplication ([#445](https://github.com/thelounge/lounge/pull/445) by [@xPaw](https://github.com/xPaw)) +- Reset the unread marker on channel change ([#527](https://github.com/thelounge/lounge/pull/527) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Fix accidentally removed border-radius ([#537](https://github.com/thelounge/lounge/pull/537) by [@astorije](https://github.com/astorije)) +- Fix font size in themes for new textarea ([#536](https://github.com/thelounge/lounge/pull/536) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Restore padding and height of message input pre-textarea era ([#539](https://github.com/thelounge/lounge/pull/539) by [@astorije](https://github.com/astorije)) +- Prevent Ctrl-Tab from triggering tab completion ([#541](https://github.com/thelounge/lounge/pull/541) by [@hho](https://github.com/hho)) ## v2.0.0-pre.4 - 2016-06-29 [Pre-release] -[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.0.0-pre.3...v2.0.0-pre.4) +[See the full changelog](https://github.com/thelounge/lounge/compare/v2.0.0-pre.3...v2.0.0-pre.4) This pre-release adds a loading window, helpful on slow connections. It also implements token persistency, ensuring users do not have to authenticate at every server restart. As a side effect, security is improved by forcing logging out users on all devices when changing their password. @@ -4161,161 +113,161 @@ Internally, we now keep track of our code coverage, which we do not enforce stri ### Added -- Add code coverage ([#408](https://github.com/thelounge/thelounge/pull/408) by [@astorije](https://github.com/astorije)) -- Display a loading message instead of blank page ([#386](https://github.com/thelounge/thelounge/pull/386) by [@xPaw](https://github.com/xPaw)) +- Add code coverage ([#408](https://github.com/thelounge/lounge/pull/408) by [@astorije](https://github.com/astorije)) +- Display a loading message instead of blank page ([#386](https://github.com/thelounge/lounge/pull/386) by [@xPaw](https://github.com/xPaw)) ### Changed -- Perform node version check as soon as possible ([#409](https://github.com/thelounge/thelounge/pull/409) by [@xPaw](https://github.com/xPaw)) -- Prepend http protocol to www. links in chat ([#410](https://github.com/thelounge/thelounge/pull/410) by [@xPaw](https://github.com/xPaw)) -- Use tabs when saving user configs ([#418](https://github.com/thelounge/thelounge/pull/418) by [@xPaw](https://github.com/xPaw)) -- Do not display the sidebar on sign-in page ([#420](https://github.com/thelounge/thelounge/pull/420) by [@astorije](https://github.com/astorije)) -- Make style of loading page similar to other pages ([#423](https://github.com/thelounge/thelounge/pull/423) by [@astorije](https://github.com/astorije)) -- Change default configuration for `host` to allow OS to decide and use both IPv4 and IPv6 ([#432](https://github.com/thelounge/thelounge/pull/432) by [@maxpoulin64](https://github.com/maxpoulin64)) -- Change nicks from links to spans everywhere ([#428](https://github.com/thelounge/thelounge/pull/428) by [@xPaw](https://github.com/xPaw)) -- Increase join delay at connection to 1000ms ([#434](https://github.com/thelounge/thelounge/pull/434) by [@williamboman](https://github.com/williamboman)) +- Perform node version check as soon as possible ([#409](https://github.com/thelounge/lounge/pull/409) by [@xPaw](https://github.com/xPaw)) +- Prepend http protocol to www. links in chat ([#410](https://github.com/thelounge/lounge/pull/410) by [@xPaw](https://github.com/xPaw)) +- Use tabs when saving user configs ([#418](https://github.com/thelounge/lounge/pull/418) by [@xPaw](https://github.com/xPaw)) +- Do not display the sidebar on sign-in page ([#420](https://github.com/thelounge/lounge/pull/420) by [@astorije](https://github.com/astorije)) +- Make style of loading page similar to other pages ([#423](https://github.com/thelounge/lounge/pull/423) by [@astorije](https://github.com/astorije)) +- Change default configuration for `host` to allow OS to decide and use both IPv4 and IPv6 ([#432](https://github.com/thelounge/lounge/pull/432) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Change nicks from links to spans everywhere ([#428](https://github.com/thelounge/lounge/pull/428) by [@xPaw](https://github.com/xPaw)) +- Increase join delay at connection to 1000ms ([#434](https://github.com/thelounge/lounge/pull/434) by [@williamboman](https://github.com/williamboman)) ### Removed -- Remove navigator.standalone detection ([#427](https://github.com/thelounge/thelounge/pull/427) by [@xPaw](https://github.com/xPaw)) +- Remove navigator.standalone detection ([#427](https://github.com/thelounge/lounge/pull/427) by [@xPaw](https://github.com/xPaw)) ### Fixed -- Do not lose authentication token when the connection gets lost ([#369](https://github.com/thelounge/thelounge/pull/369) by [@xPaw](https://github.com/xPaw)) -- Fix crash in public mode ([#413](https://github.com/thelounge/thelounge/pull/413) by [@maxpoulin64](https://github.com/maxpoulin64)) -- Do not print user loaded message in public mode ([#415](https://github.com/thelounge/thelounge/pull/415) by [@xPaw](https://github.com/xPaw)) -- Fix focusing input when clicking chat container on the client ([#364](https://github.com/thelounge/thelounge/pull/364) by [@williamboman](https://github.com/williamboman)) -- Fix channel join regression and fix possibly joining parted channels ([#411](https://github.com/thelounge/thelounge/pull/411) by [@xPaw](https://github.com/xPaw)) +- Do not lose authentication token when the connection gets lost ([#369](https://github.com/thelounge/lounge/pull/369) by [@xPaw](https://github.com/xPaw)) +- Fix crash in public mode ([#413](https://github.com/thelounge/lounge/pull/413) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Do not print user loaded message in public mode ([#415](https://github.com/thelounge/lounge/pull/415) by [@xPaw](https://github.com/xPaw)) +- Fix focusing input when clicking chat container on the client ([#364](https://github.com/thelounge/lounge/pull/364) by [@williamboman](https://github.com/williamboman)) +- Fix channel join regression and fix possibly joining parted channels ([#411](https://github.com/thelounge/lounge/pull/411) by [@xPaw](https://github.com/xPaw)) ### Security -- Implement user token persistency ([#370](https://github.com/thelounge/thelounge/pull/370) by [@xPaw](https://github.com/xPaw)) +- Implement user token persistency ([#370](https://github.com/thelounge/lounge/pull/370) by [@xPaw](https://github.com/xPaw)) ## v2.0.0-pre.3 - 2016-06-15 [Pre-release] -[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.0.0-pre.2...v2.0.0-pre.3) +[See the full changelog](https://github.com/thelounge/lounge/compare/v2.0.0-pre.2...v2.0.0-pre.3) This release introduces a few internal changes as well as two noticeable ones. When using the CLI, the home path can now be set with the `LOUNGE_HOME` environment variable, to avoid repeating `--home` over and over. On the client, sorting channels will now be saved in the user configuration. ### Added -- Fall back to LOUNGE_HOME env variable when using the CLI ([#402](https://github.com/thelounge/thelounge/pull/402) by [@williamboman](https://github.com/williamboman)) +- Fall back to LOUNGE_HOME env variable when using the CLI ([#402](https://github.com/thelounge/lounge/pull/402) by [@williamboman](https://github.com/williamboman)) ### Changed -- Rename package variable to pkg, as "package" is reserved. ([#399](https://github.com/thelounge/thelounge/pull/399) by [@hogofwar](https://github.com/hogofwar)) -- Capitalise constructor Oidentd ([#396](https://github.com/thelounge/thelounge/pull/396) by [@hogofwar](https://github.com/hogofwar)) -- Bump stylelint and update Travis CI configuration to include OSX builds and package caching ([#403](https://github.com/thelounge/thelounge/pull/403) by [@xPaw](https://github.com/xPaw)) +- Rename package variable to pkg, as "package" is reserved. ([#399](https://github.com/thelounge/lounge/pull/399) by [@hogofwar](https://github.com/hogofwar)) +- Capitalise constructor Oidentd ([#396](https://github.com/thelounge/lounge/pull/396) by [@hogofwar](https://github.com/hogofwar)) +- Bump stylelint and update Travis CI configuration to include OSX builds and package caching ([#403](https://github.com/thelounge/lounge/pull/403) by [@xPaw](https://github.com/xPaw)) ### Removed -- Supersede `mkdirp` with `fs-extra` ([#390](https://github.com/thelounge/thelounge/pull/390) by [@hogofwar](https://github.com/hogofwar)) -- Remove redundant variables ([#397](https://github.com/thelounge/thelounge/pull/397) by [@hogofwar](https://github.com/hogofwar)) +- Supersede `mkdirp` with `fs-extra` ([#390](https://github.com/thelounge/lounge/pull/390) by [@hogofwar](https://github.com/hogofwar)) +- Remove redundant variables ([#397](https://github.com/thelounge/lounge/pull/397) by [@hogofwar](https://github.com/hogofwar)) ### Fixed -- Save user's channels when they sort the channel list ([#401](https://github.com/thelounge/thelounge/pull/401) by [@xPaw](https://github.com/xPaw)) -- Fix description of `host` and `bind` config options ([#378](https://github.com/thelounge/thelounge/pull/378) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Save user's channels when they sort the channel list ([#401](https://github.com/thelounge/lounge/pull/401) by [@xPaw](https://github.com/xPaw)) +- Fix description of `host` and `bind` config options ([#378](https://github.com/thelounge/lounge/pull/378) by [@maxpoulin64](https://github.com/maxpoulin64)) ## v2.0.0-pre.2 - 2016-06-09 [Pre-release] -[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.0.0-pre.1...v2.0.0-pre.2) +[See the full changelog](https://github.com/thelounge/lounge/compare/v2.0.0-pre.1...v2.0.0-pre.2) This pre-release adds a very, very long-awaited feature: auto-reconnection! It also extends our support of ident with oidentd, shows timestamps on small screens and fix bugs around notifications and sticky scroll. ### Added -- Enable auto reconnection ([#254](https://github.com/thelounge/thelounge/pull/254) by [@xPaw](https://github.com/xPaw)) -- Add "!" modechar for admin ([#354](https://github.com/thelounge/thelounge/pull/354) by [@omnicons](https://github.com/omnicons)) -- Add CI tool for Windows builds ([#367](https://github.com/thelounge/thelounge/pull/367) by [@astorije](https://github.com/astorije)) -- Add support for oidentd spoofing ([#256](https://github.com/thelounge/thelounge/pull/256) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Enable auto reconnection ([#254](https://github.com/thelounge/lounge/pull/254) by [@xPaw](https://github.com/xPaw)) +- Add "!" modechar for admin ([#354](https://github.com/thelounge/lounge/pull/354) by [@omnicons](https://github.com/omnicons)) +- Add CI tool for Windows builds ([#367](https://github.com/thelounge/lounge/pull/367) by [@astorije](https://github.com/astorije)) +- Add support for oidentd spoofing ([#256](https://github.com/thelounge/lounge/pull/256) by [@maxpoulin64](https://github.com/maxpoulin64)) ### Changed -- Update Font Awesome to v4.6.3 ([#355](https://github.com/thelounge/thelounge/pull/355) by [@MaxLeiter](https://github.com/MaxLeiter)) -- Do not hide timestamps on small viewports ([#376](https://github.com/thelounge/thelounge/pull/376) by [@xPaw](https://github.com/xPaw)) -- Fetch Font Awesome from npm instead of embedded in repo ([#361](https://github.com/thelounge/thelounge/pull/361) by [@astorije](https://github.com/astorije)) -- Cache npm modules on appveyor ([#381](https://github.com/thelounge/thelounge/pull/381) by [@xPaw](https://github.com/xPaw)) -- Update eslint and enforce key-spacing ([#384](https://github.com/thelounge/thelounge/pull/384) by [@xPaw](https://github.com/xPaw)) -- Use `npm-run-all` in npm scripts for testing and linting ([#375](https://github.com/thelounge/thelounge/pull/375) by [@williamboman](https://github.com/williamboman)) -- Upload test results on appveyor builds ([#382](https://github.com/thelounge/thelounge/pull/382) by [@xPaw](https://github.com/xPaw)) +- Update Font Awesome to v4.6.3 ([#355](https://github.com/thelounge/lounge/pull/355) by [@MaxLeiter](https://github.com/MaxLeiter)) +- Do not hide timestamps on small viewports ([#376](https://github.com/thelounge/lounge/pull/376) by [@xPaw](https://github.com/xPaw)) +- Fetch Font Awesome from npm instead of embedded in repo ([#361](https://github.com/thelounge/lounge/pull/361) by [@astorije](https://github.com/astorije)) +- Cache npm modules on appveyor ([#381](https://github.com/thelounge/lounge/pull/381) by [@xPaw](https://github.com/xPaw)) +- Update eslint and enforce key-spacing ([#384](https://github.com/thelounge/lounge/pull/384) by [@xPaw](https://github.com/xPaw)) +- Use `npm-run-all` in npm scripts for testing and linting ([#375](https://github.com/thelounge/lounge/pull/375) by [@williamboman](https://github.com/williamboman)) +- Upload test results on appveyor builds ([#382](https://github.com/thelounge/lounge/pull/382) by [@xPaw](https://github.com/xPaw)) ### Fixed -- Turn favicon red on page load if there are highlights ([#344](https://github.com/thelounge/thelounge/pull/344) by [@xPaw](https://github.com/xPaw)) -- Do not send completely empty messages ([#345](https://github.com/thelounge/thelounge/pull/345) by [@maxpoulin64](https://github.com/maxpoulin64)) -- Make sure npm test script gets run on AppVeyor ([#372](https://github.com/thelounge/thelounge/pull/372) by [@astorije](https://github.com/astorije)) -- Keep chat stickied to the bottom on resize ([#346](https://github.com/thelounge/thelounge/pull/346) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Turn favicon red on page load if there are highlights ([#344](https://github.com/thelounge/lounge/pull/344) by [@xPaw](https://github.com/xPaw)) +- Do not send completely empty messages ([#345](https://github.com/thelounge/lounge/pull/345) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Make sure npm test script gets run on AppVeyor ([#372](https://github.com/thelounge/lounge/pull/372) by [@astorije](https://github.com/astorije)) +- Keep chat stickied to the bottom on resize ([#346](https://github.com/thelounge/lounge/pull/346) by [@maxpoulin64](https://github.com/maxpoulin64)) ## v2.0.0-pre.1 - 2016-05-22 [Pre-release] -[See the full changelog](https://github.com/thelounge/thelounge/compare/v1.5.0...v2.0.0-pre.1) +[See the full changelog](https://github.com/thelounge/lounge/compare/v1.5.0...v2.0.0-pre.1) -This is a pre-release to allow early adopters to use The Lounge with [`irc-framework`](https://github.com/kiwiirc/irc-framework) as our underlying IRC library instead of [`slate`](https://github.com/slate/slate-irc). This change itself solves a lot of issues and adds many features, most of them [listed here](https://github.com/thelounge/thelounge/pull/167#issue-139286868): IRCv3 compliance, user feedback improvement, etc. +This is a pre-release to allow early adopters to use The Lounge with [`irc-framework`](https://github.com/kiwiirc/irc-framework) as our underlying IRC library instead of [`slate`](https://github.com/slate/slate-irc). This change itself solves a lot of issues and adds many features, most of them [listed here](https://github.com/thelounge/lounge/pull/167#issue-139286868): IRCv3 compliance, user feedback improvement, etc. It also adds WEBIRC support, a better server logging capability, a web app manifest, improves the sticky scroll, and fixes a ton of bugs. ### Added -- Log enabled capabilities ([#272](https://github.com/thelounge/thelounge/pull/272) by [@xPaw](https://github.com/xPaw)) -- Add global logging helper ([#257](https://github.com/thelounge/thelounge/pull/257) by [@xPaw](https://github.com/xPaw)) -- Add support for `~` home folder expansion ([#284](https://github.com/thelounge/thelounge/pull/284) by [@maxpoulin64](https://github.com/maxpoulin64)) -- Document supported node version ([#280](https://github.com/thelounge/thelounge/pull/280) by [@xPaw](https://github.com/xPaw)) -- Add support for echo-message and znc.in/self-message caps ([#270](https://github.com/thelounge/thelounge/pull/270) by [@xPaw](https://github.com/xPaw)) -- Implement WEBIRC ([#240](https://github.com/thelounge/thelounge/pull/240) by [@maxpoulin64](https://github.com/maxpoulin64)) -- Add `manifest.json` for nicer mobile experience ([#310](https://github.com/thelounge/thelounge/pull/310) by [@xPaw](https://github.com/xPaw)) +- Log enabled capabilities ([#272](https://github.com/thelounge/lounge/pull/272) by [@xPaw](https://github.com/xPaw)) +- Add global logging helper ([#257](https://github.com/thelounge/lounge/pull/257) by [@xPaw](https://github.com/xPaw)) +- Add support for `~` home folder expansion ([#284](https://github.com/thelounge/lounge/pull/284) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Document supported node version ([#280](https://github.com/thelounge/lounge/pull/280) by [@xPaw](https://github.com/xPaw)) +- Add support for echo-message and znc.in/self-message caps ([#270](https://github.com/thelounge/lounge/pull/270) by [@xPaw](https://github.com/xPaw)) +- Implement WEBIRC ([#240](https://github.com/thelounge/lounge/pull/240) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Add `manifest.json` for nicer mobile experience ([#310](https://github.com/thelounge/lounge/pull/310) by [@xPaw](https://github.com/xPaw)) ### Changed -- Drop `slate-irc`, switch to `irc-framework` ([#167](https://github.com/thelounge/thelounge/pull/167) by [@xPaw](https://github.com/xPaw)) -- Create a single helper function to write messages ([#266](https://github.com/thelounge/thelounge/pull/266) by [@xPaw](https://github.com/xPaw)) -- Update dependencies ([#281](https://github.com/thelounge/thelounge/pull/281) by [@xPaw](https://github.com/xPaw)) -- Improve sticky scroll ([#262](https://github.com/thelounge/thelounge/pull/262) by [@xPaw](https://github.com/xPaw)) -- Change license link to point at our license file ([#290](https://github.com/thelounge/thelounge/pull/290) by [@xPaw](https://github.com/xPaw)) -- Stricter eslint rule for curly brackets ([#291](https://github.com/thelounge/thelounge/pull/291) by [@xPaw](https://github.com/xPaw)) -- Bump patch version of lodash to 4.11.2 ([#306](https://github.com/thelounge/thelounge/pull/306) by [@astorije](https://github.com/astorije)) -- Minor wording changes for better clarity ([#305](https://github.com/thelounge/thelounge/pull/305) by [@astorije](https://github.com/astorije)) -- Improve tests execution ([#260](https://github.com/thelounge/thelounge/pull/260) by [@maxpoulin64](https://github.com/maxpoulin64)) -- Update irc-framework ([#324](https://github.com/thelounge/thelounge/pull/324) by [@xPaw](https://github.com/xPaw)) -- Do not ignore our handlebars plugins in ESLint ([#329](https://github.com/thelounge/thelounge/pull/329) by [@xPaw](https://github.com/xPaw)) -- Improve nick highlights ([#327](https://github.com/thelounge/thelounge/pull/327) by [@xPaw](https://github.com/xPaw)) -- CSS classes in themes for nick colors ([#325](https://github.com/thelounge/thelounge/pull/325) by [@astorije](https://github.com/astorije)) -- Replace all concatenated paths with Node's path.join ([#307](https://github.com/thelounge/thelounge/pull/307) by [@astorije](https://github.com/astorije)) +- Drop `slate-irc`, switch to `irc-framework` ([#167](https://github.com/thelounge/lounge/pull/167) by [@xPaw](https://github.com/xPaw)) +- Create a single helper function to write messages ([#266](https://github.com/thelounge/lounge/pull/266) by [@xPaw](https://github.com/xPaw)) +- Update dependencies ([#281](https://github.com/thelounge/lounge/pull/281) by [@xPaw](https://github.com/xPaw)) +- Improve sticky scroll ([#262](https://github.com/thelounge/lounge/pull/262) by [@xPaw](https://github.com/xPaw)) +- Change license link to point at our license file ([#290](https://github.com/thelounge/lounge/pull/290) by [@xPaw](https://github.com/xPaw)) +- Stricter eslint rule for curly brackets ([#291](https://github.com/thelounge/lounge/pull/291) by [@xPaw](https://github.com/xPaw)) +- Bump patch version of lodash to 4.11.2 ([#306](https://github.com/thelounge/lounge/pull/306) by [@astorije](https://github.com/astorije)) +- Minor wording changes for better clarity ([#305](https://github.com/thelounge/lounge/pull/305) by [@astorije](https://github.com/astorije)) +- Improve tests execution ([#260](https://github.com/thelounge/lounge/pull/260) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Update irc-framework ([#324](https://github.com/thelounge/lounge/pull/324) by [@xPaw](https://github.com/xPaw)) +- Do not ignore our handlebars plugins in ESLint ([#329](https://github.com/thelounge/lounge/pull/329) by [@xPaw](https://github.com/xPaw)) +- Improve nick highlights ([#327](https://github.com/thelounge/lounge/pull/327) by [@xPaw](https://github.com/xPaw)) +- CSS classes in themes for nick colors ([#325](https://github.com/thelounge/lounge/pull/325) by [@astorije](https://github.com/astorije)) +- Replace all concatenated paths with Node's path.join ([#307](https://github.com/thelounge/lounge/pull/307) by [@astorije](https://github.com/astorije)) ### Removed -- Do not increase font size on highlight in morning theme ([#321](https://github.com/thelounge/thelounge/pull/321) by [@xPaw](https://github.com/xPaw)) +- Do not increase font size on highlight in morning theme ([#321](https://github.com/thelounge/lounge/pull/321) by [@xPaw](https://github.com/xPaw)) ### Fixed -- Only increase unread counter for whitelisted actions ([#273](https://github.com/thelounge/thelounge/pull/273) by [@xPaw](https://github.com/xPaw)) -- Parse CTCP replies ([#278](https://github.com/thelounge/thelounge/pull/278) by [@xPaw](https://github.com/xPaw)) -- Do not count your own messages as unread ([#279](https://github.com/thelounge/thelounge/pull/279) by [@xPaw](https://github.com/xPaw)) -- Use lowercase global to avoid a deprecation warning in Node.js 6 ([`d9a0dd9`](https://github.com/thelounge/thelounge/commit/d9a0dd9406e8fb22d7a5ee1ed4ed7aa8e5f0fa01) by [@xPaw](https://github.com/xPaw)) -- Do not display incorrect nick when switching to a non connected network ([#252](https://github.com/thelounge/thelounge/pull/252) by [@xPaw](https://github.com/xPaw)) -- Keep autocompletion sort whenever user list updates ([#217](https://github.com/thelounge/thelounge/pull/217) by [@xPaw](https://github.com/xPaw)) -- Make sure app does not crash when webirc is not defined in the configuration ([#294](https://github.com/thelounge/thelounge/pull/294) by [@astorije](https://github.com/astorije)) -- Save user when parting channels ([#297](https://github.com/thelounge/thelounge/pull/297) by [@xPaw](https://github.com/xPaw)) -- Add labels in connect window ([#300](https://github.com/thelounge/thelounge/pull/300) by [@xPaw](https://github.com/xPaw)) -- Add missing `aria-label` on icon buttons ([#303](https://github.com/thelounge/thelounge/pull/303) by [@astorije](https://github.com/astorije)) -- Fix unread counter not being formatted on page load ([#308](https://github.com/thelounge/thelounge/pull/308) by [@xPaw](https://github.com/xPaw)) -- Fix wrong CSS for disabled colored nicknames on themes ([#318](https://github.com/thelounge/thelounge/pull/318) by [@astorije](https://github.com/astorije)) -- Fix missing colors in action messages ([#317](https://github.com/thelounge/thelounge/pull/317) by [@astorije](https://github.com/astorije)) -- Don't falsely report failed write if it didn't fail ([`e6990e0`](https://github.com/thelounge/thelounge/commit/e6990e0fc7641d18a5bcbabddca1aacf2254ae52) by [@xPaw](https://github.com/xPaw)) -- Fix sending messages starting with a space ([#320](https://github.com/thelounge/thelounge/pull/320) by [@maxpoulin64](https://github.com/maxpoulin64)) -- Fix notifications in query windows ([#334](https://github.com/thelounge/thelounge/pull/334) by [@xPaw](https://github.com/xPaw)) +- Only increase unread counter for whitelisted actions ([#273](https://github.com/thelounge/lounge/pull/273) by [@xPaw](https://github.com/xPaw)) +- Parse CTCP replies ([#278](https://github.com/thelounge/lounge/pull/278) by [@xPaw](https://github.com/xPaw)) +- Do not count your own messages as unread ([#279](https://github.com/thelounge/lounge/pull/279) by [@xPaw](https://github.com/xPaw)) +- Use lowercase global to avoid a deprecation warning in Node.js 6 ([`d9a0dd9`](https://github.com/thelounge/lounge/commit/d9a0dd9406e8fb22d7a5ee1ed4ed7aa8e5f0fa01) by [@xPaw](https://github.com/xPaw)) +- Do not display incorrect nick when switching to a non connected network ([#252](https://github.com/thelounge/lounge/pull/252) by [@xPaw](https://github.com/xPaw)) +- Keep autocompletion sort whenever user list updates ([#217](https://github.com/thelounge/lounge/pull/217) by [@xPaw](https://github.com/xPaw)) +- Make sure app does not crash when webirc is not defined in the configuration ([#294](https://github.com/thelounge/lounge/pull/294) by [@astorije](https://github.com/astorije)) +- Save user when parting channels ([#297](https://github.com/thelounge/lounge/pull/297) by [@xPaw](https://github.com/xPaw)) +- Add labels in connect window ([#300](https://github.com/thelounge/lounge/pull/300) by [@xPaw](https://github.com/xPaw)) +- Add missing `aria-label` on icon buttons ([#303](https://github.com/thelounge/lounge/pull/303) by [@astorije](https://github.com/astorije)) +- Fix unread counter not being formatted on page load ([#308](https://github.com/thelounge/lounge/pull/308) by [@xPaw](https://github.com/xPaw)) +- Fix wrong CSS for disabled colored nicknames on themes ([#318](https://github.com/thelounge/lounge/pull/318) by [@astorije](https://github.com/astorije)) +- Fix missing colors in action messages ([#317](https://github.com/thelounge/lounge/pull/317) by [@astorije](https://github.com/astorije)) +- Don't falsely report failed write if it didn't fail ([`e6990e0`](https://github.com/thelounge/lounge/commit/e6990e0fc7641d18a5bcbabddca1aacf2254ae52) by [@xPaw](https://github.com/xPaw)) +- Fix sending messages starting with a space ([#320](https://github.com/thelounge/lounge/pull/320) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Fix notifications in query windows ([#334](https://github.com/thelounge/lounge/pull/334) by [@xPaw](https://github.com/xPaw)) ### Security -- Restrict access to the home directory by default ([#205](https://github.com/thelounge/thelounge/pull/205) by [@maxpoulin64](https://github.com/maxpoulin64)) -- Update demo link to HTTPS ([#302](https://github.com/thelounge/thelounge/pull/302) by [@MaxLeiter](https://github.com/MaxLeiter)) -- Add security headers to minimize XSS damage ([#292](https://github.com/thelounge/thelounge/pull/292) by [@xPaw](https://github.com/xPaw)) -- Do not write user configs outside of the app's users directory ([#238](https://github.com/thelounge/thelounge/pull/238) by [@williamboman](https://github.com/williamboman)) -- Don't check for existing password emptiness ([#315](https://github.com/thelounge/thelounge/pull/315) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Restrict access to the home directory by default ([#205](https://github.com/thelounge/lounge/pull/205) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Update demo link to HTTPS ([#302](https://github.com/thelounge/lounge/pull/302) by [@MaxLeiter](https://github.com/MaxLeiter)) +- Add security headers to minimize XSS damage ([#292](https://github.com/thelounge/lounge/pull/292) by [@xPaw](https://github.com/xPaw)) +- Do not write user configs outside of the app's users directory ([#238](https://github.com/thelounge/lounge/pull/238) by [@williamboman](https://github.com/williamboman)) +- Don't check for existing password emptiness ([#315](https://github.com/thelounge/lounge/pull/315) by [@maxpoulin64](https://github.com/maxpoulin64)) ## v1.5.0 - 2016-04-13 -[See the full changelog](https://github.com/thelounge/thelounge/compare/v1.4.3...v1.5.0) +[See the full changelog](https://github.com/thelounge/lounge/compare/v1.4.3...v1.5.0) With this release, administrators can now define a maximum size for channel history. While this is not optimal nor the definitive solution, it aims at reducing stability issues where The Lounge would crash after filling up the server's memory. @@ -4324,255 +276,255 @@ Other changes noticeable by users include removing custom print styles and preve ### Added -- Add config option to limit in-memory history size ([#243](https://github.com/thelounge/thelounge/pull/243) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Add config option to limit in-memory history size ([#243](https://github.com/thelounge/lounge/pull/243) by [@maxpoulin64](https://github.com/maxpoulin64)) ### Changed -- Do not parse link titles for IRC formatting ([#245](https://github.com/thelounge/thelounge/pull/245) by [@xPaw](https://github.com/xPaw)) -- Display multiple white spaces properly ([#239](https://github.com/thelounge/thelounge/pull/239) by [@maxpoulin64](https://github.com/maxpoulin64)) -- Reword password prompt of `add` and `reset` CLI commands ([#230](https://github.com/thelounge/thelounge/pull/230) by [@williamboman](https://github.com/williamboman)) +- Do not parse link titles for IRC formatting ([#245](https://github.com/thelounge/lounge/pull/245) by [@xPaw](https://github.com/xPaw)) +- Display multiple white spaces properly ([#239](https://github.com/thelounge/lounge/pull/239) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Reword password prompt of `add` and `reset` CLI commands ([#230](https://github.com/thelounge/lounge/pull/230) by [@williamboman](https://github.com/williamboman)) ### Removed -- Remove print styles ([#228](https://github.com/thelounge/thelounge/pull/228) by [@xPaw](https://github.com/xPaw)) +- Remove print styles ([#228](https://github.com/thelounge/lounge/pull/228) by [@xPaw](https://github.com/xPaw)) ## v1.4.3 - 2016-04-02 -[See the full changelog](https://github.com/thelounge/thelounge/compare/v1.4.2...v1.4.3) +[See the full changelog](https://github.com/thelounge/lounge/compare/v1.4.2...v1.4.3) This PR fixes a bug introduced in v1.3.0 which prevents deleting disconnected networks from users' configuration files. ### Fixed -- Fix not being able to remove networks from user config ([#233](https://github.com/thelounge/thelounge/pull/233) by [@xPaw](https://github.com/xPaw)) +- Fix not being able to remove networks from user config ([#233](https://github.com/thelounge/lounge/pull/233) by [@xPaw](https://github.com/xPaw)) ## v1.4.2 - 2016-03-31 -[See the full changelog](https://github.com/thelounge/thelounge/compare/v1.4.1...v1.4.2) +[See the full changelog](https://github.com/thelounge/lounge/compare/v1.4.1...v1.4.2) This PR fixes a bug introduced in v1.4.1 causing timestamps to use most of the screen. ### Fixed -- Hide options will now remove the entire row ([#227](https://github.com/thelounge/thelounge/pull/227) by [@xPaw](https://github.com/xPaw)) +- Hide options will now remove the entire row ([#227](https://github.com/thelounge/lounge/pull/227) by [@xPaw](https://github.com/xPaw)) ## v1.4.1 - 2016-03-28 -[See the full changelog](https://github.com/thelounge/thelounge/compare/v1.4.0...v1.4.1) +[See the full changelog](https://github.com/thelounge/lounge/compare/v1.4.0...v1.4.1) As of this release, running `/query nick` will simply open a chat window with user `nick`, instead of calling `whois` for this user. ### Changed -- Remove `join`, `nick` and `whois` inputs, they are cleanly handled by the server ([#208](https://github.com/thelounge/thelounge/pull/208) by [@xPaw](https://github.com/xPaw)) -- Add a `/query` command that simply opens a query window ([#218](https://github.com/thelounge/thelounge/pull/218) by [@xPaw](https://github.com/xPaw)) -- Disallow `/query` on non-nicks ([#221](https://github.com/thelounge/thelounge/pull/221) by [@astorije](https://github.com/astorije)) +- Remove `join`, `nick` and `whois` inputs, they are cleanly handled by the server ([#208](https://github.com/thelounge/lounge/pull/208) by [@xPaw](https://github.com/xPaw)) +- Add a `/query` command that simply opens a query window ([#218](https://github.com/thelounge/lounge/pull/218) by [@xPaw](https://github.com/xPaw)) +- Disallow `/query` on non-nicks ([#221](https://github.com/thelounge/lounge/pull/221) by [@astorije](https://github.com/astorije)) ### Fixed -- Fix message and topic text wrapping ([#215](https://github.com/thelounge/thelounge/pull/215) by [@xPaw](https://github.com/xPaw)) -- Fix `/part` command ([#222](https://github.com/thelounge/thelounge/pull/222) by [@maxpoulin64](https://github.com/maxpoulin64)) -- Harden URL fetcher and don't crash on non-ASCII urls ([#219](https://github.com/thelounge/thelounge/pull/219) by [@xPaw](https://github.com/xPaw)) +- Fix message and topic text wrapping ([#215](https://github.com/thelounge/lounge/pull/215) by [@xPaw](https://github.com/xPaw)) +- Fix `/part` command ([#222](https://github.com/thelounge/lounge/pull/222) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Harden URL fetcher and don't crash on non-ASCII urls ([#219](https://github.com/thelounge/lounge/pull/219) by [@xPaw](https://github.com/xPaw)) ## v1.4.0 - 2016-03-20 -[See the full changelog](https://github.com/thelounge/thelounge/compare/v1.3.1...v1.4.0) +[See the full changelog](https://github.com/thelounge/lounge/compare/v1.3.1...v1.4.0) Note that this release will reset users' notification settings to their defaults. This unfortunate side effect is the consequence of an improvement of how this setting is handled in the application. ### Added -- Add context menu when right-clicking on a sidebar item ([#9](https://github.com/thelounge/thelounge/pull/9) by [@xPaw](https://github.com/xPaw)) -- Add tests for the `Chan#sortUsers` method ([#197](https://github.com/thelounge/thelounge/pull/197) by [@astorije](https://github.com/astorije)) -- Add a very basic test for `Network#export` ([#198](https://github.com/thelounge/thelounge/pull/198) by [@astorije](https://github.com/astorije)) -- Link to the demo from the IRC channel badge on the README ([#203](https://github.com/thelounge/thelounge/pull/203) by [@Henni](https://github.com/Henni)) -- Add support for HTTP/2 ([#174](https://github.com/thelounge/thelounge/pull/174) by [@xPaw](https://github.com/xPaw)) -- Support port in `/connect` command ([#210](https://github.com/thelounge/thelounge/pull/210) by [@xPaw](https://github.com/xPaw)) +- Add context menu when right-clicking on a sidebar item ([#9](https://github.com/thelounge/lounge/pull/9) by [@xPaw](https://github.com/xPaw)) +- Add tests for the `Chan#sortUsers` method ([#197](https://github.com/thelounge/lounge/pull/197) by [@astorije](https://github.com/astorije)) +- Add a very basic test for `Network#export` ([#198](https://github.com/thelounge/lounge/pull/198) by [@astorije](https://github.com/astorije)) +- Link to the demo from the IRC channel badge on the README ([#203](https://github.com/thelounge/lounge/pull/203) by [@Henni](https://github.com/Henni)) +- Add support for HTTP/2 ([#174](https://github.com/thelounge/lounge/pull/174) by [@xPaw](https://github.com/xPaw)) +- Support port in `/connect` command ([#210](https://github.com/thelounge/lounge/pull/210) by [@xPaw](https://github.com/xPaw)) ### Changed -- Update Handlebars to 4.0.5 ([#140](https://github.com/thelounge/thelounge/pull/140) by [@xPaw](https://github.com/xPaw)) -- Update Socket.IO to 1.4.5 and use client library provided by the dependency ([#142](https://github.com/thelounge/thelounge/pull/142) by [@xPaw](https://github.com/xPaw)) -- Update ESLint to 2.3.0 and add stricter rules ([#171](https://github.com/thelounge/thelounge/pull/171) by [@xPaw](https://github.com/xPaw)) -- Mute color of the topic actions ([#151](https://github.com/thelounge/thelounge/pull/151) by [@astorije](https://github.com/astorije)) -- Rename "badge" setting and rely on browser choice for desktop notifications ([#28](https://github.com/thelounge/thelounge/pull/28) by [@lpoujol](https://github.com/lpoujol)) -- Invoke `handlebars` outside of `grunt` and generate a sourcemap ([#144](https://github.com/thelounge/thelounge/pull/144) by [@xPaw](https://github.com/xPaw)) -- Make `whois` a client action template and improve its output ([#161](https://github.com/thelounge/thelounge/pull/161) by [@xPaw](https://github.com/xPaw)) -- Handle commands in a better way and send unknown commands to the IRC server ([#154](https://github.com/thelounge/thelounge/pull/154) by [@xPaw](https://github.com/xPaw)) -- Switch the Send button to a paper plane icon ([#182](https://github.com/thelounge/thelounge/pull/182) by [@astorije](https://github.com/astorije)) -- Keep track of highlights when user is offline ([#190](https://github.com/thelounge/thelounge/pull/190) by [@xPaw](https://github.com/xPaw)) -- Load input plugins at startup and call them directly when a command is received ([#191](https://github.com/thelounge/thelounge/pull/191) by [@astorije](https://github.com/astorije)) -- Make defaults for socket.io transports consistent to use polling before websocket ([#202](https://github.com/thelounge/thelounge/pull/202) by [@xPaw](https://github.com/xPaw)) -- Update all server dependencies to current stable versions ([#200](https://github.com/thelounge/thelounge/pull/200) by [@xPaw](https://github.com/xPaw)) -- Update configuration file to reflect HTTP/2 support addition ([#206](https://github.com/thelounge/thelounge/pull/206) by [@astorije](https://github.com/astorije)) -- Change close button behavior and add a dropdown context menu ([#184](https://github.com/thelounge/thelounge/pull/184) by [@xPaw](https://github.com/xPaw)) -- Minor enhancements of the context menu UI ([#212](https://github.com/thelounge/thelounge/pull/212) by [@astorije](https://github.com/astorije)) +- Update Handlebars to 4.0.5 ([#140](https://github.com/thelounge/lounge/pull/140) by [@xPaw](https://github.com/xPaw)) +- Update Socket.IO to 1.4.5 and use client library provided by the dependency ([#142](https://github.com/thelounge/lounge/pull/142) by [@xPaw](https://github.com/xPaw)) +- Update ESLint to 2.3.0 and add stricter rules ([#171](https://github.com/thelounge/lounge/pull/171) by [@xPaw](https://github.com/xPaw)) +- Mute color of the topic actions ([#151](https://github.com/thelounge/lounge/pull/151) by [@astorije](https://github.com/astorije)) +- Rename "badge" setting and rely on browser choice for desktop notifications ([#28](https://github.com/thelounge/lounge/pull/28) by [@lpoujol](https://github.com/lpoujol)) +- Invoke `handlebars` outside of `grunt` and generate a sourcemap ([#144](https://github.com/thelounge/lounge/pull/144) by [@xPaw](https://github.com/xPaw)) +- Make `whois` a client action template and improve its output ([#161](https://github.com/thelounge/lounge/pull/161) by [@xPaw](https://github.com/xPaw)) +- Handle commands in a better way and send unknown commands to the IRC server ([#154](https://github.com/thelounge/lounge/pull/154) by [@xPaw](https://github.com/xPaw)) +- Switch the Send button to a paper plane icon ([#182](https://github.com/thelounge/lounge/pull/182) by [@astorije](https://github.com/astorije)) +- Keep track of highlights when user is offline ([#190](https://github.com/thelounge/lounge/pull/190) by [@xPaw](https://github.com/xPaw)) +- Load input plugins at startup and call them directly when a command is received ([#191](https://github.com/thelounge/lounge/pull/191) by [@astorije](https://github.com/astorije)) +- Make defaults for socket.io transports consistent to use polling before websocket ([#202](https://github.com/thelounge/lounge/pull/202) by [@xPaw](https://github.com/xPaw)) +- Update all server dependencies to current stable versions ([#200](https://github.com/thelounge/lounge/pull/200) by [@xPaw](https://github.com/xPaw)) +- Update configuration file to reflect HTTP/2 support addition ([#206](https://github.com/thelounge/lounge/pull/206) by [@astorije](https://github.com/astorije)) +- Change close button behavior and add a dropdown context menu ([#184](https://github.com/thelounge/lounge/pull/184) by [@xPaw](https://github.com/xPaw)) +- Minor enhancements of the context menu UI ([#212](https://github.com/thelounge/lounge/pull/212) by [@astorije](https://github.com/astorije)) ### Removed -- Remove `string.contains` library ([#163](https://github.com/thelounge/thelounge/pull/163) by [@xPaw](https://github.com/xPaw)) -- Remove Moment.js library from the client ([#183](https://github.com/thelounge/thelounge/pull/183) by [@xPaw](https://github.com/xPaw)) -- Disabled emails from Travis CI on successful builds ([#172](https://github.com/thelounge/thelounge/pull/172) by [@xPaw](https://github.com/xPaw)) -- Remove unnecessary operation when sorting users ([#193](https://github.com/thelounge/thelounge/pull/193) by [@astorije](https://github.com/astorije)) +- Remove `string.contains` library ([#163](https://github.com/thelounge/lounge/pull/163) by [@xPaw](https://github.com/xPaw)) +- Remove Moment.js library from the client ([#183](https://github.com/thelounge/lounge/pull/183) by [@xPaw](https://github.com/xPaw)) +- Disabled emails from Travis CI on successful builds ([#172](https://github.com/thelounge/lounge/pull/172) by [@xPaw](https://github.com/xPaw)) +- Remove unnecessary operation when sorting users ([#193](https://github.com/thelounge/lounge/pull/193) by [@astorije](https://github.com/astorije)) ### Fixed -- Make sure self messages are never highlighted and improve highlight lookup ([#157](https://github.com/thelounge/thelounge/pull/157) by [@astorije](https://github.com/astorije)) -- Fix Send button style on Zenburn and Morning themes, introduced by this release ([#187](https://github.com/thelounge/thelounge/pull/187) by [@astorije](https://github.com/astorije)) -- Make sure all close buttons in the sidebar have same weight ([#192](https://github.com/thelounge/thelounge/pull/192) by [@astorije](https://github.com/astorije)) -- Disallow parting from lobbies ([#209](https://github.com/thelounge/thelounge/pull/209) by [@xPaw](https://github.com/xPaw)) +- Make sure self messages are never highlighted and improve highlight lookup ([#157](https://github.com/thelounge/lounge/pull/157) by [@astorije](https://github.com/astorije)) +- Fix Send button style on Zenburn and Morning themes, introduced by this release ([#187](https://github.com/thelounge/lounge/pull/187) by [@astorije](https://github.com/astorije)) +- Make sure all close buttons in the sidebar have same weight ([#192](https://github.com/thelounge/lounge/pull/192) by [@astorije](https://github.com/astorije)) +- Disallow parting from lobbies ([#209](https://github.com/thelounge/lounge/pull/209) by [@xPaw](https://github.com/xPaw)) ## v1.3.1 - 2016-03-05 -[See the full changelog](https://github.com/thelounge/thelounge/compare/v1.3.0...v1.3.1) +[See the full changelog](https://github.com/thelounge/lounge/compare/v1.3.0...v1.3.1) ### Removed -- Remove attempts to set file modes ([#117](https://github.com/thelounge/thelounge/pull/117) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Remove attempts to set file modes ([#117](https://github.com/thelounge/lounge/pull/117) by [@maxpoulin64](https://github.com/maxpoulin64)) ### Fixed -- Correctly handle inline channels in messages ([#128](https://github.com/thelounge/thelounge/pull/128) by [@xPaw](https://github.com/xPaw)) -- Fix crash, introduced by this release ([#143](https://github.com/thelounge/thelounge/pull/143) by [@xPaw](https://github.com/xPaw)) -- Fix highlighted actions and mute colors of some of the actions ([#47](https://github.com/thelounge/thelounge/pull/47) by [@xPaw](https://github.com/xPaw)) -- Fix stripping multiple colors from notifications ([#145](https://github.com/thelounge/thelounge/pull/145) by [@xPaw](https://github.com/xPaw)) -- Correctly display channel name in notifications ([#148](https://github.com/thelounge/thelounge/pull/148) by [@xPaw](https://github.com/xPaw)) -- Fix hover effect on channels in topics ([#149](https://github.com/thelounge/thelounge/pull/149) by [@xPaw](https://github.com/xPaw)) -- Add missing mode action to muted colors ([#150](https://github.com/thelounge/thelounge/pull/150) by [@astorije](https://github.com/astorije)) +- Correctly handle inline channels in messages ([#128](https://github.com/thelounge/lounge/pull/128) by [@xPaw](https://github.com/xPaw)) +- Fix crash, introduced by this release ([#143](https://github.com/thelounge/lounge/pull/143) by [@xPaw](https://github.com/xPaw)) +- Fix highlighted actions and mute colors of some of the actions ([#47](https://github.com/thelounge/lounge/pull/47) by [@xPaw](https://github.com/xPaw)) +- Fix stripping multiple colors from notifications ([#145](https://github.com/thelounge/lounge/pull/145) by [@xPaw](https://github.com/xPaw)) +- Correctly display channel name in notifications ([#148](https://github.com/thelounge/lounge/pull/148) by [@xPaw](https://github.com/xPaw)) +- Fix hover effect on channels in topics ([#149](https://github.com/thelounge/lounge/pull/149) by [@xPaw](https://github.com/xPaw)) +- Add missing mode action to muted colors ([#150](https://github.com/thelounge/lounge/pull/150) by [@astorije](https://github.com/astorije)) ## v1.3.0 - 2016-03-03 -[See the full changelog](https://github.com/thelounge/thelounge/compare/v1.2.1...v1.3.0) +[See the full changelog](https://github.com/thelounge/lounge/compare/v1.2.1...v1.3.0) ### Added -- Add hostmask in `join`/`part`/`quit` messages and move actions to templates ([#94](https://github.com/thelounge/thelounge/pull/94) by [@xPaw](https://github.com/xPaw)) -- Add a section in the README explaining why a fork was created ([#95](https://github.com/thelounge/thelounge/pull/95) by [@almet](https://github.com/almet)) -- Add the ability to let users change their password from the settings page ([#57](https://github.com/thelounge/thelounge/pull/57) by [@diddledan](https://github.com/diddledan)) -- Add the ability to let users set custom CSS in their settings ([#83](https://github.com/thelounge/thelounge/pull/83) by [@xPaw](https://github.com/xPaw)) -- Add notifications for channel invites ([#127](https://github.com/thelounge/thelounge/pull/127) by [@astorije](https://github.com/astorije)) -- Allow locking network configuration ([#82](https://github.com/thelounge/thelounge/pull/82) by [@xPaw](https://github.com/xPaw)) +- Add hostmask in `join`/`part`/`quit` messages and move actions to templates ([#94](https://github.com/thelounge/lounge/pull/94) by [@xPaw](https://github.com/xPaw)) +- Add a section in the README explaining why a fork was created ([#95](https://github.com/thelounge/lounge/pull/95) by [@almet](https://github.com/almet)) +- Add the ability to let users change their password from the settings page ([#57](https://github.com/thelounge/lounge/pull/57) by [@diddledan](https://github.com/diddledan)) +- Add the ability to let users set custom CSS in their settings ([#83](https://github.com/thelounge/lounge/pull/83) by [@xPaw](https://github.com/xPaw)) +- Add notifications for channel invites ([#127](https://github.com/thelounge/lounge/pull/127) by [@astorije](https://github.com/astorije)) +- Allow locking network configuration ([#82](https://github.com/thelounge/lounge/pull/82) by [@xPaw](https://github.com/xPaw)) ### Changed -- Add target channel name in notifications ([#118](https://github.com/thelounge/thelounge/pull/118) by [@astorije](https://github.com/astorije)) -- Bump `grunt-contrib-uglify` and pin versions of `grunt`-related dependencies ([#119](https://github.com/thelounge/thelounge/pull/119) by [@astorije](https://github.com/astorije)) -- Switch to a power-off icon for logging out ([#131](https://github.com/thelounge/thelounge/pull/131) by [@astorije](https://github.com/astorije)) +- Add target channel name in notifications ([#118](https://github.com/thelounge/lounge/pull/118) by [@astorije](https://github.com/astorije)) +- Bump `grunt-contrib-uglify` and pin versions of `grunt`-related dependencies ([#119](https://github.com/thelounge/lounge/pull/119) by [@astorije](https://github.com/astorije)) +- Switch to a power-off icon for logging out ([#131](https://github.com/thelounge/lounge/pull/131) by [@astorije](https://github.com/astorije)) ### Removed -- Remove auto-select on input fields ([#120](https://github.com/thelounge/thelounge/pull/120) by [@astorije](https://github.com/astorije)) +- Remove auto-select on input fields ([#120](https://github.com/thelounge/lounge/pull/120) by [@astorije](https://github.com/astorije)) ### Fixed -- Fix the "Show more" button being displayed over chat messages and message paddings when `join`/`part`/`quit` messages are hidden ([`b53e5c4`](https://github.com/thelounge/thelounge/commit/b53e5c407c7ca90e9741791b4e0d927fb5f54ea1) by [@xPaw](https://github.com/xPaw)) -- Fix how highlights are handled and highlighted ([#91](https://github.com/thelounge/thelounge/pull/91) by [@xPaw](https://github.com/xPaw)) -- Fix favicon highlight on Chrome and remove `Favico.js` library ([#100](https://github.com/thelounge/thelounge/pull/100) by [@xPaw](https://github.com/xPaw)) -- Fix complete crash when refreshing a public instance, introduced by this release ([#125](https://github.com/thelounge/thelounge/pull/125) by [@astorije](https://github.com/astorije)) -- Fix clickable "you" in the text of an `/invite`, introduced by this release ([#122](https://github.com/thelounge/thelounge/pull/122) by [@xPaw](https://github.com/xPaw)) -- Fix minor issues with the main HTML file ([#134](https://github.com/thelounge/thelounge/pull/134) by [@astorije](https://github.com/astorije)) -- Strip control codes from notifications ([#123](https://github.com/thelounge/thelounge/pull/123) by [@xPaw](https://github.com/xPaw)) +- Fix the "Show more" button being displayed over chat messages and message paddings when `join`/`part`/`quit` messages are hidden ([`b53e5c4`](https://github.com/thelounge/lounge/commit/b53e5c407c7ca90e9741791b4e0d927fb5f54ea1) by [@xPaw](https://github.com/xPaw)) +- Fix how highlights are handled and highlighted ([#91](https://github.com/thelounge/lounge/pull/91) by [@xPaw](https://github.com/xPaw)) +- Fix favicon highlight on Chrome and remove `Favico.js` library ([#100](https://github.com/thelounge/lounge/pull/100) by [@xPaw](https://github.com/xPaw)) +- Fix complete crash when refreshing a public instance, introduced by this release ([#125](https://github.com/thelounge/lounge/pull/125) by [@astorije](https://github.com/astorije)) +- Fix clickable "you" in the text of an `/invite`, introduced by this release ([#122](https://github.com/thelounge/lounge/pull/122) by [@xPaw](https://github.com/xPaw)) +- Fix minor issues with the main HTML file ([#134](https://github.com/thelounge/lounge/pull/134) by [@astorije](https://github.com/astorije)) +- Strip control codes from notifications ([#123](https://github.com/thelounge/lounge/pull/123) by [@xPaw](https://github.com/xPaw)) ## v1.2.1 - 2016-02-26 -[See the full changelog](https://github.com/thelounge/thelounge/compare/v1.2.0...v1.2.1) +[See the full changelog](https://github.com/thelounge/lounge/compare/v1.2.0...v1.2.1) ### Changed -- Bump and pin mocha version ([#104](https://github.com/thelounge/thelounge/pull/104) by [@astorije](https://github.com/astorije)) +- Bump and pin mocha version ([#104](https://github.com/thelounge/lounge/pull/104) by [@astorije](https://github.com/astorije)) ### Fixed -- Fix CSS selector syntax in channel message handler ([#102](https://github.com/thelounge/thelounge/pull/102) by [@maxpoulin64](https://github.com/maxpoulin64)) -- Fix fading channel name in sidebar of Crypto and Zenburn themes ([#105](https://github.com/thelounge/thelounge/pull/105) by [@maxpoulin64](https://github.com/maxpoulin64)) -- Fix `/invite` command broken by lodash bump ([#106](https://github.com/thelounge/thelounge/pull/106) by [@JocelynDelalande](https://github.com/JocelynDelalande)) +- Fix CSS selector syntax in channel message handler ([#102](https://github.com/thelounge/lounge/pull/102) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Fix fading channel name in sidebar of Crypto and Zenburn themes ([#105](https://github.com/thelounge/lounge/pull/105) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Fix `/invite` command broken by lodash bump ([#106](https://github.com/thelounge/lounge/pull/106) by [@JocelynDelalande](https://github.com/JocelynDelalande)) ## v1.2.0 - 2016-02-24 -[See the full changelog](https://github.com/thelounge/thelounge/compare/v1.1.1...v1.2.0) +[See the full changelog](https://github.com/thelounge/lounge/compare/v1.1.1...v1.2.0) -Note that this release will reset client-side settings to their defaults. Current users will have to re-set them in the settings page. This is [a conscious trade-off](https://github.com/thelounge/thelounge/pull/70#issuecomment-186717859) as the fork is rather new and there are not many settings overall. +Note that this release will reset client-side settings to their defaults. Current users will have to re-set them in the settings page. This is [a conscious trade-off](https://github.com/thelounge/lounge/pull/70#issuecomment-186717859) as the fork is rather new and there are not many settings overall. ### Added -- Add support for the `/invite <nickname> <channel>` command ([#7](https://github.com/thelounge/thelounge/pull/7) by [@xPaw](https://github.com/xPaw)) -- Add a command shorthand to invite in the current channel with `/invite <nickname>` ([#76](https://github.com/thelounge/thelounge/pull/76) by [@astorije](https://github.com/astorije)) -- Add style linting for all CSS files in the repository ([#43](https://github.com/thelounge/thelounge/pull/43) by [@xPaw](https://github.com/xPaw)) +- Add support for the `/invite <nickname> <channel>` command ([#7](https://github.com/thelounge/lounge/pull/7) by [@xPaw](https://github.com/xPaw)) +- Add a command shorthand to invite in the current channel with `/invite <nickname>` ([#76](https://github.com/thelounge/lounge/pull/76) by [@astorije](https://github.com/astorije)) +- Add style linting for all CSS files in the repository ([#43](https://github.com/thelounge/lounge/pull/43) by [@xPaw](https://github.com/xPaw)) ### Changed -- Improve client performance by updating the users' list only when it's needed ([#58](https://github.com/thelounge/thelounge/pull/58) by [@maxpoulin64](https://github.com/maxpoulin64)) -- Let the badge counter hide with a fade-out ([#73](https://github.com/thelounge/thelounge/pull/73) by [@xPaw](https://github.com/xPaw)) -- Update `lodash` dependency to the latest major version ([#38](https://github.com/thelounge/thelounge/pull/38) by [@xPaw](https://github.com/xPaw)) -- Use `localStorage` instead of cookies for client-side settings storage ([#70](https://github.com/thelounge/thelounge/pull/70) by [@xPaw](https://github.com/xPaw)) -- Replace Bootstrap's tooltips with CSS tooltips from GitHub's Primer ([#79](https://github.com/thelounge/thelounge/pull/79) by [@xPaw](https://github.com/xPaw)) +- Improve client performance by updating the users' list only when it's needed ([#58](https://github.com/thelounge/lounge/pull/58) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Let the badge counter hide with a fade-out ([#73](https://github.com/thelounge/lounge/pull/73) by [@xPaw](https://github.com/xPaw)) +- Update `lodash` dependency to the latest major version ([#38](https://github.com/thelounge/lounge/pull/38) by [@xPaw](https://github.com/xPaw)) +- Use `localStorage` instead of cookies for client-side settings storage ([#70](https://github.com/thelounge/lounge/pull/70) by [@xPaw](https://github.com/xPaw)) +- Replace Bootstrap's tooltips with CSS tooltips from GitHub's Primer ([#79](https://github.com/thelounge/lounge/pull/79) by [@xPaw](https://github.com/xPaw)) ### Fixed -- Fade long channel names in the sidebar instead of breaking to another line ([#75](https://github.com/thelounge/thelounge/pull/75) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Fade long channel names in the sidebar instead of breaking to another line ([#75](https://github.com/thelounge/lounge/pull/75) by [@maxpoulin64](https://github.com/maxpoulin64)) ## v1.1.1 - 2016-02-19 -[See the full changelog](https://github.com/thelounge/thelounge/compare/v1.1.0...v1.1.1) +[See the full changelog](https://github.com/thelounge/lounge/compare/v1.1.0...v1.1.1) ### Changed -- Remove compiled assets and generate them at prepublish time ([#63](https://github.com/thelounge/thelounge/pull/63) by [@astorije](https://github.com/astorije)) +- Remove compiled assets and generate them at prepublish time ([#63](https://github.com/thelounge/lounge/pull/63) by [@astorije](https://github.com/astorije)) ## v1.1.0 - 2016-02-19 -[See the full changelog](https://github.com/thelounge/thelounge/compare/v1.0.2...v1.1.0) +[See the full changelog](https://github.com/thelounge/lounge/compare/v1.0.2...v1.1.0) ### Added -- Allow The Lounge to be proxied behind a `/path/` URL ([#27](https://github.com/thelounge/thelounge/pull/27) by [@gdamjan](https://github.com/gdamjan)) +- Allow The Lounge to be proxied behind a `/path/` URL ([#27](https://github.com/thelounge/lounge/pull/27) by [@gdamjan](https://github.com/gdamjan)) ### Changed -- Simplify a great deal the CONTRIBUTING file ([#40](https://github.com/thelounge/thelounge/pull/40) by [@astorije](https://github.com/astorije)) -- Use a Font Awesome icon for the channel closing button ([#48](https://github.com/thelounge/thelounge/pull/48) by [@xPaw](https://github.com/xPaw)) +- Simplify a great deal the CONTRIBUTING file ([#40](https://github.com/thelounge/lounge/pull/40) by [@astorije](https://github.com/astorije)) +- Use a Font Awesome icon for the channel closing button ([#48](https://github.com/thelounge/lounge/pull/48) by [@xPaw](https://github.com/xPaw)) ### Removed -- Remove Node 0.10 from Travis CI ([#60](https://github.com/thelounge/thelounge/pull/60) by [@astorije](https://github.com/astorije)) +- Remove Node 0.10 from Travis CI ([#60](https://github.com/thelounge/lounge/pull/60) by [@astorije](https://github.com/astorije)) ### Fixed -- Suppress deprecation warning for `moment().zone` ([#37](https://github.com/thelounge/thelounge/pull/37) by [@deiu](https://github.com/deiu)) -- Fix a bug preventing the closing of a channel when the user was kicked out ([#34](https://github.com/thelounge/thelounge/pull/34) by [@xPaw](https://github.com/xPaw)) +- Suppress deprecation warning for `moment().zone` ([#37](https://github.com/thelounge/lounge/pull/37) by [@deiu](https://github.com/deiu)) +- Fix a bug preventing the closing of a channel when the user was kicked out ([#34](https://github.com/thelounge/lounge/pull/34) by [@xPaw](https://github.com/xPaw)) ## v1.0.2 - 2016-02-15 -[See the full changelog](https://github.com/thelounge/thelounge/compare/v1.0.1...v1.0.2) +[See the full changelog](https://github.com/thelounge/lounge/compare/v1.0.1...v1.0.2) ### Changed -- Remove `#foo` channel from the default configuration file ([#22](https://github.com/thelounge/thelounge/pull/22) by [@astorije](https://github.com/astorije)) -- Change the Freenode URL to `chat.freenode.net` in the default configuration file ([#13](https://github.com/thelounge/thelounge/pull/13) by [@dubzi](https://github.com/dubzi)) -- Ensure all `.js` files are linted ([#42](https://github.com/thelounge/thelounge/pull/42) by [@williamboman](https://github.com/williamboman)) +- Remove `#foo` channel from the default configuration file ([#22](https://github.com/thelounge/lounge/pull/22) by [@astorije](https://github.com/astorije)) +- Change the Freenode URL to `chat.freenode.net` in the default configuration file ([#13](https://github.com/thelounge/lounge/pull/13) by [@dubzi](https://github.com/dubzi)) +- Ensure all `.js` files are linted ([#42](https://github.com/thelounge/lounge/pull/42) by [@williamboman](https://github.com/williamboman)) ### Fixed -- Hide the user list button on a server or private message window ([#32](https://github.com/thelounge/thelounge/pull/32) by [@MaxLeiter](https://github.com/MaxLeiter)) -- Correctly sort the user list whenever a user joins ([#33](https://github.com/thelounge/thelounge/pull/33) by [@xPaw](https://github.com/xPaw)) +- Hide the user list button on a server or private message window ([#32](https://github.com/thelounge/lounge/pull/32) by [@MaxLeiter](https://github.com/MaxLeiter)) +- Correctly sort the user list whenever a user joins ([#33](https://github.com/thelounge/lounge/pull/33) by [@xPaw](https://github.com/xPaw)) ## v1.0.1 - 2016-02-14 -[See the full changelog](https://github.com/thelounge/thelounge/compare/v1.0.0...v1.0.1) +[See the full changelog](https://github.com/thelounge/lounge/compare/v1.0.0...v1.0.1) ### Changed -- In the change log, use a permanent URL to link the previous history of The Lounge to Shout ([#12](https://github.com/thelounge/thelounge/pull/12) by [@xPaw](https://github.com/xPaw)) -- Update some dependencies and pin versions ([#8](https://github.com/thelounge/thelounge/pull/8) by [@xPaw](https://github.com/xPaw)) +- In the change log, use a permanent URL to link the previous history of The Lounge to Shout ([#12](https://github.com/thelounge/lounge/pull/12) by [@xPaw](https://github.com/xPaw)) +- Update some dependencies and pin versions ([#8](https://github.com/thelounge/lounge/pull/8) by [@xPaw](https://github.com/xPaw)) ### Fixed -- Add missing form methods that were causing LastPass to trigger a warning ([#19](https://github.com/thelounge/thelounge/pull/19) by [@maxpoulin64](https://github.com/maxpoulin64)) -- Fix comments in the configuration file ([#1](https://github.com/thelounge/thelounge/pull/1) by [@FryDay](https://github.com/FryDay)) +- Add missing form methods that were causing LastPass to trigger a warning ([#19](https://github.com/thelounge/lounge/pull/19) by [@maxpoulin64](https://github.com/maxpoulin64)) +- Fix comments in the configuration file ([#1](https://github.com/thelounge/lounge/pull/1) by [@FryDay](https://github.com/FryDay)) ## v1.0.0 - 2016-02-12 -[See the full changelog](https://github.com/thelounge/thelounge/compare/baadc3df3534fb22515a8c2ea29218fbbc1228b4...v1.0.0) +[See the full changelog](https://github.com/thelounge/lounge/compare/baadc3df3534fb22515a8c2ea29218fbbc1228b4...v1.0.0) This is the first release of **The Lounge**, picking up where Shout `v0.53.0` left off! @@ -4595,7 +547,7 @@ This is the first release of **The Lounge**, picking up where Shout `v0.53.0` le - Render user actions separately ([#588](https://github.com/erming/shout/pull/588) by [@xPaw](https://github.com/xPaw)) - Simply parse all 0-99 IRC colors ([#609](https://github.com/erming/shout/pull/609) by [@xPaw](https://github.com/xPaw)) - Tag notifications to reduce notification spam ([#418](https://github.com/erming/shout/pull/418) by [@williamboman](https://github.com/williamboman)) -- Change all mentions of Shout to the new name: The Lounge ([#2](https://github.com/thelounge/thelounge/pull/2) by [@astorije](https://github.com/astorije)) +- Change all mentions of Shout to the new name: The Lounge ([#2](https://github.com/thelounge/lounge/pull/2) by [@astorije](https://github.com/astorije)) ### Fixed diff --git a/.github/CONTRIBUTING.md b/CONTRIBUTING.md similarity index 57% rename from .github/CONTRIBUTING.md rename to CONTRIBUTING.md index 4f18191e..f3da308a 100644 --- a/.github/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -3,20 +3,24 @@ Welcome to The Lounge, it's great to have you here! We thank you in advance for your contributions. +### I have a question + +- Find us on the Freenode channel `#thelounge`. You might not get an answer + right away, but this channel is full of nice people who will be happy to + help you. + ### I want to report a bug - Look at the [open and closed - issues](https://github.com/thelounge/thelounge/issues?q=is%3Aissue) to see if + issues](https://github.com/thelounge/lounge/issues?q=is%3Aissue) to see if this was not already discussed before. If you can't see any, feel free to - [open a new issue](https://github.com/thelounge/thelounge/issues/new). -- If you think you discovered a security vulnerability, **do not open a public - issue on GitHub.** Refer to our [security guidelines](/SECURITY.md) instead. + [open a new issue](https://github.com/thelounge/lounge/issues/new). ### I want to contribute to the code - Make sure to discuss your ideas with the community in an - [issue](https://github.com/thelounge/thelounge/issues) or on the IRC channel. -- Take a look at the open issues labeled as [`help wanted`](https://github.com/thelounge/thelounge/labels/help%20wanted) + [issue](https://github.com/thelounge/lounge/issues) or on the IRC channel. +- Take a look at the open issues labeled as [`help wanted`](https://github.com/thelounge/lounge/issues?q=is%3Aopen+is%3Aissue+label%3Abug+label%3A%22help+wanted%22) if you want to help without having a specific idea in mind. - Make sure that your PRs do not contain unnecessary commits or merge commits. [Squash commits](https://git-scm.com/book/en/v2/Git-Tools-Rewriting-History) @@ -28,10 +32,6 @@ your contributions. Pope's guidelines](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html). - Each PR will be reviewed by at least two different project maintainers. You can read more about this in the [maintainers' - corner](https://github.com/thelounge/thelounge/wiki/Maintainers'-corner). +corner](https://github.com/thelounge/lounge/wiki/Maintainers'-corner). - Please document any relevant changes in the documentation that can be found - [in its own repository](https://github.com/thelounge/thelounge.chat). -- Note that we use prettier on the project. You can set up IDE plugins to format - on save ([see VS Code one here](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode)). -- We have a git hook to automatically run prettier before commit, in case you don't install the plugin. -- If for any reason, prettier does not work for you, you can run `yarn format:prettier` and that should format everything. + [in its own repository](https://github.com/thelounge/thelounge.github.io). diff --git a/Gruntfile.js b/Gruntfile.js new file mode 100644 index 00000000..49f9477b --- /dev/null +++ b/Gruntfile.js @@ -0,0 +1,26 @@ +module.exports = function(grunt) { + var libs = "client/js/libs/**/*.js"; + grunt.initConfig({ + watch: { + files: libs, + tasks: ["uglify"] + }, + uglify: { + options: { + sourceMap: true, + compress: false + }, + js: { + files: { + "client/js/libs.min.js": libs + } + } + } + }); + grunt.loadNpmTasks("grunt-contrib-uglify"); + grunt.loadNpmTasks("grunt-contrib-watch"); + grunt.registerTask( + "default", + ["uglify"] + ); +}; diff --git a/README.md b/README.md index 20ca44f5..cc9ae834 100644 --- a/README.md +++ b/README.md @@ -1,95 +1,75 @@ -<h1 align="center"> - <img - width="300" - alt="The Lounge" - src="https://raw.githubusercontent.com/thelounge/thelounge/master/client/img/logo-vertical-transparent-bg.svg?sanitize=true"> -</h1> +[![#thelounge IRC channel on freenode](https://img.shields.io/badge/irc%20channel-%23thelounge%20on%20freenode-blue.svg)](https://avatar.playat.ch:1000/) +[![npm version](https://img.shields.io/npm/v/thelounge.svg)](https://www.npmjs.org/package/thelounge) +[![Travis CI Build Status](https://travis-ci.org/thelounge/lounge.svg?branch=master)](https://travis-ci.org/thelounge/lounge) +[![AppVeyor Build status](https://ci.appveyor.com/api/projects/status/deymtp0lldq78s8t/branch/master?svg=true)](https://ci.appveyor.com/project/astorije/lounge/branch/master) +[![Dependency Status](https://david-dm.org/thelounge/lounge.svg)](https://david-dm.org/thelounge/lounge) +[![devDependency Status](https://david-dm.org/thelounge/lounge/dev-status.svg)](https://david-dm.org/thelounge/lounge#info=devDependencies) -<h3 align="center"> - Modern web IRC client designed for self-hosting -</h3> +# The Lounge -<p align="center"> - <strong> - <a href="https://thelounge.chat/">Website</a> - • - <a href="https://thelounge.chat/docs">Docs</a> - • - <a href="https://demo.thelounge.chat/">Demo</a> - • - <a href="https://github.com/thelounge/thelounge-docker">Docker</a> - </strong> -</p> -<p align="center"> - <a href="https://demo.thelounge.chat/"><img - alt="#thelounge IRC channel on Libera.Chat" - src="https://img.shields.io/badge/Libera.Chat-%23thelounge-415364.svg?colorA=ff9e18"></a> - <a href="https://yarn.pm/thelounge"><img - alt="npm version" - src="https://img.shields.io/npm/v/thelounge.svg?colorA=333a41&maxAge=3600"></a> - <a href="https://github.com/thelounge/thelounge/actions"><img - alt="Build Status" - src="https://github.com/thelounge/thelounge/workflows/Build/badge.svg"></a> -</p> +__What is it?__ -<p align="center"> - <img src="https://raw.githubusercontent.com/thelounge/thelounge.github.io/master/img/thelounge-screenshot.png" width="550"> -</p> +The Lounge is a web IRC client that you host on your own server. -## Overview +*This is the official, community-managed fork of @erming's great initiative, the [Shout](https://github.com/erming/shout) project.* -- **Modern features brought to IRC.** Push notifications, link previews, new message markers, and more bring IRC to the 21st century. -- **Always connected.** Remains connected to IRC servers while you are offline. -- **Cross platform.** It doesn't matter what OS you use, it just works wherever Node.js runs. -- **Responsive interface.** The client works smoothly on every desktop, smartphone and tablet. -- **Synchronized experience.** Always resume where you left off no matter what device. +__What features does it have?__ -To learn more about configuration, usage and features of The Lounge, take a look at [the website](https://thelounge.chat). +- Multiple user support +- Stays connected even when you close the browser +- Connect from multiple devices at once +- Responsive layout — works well on your smartphone +- _.. and more!_ -The Lounge is the official and community-managed fork of [Shout](https://github.com/erming/shout), by [Mattias Erming](https://github.com/erming). +__Why the fork?__ -## Installation and usage +We felt that the original [Shout](https://github.com/erming/shout) project +"stagnated" a little because its original author wanted it to remain his pet +project (which is a perfectly fine thing!). -The Lounge requires latest [Node.js](https://nodejs.org/) LTS version or more recent. -The [Yarn package manager](https://yarnpkg.com/) is also recommended. -If you want to install with npm, `--unsafe-perm` is required for a correct install. +A bunch of people, excited about doing things a bit differently than the upstream +project forked it under a new name: “The Lounge”. -### Running stable releases +This fork aims to be community managed, meaning that the decisions are taken +in a collegial fashion, and that a bunch of maintainers should be able to make +the review process quicker and more streamlined. -Please refer to the [install and upgrade documentation on our website](https://thelounge.chat/docs/install-and-upgrade) for all available installation methods. +## Install -### Running from source +To use The Lounge you must have [Node.js](https://nodejs.org/en/download/) installed. +The oldest Node.js version we support is 4.2.0. -The following commands install and run the development version of The Lounge: +If you still use 0.10 or 0.12 we strongly advise you to upgrade before installing The Lounge. +For more information on how to upgrade, read the [documentation](https://nodejs.org/en/download/package-manager/). -```sh -git clone https://github.com/thelounge/thelounge.git -cd thelounge -yarn install -NODE_ENV=production yarn build -yarn start +``` +sudo npm install -g thelounge ``` -When installed like this, `thelounge` executable is not created. Use `node index <command>` to run commands. +## Usage -⚠️ While it is the most recent codebase, this is not production-ready! Run at -your own risk. It is also not recommended to run this as root. +When the install is complete, go ahead and run this in your terminal: + +``` +lounge --help +``` + +For more information, read the [documentation](https://thelounge.github.io/docs/). ## Development setup -Simply follow the instructions to run The Lounge from source above, on your own -fork. +To run the app from source, just clone the code and run this in your terminal: -Before submitting any change, make sure to: +``` +npm install +npm start +``` -- Read the [Contributing instructions](https://github.com/thelounge/thelounge/blob/master/.github/CONTRIBUTING.md#contributing) -- Run `yarn test` to execute linters and the test suite - - Run `yarn format:prettier` if linting fails -- Run `yarn build:client` if you change or add anything in `client/js` or `client/components` - - The built files will be output to `public/` by webpack -- Run `yarn build:server` if you change anything in `server/` - - The built files will be output to `dist/` by tsc -- `yarn dev` can be used to start The Lounge with hot module reloading +You will have to run `npm run build` if you change or add anything in +`client/js/libs` or `client/views`. -To ensure that you don't commit files that fail the linting, you can install a pre-commit git hook. -Execute `yarn githooks-install` to do so. +## License + +Available under the [MIT License](LICENSE). + +Some fonts licensed under [SIL OFL](http://scripts.sil.org/OFL) and the [Apache License](http://www.apache.org/licenses/). diff --git a/SECURITY.md b/SECURITY.md deleted file mode 100644 index 7c292045..00000000 --- a/SECURITY.md +++ /dev/null @@ -1,9 +0,0 @@ -# Responsible Disclosure of Security Vulnerabilities - -- ⚠️ **Do not open public issues on GitHub to report security vulnerabilities.** -- Contact us privately first, in a - [responsible disclosure](https://en.wikipedia.org/wiki/Responsible_disclosure) - manner. -- On IRC, send a private message to any voiced user on our Libera.Chat channel, - `#thelounge`. -- By email, send us your report at <security@thelounge.chat>. diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 00000000..4e0b2fc8 --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,29 @@ +--- +# http://www.appveyor.com/docs/appveyor-yml + +# Build version format +version: "{build}" + +# Do not build on tags (GitHub only) +skip_tags: true + +environment: + nodejs_version: '4' + +install: + - ps: Install-Product node $env:nodejs_version + - npm install + - npm install mocha-appveyor-reporter + - echo --reporter mocha-appveyor-reporter >> test/mocha.opts + +test_script: + - node --version + - npm --version + - npm test + +# cache npm modules +cache: + - node_modules + +# Don't actually build +build: off diff --git a/babel.config.cjs b/babel.config.cjs deleted file mode 100644 index 8554cbc5..00000000 --- a/babel.config.cjs +++ /dev/null @@ -1,4 +0,0 @@ -module.exports = { - presets: [["@babel/preset-env", {bugfixes: true}], "babel-preset-typescript-vue3"], - plugins: ["@babel/plugin-transform-runtime"], -}; diff --git a/client/audio/pop.ogg b/client/audio/pop.ogg new file mode 100644 index 00000000..1fe623f5 Binary files /dev/null and b/client/audio/pop.ogg differ diff --git a/client/audio/pop.wav b/client/audio/pop.wav deleted file mode 100644 index 07111c7e..00000000 Binary files a/client/audio/pop.wav and /dev/null differ diff --git a/client/components/App.vue b/client/components/App.vue deleted file mode 100644 index 9ae4190f..00000000 --- a/client/components/App.vue +++ /dev/null @@ -1,195 +0,0 @@ -<template> - <div id="viewport" :class="viewportClasses" role="tablist"> - <Sidebar v-if="store.state.appLoaded" :overlay="overlay" /> - <div - id="sidebar-overlay" - ref="overlay" - aria-hidden="true" - @click="store.commit('sidebarOpen', false)" - /> - <router-view ref="loungeWindow"></router-view> - <Mentions /> - <ImageViewer ref="imageViewer" /> - <ContextMenu ref="contextMenu" /> - <ConfirmDialog ref="confirmDialog" /> - <div id="upload-overlay"></div> - </div> -</template> - -<script lang="ts"> -import constants from "../js/constants"; -import eventbus from "../js/eventbus"; -import Mousetrap, {ExtendedKeyboardEvent} from "mousetrap"; -import throttle from "lodash/throttle"; -import storage from "../js/localStorage"; -import isIgnoredKeybind from "../js/helpers/isIgnoredKeybind"; - -import Sidebar from "./Sidebar.vue"; -import ImageViewer from "./ImageViewer.vue"; -import ContextMenu from "./ContextMenu.vue"; -import ConfirmDialog from "./ConfirmDialog.vue"; -import Mentions from "./Mentions.vue"; -import { - computed, - provide, - defineComponent, - onBeforeUnmount, - onMounted, - ref, - Ref, - InjectionKey, -} from "vue"; -import {useStore} from "../js/store"; -import type {DebouncedFunc} from "lodash"; - -export const imageViewerKey = Symbol() as InjectionKey<Ref<typeof ImageViewer | null>>; -const contextMenuKey = Symbol() as InjectionKey<Ref<typeof ContextMenu | null>>; -const confirmDialogKey = Symbol() as InjectionKey<Ref<typeof ConfirmDialog | null>>; - -export default defineComponent({ - name: "App", - components: { - Sidebar, - ImageViewer, - ContextMenu, - ConfirmDialog, - Mentions, - }, - setup() { - const store = useStore(); - const overlay = ref(null); - const loungeWindow = ref(null); - const imageViewer = ref(null); - const contextMenu = ref(null); - const confirmDialog = ref(null); - - provide(imageViewerKey, imageViewer); - provide(contextMenuKey, contextMenu); - provide(confirmDialogKey, confirmDialog); - - const viewportClasses = computed(() => { - return { - notified: store.getters.highlightCount > 0, - "menu-open": store.state.appLoaded && store.state.sidebarOpen, - "menu-dragging": store.state.sidebarDragging, - "userlist-open": store.state.userlistOpen, - }; - }); - - const debouncedResize = ref<DebouncedFunc<() => void>>(); - const dayChangeTimeout = ref<any>(); - - const escapeKey = () => { - eventbus.emit("escapekey"); - }; - - const toggleSidebar = (e: ExtendedKeyboardEvent) => { - if (isIgnoredKeybind(e)) { - return true; - } - - store.commit("toggleSidebar"); - - return false; - }; - - const toggleUserList = (e: ExtendedKeyboardEvent) => { - if (isIgnoredKeybind(e)) { - return true; - } - - store.commit("toggleUserlist"); - - return false; - }; - - const toggleMentions = () => { - if (store.state.networks.length !== 0) { - eventbus.emit("mentions:toggle"); - } - }; - - const msUntilNextDay = () => { - // Compute how many milliseconds are remaining until the next day starts - const today = new Date(); - const tommorow = new Date( - today.getFullYear(), - today.getMonth(), - today.getDate() + 1 - ).getTime(); - - return tommorow - today.getTime(); - }; - - const prepareOpenStates = () => { - const viewportWidth = window.innerWidth; - let isUserlistOpen = storage.get("thelounge.state.userlist"); - - if (viewportWidth > constants.mobileViewportPixels) { - store.commit("sidebarOpen", storage.get("thelounge.state.sidebar") !== "false"); - } - - // If The Lounge is opened on a small screen (less than 1024px), and we don't have stored - // user list state, close it by default - if (viewportWidth >= 1024 && isUserlistOpen !== "true" && isUserlistOpen !== "false") { - isUserlistOpen = "true"; - } - - store.commit("userlistOpen", isUserlistOpen === "true"); - }; - - prepareOpenStates(); - - onMounted(() => { - Mousetrap.bind("esc", escapeKey); - Mousetrap.bind("alt+u", toggleUserList); - Mousetrap.bind("alt+s", toggleSidebar); - Mousetrap.bind("alt+m", toggleMentions); - - debouncedResize.value = throttle(() => { - eventbus.emit("resize"); - }, 100); - - window.addEventListener("resize", debouncedResize.value, {passive: true}); - - // Emit a daychange event every time the day changes so date markers know when to update themselves - const emitDayChange = () => { - eventbus.emit("daychange"); - // This should always be 24h later but re-computing exact value just in case - dayChangeTimeout.value = setTimeout(emitDayChange, msUntilNextDay()); - }; - - dayChangeTimeout.value = setTimeout(emitDayChange, msUntilNextDay()); - }); - - onBeforeUnmount(() => { - Mousetrap.unbind("esc"); - Mousetrap.unbind("alt+u"); - Mousetrap.unbind("alt+s"); - Mousetrap.unbind("alt+m"); - - if (debouncedResize.value) { - window.removeEventListener("resize", debouncedResize.value); - } - - if (dayChangeTimeout.value) { - clearTimeout(dayChangeTimeout.value); - } - }); - - return { - viewportClasses, - escapeKey, - toggleSidebar, - toggleUserList, - toggleMentions, - store, - overlay, - loungeWindow, - imageViewer, - contextMenu, - confirmDialog, - }; - }, -}); -</script> diff --git a/client/components/Channel.vue b/client/components/Channel.vue deleted file mode 100644 index c21e55d2..00000000 --- a/client/components/Channel.vue +++ /dev/null @@ -1,65 +0,0 @@ -<template> - <!-- TODO: investigate --> - <ChannelWrapper ref="wrapper" v-bind="$props"> - <span class="name">{{ channel.name }}</span> - <span - v-if="channel.unread" - :class="{highlight: channel.highlight && !channel.muted}" - class="badge" - >{{ unreadCount }}</span - > - <template v-if="channel.type === 'channel'"> - <span - v-if="channel.state === 0" - class="parted-channel-tooltip tooltipped tooltipped-w" - aria-label="Not currently joined" - > - <span class="parted-channel-icon" /> - </span> - <span class="close-tooltip tooltipped tooltipped-w" aria-label="Leave"> - <button class="close" aria-label="Leave" @click.stop="close" /> - </span> - </template> - <template v-else> - <span class="close-tooltip tooltipped tooltipped-w" aria-label="Close"> - <button class="close" aria-label="Close" @click.stop="close" /> - </span> - </template> - </ChannelWrapper> -</template> - -<script lang="ts"> -import {PropType, defineComponent, computed} from "vue"; -import roundBadgeNumber from "../js/helpers/roundBadgeNumber"; -import useCloseChannel from "../js/hooks/use-close-channel"; -import {ClientChan, ClientNetwork} from "../js/types"; -import ChannelWrapper from "./ChannelWrapper.vue"; - -export default defineComponent({ - name: "Channel", - components: { - ChannelWrapper, - }, - props: { - network: { - type: Object as PropType<ClientNetwork>, - required: true, - }, - channel: { - type: Object as PropType<ClientChan>, - required: true, - }, - active: Boolean, - isFiltering: Boolean, - }, - setup(props) { - const unreadCount = computed(() => roundBadgeNumber(props.channel.unread)); - const close = useCloseChannel(props.channel); - - return { - unreadCount, - close, - }; - }, -}); -</script> diff --git a/client/components/ChannelWrapper.vue b/client/components/ChannelWrapper.vue deleted file mode 100644 index 380b52af..00000000 --- a/client/components/ChannelWrapper.vue +++ /dev/null @@ -1,112 +0,0 @@ -<template> - <!-- TODO: move closed style to it's own class --> - <div - v-if="isChannelVisible" - ref="element" - :class="[ - 'channel-list-item', - {active: active}, - {'parted-channel': channel.type === 'channel' && channel.state === 0}, - {'has-draft': channel.pendingMessage}, - {'has-unread': channel.unread}, - {'has-highlight': channel.highlight}, - { - 'not-secure': - channel.type === 'lobby' && network.status.connected && !network.status.secure, - }, - {'not-connected': channel.type === 'lobby' && !network.status.connected}, - {'is-muted': channel.muted}, - ]" - :aria-label="getAriaLabel()" - :title="getAriaLabel()" - :data-name="channel.name" - :data-type="channel.type" - :aria-controls="'#chan-' + channel.id" - :aria-selected="active" - :style="channel.closed ? {transition: 'none', opacity: 0.4} : undefined" - role="tab" - @click="click" - @contextmenu.prevent="openContextMenu" - > - <slot :network="network" :channel="channel" :active-channel="activeChannel" /> - </div> -</template> - -<script lang="ts"> -import eventbus from "../js/eventbus"; -import isChannelCollapsed from "../js/helpers/isChannelCollapsed"; -import {ClientNetwork, ClientChan} from "../js/types"; -import {computed, defineComponent, PropType} from "vue"; -import {useStore} from "../js/store"; -import {switchToChannel} from "../js/router"; - -export default defineComponent({ - name: "ChannelWrapper", - props: { - network: { - type: Object as PropType<ClientNetwork>, - required: true, - }, - channel: { - type: Object as PropType<ClientChan>, - required: true, - }, - active: Boolean, - isFiltering: Boolean, - }, - setup(props) { - const store = useStore(); - const activeChannel = computed(() => store.state.activeChannel); - const isChannelVisible = computed( - () => props.isFiltering || !isChannelCollapsed(props.network, props.channel) - ); - - const getAriaLabel = () => { - const extra: string[] = []; - const type = props.channel.type; - - if (props.channel.unread > 0) { - if (props.channel.unread > 1) { - extra.push(`${props.channel.unread} unread messages`); - } else { - extra.push(`${props.channel.unread} unread message`); - } - } - - if (props.channel.highlight > 0) { - if (props.channel.highlight > 1) { - extra.push(`${props.channel.highlight} mentions`); - } else { - extra.push(`${props.channel.highlight} mention`); - } - } - - return `${type}: ${props.channel.name} ${extra.length ? `(${extra.join(", ")})` : ""}`; - }; - - const click = () => { - if (props.isFiltering) { - return; - } - - switchToChannel(props.channel); - }; - - const openContextMenu = (event: MouseEvent) => { - eventbus.emit("contextmenu:channel", { - event: event, - channel: props.channel, - network: props.network, - }); - }; - - return { - activeChannel, - isChannelVisible, - getAriaLabel, - click, - openContextMenu, - }; - }, -}); -</script> diff --git a/client/components/Chat.vue b/client/components/Chat.vue deleted file mode 100644 index b1447ed6..00000000 --- a/client/components/Chat.vue +++ /dev/null @@ -1,274 +0,0 @@ -<template> - <div id="chat-container" class="window" :data-current-channel="channel.name" lang=""> - <div - id="chat" - :class="{ - 'hide-motd': !store.state.settings.motd, - 'time-seconds': store.state.settings.showSeconds, - 'time-12h': store.state.settings.use12hClock, - 'colored-nicks': true, // TODO temporarily fixes themes, to be removed in next major version - }" - > - <div - :id="'chan-' + channel.id" - class="chat-view" - :data-type="channel.type" - :aria-label="channel.name" - role="tabpanel" - > - <div class="header"> - <SidebarToggle /> - <span class="title" :aria-label="'Currently open ' + channel.type">{{ - channel.name - }}</span> - <div v-if="channel.editTopic === true" class="topic-container"> - <input - ref="topicInput" - :value="channel.topic" - class="topic-input" - placeholder="Set channel topic" - enterkeyhint="done" - @keyup.enter="saveTopic" - @keyup.esc="channel.editTopic = false" - /> - <span aria-label="Save topic" class="save-topic" @click="saveTopic"> - <span type="button" aria-label="Save topic"></span> - </span> - </div> - <span - v-else - :title="channel.topic" - :class="{topic: true, empty: !channel.topic}" - @dblclick="editTopic" - ><ParsedMessage - v-if="channel.topic" - :network="network" - :text="channel.topic" - /></span> - <MessageSearchForm - v-if=" - store.state.settings.searchEnabled && - ['channel', 'query'].includes(channel.type) - " - :network="network" - :channel="channel" - /> - <button - class="mentions" - aria-label="Open your mentions" - @click="openMentions" - /> - <button - class="menu" - aria-label="Open the context menu" - @click="openContextMenu" - /> - <span - v-if="channel.type === 'channel'" - class="rt-tooltip tooltipped tooltipped-w" - aria-label="Toggle user list" - > - <button - class="rt" - aria-label="Toggle user list" - @click="store.commit('toggleUserlist')" - /> - </span> - </div> - <div v-if="channel.type === 'special'" class="chat-content"> - <div class="chat"> - <div class="messages"> - <div class="msg"> - <component - :is="specialComponent" - :network="network" - :channel="channel" - /> - </div> - </div> - </div> - </div> - <div v-else class="chat-content"> - <div - :class="[ - 'scroll-down tooltipped tooltipped-w tooltipped-no-touch', - {'scroll-down-shown': !channel.scrolledToBottom}, - ]" - aria-label="Jump to recent messages" - @click="messageList?.jumpToBottom()" - > - <div class="scroll-down-arrow" /> - </div> - <ChatUserList v-if="channel.type === 'channel'" :channel="channel" /> - <MessageList - ref="messageList" - :network="network" - :channel="channel" - :focused="focused" - /> - </div> - </div> - </div> - <div - v-if="store.state.currentUserVisibleError" - id="user-visible-error" - @click="hideUserVisibleError" - > - {{ store.state.currentUserVisibleError }} - </div> - <ChatInput :network="network" :channel="channel" /> - </div> -</template> - -<script lang="ts"> -import socket from "../js/socket"; -import eventbus from "../js/eventbus"; -import ParsedMessage from "./ParsedMessage.vue"; -import MessageList from "./MessageList.vue"; -import ChatInput from "./ChatInput.vue"; -import ChatUserList from "./ChatUserList.vue"; -import SidebarToggle from "./SidebarToggle.vue"; -import MessageSearchForm from "./MessageSearchForm.vue"; -import ListBans from "./Special/ListBans.vue"; -import ListInvites from "./Special/ListInvites.vue"; -import ListChannels from "./Special/ListChannels.vue"; -import ListIgnored from "./Special/ListIgnored.vue"; -import {defineComponent, PropType, ref, computed, watch, nextTick, onMounted, Component} from "vue"; -import type {ClientNetwork, ClientChan} from "../js/types"; -import {useStore} from "../js/store"; -import {SpecialChanType, ChanType} from "../../shared/types/chan"; - -export default defineComponent({ - name: "Chat", - components: { - ParsedMessage, - MessageList, - ChatInput, - ChatUserList, - SidebarToggle, - MessageSearchForm, - }, - props: { - network: {type: Object as PropType<ClientNetwork>, required: true}, - channel: {type: Object as PropType<ClientChan>, required: true}, - focused: Number, - }, - emits: ["channel-changed"], - setup(props, {emit}) { - const store = useStore(); - - const messageList = ref<typeof MessageList>(); - const topicInput = ref<HTMLInputElement | null>(null); - - const specialComponent = computed(() => { - switch (props.channel.special) { - case SpecialChanType.BANLIST: - return ListBans as Component; - case SpecialChanType.INVITELIST: - return ListInvites as Component; - case SpecialChanType.CHANNELLIST: - return ListChannels as Component; - case SpecialChanType.IGNORELIST: - return ListIgnored as Component; - } - - return undefined; - }); - - const channelChanged = () => { - // Triggered when active channel is set or changed - emit("channel-changed", props.channel); - - socket.emit("open", props.channel.id); - - if (props.channel.usersOutdated) { - props.channel.usersOutdated = false; - - socket.emit("names", { - target: props.channel.id, - }); - } - }; - - const hideUserVisibleError = () => { - store.commit("currentUserVisibleError", null); - }; - - const editTopic = () => { - if (props.channel.type === ChanType.CHANNEL) { - props.channel.editTopic = true; - } - }; - - const saveTopic = () => { - props.channel.editTopic = false; - - if (!topicInput.value) { - return; - } - - const newTopic = topicInput.value.value; - - if (props.channel.topic !== newTopic) { - const target = props.channel.id; - const text = `/topic ${newTopic}`; - socket.emit("input", {target, text}); - } - }; - - const openContextMenu = (event: any) => { - eventbus.emit("contextmenu:channel", { - event: event, - channel: props.channel, - network: props.network, - }); - }; - - const openMentions = (event: any) => { - eventbus.emit("mentions:toggle", { - event: event, - }); - }; - - watch( - () => props.channel, - () => { - channelChanged(); - } - ); - - watch( - () => props.channel.editTopic, - (newTopic) => { - if (newTopic) { - void nextTick(() => { - topicInput.value?.focus(); - }); - } - } - ); - - onMounted(() => { - channelChanged(); - - if (props.channel.editTopic) { - void nextTick(() => { - topicInput.value?.focus(); - }); - } - }); - - return { - store, - messageList, - topicInput, - specialComponent, - hideUserVisibleError, - editTopic, - saveTopic, - openContextMenu, - openMentions, - }; - }, -}); -</script> diff --git a/client/components/ChatInput.vue b/client/components/ChatInput.vue deleted file mode 100644 index 8cc2f8ed..00000000 --- a/client/components/ChatInput.vue +++ /dev/null @@ -1,358 +0,0 @@ -<template> - <form id="form" method="post" action="" @submit.prevent="onSubmit"> - <span id="upload-progressbar" /> - <span id="nick">{{ network.nick }}</span> - <textarea - id="input" - ref="input" - dir="auto" - class="mousetrap" - enterkeyhint="send" - :value="channel.pendingMessage" - :placeholder="getInputPlaceholder(channel)" - :aria-label="getInputPlaceholder(channel)" - @input="setPendingMessage" - @keypress.enter.exact.prevent="onSubmit" - @blur="onBlur" - /> - <span - v-if="store.state.serverConfiguration?.fileUpload" - id="upload-tooltip" - class="tooltipped tooltipped-w tooltipped-no-touch" - aria-label="Upload file" - @click="openFileUpload" - > - <input - id="upload-input" - ref="uploadInput" - type="file" - aria-labelledby="upload" - multiple - @change="onUploadInputChange" - /> - <button - id="upload" - type="button" - aria-label="Upload file" - :disabled="!store.state.isConnected" - /> - </span> - <span - id="submit-tooltip" - class="tooltipped tooltipped-w tooltipped-no-touch" - aria-label="Send message" - > - <button - id="submit" - type="submit" - aria-label="Send message" - :disabled="!store.state.isConnected" - /> - </span> - </form> -</template> - -<script lang="ts"> -import Mousetrap from "mousetrap"; -import {wrapCursor} from "undate"; -import autocompletion from "../js/autocompletion"; -import {commands} from "../js/commands/index"; -import socket from "../js/socket"; -import upload from "../js/upload"; -import eventbus from "../js/eventbus"; -import {watch, defineComponent, nextTick, onMounted, PropType, ref, onUnmounted} from "vue"; -import type {ClientNetwork, ClientChan} from "../js/types"; -import {useStore} from "../js/store"; -import {ChanType} from "../../shared/types/chan"; - -const formattingHotkeys = { - "mod+k": "\x03", - "mod+b": "\x02", - "mod+u": "\x1F", - "mod+i": "\x1D", - "mod+o": "\x0F", - "mod+s": "\x1e", - "mod+m": "\x11", -}; - -// Autocomplete bracket and quote characters like in a modern IDE -// For example, select `text`, press `[` key, and it becomes `[text]` -const bracketWraps = { - '"': '"', - "'": "'", - "(": ")", - "<": ">", - "[": "]", - "{": "}", - "*": "*", - "`": "`", - "~": "~", - _: "_", -}; - -export default defineComponent({ - name: "ChatInput", - props: { - network: {type: Object as PropType<ClientNetwork>, required: true}, - channel: {type: Object as PropType<ClientChan>, required: true}, - }, - setup(props) { - const store = useStore(); - const input = ref<HTMLTextAreaElement>(); - const uploadInput = ref<HTMLInputElement>(); - const autocompletionRef = ref<ReturnType<typeof autocompletion>>(); - - const setInputSize = () => { - void nextTick(() => { - if (!input.value) { - return; - } - - const style = window.getComputedStyle(input.value); - const lineHeight = parseFloat(style.lineHeight) || 1; - - // Start by resetting height before computing as scrollHeight does not - // decrease when deleting characters - input.value.style.height = ""; - - // Use scrollHeight to calculate how many lines there are in input, and ceil the value - // because some browsers tend to incorrently round the values when using high density - // displays or using page zoom feature - input.value.style.height = `${ - Math.ceil(input.value.scrollHeight / lineHeight) * lineHeight - }px`; - }); - }; - - const setPendingMessage = (e: Event) => { - props.channel.pendingMessage = (e.target as HTMLInputElement).value; - props.channel.inputHistoryPosition = 0; - setInputSize(); - }; - - const getInputPlaceholder = (channel: ClientChan) => { - if (channel.type === ChanType.CHANNEL || channel.type === ChanType.QUERY) { - return `Write to ${channel.name}`; - } - - return ""; - }; - - const onSubmit = () => { - if (!input.value) { - return; - } - - // Triggering click event opens the virtual keyboard on mobile - // This can only be called from another interactive event (e.g. button click) - input.value.click(); - input.value.focus(); - - if (!store.state.isConnected) { - return false; - } - - const target = props.channel.id; - const text = props.channel.pendingMessage; - - if (text.length === 0) { - return false; - } - - if (autocompletionRef.value) { - autocompletionRef.value.hide(); - } - - props.channel.inputHistoryPosition = 0; - props.channel.pendingMessage = ""; - input.value.value = ""; - setInputSize(); - - // Store new message in history if last message isn't already equal - if (props.channel.inputHistory[1] !== text) { - props.channel.inputHistory.splice(1, 0, text); - } - - // Limit input history to a 100 entries - if (props.channel.inputHistory.length > 100) { - props.channel.inputHistory.pop(); - } - - if (text[0] === "/") { - const args = text.substring(1).split(" "); - const cmd = args.shift()?.toLowerCase(); - - if (!cmd) { - return false; - } - - if (Object.prototype.hasOwnProperty.call(commands, cmd) && commands[cmd](args)) { - return false; - } - } - - socket.emit("input", {target, text}); - }; - - const onUploadInputChange = () => { - if (!uploadInput.value || !uploadInput.value.files) { - return; - } - - const files = Array.from(uploadInput.value.files); - upload.triggerUpload(files); - uploadInput.value.value = ""; // Reset <input> element so you can upload the same file - }; - - const openFileUpload = () => { - uploadInput.value?.click(); - }; - - const blurInput = () => { - input.value?.blur(); - }; - - const onBlur = () => { - if (autocompletionRef.value) { - autocompletionRef.value.hide(); - } - }; - - watch( - () => props.channel.id, - () => { - if (autocompletionRef.value) { - autocompletionRef.value.hide(); - } - } - ); - - watch( - () => props.channel.pendingMessage, - () => { - setInputSize(); - } - ); - - onMounted(() => { - eventbus.on("escapekey", blurInput); - - if (store.state.settings.autocomplete) { - if (!input.value) { - throw new Error("ChatInput autocomplete: input element is not available"); - } - - autocompletionRef.value = autocompletion(input.value); - } - - const inputTrap = Mousetrap(input.value); - - inputTrap.bind(Object.keys(formattingHotkeys), function (e, key) { - const modifier = formattingHotkeys[key]; - - if (!e.target) { - return; - } - - wrapCursor( - e.target as HTMLTextAreaElement, - modifier, - (e.target as HTMLTextAreaElement).selectionStart === - (e.target as HTMLTextAreaElement).selectionEnd - ? "" - : modifier - ); - - return false; - }); - - inputTrap.bind(Object.keys(bracketWraps), function (e, key) { - if ( - (e.target as HTMLTextAreaElement)?.selectionStart !== - (e.target as HTMLTextAreaElement).selectionEnd - ) { - wrapCursor(e.target as HTMLTextAreaElement, key, bracketWraps[key]); - - return false; - } - }); - - inputTrap.bind(["up", "down"], (e, key) => { - if ( - store.state.isAutoCompleting || - (e.target as HTMLTextAreaElement).selectionStart !== - (e.target as HTMLTextAreaElement).selectionEnd || - !input.value - ) { - return; - } - - const onRow = ( - input.value.value.slice(undefined, input.value.selectionStart).match(/\n/g) || - [] - ).length; - const totalRows = (input.value.value.match(/\n/g) || []).length; - - const {channel} = props; - - if (channel.inputHistoryPosition === 0) { - channel.inputHistory[channel.inputHistoryPosition] = channel.pendingMessage; - } - - if (key === "up" && onRow === 0) { - if (channel.inputHistoryPosition < channel.inputHistory.length - 1) { - channel.inputHistoryPosition++; - } else { - return; - } - } else if ( - key === "down" && - channel.inputHistoryPosition > 0 && - onRow === totalRows - ) { - channel.inputHistoryPosition--; - } else { - return; - } - - channel.pendingMessage = channel.inputHistory[channel.inputHistoryPosition]; - input.value.value = channel.pendingMessage; - setInputSize(); - - return false; - }); - - if (store.state.serverConfiguration?.fileUpload) { - upload.mounted(); - } - }); - - onUnmounted(() => { - eventbus.off("escapekey", blurInput); - - if (autocompletionRef.value) { - autocompletionRef.value.destroy(); - autocompletionRef.value = undefined; - } - - upload.unmounted(); - upload.abort(); - }); - - return { - store, - input, - uploadInput, - onUploadInputChange, - openFileUpload, - blurInput, - onBlur, - setInputSize, - upload, - getInputPlaceholder, - onSubmit, - setPendingMessage, - }; - }, -}); -</script> diff --git a/client/components/ChatUserList.vue b/client/components/ChatUserList.vue deleted file mode 100644 index ffd5fb39..00000000 --- a/client/components/ChatUserList.vue +++ /dev/null @@ -1,255 +0,0 @@ -<template> - <aside - ref="userlist" - class="userlist" - :aria-label="'User list for ' + channel.name" - @mouseleave="removeHoverUser" - > - <div class="count"> - <input - ref="input" - :value="userSearchInput" - :placeholder=" - channel.users.length + ' user' + (channel.users.length === 1 ? '' : 's') - " - type="search" - class="search" - aria-label="Search among the user list" - tabindex="-1" - @input="setUserSearchInput" - @keydown.up="navigateUserList($event, -1)" - @keydown.down="navigateUserList($event, 1)" - @keydown.page-up="navigateUserList($event, -10)" - @keydown.page-down="navigateUserList($event, 10)" - @keydown.enter="selectUser" - /> - </div> - <div class="names"> - <div - v-for="(users, mode) in groupedUsers" - :key="mode" - :class="['user-mode', getModeClass(String(mode))]" - > - <template v-if="userSearchInput.length > 0"> - <!-- eslint-disable vue/no-v-text-v-html-on-component --> - <Username - v-for="user in users" - :key="user.original.nick + '-search'" - :on-hover="hoverUser" - :active="user.original === activeUser" - :user="user.original" - v-html="user.string" - /> - <!-- eslint-enable --> - </template> - <template v-else> - <Username - v-for="user in users" - :key="user.nick" - :on-hover="hoverUser" - :active="user === activeUser" - :user="user" - /> - </template> - </div> - </div> - </aside> -</template> - -<script lang="ts"> -import {filter as fuzzyFilter} from "fuzzy"; -import {computed, defineComponent, nextTick, PropType, ref} from "vue"; -import type {UserInMessage} from "../../shared/types/msg"; -import type {ClientChan, ClientUser} from "../js/types"; -import Username from "./Username.vue"; - -const modes = { - "~": "owner", - "&": "admin", - "!": "admin", - "@": "op", - "%": "half-op", - "+": "voice", - "": "normal", -}; - -export default defineComponent({ - name: "ChatUserList", - components: { - Username, - }, - props: { - channel: {type: Object as PropType<ClientChan>, required: true}, - }, - setup(props) { - const userSearchInput = ref(""); - const activeUser = ref<UserInMessage | null>(); - const userlist = ref<HTMLDivElement>(); - const filteredUsers = computed(() => { - if (!userSearchInput.value) { - return; - } - - return fuzzyFilter(userSearchInput.value, props.channel.users, { - pre: "<b>", - post: "</b>", - extract: (u) => u.nick, - }); - }); - - const groupedUsers = computed(() => { - const groups = {}; - - if (userSearchInput.value && filteredUsers.value) { - const result = filteredUsers.value; - - for (const user of result) { - const mode: string = user.original.modes[0] || ""; - - if (!groups[mode]) { - groups[mode] = []; - } - - // Prepend user mode to search result - user.string = mode + user.string; - - groups[mode].push(user); - } - } else { - for (const user of props.channel.users) { - const mode = user.modes[0] || ""; - - if (!groups[mode]) { - groups[mode] = [user]; - } else { - groups[mode].push(user); - } - } - } - - return groups as { - [mode: string]: (ClientUser & { - original: UserInMessage; - string: string; - })[]; - }; - }); - - const setUserSearchInput = (e: Event) => { - userSearchInput.value = (e.target as HTMLInputElement).value; - }; - - const getModeClass = (mode: string) => { - return modes[mode] as typeof modes; - }; - - const selectUser = () => { - // Simulate a click on the active user to open the context menu. - // Coordinates are provided to position the menu correctly. - if (!activeUser.value || !userlist.value) { - return; - } - - const el = userlist.value.querySelector(".active"); - - if (!el) { - return; - } - - const rect = el.getBoundingClientRect(); - const ev = new MouseEvent("click", { - view: window, - bubbles: true, - cancelable: true, - clientX: rect.left, - clientY: rect.top + rect.height, - }); - el.dispatchEvent(ev); - }; - - const hoverUser = (user: UserInMessage) => { - activeUser.value = user; - }; - - const removeHoverUser = () => { - activeUser.value = null; - }; - - const scrollToActiveUser = () => { - // Scroll the list if needed after the active class is applied - void nextTick(() => { - const el = userlist.value?.querySelector(".active"); - el?.scrollIntoView({block: "nearest", inline: "nearest"}); - }); - }; - - const navigateUserList = (event: Event, direction: number) => { - // Prevent propagation to stop global keybind handler from capturing pagedown/pageup - // and redirecting it to the message list container for scrolling - event.stopImmediatePropagation(); - event.preventDefault(); - - let users = props.channel.users; - - // Only using filteredUsers when we have to avoids filtering when it's not needed - if (userSearchInput.value && filteredUsers.value) { - users = filteredUsers.value.map((result) => result.original); - } - - // Bail out if there's no users to select - if (!users.length) { - activeUser.value = null; - return; - } - - const abort = () => { - activeUser.value = direction ? users[0] : users[users.length - 1]; - scrollToActiveUser(); - }; - - // If there's no active user select the first or last one depending on direction - if (!activeUser.value) { - abort(); - return; - } - - let currentIndex = users.indexOf(activeUser.value as ClientUser); - - if (currentIndex === -1) { - abort(); - return; - } - - currentIndex += direction; - - // Wrap around the list if necessary. Normaly each loop iterates once at most, - // but might iterate more often if pgup or pgdown are used in a very short user list - while (currentIndex < 0) { - currentIndex += users.length; - } - - while (currentIndex > users.length - 1) { - currentIndex -= users.length; - } - - activeUser.value = users[currentIndex]; - scrollToActiveUser(); - }; - - return { - filteredUsers, - groupedUsers, - userSearchInput, - activeUser, - userlist, - - setUserSearchInput, - getModeClass, - selectUser, - hoverUser, - removeHoverUser, - navigateUserList, - }; - }, -}); -</script> diff --git a/client/components/ConfirmDialog.vue b/client/components/ConfirmDialog.vue deleted file mode 100644 index 17691cad..00000000 --- a/client/components/ConfirmDialog.vue +++ /dev/null @@ -1,102 +0,0 @@ -<template> - <div id="confirm-dialog-overlay" :class="{opened: !!data}"> - <div v-if="data !== null" id="confirm-dialog"> - <div class="confirm-text"> - <div class="confirm-text-title">{{ data?.title }}</div> - <p>{{ data?.text }}</p> - </div> - <div class="confirm-buttons"> - <button class="btn btn-cancel" @click="close(false)">Cancel</button> - <button class="btn btn-danger" @click="close(true)">{{ data?.button }}</button> - </div> - </div> - </div> -</template> - -<style> -#confirm-dialog { - background: var(--body-bg-color); - color: #fff; - margin: 10px; - border-radius: 5px; - max-width: 500px; -} - -#confirm-dialog .confirm-text { - padding: 15px; - user-select: text; -} - -#confirm-dialog .confirm-text-title { - font-size: 20px; - font-weight: 700; - margin-bottom: 10px; -} - -#confirm-dialog .confirm-buttons { - display: flex; - justify-content: flex-end; - padding: 15px; - background: rgba(0, 0, 0, 0.3); -} - -#confirm-dialog .confirm-buttons .btn { - margin-bottom: 0; - margin-left: 10px; -} - -#confirm-dialog .confirm-buttons .btn-cancel { - border-color: transparent; -} -</style> - -<script lang="ts"> -import eventbus from "../js/eventbus"; -import {defineComponent, onMounted, onUnmounted, ref} from "vue"; - -type ConfirmDialogData = { - title: string; - text: string; - button: string; -}; - -type ConfirmDialogCallback = { - (confirmed: boolean): void; -}; - -export default defineComponent({ - name: "ConfirmDialog", - setup() { - const data = ref<ConfirmDialogData>(); - const callback = ref<ConfirmDialogCallback>(); - - const open = (incoming: ConfirmDialogData, cb: ConfirmDialogCallback) => { - data.value = incoming; - callback.value = cb; - }; - - const close = (result: boolean) => { - data.value = undefined; - - if (callback.value) { - callback.value(!!result); - } - }; - - onMounted(() => { - eventbus.on("escapekey", close); - eventbus.on("confirm-dialog", open); - }); - - onUnmounted(() => { - eventbus.off("escapekey", close); - eventbus.off("confirm-dialog", open); - }); - - return { - data, - close, - }; - }, -}); -</script> diff --git a/client/components/ContextMenu.vue b/client/components/ContextMenu.vue deleted file mode 100644 index 6a87fcc6..00000000 --- a/client/components/ContextMenu.vue +++ /dev/null @@ -1,286 +0,0 @@ -<template> - <div - v-if="isOpen" - id="context-menu-container" - :class="{passthrough}" - @click="containerClick" - @contextmenu.prevent="containerClick" - @keydown.exact.up.prevent="navigateMenu(-1)" - @keydown.exact.down.prevent="navigateMenu(1)" - @keydown.exact.tab.prevent="navigateMenu(1)" - @keydown.shift.tab.prevent="navigateMenu(-1)" - > - <ul - id="context-menu" - ref="contextMenu" - role="menu" - :style="{ - top: style.top + 'px', - left: style.left + 'px', - }" - tabindex="-1" - :aria-activedescendant="activeItem > -1 ? `context-menu-item-${activeItem}` : undefined" - @mouseleave="activeItem = -1" - @keydown.enter.prevent="clickActiveItem" - > - <!-- TODO: type --> - <template v-for="(item, id) of (items as any)" :key="item.name"> - <li - :id="`context-menu-item-${id}`" - :class="[ - 'context-menu-' + item.type, - item.class ? 'context-menu-' + item.class : null, - {active: id === activeItem}, - ]" - role="menuitem" - @mouseenter="hoverItem(id)" - @click="clickItem(item)" - > - {{ item.label }} - </li> - </template> - </ul> - </div> -</template> - -<script lang="ts"> -import { - generateUserContextMenu, - generateChannelContextMenu, - generateInlineChannelContextMenu, - ContextMenuItem, -} from "../js/helpers/contextMenu"; -import eventbus from "../js/eventbus"; -import {defineComponent, nextTick, onMounted, onUnmounted, PropType, ref} from "vue"; -import {ClientChan, ClientMessage, ClientNetwork, ClientUser} from "../js/types"; -import {useStore} from "../js/store"; -import {useRouter} from "vue-router"; - -export default defineComponent({ - name: "ContextMenu", - props: { - message: { - required: false, - type: Object as PropType<ClientMessage>, - }, - }, - setup() { - const store = useStore(); - const router = useRouter(); - - const isOpen = ref(false); - const passthrough = ref(false); - - const contextMenu = ref<HTMLUListElement | null>(); - const previousActiveElement = ref<HTMLElement | null>(); - const items = ref<ContextMenuItem[]>([]); - const activeItem = ref(-1); - const style = ref({ - top: 0, - left: 0, - }); - - const close = () => { - if (!isOpen.value) { - return; - } - - isOpen.value = false; - items.value = []; - - if (previousActiveElement.value) { - previousActiveElement.value.focus(); - previousActiveElement.value = null; - } - }; - - const enablePointerEvents = () => { - passthrough.value = false; - document.body.removeEventListener("pointerup", enablePointerEvents); - }; - - const containerClick = (event: MouseEvent) => { - if (event.currentTarget === event.target) { - close(); - } - }; - - const positionContextMenu = (event: MouseEvent) => { - const element = event.target as HTMLElement; - - if (!contextMenu.value) { - return; - } - - const menuWidth = contextMenu.value?.offsetWidth; - const menuHeight = contextMenu.value?.offsetHeight; - - if (element && element.classList.contains("menu")) { - return { - left: element.getBoundingClientRect().left - (menuWidth - element.offsetWidth), - top: element.getBoundingClientRect().top + element.offsetHeight, - }; - } - - const offset = {left: event.pageX, top: event.pageY}; - - if (window.innerWidth - offset.left < menuWidth) { - offset.left = window.innerWidth - menuWidth; - } - - if (window.innerHeight - offset.top < menuHeight) { - offset.top = window.innerHeight - menuHeight; - } - - return offset; - }; - - const hoverItem = (id: number) => { - activeItem.value = id; - }; - - const clickItem = (item: ContextMenuItem) => { - close(); - - if ("action" in item && item.action) { - item.action(); - } else if ("link" in item && item.link) { - router.push(item.link).catch(() => { - // eslint-disable-next-line no-console - console.error("Failed to navigate to", item.link); - }); - } - }; - - const clickActiveItem = () => { - if (items.value[activeItem.value]) { - clickItem(items.value[activeItem.value]); - } - }; - - const open = (event: MouseEvent, newItems: ContextMenuItem[]) => { - event.preventDefault(); - - previousActiveElement.value = document.activeElement as HTMLElement; - items.value = newItems; - activeItem.value = 0; - isOpen.value = true; - - // Position the menu and set the focus on the first item after it's size has updated - nextTick(() => { - const pos = positionContextMenu(event); - - if (!pos) { - return; - } - - style.value.left = pos.left; - style.value.top = pos.top; - contextMenu.value?.focus(); - }).catch((e) => { - // eslint-disable-next-line no-console - console.error(e); - }); - }; - - const openChannelContextMenu = (data: { - event: MouseEvent; - channel: ClientChan; - network: ClientNetwork; - }) => { - if (data.event.type === "contextmenu") { - // Pass through all pointer events to allow the network list's - // dragging events to continue triggering. - passthrough.value = true; - document.body.addEventListener("pointerup", enablePointerEvents, { - passive: true, - }); - } - - const newItems = generateChannelContextMenu(data.channel, data.network); - open(data.event, newItems); - }; - - const openInlineChannelContextMenu = (data: {channel: string; event: MouseEvent}) => { - const {network} = store.state.activeChannel; - const newItems = generateInlineChannelContextMenu(store, data.channel, network); - - open(data.event, newItems); - }; - - const openUserContextMenu = (data: { - user: Pick<ClientUser, "nick" | "modes">; - event: MouseEvent; - }) => { - const {network, channel} = store.state.activeChannel; - - const newItems = generateUserContextMenu( - store, - channel, - network, - channel.users.find((u) => u.nick === data.user.nick) || { - nick: data.user.nick, - modes: [], - } - ); - open(data.event, newItems); - }; - - const navigateMenu = (direction: number) => { - let currentIndex = activeItem.value; - - currentIndex += direction; - - const nextItem = items.value[currentIndex]; - - // If the next item we would select is a divider, skip over it - if (nextItem && "type" in nextItem && nextItem.type === "divider") { - currentIndex += direction; - } - - if (currentIndex < 0) { - currentIndex += items.value.length; - } - - if (currentIndex > items.value.length - 1) { - currentIndex -= items.value.length; - } - - activeItem.value = currentIndex; - }; - - onMounted(() => { - eventbus.on("escapekey", close); - eventbus.on("contextmenu:cancel", close); - eventbus.on("contextmenu:user", openUserContextMenu); - eventbus.on("contextmenu:channel", openChannelContextMenu); - eventbus.on("contextmenu:inline-channel", openInlineChannelContextMenu); - }); - - onUnmounted(() => { - eventbus.off("escapekey", close); - eventbus.off("contextmenu:cancel", close); - eventbus.off("contextmenu:user", openUserContextMenu); - eventbus.off("contextmenu:channel", openChannelContextMenu); - eventbus.off("contextmenu:inline-channel", openInlineChannelContextMenu); - - close(); - }); - - return { - isOpen, - items, - activeItem, - style, - contextMenu, - passthrough, - close, - containerClick, - navigateMenu, - hoverItem, - clickItem, - clickActiveItem, - }; - }, -}); -</script> diff --git a/client/components/DateMarker.vue b/client/components/DateMarker.vue deleted file mode 100644 index 4125465c..00000000 --- a/client/components/DateMarker.vue +++ /dev/null @@ -1,66 +0,0 @@ -<template> - <div :aria-label="localeDate" class="date-marker-container tooltipped tooltipped-s"> - <div class="date-marker"> - <span :aria-label="friendlyDate()" class="date-marker-text" /> - </div> - </div> -</template> - -<script lang="ts"> -import dayjs from "dayjs"; -import calendar from "dayjs/plugin/calendar"; -import {computed, defineComponent, onBeforeUnmount, onMounted, PropType} from "vue"; -import eventbus from "../js/eventbus"; -import type {ClientMessage} from "../js/types"; - -dayjs.extend(calendar); - -export default defineComponent({ - name: "DateMarker", - props: { - message: { - type: Object as PropType<ClientMessage>, - required: true, - }, - focused: Boolean, - }, - setup(props) { - const localeDate = computed(() => dayjs(props.message.time).format("D MMMM YYYY")); - - const hoursPassed = () => { - return (Date.now() - Date.parse(props.message.time.toString())) / 3600000; - }; - - const dayChange = () => { - if (hoursPassed() >= 48) { - eventbus.off("daychange", dayChange); - } - }; - - const friendlyDate = () => { - // See http://momentjs.com/docs/#/displaying/calendar-time/ - return dayjs(props.message.time).calendar(null, { - sameDay: "[Today]", - lastDay: "[Yesterday]", - lastWeek: "D MMMM YYYY", - sameElse: "D MMMM YYYY", - }); - }; - - onMounted(() => { - if (hoursPassed() < 48) { - eventbus.on("daychange", dayChange); - } - }); - - onBeforeUnmount(() => { - eventbus.off("daychange", dayChange); - }); - - return { - localeDate, - friendlyDate, - }; - }, -}); -</script> diff --git a/client/components/Draggable.vue b/client/components/Draggable.vue deleted file mode 100644 index 065662fd..00000000 --- a/client/components/Draggable.vue +++ /dev/null @@ -1,120 +0,0 @@ -<template> - <div ref="containerRef" :class="$props.class"> - <slot - v-for="(item, index) of list" - :key="item[itemKey]" - :element="item" - :index="index" - name="item" - ></slot> - </div> -</template> - -<script lang="ts"> -import {defineComponent, ref, PropType, watch, onUnmounted, onBeforeUnmount} from "vue"; -import Sortable from "sortablejs"; - -const Props = { - delay: { - type: Number, - default: 0, - required: false, - }, - delayOnTouchOnly: { - type: Boolean, - default: false, - required: false, - }, - touchStartThreshold: { - type: Number, - default: 10, - required: false, - }, - handle: { - type: String, - default: "", - required: false, - }, - draggable: { - type: String, - default: "", - required: false, - }, - ghostClass: { - type: String, - default: "", - required: false, - }, - dragClass: { - type: String, - default: "", - required: false, - }, - group: { - type: String, - default: "", - required: false, - }, - class: { - type: String, - default: "", - required: false, - }, - itemKey: { - type: String, - default: "", - required: true, - }, - list: { - type: Array as PropType<any[]>, - default: [], - required: true, - }, - filter: { - type: String, - default: "", - required: false, - }, -}; - -export default defineComponent({ - name: "Draggable", - props: Props, - emits: ["change", "choose", "unchoose"], - setup(props, {emit}) { - const containerRef = ref<HTMLElement | null>(null); - const sortable = ref<Sortable | null>(null); - - watch(containerRef, (newDraggable) => { - if (newDraggable) { - sortable.value = new Sortable(newDraggable, { - ...props, - - onChoose(event) { - emit("choose", event); - }, - - onUnchoose(event) { - emit("unchoose", event); - }, - - onEnd(event) { - emit("change", event); - }, - }); - } - }); - - onBeforeUnmount(() => { - if (sortable.value) { - sortable.value.destroy(); - containerRef.value = null; - } - }); - - return { - containerRef, - }; - }, -}); -</script> diff --git a/client/components/ImageViewer.vue b/client/components/ImageViewer.vue deleted file mode 100644 index 4a143372..00000000 --- a/client/components/ImageViewer.vue +++ /dev/null @@ -1,478 +0,0 @@ -<template> - <div - id="image-viewer" - ref="viewer" - :class="{opened: link !== null}" - @wheel="onMouseWheel" - @touchstart.passive="onTouchStart" - @click="onClick" - > - <template v-if="link !== null"> - <button class="close-btn" aria-label="Close"></button> - - <button - v-if="previousImage" - class="previous-image-btn" - aria-label="Previous image" - @click.stop="previous" - ></button> - <button - v-if="nextImage" - class="next-image-btn" - aria-label="Next image" - @click.stop="next" - ></button> - - <a class="open-btn" :href="link.link" target="_blank" rel="noopener"></a> - - <img - ref="image" - :src="link.thumb" - alt="" - :style="computeImageStyles" - @load="onImageLoad" - @mousedown="onImageMouseDown" - @touchstart.passive="onImageTouchStart" - /> - </template> - </div> -</template> - -<script lang="ts"> -import Mousetrap from "mousetrap"; -import {computed, defineComponent, ref, watch} from "vue"; -import eventbus from "../js/eventbus"; -import {ClientChan, ClientLinkPreview} from "../js/types"; -import {SharedMsg} from "../../shared/types/msg"; - -export default defineComponent({ - name: "ImageViewer", - setup() { - const viewer = ref<HTMLDivElement>(); - const image = ref<HTMLImageElement>(); - - const link = ref<ClientLinkPreview | null>(null); - const previousImage = ref<ClientLinkPreview | null>(); - const nextImage = ref<ClientLinkPreview | null>(); - const channel = ref<ClientChan | null>(); - - const position = ref<{ - x: number; - y: number; - }>({ - x: 0, - y: 0, - }); - - const transform = ref<{ - scale: number; - x: number; - y: number; - }>({ - scale: 1, - x: 0, - y: 0, - }); - - const computeImageStyles = computed(() => { - // Sub pixels may cause the image to blur in certain browsers - // round it down to prevent that - const transformX = Math.floor(transform.value.x); - const transformY = Math.floor(transform.value.y); - - return { - left: `${position.value.x}px`, - top: `${position.value.y}px`, - transform: `translate3d(${transformX}px, ${transformY}px, 0) scale3d(${transform.value.scale}, ${transform.value.scale}, 1)`, - }; - }); - - const closeViewer = () => { - if (link.value === null) { - return; - } - - channel.value = null; - previousImage.value = null; - nextImage.value = null; - link.value = null; - }; - - const setPrevNextImages = () => { - if (!channel.value || !link.value) { - return null; - } - - const links = channel.value.messages - .map((msg: SharedMsg) => msg.previews) - .flat() - .filter((preview) => preview && preview.thumb); - - const currentIndex = links.indexOf(link.value); - - previousImage.value = links[currentIndex - 1] || null; - nextImage.value = links[currentIndex + 1] || null; - }; - - const previous = () => { - if (previousImage.value) { - link.value = previousImage.value; - } - }; - - const next = () => { - if (nextImage.value) { - link.value = nextImage.value; - } - }; - - const prepareImage = () => { - const viewerEl = viewer.value; - const imageEl = image.value; - - if (!viewerEl || !imageEl) { - return; - } - - const width = viewerEl.offsetWidth; - const height = viewerEl.offsetHeight; - const scale = Math.min(1, width / imageEl.width, height / imageEl.height); - - position.value.x = Math.floor(-image.value!.naturalWidth / 2); - position.value.y = Math.floor(-image.value!.naturalHeight / 2); - transform.value.scale = Math.max(scale, 0.1); - transform.value.x = width / 2; - transform.value.y = height / 2; - }; - - const onImageLoad = () => { - prepareImage(); - }; - - const calculateZoomShift = (newScale: number, x: number, y: number, oldScale: number) => { - if (!image.value || !viewer.value) { - return; - } - - const imageWidth = image.value.width; - const centerX = viewer.value.offsetWidth / 2; - const centerY = viewer.value.offsetHeight / 2; - - return { - x: - centerX - - ((centerX - (y - (imageWidth * x) / 2)) / x) * newScale + - (imageWidth * newScale) / 2, - y: - centerY - - ((centerY - (oldScale - (imageWidth * x) / 2)) / x) * newScale + - (imageWidth * newScale) / 2, - }; - }; - - const correctPosition = () => { - const imageEl = image.value; - const viewerEl = viewer.value; - - if (!imageEl || !viewerEl) { - return; - } - - const widthScaled = imageEl.width * transform.value.scale; - const heightScaled = imageEl.height * transform.value.scale; - const containerWidth = viewerEl.offsetWidth; - const containerHeight = viewerEl.offsetHeight; - - if (widthScaled < containerWidth) { - transform.value.x = containerWidth / 2; - } else if (transform.value.x - widthScaled / 2 > 0) { - transform.value.x = widthScaled / 2; - } else if (transform.value.x + widthScaled / 2 < containerWidth) { - transform.value.x = containerWidth - widthScaled / 2; - } - - if (heightScaled < containerHeight) { - transform.value.y = containerHeight / 2; - } else if (transform.value.y - heightScaled / 2 > 0) { - transform.value.y = heightScaled / 2; - } else if (transform.value.y + heightScaled / 2 < containerHeight) { - transform.value.y = containerHeight - heightScaled / 2; - } - }; - - // Reduce multiple touch points into a single x/y/scale - const reduceTouches = (touches: TouchList) => { - let totalX = 0; - let totalY = 0; - let totalScale = 0; - - for (let i = 0; i < touches.length; i++) { - const x = touches[i].clientX; - const y = touches[i].clientY; - - totalX += x; - totalY += y; - - for (let i2 = 0; i2 < touches.length; i2++) { - if (i !== i2) { - const x2 = touches[i2].clientX; - const y2 = touches[i2].clientY; - totalScale += Math.sqrt((x - x2) * (x - x2) + (y - y2) * (y - y2)); - } - } - } - - if (totalScale === 0) { - totalScale = 1; - } - - return { - x: totalX / touches.length, - y: totalY / touches.length, - scale: totalScale / touches.length, - }; - }; - - const onTouchStart = (e: TouchEvent) => { - // prevent sidebar touchstart event, we don't want to interact with sidebar while in image viewer - e.stopImmediatePropagation(); - }; - - // Touch image manipulation: - // 1. Move around by dragging it with one finger - // 2. Change image scale by using two fingers - const onImageTouchStart = (e: TouchEvent) => { - const img = image.value; - let touch = reduceTouches(e.touches); - let currentTouches = e.touches; - let touchEndFingers = 0; - - const currentTransform = { - x: touch.x, - y: touch.y, - scale: touch.scale, - }; - - const startTransform = { - x: transform.value.x, - y: transform.value.y, - scale: transform.value.scale, - }; - - const touchMove = (moveEvent) => { - touch = reduceTouches(moveEvent.touches); - - if (currentTouches.length !== moveEvent.touches.length) { - currentTransform.x = touch.x; - currentTransform.y = touch.y; - currentTransform.scale = touch.scale; - startTransform.x = transform.value.x; - startTransform.y = transform.value.y; - startTransform.scale = transform.value.scale; - } - - const deltaX = touch.x - currentTransform.x; - const deltaY = touch.y - currentTransform.y; - const deltaScale = touch.scale / currentTransform.scale; - currentTouches = moveEvent.touches; - touchEndFingers = 0; - - const newScale = Math.min(3, Math.max(0.1, startTransform.scale * deltaScale)); - - const fixedPosition = calculateZoomShift( - newScale, - startTransform.scale, - startTransform.x, - startTransform.y - ); - - if (!fixedPosition) { - return; - } - - transform.value.x = fixedPosition.x + deltaX; - transform.value.y = fixedPosition.y + deltaY; - transform.value.scale = newScale; - correctPosition(); - }; - - const touchEnd = (endEvent: TouchEvent) => { - const changedTouches = endEvent.changedTouches.length; - - if (currentTouches.length > changedTouches + touchEndFingers) { - touchEndFingers += changedTouches; - return; - } - - // todo: this is swipe to close, but it's not working very well due to unfinished delta calculation - /* if ( - transform.value.scale <= 1 && - endEvent.changedTouches[0].clientY - startTransform.y <= -70 - ) { - return this.closeViewer(); - }*/ - - correctPosition(); - - img?.removeEventListener("touchmove", touchMove); - img?.removeEventListener("touchend", touchEnd); - }; - - img?.addEventListener("touchmove", touchMove, {passive: true}); - img?.addEventListener("touchend", touchEnd, {passive: true}); - }; - - // Image mouse manipulation: - // 1. Mouse wheel scrolling will zoom in and out - // 2. If image is zoomed in, simply dragging it will move it around - const onImageMouseDown = (e: MouseEvent) => { - // todo: ignore if in touch event currently? - - // only left mouse - // TODO: e.buttons? - if (e.which !== 1) { - return; - } - - e.stopPropagation(); - e.preventDefault(); - - const viewerEl = viewer.value; - const imageEl = image.value; - - if (!viewerEl || !imageEl) { - return; - } - - const startX = e.clientX; - const startY = e.clientY; - const startTransformX = transform.value.x; - const startTransformY = transform.value.y; - const widthScaled = imageEl.width * transform.value.scale; - const heightScaled = imageEl.height * transform.value.scale; - const containerWidth = viewerEl.offsetWidth; - const containerHeight = viewerEl.offsetHeight; - const centerX = transform.value.x - widthScaled / 2; - const centerY = transform.value.y - heightScaled / 2; - let movedDistance = 0; - - const mouseMove = (moveEvent: MouseEvent) => { - moveEvent.stopPropagation(); - moveEvent.preventDefault(); - - const newX = moveEvent.clientX - startX; - const newY = moveEvent.clientY - startY; - - movedDistance = Math.max(movedDistance, Math.abs(newX), Math.abs(newY)); - - if (centerX < 0 || widthScaled + centerX > containerWidth) { - transform.value.x = startTransformX + newX; - } - - if (centerY < 0 || heightScaled + centerY > containerHeight) { - transform.value.y = startTransformY + newY; - } - - correctPosition(); - }; - - const mouseUp = (upEvent: MouseEvent) => { - correctPosition(); - - if (movedDistance < 2 && upEvent.button === 0) { - closeViewer(); - } - - image.value?.removeEventListener("mousemove", mouseMove); - image.value?.removeEventListener("mouseup", mouseUp); - }; - - image.value?.addEventListener("mousemove", mouseMove); - image.value?.addEventListener("mouseup", mouseUp); - }; - - // If image is zoomed in, holding ctrl while scrolling will move the image up and down - const onMouseWheel = (e: WheelEvent) => { - // if image viewer is closing (css animation), you can still trigger mousewheel - // TODO: Figure out a better fix for this - if (link.value === null) { - return; - } - - e.preventDefault(); // TODO: Can this be passive? - - if (e.ctrlKey) { - transform.value.y += e.deltaY; - } else { - const delta = e.deltaY > 0 ? 0.1 : -0.1; - const newScale = Math.min(3, Math.max(0.1, transform.value.scale + delta)); - const fixedPosition = calculateZoomShift( - newScale, - transform.value.scale, - transform.value.x, - transform.value.y - ); - - if (!fixedPosition) { - return; - } - - transform.value.scale = newScale; - transform.value.x = fixedPosition.x; - transform.value.y = fixedPosition.y; - } - - correctPosition(); - }; - - const onClick = (e: Event) => { - // If click triggers on the image, ignore it - if (e.target === image.value) { - return; - } - - closeViewer(); - }; - - watch(link, (newLink, oldLink) => { - // TODO: history.pushState - if (newLink === null) { - eventbus.off("escapekey", closeViewer); - eventbus.off("resize", correctPosition); - Mousetrap.unbind("left"); - Mousetrap.unbind("right"); - return; - } - - setPrevNextImages(); - - if (!oldLink) { - eventbus.on("escapekey", closeViewer); - eventbus.on("resize", correctPosition); - Mousetrap.bind("left", previous); - Mousetrap.bind("right", next); - } - }); - - return { - link, - channel, - image, - transform, - closeViewer, - next, - previous, - onImageLoad, - onImageMouseDown, - onMouseWheel, - onClick, - onTouchStart, - previousImage, - nextImage, - onImageTouchStart, - computeImageStyles, - viewer, - }; - }, -}); -</script> diff --git a/client/components/InlineChannel.vue b/client/components/InlineChannel.vue deleted file mode 100644 index 784a93ad..00000000 --- a/client/components/InlineChannel.vue +++ /dev/null @@ -1,35 +0,0 @@ -<template> - <span - class="inline-channel" - dir="auto" - role="button" - tabindex="0" - @click.prevent="openContextMenu" - @contextmenu.prevent="openContextMenu" - ><slot></slot - ></span> -</template> - -<script lang="ts"> -import {defineComponent} from "vue"; -import eventbus from "../js/eventbus"; - -export default defineComponent({ - name: "InlineChannel", - props: { - channel: String, - }, - setup(props) { - const openContextMenu = (event) => { - eventbus.emit("contextmenu:inline-channel", { - event: event, - channel: props.channel, - }); - }; - - return { - openContextMenu, - }; - }, -}); -</script> diff --git a/client/components/JoinChannel.vue b/client/components/JoinChannel.vue deleted file mode 100644 index fa5eebc4..00000000 --- a/client/components/JoinChannel.vue +++ /dev/null @@ -1,93 +0,0 @@ -<template> - <form - :id="'join-channel-' + channel.id" - class="join-form" - method="post" - action="" - autocomplete="off" - @keydown.esc.prevent="$emit('toggle-join-channel')" - @submit.prevent="onSubmit" - > - <input - v-model="inputChannel" - v-focus - type="text" - class="input" - name="channel" - placeholder="Channel" - pattern="[^\s]+" - maxlength="200" - title="The channel name may not contain spaces" - required - /> - <input - v-model="inputPassword" - type="password" - class="input" - name="key" - placeholder="Password (optional)" - pattern="[^\s]+" - maxlength="200" - title="The channel password may not contain spaces" - autocomplete="new-password" - /> - <button type="submit" class="btn btn-small">Join</button> - </form> -</template> - -<script lang="ts"> -import {defineComponent, PropType, ref} from "vue"; -import {switchToChannel} from "../js/router"; -import socket from "../js/socket"; -import {useStore} from "../js/store"; -import {ClientNetwork, ClientChan} from "../js/types"; - -export default defineComponent({ - name: "JoinChannel", - directives: { - focus: { - mounted: (el: HTMLFormElement) => el.focus(), - }, - }, - props: { - network: {type: Object as PropType<ClientNetwork>, required: true}, - channel: {type: Object as PropType<ClientChan>, required: true}, - }, - emits: ["toggle-join-channel"], - setup(props, {emit}) { - const store = useStore(); - const inputChannel = ref(""); - const inputPassword = ref(""); - - const onSubmit = () => { - const existingChannel = store.getters.findChannelOnCurrentNetwork(inputChannel.value); - - if (existingChannel) { - switchToChannel(existingChannel); - } else { - const chanTypes = props.network.serverOptions.CHANTYPES; - let channel = inputChannel.value; - - if (chanTypes && chanTypes.length > 0 && !chanTypes.includes(channel[0])) { - channel = chanTypes[0] + channel; - } - - socket.emit("input", { - text: `/join ${channel} ${inputPassword.value}`, - target: props.channel.id, - }); - } - - inputChannel.value = ""; - inputPassword.value = ""; - emit("toggle-join-channel"); - }; - - return { - inputChannel, - inputPassword, - onSubmit, - }; - }, -}); -</script> diff --git a/client/components/LinkPreview.vue b/client/components/LinkPreview.vue deleted file mode 100644 index 9a124ab8..00000000 --- a/client/components/LinkPreview.vue +++ /dev/null @@ -1,329 +0,0 @@ -<template> - <div - v-if="link.shown" - v-show="link.sourceLoaded || link.type === 'link'" - ref="container" - class="preview" - dir="ltr" - > - <div - ref="content" - :class="['toggle-content', 'toggle-type-' + link.type, {opened: isContentShown}]" - > - <template v-if="link.type === 'link'"> - <a - v-if="link.thumb" - v-show="link.sourceLoaded" - :href="link.link" - class="toggle-thumbnail" - target="_blank" - rel="noopener" - @click="onThumbnailClick" - > - <img - :src="link.thumb" - decoding="async" - alt="" - class="thumb" - @error="onThumbnailError" - @abort="onThumbnailError" - @load="onPreviewReady" - /> - </a> - <div class="toggle-text" dir="auto"> - <div class="head"> - <div class="overflowable"> - <a - :href="link.link" - :title="link.head" - target="_blank" - rel="noopener" - >{{ link.head }}</a - > - </div> - - <button - v-if="showMoreButton" - :aria-expanded="isContentShown" - :aria-label="moreButtonLabel" - dir="auto" - class="more" - @click="onMoreClick" - > - <span class="more-caret" /> - </button> - </div> - - <div class="body overflowable"> - <a :href="link.link" :title="link.body" target="_blank" rel="noopener">{{ - link.body - }}</a> - </div> - </div> - </template> - <template v-else-if="link.type === 'image'"> - <a - :href="link.link" - class="toggle-thumbnail" - target="_blank" - rel="noopener" - @click="onThumbnailClick" - > - <img - v-show="link.sourceLoaded" - :src="link.thumb" - decoding="async" - alt="" - @load="onPreviewReady" - /> - </a> - </template> - <template v-else-if="link.type === 'video'"> - <video - v-show="link.sourceLoaded" - preload="metadata" - controls - @canplay="onPreviewReady" - > - <source :src="link.media" :type="link.mediaType" /> - </video> - </template> - <template v-else-if="link.type === 'audio'"> - <audio - v-show="link.sourceLoaded" - controls - preload="metadata" - @canplay="onPreviewReady" - > - <source :src="link.media" :type="link.mediaType" /> - </audio> - </template> - <template v-else-if="link.type === 'error'"> - <em v-if="link.error === 'image-too-big'"> - This image is larger than {{ imageMaxSize }} and cannot be previewed. - <a :href="link.link" target="_blank" rel="noopener">Click here</a> - to open it in a new window. - </em> - <template v-else-if="link.error === 'message'"> - <div> - <em> - A preview could not be loaded. - <a :href="link.link" target="_blank" rel="noopener">Click here</a> - to open it in a new window. - </em> - <br /> - <pre class="prefetch-error">{{ link.message }}</pre> - </div> - - <button - :aria-expanded="isContentShown" - :aria-label="moreButtonLabel" - class="more" - @click="onMoreClick" - > - <span class="more-caret" /> - </button> - </template> - </template> - </div> - </div> -</template> - -<script lang="ts"> -import { - computed, - defineComponent, - inject, - nextTick, - onBeforeUnmount, - onMounted, - onUnmounted, - PropType, - ref, - watch, -} from "vue"; -import {onBeforeRouteUpdate} from "vue-router"; -import eventbus from "../js/eventbus"; -import friendlysize from "../js/helpers/friendlysize"; -import {useStore} from "../js/store"; -import type {ClientChan, ClientLinkPreview} from "../js/types"; -import {imageViewerKey} from "./App.vue"; - -export default defineComponent({ - name: "LinkPreview", - props: { - link: { - type: Object as PropType<ClientLinkPreview>, - required: true, - }, - keepScrollPosition: { - type: Function as PropType<() => void>, - required: true, - }, - channel: {type: Object as PropType<ClientChan>, required: true}, - }, - setup(props) { - const store = useStore(); - - const showMoreButton = ref(false); - const isContentShown = ref(false); - const imageViewer = inject(imageViewerKey); - - onBeforeRouteUpdate((to, from, next) => { - // cancel the navigation if the user is trying to close the image viewer - if (imageViewer?.value?.link) { - imageViewer.value.closeViewer(); - return next(false); - } - - next(); - }); - - const content = ref<HTMLDivElement | null>(null); - const container = ref<HTMLDivElement | null>(null); - - const moreButtonLabel = computed(() => { - return isContentShown.value ? "Less" : "More"; - }); - - const imageMaxSize = computed(() => { - if (!props.link.maxSize) { - return; - } - - return friendlysize(props.link.maxSize); - }); - - const handleResize = () => { - nextTick(() => { - if (!content.value || !container.value) { - return; - } - - showMoreButton.value = content.value.offsetWidth >= container.value.offsetWidth; - }).catch((e) => { - // eslint-disable-next-line no-console - console.error("Error in LinkPreview.handleResize", e); - }); - }; - - const onPreviewReady = () => { - props.link.sourceLoaded = true; - - props.keepScrollPosition(); - - if (props.link.type === "link") { - handleResize(); - } - }; - - const onPreviewUpdate = () => { - // Don't display previews while they are loading on the server - if (props.link.type === "loading") { - return; - } - - // Error does not have any media to render - if (props.link.type === "error") { - onPreviewReady(); - } - - // If link doesn't have a thumbnail, render it - if (props.link.type === "link") { - handleResize(); - props.keepScrollPosition(); - } - }; - - const onThumbnailError = () => { - // If thumbnail fails to load, hide it and show the preview without it - props.link.thumb = ""; - onPreviewReady(); - }; - - const onThumbnailClick = (e: MouseEvent) => { - e.preventDefault(); - - if (!imageViewer?.value) { - return; - } - - imageViewer.value.channel = props.channel; - imageViewer.value.link = props.link; - }; - - const onMoreClick = () => { - isContentShown.value = !isContentShown.value; - props.keepScrollPosition(); - }; - - const updateShownState = () => { - // User has manually toggled the preview, do not apply default - if (props.link.shown !== null) { - return; - } - - let defaultState = false; - - switch (props.link.type) { - case "error": - // Collapse all errors by default unless its a message about image being too big - if (props.link.error === "image-too-big") { - defaultState = store.state.settings.media; - } - - break; - - case "link": - defaultState = store.state.settings.links; - break; - - default: - defaultState = store.state.settings.media; - } - - props.link.shown = defaultState; - }; - - updateShownState(); - - watch( - () => props.link.type, - () => { - updateShownState(); - onPreviewUpdate(); - } - ); - - onMounted(() => { - eventbus.on("resize", handleResize); - - onPreviewUpdate(); - }); - - onBeforeUnmount(() => { - eventbus.off("resize", handleResize); - }); - - onUnmounted(() => { - // Let this preview go through load/canplay events again, - // Otherwise the browser can cause a resize on video elements - props.link.sourceLoaded = false; - }); - - return { - moreButtonLabel, - imageMaxSize, - onThumbnailClick, - onThumbnailError, - onMoreClick, - onPreviewReady, - onPreviewUpdate, - showMoreButton, - isContentShown, - content, - container, - }; - }, -}); -</script> diff --git a/client/components/LinkPreviewFileSize.vue b/client/components/LinkPreviewFileSize.vue deleted file mode 100644 index 5c577c1b..00000000 --- a/client/components/LinkPreviewFileSize.vue +++ /dev/null @@ -1,22 +0,0 @@ -<template> - <span class="preview-size">({{ previewSize }})</span> -</template> - -<script lang="ts"> -import {defineComponent} from "vue"; -import friendlysize from "../js/helpers/friendlysize"; - -export default defineComponent({ - name: "LinkPreviewFileSize", - props: { - size: {type: Number, required: true}, - }, - setup(props) { - const previewSize = friendlysize(props.size); - - return { - previewSize, - }; - }, -}); -</script> diff --git a/client/components/LinkPreviewToggle.vue b/client/components/LinkPreviewToggle.vue deleted file mode 100644 index 24351ab7..00000000 --- a/client/components/LinkPreviewToggle.vue +++ /dev/null @@ -1,37 +0,0 @@ -<template> - <button - v-if="link.type !== 'loading'" - :class="['toggle-button', 'toggle-preview', {opened: link.shown}]" - :aria-label="ariaLabel" - @click="onClick" - /> -</template> - -<script lang="ts"> -import {computed, defineComponent, PropType} from "vue"; -import {ClientMessage, ClientLinkPreview} from "../js/types"; - -export default defineComponent({ - name: "LinkPreviewToggle", - props: { - link: {type: Object as PropType<ClientLinkPreview>, required: true}, - message: {type: Object as PropType<ClientMessage>, required: true}, - }, - emits: ["toggle-link-preview"], - setup(props, {emit}) { - const ariaLabel = computed(() => { - return props.link.shown ? "Collapse preview" : "Expand preview"; - }); - - const onClick = () => { - props.link.shown = !props.link.shown; - emit("toggle-link-preview", props.link, props.message); - }; - - return { - ariaLabel, - onClick, - }; - }, -}); -</script> diff --git a/client/components/Mentions.vue b/client/components/Mentions.vue deleted file mode 100644 index 63144948..00000000 --- a/client/components/Mentions.vue +++ /dev/null @@ -1,247 +0,0 @@ -<template> - <div - v-if="isOpen" - id="mentions-popup-container" - @click="containerClick" - @contextmenu="containerClick" - > - <div class="mentions-popup"> - <div class="mentions-popup-title"> - Recent mentions - <button - v-if="resolvedMessages.length" - class="btn dismiss-all-mentions" - @click="dismissAllMentions()" - > - Dismiss all - </button> - </div> - <template v-if="resolvedMessages.length === 0"> - <p v-if="isLoading">Loading…</p> - <p v-else>You have no recent mentions.</p> - </template> - <template v-for="message in resolvedMessages" v-else :key="message.msgId"> - <div :class="['msg', message.type]"> - <div class="mentions-info"> - <div> - <span class="from"> - <Username :user="(message.from as any)" /> - <template v-if="message.channel"> - in {{ message.channel.channel.name }} on - {{ message.channel.network.name }} - </template> - <template v-else> in unknown channel </template> </span - >{{ ` ` }} - <span :title="message.localetime" class="time"> - {{ messageTime(message.time.toString()) }} - </span> - </div> - <div> - <span - class="close-tooltip tooltipped tooltipped-w" - aria-label="Dismiss this mention" - > - <button - class="msg-dismiss" - aria-label="Dismiss this mention" - @click="dismissMention(message)" - ></button> - </span> - </div> - </div> - <div class="content" dir="auto"> - <ParsedMessage :message="(message as any)" /> - </div> - </div> - </template> - </div> - </div> -</template> - -<style> -#mentions-popup-container { - z-index: 8; -} - -.mentions-popup { - background-color: var(--window-bg-color); - position: absolute; - width: 400px; - right: 80px; - top: 55px; - max-height: 400px; - overflow-y: auto; - z-index: 2; - padding: 10px; -} - -.mentions-popup > .mentions-popup-title { - display: flex; - justify-content: space-between; - margin-bottom: 10px; - font-size: 20px; -} - -.mentions-popup .mentions-info { - display: flex; - justify-content: space-between; -} - -.mentions-popup .msg { - margin-bottom: 15px; - user-select: text; -} - -.mentions-popup .msg:last-child { - margin-bottom: 0; -} - -.mentions-popup .msg .content { - background-color: var(--highlight-bg-color); - border-radius: 5px; - padding: 6px; - margin-top: 2px; - word-wrap: break-word; - word-break: break-word; /* Webkit-specific */ -} - -.mentions-popup .msg-dismiss::before { - font-size: 20px; - font-weight: normal; - display: inline-block; - line-height: 16px; - text-align: center; - content: "×"; -} - -.mentions-popup .msg-dismiss:hover { - color: var(--link-color); -} - -.mentions-popup .dismiss-all-mentions { - margin: 0; - padding: 4px 6px; -} - -@media (min-height: 500px) { - .mentions-popup { - max-height: 60vh; - } -} - -@media (max-width: 768px) { - .mentions-popup { - border-radius: 0; - border: 0; - box-shadow: none; - width: 100%; - max-height: none; - right: 0; - left: 0; - bottom: 0; - top: 45px; /* header height */ - } -} -</style> - -<script lang="ts"> -import Username from "./Username.vue"; -import ParsedMessage from "./ParsedMessage.vue"; -import socket from "../js/socket"; -import eventbus from "../js/eventbus"; -import localetime from "../js/helpers/localetime"; -import dayjs from "dayjs"; -import relativeTime from "dayjs/plugin/relativeTime"; -import {computed, watch, defineComponent, ref, onMounted, onUnmounted} from "vue"; -import {useStore} from "../js/store"; -import {ClientMention} from "../js/types"; - -dayjs.extend(relativeTime); - -export default defineComponent({ - name: "Mentions", - components: { - Username, - ParsedMessage, - }, - setup() { - const store = useStore(); - const isOpen = ref(false); - const isLoading = ref(false); - const resolvedMessages = computed(() => { - const messages = store.state.mentions.slice().reverse(); - - for (const message of messages) { - message.localetime = localetime(message.time); - message.channel = store.getters.findChannel(message.chanId); - } - - return messages.filter((message) => !message.channel?.channel.muted); - }); - - watch( - () => store.state.mentions, - () => { - isLoading.value = false; - } - ); - - const messageTime = (time: string) => { - return dayjs(time).fromNow(); - }; - - const dismissMention = (message: ClientMention) => { - store.state.mentions.splice( - store.state.mentions.findIndex((m) => m.msgId === message.msgId), - 1 - ); - - socket.emit("mentions:dismiss", message.msgId); - }; - - const dismissAllMentions = () => { - store.state.mentions = []; - socket.emit("mentions:dismiss_all"); - }; - - const containerClick = (event: Event) => { - if (event.currentTarget === event.target) { - isOpen.value = false; - } - }; - - const togglePopup = () => { - isOpen.value = !isOpen.value; - - if (isOpen.value) { - isLoading.value = true; - socket.emit("mentions:get"); - } - }; - - const closePopup = () => { - isOpen.value = false; - }; - - onMounted(() => { - eventbus.on("mentions:toggle", togglePopup); - eventbus.on("escapekey", closePopup); - }); - - onUnmounted(() => { - eventbus.off("mentions:toggle", togglePopup); - eventbus.off("escapekey", closePopup); - }); - - return { - isOpen, - isLoading, - resolvedMessages, - messageTime, - dismissMention, - dismissAllMentions, - containerClick, - }; - }, -}); -</script> diff --git a/client/components/Message.vue b/client/components/Message.vue deleted file mode 100644 index 44680ac0..00000000 --- a/client/components/Message.vue +++ /dev/null @@ -1,173 +0,0 @@ -<template> - <div - :id="'msg-' + message.id" - :class="[ - 'msg', - { - self: message.self, - highlight: message.highlight || focused, - 'previous-source': isPreviousSource, - }, - ]" - :data-type="message.type" - :data-command="message.command" - :data-from="message.from && message.from.nick" - > - <span - aria-hidden="true" - :aria-label="messageTimeLocale" - class="time tooltipped tooltipped-e" - >{{ `${messageTime} ` }} - </span> - <template v-if="message.type === 'unhandled'"> - <span class="from">[{{ message.command }}]</span> - <span class="content"> - <span v-for="(param, id) in message.params" :key="id">{{ - ` ${param} ` - }}</span> - </span> - </template> - <template v-else-if="isAction()"> - <span class="from"><span class="only-copy" aria-hidden="true">*** </span></span> - <component :is="messageComponent" :network="network" :message="message" /> - </template> - <template v-else-if="message.type === 'action'"> - <span class="from"><span class="only-copy">* </span></span> - <span class="content" dir="auto"> - <Username - :user="message.from" - :network="network" - :channel="channel" - dir="auto" - /> <ParsedMessage :message="message" /> - <LinkPreview - v-for="preview in message.previews" - :key="preview.link" - :keep-scroll-position="keepScrollPosition" - :link="preview" - :channel="channel" - /> - </span> - </template> - <template v-else> - <span v-if="message.type === 'message'" class="from"> - <template v-if="message.from && message.from.nick"> - <span class="only-copy" aria-hidden="true"><</span> - <Username :user="message.from" :network="network" :channel="channel" /> - <span class="only-copy" aria-hidden="true">> </span> - </template> - </span> - <span v-else-if="message.type === 'plugin'" class="from"> - <template v-if="message.from && message.from.nick"> - <span class="only-copy" aria-hidden="true">[</span> - {{ message.from.nick }} - <span class="only-copy" aria-hidden="true">] </span> - </template> - </span> - <span v-else class="from"> - <template v-if="message.from && message.from.nick"> - <span class="only-copy" aria-hidden="true">-</span> - <Username :user="message.from" :network="network" :channel="channel" /> - <span class="only-copy" aria-hidden="true">- </span> - </template> - </span> - <span class="content" dir="auto"> - <span - v-if="message.showInActive" - aria-label="This message was shown in your active channel" - class="msg-shown-in-active tooltipped tooltipped-e" - ><span></span - ></span> - <span - v-if="message.statusmsgGroup" - :aria-label="`This message was only shown to users with ${message.statusmsgGroup} mode`" - class="msg-statusmsg tooltipped tooltipped-e" - ><span>{{ message.statusmsgGroup }}</span></span - > - <ParsedMessage :network="network" :message="message" /> - <LinkPreview - v-for="preview in message.previews" - :key="preview.link" - :keep-scroll-position="keepScrollPosition" - :link="preview" - :channel="channel" - /> - </span> - </template> - </div> -</template> - -<script lang="ts"> -import {computed, defineComponent, PropType} from "vue"; -import dayjs from "dayjs"; - -import constants from "../js/constants"; -import localetime from "../js/helpers/localetime"; -import Username from "./Username.vue"; -import LinkPreview from "./LinkPreview.vue"; -import ParsedMessage from "./ParsedMessage.vue"; -import MessageTypes from "./MessageTypes"; - -import type {ClientChan, ClientMessage, ClientNetwork} from "../js/types"; -import {useStore} from "../js/store"; - -MessageTypes.ParsedMessage = ParsedMessage; -MessageTypes.LinkPreview = LinkPreview; -MessageTypes.Username = Username; - -export default defineComponent({ - name: "Message", - components: MessageTypes, - props: { - message: {type: Object as PropType<ClientMessage>, required: true}, - channel: {type: Object as PropType<ClientChan>, required: false}, - network: {type: Object as PropType<ClientNetwork>, required: true}, - keepScrollPosition: Function as PropType<() => void>, - isPreviousSource: Boolean, - focused: Boolean, - }, - setup(props) { - const store = useStore(); - - const timeFormat = computed(() => { - let format: keyof typeof constants.timeFormats; - - if (store.state.settings.use12hClock) { - format = store.state.settings.showSeconds ? "msg12hWithSeconds" : "msg12h"; - } else { - format = store.state.settings.showSeconds ? "msgWithSeconds" : "msgDefault"; - } - - return constants.timeFormats[format]; - }); - - const messageTime = computed(() => { - return dayjs(props.message.time).format(timeFormat.value); - }); - - const messageTimeLocale = computed(() => { - return localetime(props.message.time); - }); - - const messageComponent = computed(() => { - return "message-" + (props.message.type || "invalid"); // TODO: force existence of type in sharedmsg - }); - - const isAction = () => { - if (!props.message.type) { - return false; - } - - return typeof MessageTypes["message-" + props.message.type] !== "undefined"; - }; - - return { - timeFormat, - messageTime, - messageTimeLocale, - messageComponent, - isAction, - }; - }, -}); -</script> diff --git a/client/components/MessageCondensed.vue b/client/components/MessageCondensed.vue deleted file mode 100644 index 218fdeff..00000000 --- a/client/components/MessageCondensed.vue +++ /dev/null @@ -1,165 +0,0 @@ -<template> - <div :class="['msg', {closed: isCollapsed}]" data-type="condensed"> - <div class="condensed-summary"> - <span class="time" /> - <span class="from" /> - <span class="content" @click="onCollapseClick" - >{{ condensedText - }}<button class="toggle-button" aria-label="Toggle status messages" - /></span> - </div> - <Message - v-for="message in messages" - :key="message.id" - :network="network" - :message="message" - /> - </div> -</template> - -<script lang="ts"> -import {computed, defineComponent, PropType, ref} from "vue"; -import {condensedTypes} from "../../shared/irc"; -import {MessageType} from "../../shared/types/msg"; -import {ClientMessage, ClientNetwork} from "../js/types"; -import Message from "./Message.vue"; - -export default defineComponent({ - name: "MessageCondensed", - components: { - Message, - }, - props: { - network: {type: Object as PropType<ClientNetwork>, required: true}, - messages: { - type: Array as PropType<ClientMessage[]>, - required: true, - }, - keepScrollPosition: { - type: Function as PropType<() => void>, - required: true, - }, - focused: Boolean, - }, - setup(props) { - const isCollapsed = ref(true); - - const onCollapseClick = () => { - isCollapsed.value = !isCollapsed.value; - props.keepScrollPosition(); - }; - - const condensedText = computed(() => { - const obj: Record<string, number> = {}; - - condensedTypes.forEach((type) => { - obj[type] = 0; - }); - - for (const message of props.messages) { - // special case since one MODE message can change multiple modes - if (message.type === MessageType.MODE) { - // syntax: +vv-t maybe-some targets - // we want the number of mode changes in the message, so count the - // number of chars other than + and - before the first space - const text = message.text ? message.text : ""; - const modeChangesCount = text - .split(" ")[0] - .split("") - .filter((char) => char !== "+" && char !== "-").length; - obj[message.type] += modeChangesCount; - } else { - if (!message.type) { - /* eslint-disable no-console */ - console.log(`empty message type, this should not happen: ${message.id}`); - continue; - } - - obj[message.type]++; - } - } - - // Count quits as parts in condensed messages to reduce information density - obj.part += obj.quit; - - const strings: string[] = []; - condensedTypes.forEach((type) => { - if (obj[type]) { - switch (type) { - case "chghost": - strings.push( - String(obj[type]) + - (obj[type] > 1 - ? " users have changed hostname" - : " user has changed hostname") - ); - break; - case "join": - strings.push( - String(obj[type]) + - (obj[type] > 1 ? " users have joined" : " user has joined") - ); - break; - case "part": - strings.push( - String(obj[type]) + - (obj[type] > 1 ? " users have left" : " user has left") - ); - break; - case "nick": - strings.push( - String(obj[type]) + - (obj[type] > 1 - ? " users have changed nick" - : " user has changed nick") - ); - break; - case "kick": - strings.push( - String(obj[type]) + - (obj[type] > 1 ? " users were kicked" : " user was kicked") - ); - break; - case "mode": - strings.push( - String(obj[type]) + - (obj[type] > 1 ? " modes were set" : " mode was set") - ); - break; - case "away": - strings.push( - "marked away " + - (obj[type] > 1 ? String(obj[type]) + " times" : "once") - ); - break; - case "back": - strings.push( - "marked back " + - (obj[type] > 1 ? String(obj[type]) + " times" : "once") - ); - break; - } - } - }); - - if (strings.length) { - let text = strings.pop(); - - if (strings.length) { - text = strings.join(", ") + ", and " + text!; - } - - return text; - } - - return ""; - }); - - return { - isCollapsed, - condensedText, - onCollapseClick, - }; - }, -}); -</script> diff --git a/client/components/MessageList.vue b/client/components/MessageList.vue deleted file mode 100644 index 2a2afe1b..00000000 --- a/client/components/MessageList.vue +++ /dev/null @@ -1,440 +0,0 @@ -<template> - <div ref="chat" class="chat" tabindex="-1"> - <div v-show="channel.moreHistoryAvailable" class="show-more"> - <button - ref="loadMoreButton" - :disabled="channel.historyLoading || !store.state.isConnected" - class="btn" - @click="onShowMoreClick" - > - <span v-if="channel.historyLoading">Loading…</span> - <span v-else>Show older messages</span> - </button> - </div> - <div - class="messages" - role="log" - aria-live="polite" - aria-relevant="additions" - @copy="onCopy" - > - <template v-for="(message, id) in condensedMessages"> - <DateMarker - v-if="shouldDisplayDateMarker(message, id)" - :key="message.id + '-date'" - :message="message as any" - :focused="message.id === focused" - /> - <div - v-if="shouldDisplayUnreadMarker(Number(message.id))" - :key="message.id + '-unread'" - class="unread-marker" - > - <span class="unread-marker-text" /> - </div> - - <MessageCondensed - v-if="message.type === 'condensed'" - :key="message.messages[0].id" - :network="network" - :keep-scroll-position="keepScrollPosition" - :messages="message.messages" - :focused="message.id === focused" - /> - <Message - v-else - :key="message.id" - :channel="channel" - :network="network" - :message="message" - :keep-scroll-position="keepScrollPosition" - :is-previous-source="isPreviousSource(message, id)" - :focused="message.id === focused" - @toggle-link-preview="onLinkPreviewToggle" - /> - </template> - </div> - </div> -</template> - -<script lang="ts"> -import {condensedTypes} from "../../shared/irc"; -import {ChanType} from "../../shared/types/chan"; -import {MessageType, SharedMsg} from "../../shared/types/msg"; -import eventbus from "../js/eventbus"; -import clipboard from "../js/clipboard"; -import socket from "../js/socket"; -import Message from "./Message.vue"; -import MessageCondensed from "./MessageCondensed.vue"; -import DateMarker from "./DateMarker.vue"; -import { - computed, - defineComponent, - nextTick, - onBeforeUnmount, - onBeforeUpdate, - onMounted, - onUnmounted, - PropType, - ref, - watch, -} from "vue"; -import {useStore} from "../js/store"; -import {ClientChan, ClientMessage, ClientNetwork, ClientLinkPreview} from "../js/types"; - -type CondensedMessageContainer = { - type: "condensed"; - time: Date; - messages: ClientMessage[]; - id?: number; -}; - -// TODO; move into component -let unreadMarkerShown = false; - -export default defineComponent({ - name: "MessageList", - components: { - Message, - MessageCondensed, - DateMarker, - }, - props: { - network: {type: Object as PropType<ClientNetwork>, required: true}, - channel: {type: Object as PropType<ClientChan>, required: true}, - focused: Number, - }, - setup(props) { - const store = useStore(); - - const chat = ref<HTMLDivElement | null>(null); - const loadMoreButton = ref<HTMLButtonElement | null>(null); - const historyObserver = ref<IntersectionObserver | null>(null); - const skipNextScrollEvent = ref(false); - - const isWaitingForNextTick = ref(false); - - const jumpToBottom = () => { - skipNextScrollEvent.value = true; - props.channel.scrolledToBottom = true; - - const el = chat.value; - - if (el) { - el.scrollTop = el.scrollHeight; - } - }; - - const onShowMoreClick = () => { - if (!store.state.isConnected) { - return; - } - - let lastMessage = -1; - - // Find the id of first message that isn't showInActive - // If showInActive is set, this message is actually in another channel - for (const message of props.channel.messages) { - if (!message.showInActive) { - lastMessage = message.id; - break; - } - } - - props.channel.historyLoading = true; - - socket.emit("more", { - target: props.channel.id, - lastId: lastMessage, - condensed: store.state.settings.statusMessages !== "shown", - }); - }; - - const onLoadButtonObserved = (entries: IntersectionObserverEntry[]) => { - entries.forEach((entry) => { - if (!entry.isIntersecting) { - return; - } - - onShowMoreClick(); - }); - }; - - nextTick(() => { - if (!chat.value) { - return; - } - - if (window.IntersectionObserver) { - historyObserver.value = new window.IntersectionObserver(onLoadButtonObserved, { - root: chat.value, - }); - } - - jumpToBottom(); - }).catch((e) => { - // eslint-disable-next-line no-console - console.error("Error in new IntersectionObserver", e); - }); - - const condensedMessages = computed(() => { - if (props.channel.type !== ChanType.CHANNEL && props.channel.type !== ChanType.QUERY) { - return props.channel.messages; - } - - // If actions are hidden, just return a message list with them excluded - if (store.state.settings.statusMessages === "hidden") { - return props.channel.messages.filter( - (message) => !condensedTypes.has(message.type || "") - ); - } - - // If actions are not condensed, just return raw message list - if (store.state.settings.statusMessages !== "condensed") { - return props.channel.messages; - } - - let lastCondensedContainer: CondensedMessageContainer | null = null; - - const condensed: (ClientMessage | CondensedMessageContainer)[] = []; - - for (const message of props.channel.messages) { - // If this message is not condensable, or its an action affecting our user, - // then just append the message to container and be done with it - if (message.self || message.highlight || !condensedTypes.has(message.type || "")) { - lastCondensedContainer = null; - - condensed.push(message); - - continue; - } - - if (!lastCondensedContainer) { - lastCondensedContainer = { - time: message.time, - type: "condensed", - messages: [], - }; - - condensed.push(lastCondensedContainer); - } - - lastCondensedContainer!.messages.push(message); - - // Set id of the condensed container to last message id, - // which is required for the unread marker to work correctly - lastCondensedContainer!.id = message.id; - - // If this message is the unread boundary, create a split condensed container - if (message.id === props.channel.firstUnread) { - lastCondensedContainer = null; - } - } - - return condensed.map((message) => { - // Skip condensing single messages, it doesn't save any - // space but makes useful information harder to see - if (message.type === "condensed" && message.messages.length === 1) { - return message.messages[0]; - } - - return message; - }); - }); - - const shouldDisplayDateMarker = ( - message: SharedMsg | CondensedMessageContainer, - id: number - ) => { - const previousMessage = condensedMessages.value[id - 1]; - - if (!previousMessage) { - return true; - } - - const oldDate = new Date(previousMessage.time); - const newDate = new Date(message.time); - - return ( - oldDate.getDate() !== newDate.getDate() || - oldDate.getMonth() !== newDate.getMonth() || - oldDate.getFullYear() !== newDate.getFullYear() - ); - }; - - const shouldDisplayUnreadMarker = (id: number) => { - if (!unreadMarkerShown && id > props.channel.firstUnread) { - unreadMarkerShown = true; - return true; - } - - return false; - }; - - const isPreviousSource = (currentMessage: ClientMessage, id: number) => { - const previousMessage = condensedMessages.value[id - 1]; - return ( - previousMessage && - currentMessage.type === MessageType.MESSAGE && - previousMessage.type === MessageType.MESSAGE && - currentMessage.from && - previousMessage.from && - currentMessage.from.nick === previousMessage.from.nick - ); - }; - - const onCopy = () => { - if (chat.value) { - clipboard(chat.value); - } - }; - - const keepScrollPosition = async () => { - // If we are already waiting for the next tick to force scroll position, - // we have no reason to perform more checks and set it again in the next tick - if (isWaitingForNextTick.value) { - return; - } - - const el = chat.value; - - if (!el) { - return; - } - - if (!props.channel.scrolledToBottom) { - if (props.channel.historyLoading) { - const heightOld = el.scrollHeight - el.scrollTop; - - isWaitingForNextTick.value = true; - - await nextTick(); - - isWaitingForNextTick.value = false; - skipNextScrollEvent.value = true; - - el.scrollTop = el.scrollHeight - heightOld; - } - - return; - } - - isWaitingForNextTick.value = true; - await nextTick(); - isWaitingForNextTick.value = false; - - jumpToBottom(); - }; - - const onLinkPreviewToggle = async (preview: ClientLinkPreview, message: ClientMessage) => { - await keepScrollPosition(); - - // Tell the server we're toggling so it remembers at page reload - socket.emit("msg:preview:toggle", { - target: props.channel.id, - msgId: message.id, - link: preview.link, - shown: preview.shown, - }); - }; - - const handleScroll = () => { - // Setting scrollTop also triggers scroll event - // We don't want to perform calculations for that - if (skipNextScrollEvent.value) { - skipNextScrollEvent.value = false; - return; - } - - const el = chat.value; - - if (!el) { - return; - } - - props.channel.scrolledToBottom = el.scrollHeight - el.scrollTop - el.offsetHeight <= 30; - }; - - const handleResize = () => { - // Keep message list scrolled to bottom on resize - if (props.channel.scrolledToBottom) { - jumpToBottom(); - } - }; - - onMounted(() => { - chat.value?.addEventListener("scroll", handleScroll, {passive: true}); - - eventbus.on("resize", handleResize); - - void nextTick(() => { - if (historyObserver.value && loadMoreButton.value) { - historyObserver.value.observe(loadMoreButton.value); - } - }); - }); - - watch( - () => props.channel.id, - () => { - props.channel.scrolledToBottom = true; - - // Re-add the intersection observer to trigger the check again on channel switch - // Otherwise if last channel had the button visible, switching to a new channel won't trigger the history - if (historyObserver.value && loadMoreButton.value) { - historyObserver.value.unobserve(loadMoreButton.value); - historyObserver.value.observe(loadMoreButton.value); - } - } - ); - - watch( - () => props.channel.messages, - async () => { - await keepScrollPosition(); - }, - { - deep: true, - } - ); - - watch( - () => props.channel.pendingMessage, - async () => { - // Keep the scroll stuck when input gets resized while typing - await keepScrollPosition(); - } - ); - - onBeforeUpdate(() => { - unreadMarkerShown = false; - }); - - onBeforeUnmount(() => { - eventbus.off("resize", handleResize); - chat.value?.removeEventListener("scroll", handleScroll); - }); - - onUnmounted(() => { - if (historyObserver.value) { - historyObserver.value.disconnect(); - } - }); - - return { - chat, - store, - onShowMoreClick, - loadMoreButton, - onCopy, - condensedMessages, - shouldDisplayDateMarker, - shouldDisplayUnreadMarker, - keepScrollPosition, - isPreviousSource, - jumpToBottom, - onLinkPreviewToggle, - }; - }, -}); -</script> diff --git a/client/components/MessageSearchForm.vue b/client/components/MessageSearchForm.vue deleted file mode 100644 index 98b1a0b2..00000000 --- a/client/components/MessageSearchForm.vue +++ /dev/null @@ -1,175 +0,0 @@ -<template> - <form :class="['message-search', {opened: searchOpened}]" @submit.prevent="searchMessages"> - <div class="input-wrapper"> - <input - ref="searchInputField" - v-model="searchInput" - type="search" - name="search" - class="input" - placeholder="Search messages…" - @blur="closeSearch" - @keyup.esc="closeSearch" - /> - </div> - <button - v-if="!onSearchPage" - class="search" - type="button" - aria-label="Search messages in this channel" - @mousedown.prevent="toggleSearch" - /> - </form> -</template> - -<style> -form.message-search { - display: flex; -} - -form.message-search .input-wrapper { - display: flex; -} - -form.message-search input { - width: 100%; - height: auto !important; - margin: 7px 0; - border: 0; - color: inherit; - background-color: #fafafa; - appearance: none; -} - -form.message-search input::placeholder { - color: rgba(0, 0, 0, 0.35); -} - -@media (min-width: 480px) { - form.message-search input { - min-width: 140px; - } - - form.message-search input:focus { - min-width: 220px; - } -} - -form.message-search .input-wrapper { - position: absolute; - top: 45px; - left: 0; - right: 0; - z-index: 1; - height: 0; - overflow: hidden; - background: var(--window-bg-color); -} - -form.message-search .input-wrapper input { - margin: 7px; -} - -form.message-search.opened .input-wrapper { - height: 50px; -} - -#chat form.message-search button { - display: flex; - color: #607992; -} -</style> - -<script lang="ts"> -import {computed, defineComponent, onMounted, PropType, ref, watch} from "vue"; -import {useRoute, useRouter} from "vue-router"; -import eventbus from "../js/eventbus"; -import {ClientNetwork, ClientChan} from "../js/types"; - -export default defineComponent({ - name: "MessageSearchForm", - props: { - network: {type: Object as PropType<ClientNetwork>, required: true}, - channel: {type: Object as PropType<ClientChan>, required: true}, - }, - setup(props) { - const searchOpened = ref(false); - const searchInput = ref(""); - const router = useRouter(); - const route = useRoute(); - - const searchInputField = ref<HTMLInputElement | null>(null); - - const onSearchPage = computed(() => { - return route.name === "SearchResults"; - }); - - watch(route, (newValue) => { - if (newValue.query.q) { - searchInput.value = String(newValue.query.q); - } - }); - - onMounted(() => { - searchInput.value = String(route.query.q || ""); - searchOpened.value = onSearchPage.value; - - if (searchInputField.value && !searchInput.value && searchOpened.value) { - searchInputField.value.focus(); - } - }); - - const closeSearch = () => { - if (!onSearchPage.value) { - searchInput.value = ""; - searchOpened.value = false; - } - }; - - const toggleSearch = () => { - if (searchOpened.value) { - searchInputField.value?.blur(); - return; - } - - searchOpened.value = true; - searchInputField.value?.focus(); - }; - - const searchMessages = (event: Event) => { - event.preventDefault(); - - if (!searchInput.value) { - return; - } - - router - .push({ - name: "SearchResults", - params: { - id: props.channel.id, - }, - query: { - q: searchInput.value, - }, - }) - .catch((err) => { - if (err.name === "NavigationDuplicated") { - // Search for the same query again - eventbus.emit("re-search"); - } - }); - }; - - return { - searchOpened, - searchInput, - searchInputField, - closeSearch, - toggleSearch, - searchMessages, - onSearchPage, - }; - }, -}); -</script> diff --git a/client/components/MessageTypes/away.vue b/client/components/MessageTypes/away.vue deleted file mode 100644 index 39ca76d1..00000000 --- a/client/components/MessageTypes/away.vue +++ /dev/null @@ -1,35 +0,0 @@ -<template> - <span class="content"> - <ParsedMessage v-if="message.self" :network="network" :message="message" /> - <template v-else> - <Username :user="message.from" /> - is away - <i class="away-message">(<ParsedMessage :network="network" :message="message" />)</i> - </template> - </span> -</template> - -<script lang="ts"> -import {defineComponent, PropType} from "vue"; -import type {ClientNetwork, ClientMessage} from "../../js/types"; -import ParsedMessage from "../ParsedMessage.vue"; -import Username from "../Username.vue"; - -export default defineComponent({ - name: "MessageTypeAway", - components: { - ParsedMessage, - Username, - }, - props: { - network: { - type: Object as PropType<ClientNetwork>, - required: true, - }, - message: { - type: Object as PropType<ClientMessage>, - required: true, - }, - }, -}); -</script> diff --git a/client/components/MessageTypes/back.vue b/client/components/MessageTypes/back.vue deleted file mode 100644 index 759d1e33..00000000 --- a/client/components/MessageTypes/back.vue +++ /dev/null @@ -1,34 +0,0 @@ -<template> - <span class="content"> - <ParsedMessage v-if="message.self" :network="network" :message="message" /> - <template v-else> - <Username :user="message.from" /> - is back - </template> - </span> -</template> - -<script lang="ts"> -import {defineComponent, PropType} from "vue"; -import {ClientNetwork, ClientMessage} from "../../js/types"; -import ParsedMessage from "../ParsedMessage.vue"; -import Username from "../Username.vue"; - -export default defineComponent({ - name: "MessageTypeBack", - components: { - ParsedMessage, - Username, - }, - props: { - network: { - type: Object as PropType<ClientNetwork>, - required: true, - }, - message: { - type: Object as PropType<ClientMessage>, - required: true, - }, - }, -}); -</script> diff --git a/client/components/MessageTypes/chghost.vue b/client/components/MessageTypes/chghost.vue deleted file mode 100644 index 0f6cd8f4..00000000 --- a/client/components/MessageTypes/chghost.vue +++ /dev/null @@ -1,38 +0,0 @@ -<template> - <span class="content"> - <Username :user="message.from" /> - has changed - <span v-if="message.new_ident" - >username to <b>{{ message.new_ident }}</b></span - > - <span v-if="message.new_host" - >hostname to - <i class="hostmask"><ParsedMessage :network="network" :text="message.new_host" /></i - ></span> - </span> -</template> - -<script lang="ts"> -import {defineComponent, PropType} from "vue"; -import {ClientNetwork, ClientMessage} from "../../js/types"; -import ParsedMessage from "../ParsedMessage.vue"; -import Username from "../Username.vue"; - -export default defineComponent({ - name: "MessageTypeChangeHost", - components: { - ParsedMessage, - Username, - }, - props: { - network: { - type: Object as PropType<ClientNetwork>, - required: true, - }, - message: { - type: Object as PropType<ClientMessage>, - required: true, - }, - }, -}); -</script> diff --git a/client/components/MessageTypes/ctcp.vue b/client/components/MessageTypes/ctcp.vue deleted file mode 100644 index 7b85afc3..00000000 --- a/client/components/MessageTypes/ctcp.vue +++ /dev/null @@ -1,31 +0,0 @@ -<template> - <span class="content"> - <Username :user="message.from" /> - {{ ` ` }}<span class="ctcp-message"><ParsedMessage :text="message.ctcpMessage" /></span> - </span> -</template> - -<script lang="ts"> -import {defineComponent, PropType} from "vue"; -import {ClientNetwork, ClientMessage} from "../../js/types"; -import ParsedMessage from "../ParsedMessage.vue"; -import Username from "../Username.vue"; - -export default defineComponent({ - name: "MessageTypeCTCP", - components: { - ParsedMessage, - Username, - }, - props: { - network: { - type: Object as PropType<ClientNetwork>, - required: true, - }, - message: { - type: Object as PropType<ClientMessage>, - required: true, - }, - }, -}); -</script> diff --git a/client/components/MessageTypes/ctcp_request.vue b/client/components/MessageTypes/ctcp_request.vue deleted file mode 100644 index 310bfacd..00000000 --- a/client/components/MessageTypes/ctcp_request.vue +++ /dev/null @@ -1,32 +0,0 @@ -<template> - <span class="content"> - <Username :user="message.from" /> - sent a <abbr title="Client-to-client protocol">CTCP</abbr> request: - <span class="ctcp-message"><ParsedMessage :text="message.ctcpMessage" /></span> - </span> -</template> - -<script lang="ts"> -import {defineComponent, PropType} from "vue"; -import {ClientNetwork, ClientMessage} from "../../js/types"; -import ParsedMessage from "../ParsedMessage.vue"; -import Username from "../Username.vue"; - -export default defineComponent({ - name: "MessageTypeRequestCTCP", - components: { - ParsedMessage, - Username, - }, - props: { - network: { - type: Object as PropType<ClientNetwork>, - required: true, - }, - message: { - type: Object as PropType<ClientMessage>, - required: true, - }, - }, -}); -</script> diff --git a/client/components/MessageTypes/error.vue b/client/components/MessageTypes/error.vue deleted file mode 100644 index 64b7f645..00000000 --- a/client/components/MessageTypes/error.vue +++ /dev/null @@ -1,77 +0,0 @@ -<template> - <span class="content"> - <ParsedMessage :network="network" :message="message" :text="errorMessage" /> - </span> -</template> - -<script lang="ts"> -import ParsedMessage from "../ParsedMessage.vue"; -import {computed, defineComponent, PropType} from "vue"; -import {ClientNetwork, ClientMessage} from "../../js/types"; - -export default defineComponent({ - name: "MessageTypeError", - components: { - ParsedMessage, - }, - props: { - network: { - type: Object as PropType<ClientNetwork>, - required: true, - }, - message: { - type: Object as PropType<ClientMessage>, - required: true, - }, - }, - setup(props) { - const errorMessage = computed(() => { - // TODO: enforce chan and nick fields so that we can get rid of that - const chan = props.message.channel || "!UNKNOWN_CHAN"; - const nick = props.message.nick || "!UNKNOWN_NICK"; - - switch (props.message.error) { - case "bad_channel_key": - return `Cannot join ${chan} - Bad channel key.`; - case "banned_from_channel": - return `Cannot join ${chan} - You have been banned from the channel.`; - case "cannot_send_to_channel": - return `Cannot send to channel ${chan}`; - case "channel_is_full": - return `Cannot join ${chan} - Channel is full.`; - case "chanop_privs_needed": - return "Cannot perform action: You're not a channel operator."; - case "invite_only_channel": - return `Cannot join ${chan} - Channel is invite only.`; - case "no_such_nick": - return `User ${nick} hasn't logged in or does not exist.`; - case "not_on_channel": - return "Cannot perform action: You're not on the channel."; - case "password_mismatch": - return "Password mismatch."; - case "too_many_channels": - return `Cannot join ${chan} - You've already reached the maximum number of channels allowed.`; - case "unknown_command": - // TODO: not having message.command should never happen, so force existence - return `Unknown command: ${props.message.command || "!UNDEFINED_COMMAND_BUG"}`; - case "user_not_in_channel": - return `User ${nick} is not on the channel.`; - case "user_on_channel": - return `User ${nick} is already on the channel.`; - default: - if (props.message.reason) { - return `${props.message.reason} (${ - props.message.error || "!UNDEFINED_ERR" - })`; - } - - return props.message.error; - } - }); - - return { - errorMessage, - }; - }, -}); -</script> diff --git a/client/components/MessageTypes/index.ts b/client/components/MessageTypes/index.ts deleted file mode 100644 index 412bcfbc..00000000 --- a/client/components/MessageTypes/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -// This creates a version of `require()` in the context of the current -// directory, so we iterate over its content, which is a map statically built by -// Webpack. -// Second argument says it's recursive, third makes sure we only load templates. -const requireViews = require.context(".", false, /\.vue$/); - -export default requireViews.keys().reduce((acc: Record<string, any>, path) => { - acc["message-" + path.substring(2, path.length - 4)] = requireViews(path).default; - - return acc; -}, {}); diff --git a/client/components/MessageTypes/invite.vue b/client/components/MessageTypes/invite.vue deleted file mode 100644 index 62c9f989..00000000 --- a/client/components/MessageTypes/invite.vue +++ /dev/null @@ -1,34 +0,0 @@ -<template> - <span class="content"> - <Username :user="message.from" /> - invited - <span v-if="message.invitedYou">you</span> - <Username v-else :user="message.target" /> - to <ParsedMessage :network="network" :text="message.channel" /> - </span> -</template> - -<script lang="ts"> -import {defineComponent, PropType} from "vue"; -import {ClientNetwork, ClientMessage} from "../../js/types"; -import ParsedMessage from "../ParsedMessage.vue"; -import Username from "../Username.vue"; - -export default defineComponent({ - name: "MessageTypeInvite", - components: { - ParsedMessage, - Username, - }, - props: { - network: { - type: Object as PropType<ClientNetwork>, - required: true, - }, - message: { - type: Object as PropType<ClientMessage>, - required: true, - }, - }, -}); -</script> diff --git a/client/components/MessageTypes/join.vue b/client/components/MessageTypes/join.vue deleted file mode 100644 index 6d80b0ab..00000000 --- a/client/components/MessageTypes/join.vue +++ /dev/null @@ -1,38 +0,0 @@ -<template> - <span class="content"> - <Username :user="message.from" /> - <i class="hostmask"> (<ParsedMessage :network="network" :text="message.hostmask" />)</i> - <template v-if="message.account"> - <i class="account"> [{{ message.account }}]</i> - </template> - <template v-if="message.gecos"> - <i class="realname"> ({{ message.gecos }})</i> - </template> - has joined the channel - </span> -</template> - -<script lang="ts"> -import {defineComponent, PropType} from "vue"; -import {ClientNetwork, ClientMessage} from "../../js/types"; -import ParsedMessage from "../ParsedMessage.vue"; -import Username from "../Username.vue"; - -export default defineComponent({ - name: "MessageTypeJoin", - components: { - ParsedMessage, - Username, - }, - props: { - network: { - type: Object as PropType<ClientNetwork>, - required: true, - }, - message: { - type: Object as PropType<ClientMessage>, - required: true, - }, - }, -}); -</script> diff --git a/client/components/MessageTypes/kick.vue b/client/components/MessageTypes/kick.vue deleted file mode 100644 index fa312595..00000000 --- a/client/components/MessageTypes/kick.vue +++ /dev/null @@ -1,35 +0,0 @@ -<template> - <span class="content"> - <Username :user="message.from" /> - has kicked - <Username :user="message.target" /> - <i v-if="message.text" class="part-reason" - > (<ParsedMessage :network="network" :message="message" />)</i - > - </span> -</template> - -<script lang="ts"> -import {defineComponent, PropType} from "vue"; -import {ClientNetwork, ClientMessage} from "../../js/types"; -import ParsedMessage from "../ParsedMessage.vue"; -import Username from "../Username.vue"; - -export default defineComponent({ - name: "MessageTypeKick", - components: { - ParsedMessage, - Username, - }, - props: { - network: { - type: Object as PropType<ClientNetwork>, - required: true, - }, - message: { - type: Object as PropType<ClientMessage>, - required: true, - }, - }, -}); -</script> diff --git a/client/components/MessageTypes/mode.vue b/client/components/MessageTypes/mode.vue deleted file mode 100644 index 08fac02a..00000000 --- a/client/components/MessageTypes/mode.vue +++ /dev/null @@ -1,32 +0,0 @@ -<template> - <span class="content"> - <Username :user="message.from" /> - sets mode - <ParsedMessage :message="message" /> - </span> -</template> - -<script lang="ts"> -import {defineComponent, PropType} from "vue"; -import {ClientNetwork, ClientMessage} from "../../js/types"; -import ParsedMessage from "../ParsedMessage.vue"; -import Username from "../Username.vue"; - -export default defineComponent({ - name: "MessageTypeMode", - components: { - ParsedMessage, - Username, - }, - props: { - network: { - type: Object as PropType<ClientNetwork>, - required: true, - }, - message: { - type: Object as PropType<ClientMessage>, - required: true, - }, - }, -}); -</script> diff --git a/client/components/MessageTypes/mode_channel.vue b/client/components/MessageTypes/mode_channel.vue deleted file mode 100644 index f79c9990..00000000 --- a/client/components/MessageTypes/mode_channel.vue +++ /dev/null @@ -1,24 +0,0 @@ -<template> - <span class="content"> - Channel mode is <b>{{ message.text }}</b> - </span> -</template> - -<script lang="ts"> -import {defineComponent, PropType} from "vue"; -import {ClientNetwork, ClientMessage} from "../../js/types"; - -export default defineComponent({ - name: "MessageChannelMode", - props: { - network: { - type: Object as PropType<ClientNetwork>, - required: true, - }, - message: { - type: Object as PropType<ClientMessage>, - required: true, - }, - }, -}); -</script> diff --git a/client/components/MessageTypes/mode_user.vue b/client/components/MessageTypes/mode_user.vue deleted file mode 100644 index a4ec7d01..00000000 --- a/client/components/MessageTypes/mode_user.vue +++ /dev/null @@ -1,24 +0,0 @@ -<template> - <span class="content"> - Your user mode is <b>{{ message.raw_modes }}</b> - </span> -</template> - -<script lang="ts"> -import {defineComponent, PropType} from "vue"; -import {ClientNetwork, ClientMessage} from "../../js/types"; - -export default defineComponent({ - name: "MessageChannelMode", - props: { - network: { - type: Object as PropType<ClientNetwork>, - required: true, - }, - message: { - type: Object as PropType<ClientMessage>, - required: true, - }, - }, -}); -</script> diff --git a/client/components/MessageTypes/monospace_block.vue b/client/components/MessageTypes/monospace_block.vue deleted file mode 100644 index a1d29b1a..00000000 --- a/client/components/MessageTypes/monospace_block.vue +++ /dev/null @@ -1,49 +0,0 @@ -<template> - <span class="content"> - <span class="text"><ParsedMessage :network="network" :text="cleanText" /></span> - </span> -</template> - -<script lang="ts"> -import {computed, defineComponent, PropType} from "vue"; -import {ClientNetwork, ClientMessage} from "../../js/types"; -import ParsedMessage from "../ParsedMessage.vue"; - -export default defineComponent({ - name: "MessageTypeMonospaceBlock", - components: { - ParsedMessage, - }, - props: { - network: { - type: Object as PropType<ClientNetwork>, - required: true, - }, - message: { - type: Object as PropType<ClientMessage>, - required: true, - }, - }, - setup(props) { - const cleanText = computed(() => { - let lines = props.message.text.split("\n"); - - // If all non-empty lines of the MOTD start with a hyphen (which is common - // across MOTDs), remove all the leading hyphens. - if (lines.every((line) => line === "" || line[0] === "-")) { - lines = lines.map((line) => line.substring(2)); - } - - // Remove empty lines around the MOTD (but not within it) - return lines - .map((line) => line.replace(/\s*$/, "")) - .join("\n") - .replace(/^[\r\n]+|[\r\n]+$/g, ""); - }); - - return { - cleanText, - }; - }, -}); -</script> diff --git a/client/components/MessageTypes/nick.vue b/client/components/MessageTypes/nick.vue deleted file mode 100644 index b79b2a03..00000000 --- a/client/components/MessageTypes/nick.vue +++ /dev/null @@ -1,30 +0,0 @@ -<template> - <span class="content"> - <Username :user="message.from" /> - is now known as - <Username :user="{nick: message.new_nick, mode: message.from.mode}" /> - </span> -</template> - -<script lang="ts"> -import {defineComponent, PropType} from "vue"; -import {ClientNetwork, ClientMessage} from "../../js/types"; -import Username from "../Username.vue"; - -export default defineComponent({ - name: "MessageTypeNick", - components: { - Username, - }, - props: { - network: { - type: Object as PropType<ClientNetwork>, - required: true, - }, - message: { - type: Object as PropType<ClientMessage>, - required: true, - }, - }, -}); -</script> diff --git a/client/components/MessageTypes/part.vue b/client/components/MessageTypes/part.vue deleted file mode 100644 index d889a166..00000000 --- a/client/components/MessageTypes/part.vue +++ /dev/null @@ -1,35 +0,0 @@ -<template> - <span class="content"> - <Username :user="message.from" /> - <i class="hostmask"> (<ParsedMessage :network="network" :text="message.hostmask" />)</i> has - left the channel - <i v-if="message.text" class="part-reason" - >(<ParsedMessage :network="network" :message="message" />)</i - > - </span> -</template> - -<script lang="ts"> -import {defineComponent, PropType} from "vue"; -import {ClientNetwork, ClientMessage} from "../../js/types"; -import ParsedMessage from "../ParsedMessage.vue"; -import Username from "../Username.vue"; - -export default defineComponent({ - name: "MessageTypePart", - components: { - ParsedMessage, - Username, - }, - props: { - network: { - type: Object as PropType<ClientNetwork>, - required: true, - }, - message: { - type: Object as PropType<ClientMessage>, - required: true, - }, - }, -}); -</script> diff --git a/client/components/MessageTypes/quit.vue b/client/components/MessageTypes/quit.vue deleted file mode 100644 index 810127ac..00000000 --- a/client/components/MessageTypes/quit.vue +++ /dev/null @@ -1,35 +0,0 @@ -<template> - <span class="content"> - <Username :user="message.from" /> - <i class="hostmask"> (<ParsedMessage :network="network" :text="message.hostmask" />)</i> has - quit - <i v-if="message.text" class="quit-reason" - >(<ParsedMessage :network="network" :message="message" />)</i - > - </span> -</template> - -<script lang="ts"> -import {defineComponent, PropType} from "vue"; -import type {ClientMessage, ClientNetwork} from "../../js/types"; -import ParsedMessage from "../ParsedMessage.vue"; -import Username from "../Username.vue"; - -export default defineComponent({ - name: "MessageTypeQuit", - components: { - ParsedMessage, - Username, - }, - props: { - network: { - type: Object as PropType<ClientNetwork>, - required: true, - }, - message: { - type: Object as PropType<ClientMessage>, - required: true, - }, - }, -}); -</script> diff --git a/client/components/MessageTypes/raw.vue b/client/components/MessageTypes/raw.vue deleted file mode 100644 index a324a5ad..00000000 --- a/client/components/MessageTypes/raw.vue +++ /dev/null @@ -1,22 +0,0 @@ -<template> - <span class="content">{{ message.text }}</span> -</template> - -<script lang="ts"> -import {defineComponent, PropType} from "vue"; -import {ClientNetwork, ClientMessage} from "../../js/types"; - -export default defineComponent({ - name: "MessageTypeRaw", - props: { - network: { - type: Object as PropType<ClientNetwork>, - required: true, - }, - message: { - type: Object as PropType<ClientMessage>, - required: true, - }, - }, -}); -</script> diff --git a/client/components/MessageTypes/topic.vue b/client/components/MessageTypes/topic.vue deleted file mode 100644 index 4e32c6e5..00000000 --- a/client/components/MessageTypes/topic.vue +++ /dev/null @@ -1,36 +0,0 @@ -<template> - <span class="content"> - <template v-if="message.from && message.from.nick" - ><Username :user="message.from" /> has changed the topic to: - </template> - <template v-else>The topic is: </template> - <span v-if="message.text" class="new-topic" - ><ParsedMessage :network="network" :message="message" - /></span> - </span> -</template> - -<script lang="ts"> -import {defineComponent, PropType} from "vue"; -import type {ClientMessage, ClientNetwork} from "../../js/types"; -import ParsedMessage from "../ParsedMessage.vue"; -import Username from "../Username.vue"; - -export default defineComponent({ - name: "MessageTypeTopic", - components: { - ParsedMessage, - Username, - }, - props: { - network: { - type: Object as PropType<ClientNetwork>, - required: true, - }, - message: { - type: Object as PropType<ClientMessage>, - required: true, - }, - }, -}); -</script> diff --git a/client/components/MessageTypes/topic_set_by.vue b/client/components/MessageTypes/topic_set_by.vue deleted file mode 100644 index e077ad0f..00000000 --- a/client/components/MessageTypes/topic_set_by.vue +++ /dev/null @@ -1,38 +0,0 @@ -<template> - <span class="content"> - Topic set by - <Username :user="message.from" /> - on {{ messageTimeLocale }} - </span> -</template> - -<script lang="ts"> -import localetime from "../../js/helpers/localetime"; -import {computed, defineComponent, PropType} from "vue"; -import {ClientNetwork, ClientMessage} from "../../js/types"; -import Username from "../Username.vue"; - -export default defineComponent({ - name: "MessageTypeTopicSetBy", - components: { - Username, - }, - props: { - network: { - type: Object as PropType<ClientNetwork>, - required: true, - }, - message: { - type: Object as PropType<ClientMessage>, - required: true, - }, - }, - setup(props) { - const messageTimeLocale = computed(() => localetime(props.message.when)); - - return { - messageTimeLocale, - }; - }, -}); -</script> diff --git a/client/components/MessageTypes/whois.vue b/client/components/MessageTypes/whois.vue deleted file mode 100644 index 6d2c797f..00000000 --- a/client/components/MessageTypes/whois.vue +++ /dev/null @@ -1,150 +0,0 @@ -<template> - <span class="content"> - <p> - <Username :user="{nick: message.whois.nick}" /> - <span v-if="message.whois.whowas"> is offline, last information:</span> - </p> - - <dl class="whois"> - <template v-if="message.whois.account"> - <dt>Logged in as:</dt> - <dd>{{ message.whois.account }}</dd> - </template> - - <dt>Host mask:</dt> - <dd class="hostmask"> - <ParsedMessage - :network="network" - :text="message.whois.ident + '@' + message.whois.hostname" - /> - </dd> - - <template v-if="message.whois.actual_hostname"> - <dt>Actual host:</dt> - <dd class="hostmask"> - <a - :href="'https://ipinfo.io/' + message.whois.actual_ip" - target="_blank" - rel="noopener" - >{{ message.whois.actual_ip }}</a - > - <i v-if="message.whois.actual_hostname != message.whois.actual_ip"> - ({{ message.whois.actual_hostname }})</i - > - </dd> - </template> - - <template v-if="message.whois.actual_username"> - <dt>Actual username:</dt> - <dd>{{ message.whois.actual_username }}</dd> - </template> - - <template v-if="message.whois.real_name"> - <dt>Real name:</dt> - <dd><ParsedMessage :network="network" :text="message.whois.real_name" /></dd> - </template> - - <template v-if="message.whois.registered_nick"> - <dt>Registered nick:</dt> - <dd>{{ message.whois.registered_nick }}</dd> - </template> - - <template v-if="message.whois.channels"> - <dt>Channels:</dt> - <dd><ParsedMessage :network="network" :text="message.whois.channels" /></dd> - </template> - - <template v-if="message.whois.modes"> - <dt>Modes:</dt> - <dd>{{ message.whois.modes }}</dd> - </template> - - <template v-if="message.whois.special"> - <template v-for="special in message.whois.special" :key="special"> - <dt>Special:</dt> - <dd>{{ special }}</dd> - </template> - </template> - - <template v-if="message.whois.operator"> - <dt>Operator:</dt> - <dd>{{ message.whois.operator }}</dd> - </template> - - <template v-if="message.whois.helpop"> - <dt>Available for help:</dt> - <dd>Yes</dd> - </template> - - <template v-if="message.whois.bot"> - <dt>Is a bot:</dt> - <dd>Yes</dd> - </template> - - <template v-if="message.whois.away"> - <dt>Away:</dt> - <dd><ParsedMessage :network="network" :text="message.whois.away" /></dd> - </template> - - <template v-if="message.whois.secure"> - <dt>Secure connection:</dt> - <dd>Yes</dd> - </template> - - <template v-if="message.whois.certfps"> - <template v-for="certfp in message.whois.certfps" :key="certfp"> - <dt>Certificate:</dt> - <dd>{{ certfp }}</dd> - </template> - </template> - - <template v-if="message.whois.server"> - <dt>Connected to:</dt> - <dd> - {{ message.whois.server }} <i>({{ message.whois.server_info }})</i> - </dd> - </template> - - <template v-if="message.whois.logonTime"> - <dt>Connected at:</dt> - <dd>{{ localetime(message.whois.logonTime) }}</dd> - </template> - - <template v-if="message.whois.idle"> - <dt>Idle since:</dt> - <dd>{{ localetime(message.whois.idleTime) }}</dd> - </template> - </dl> - </span> -</template> - -<script lang="ts"> -import {defineComponent, PropType} from "vue"; -import localetime from "../../js/helpers/localetime"; -import {ClientNetwork, ClientMessage} from "../../js/types"; -import ParsedMessage from "../ParsedMessage.vue"; -import Username from "../Username.vue"; - -export default defineComponent({ - name: "MessageTypeWhois", - components: { - ParsedMessage, - Username, - }, - props: { - network: { - type: Object as PropType<ClientNetwork>, - required: true, - }, - message: { - type: Object as PropType<ClientMessage>, - required: true, - }, - }, - setup() { - return { - localetime: (date: Date) => localetime(date), - }; - }, -}); -</script> diff --git a/client/components/NetworkForm.vue b/client/components/NetworkForm.vue deleted file mode 100644 index 87aca0b0..00000000 --- a/client/components/NetworkForm.vue +++ /dev/null @@ -1,572 +0,0 @@ -<template> - <div id="connect" class="window" role="tabpanel" aria-label="Connect"> - <div class="header"> - <SidebarToggle /> - </div> - <form class="container" method="post" action="" @submit.prevent="onSubmit"> - <h1 class="title"> - <template v-if="defaults.uuid"> - <input v-model="defaults.uuid" type="hidden" name="uuid" /> - Edit {{ defaults.name }} - </template> - <template v-else> - Connect - <template - v-if="config?.lockNetwork && store?.state.serverConfiguration?.public" - > - to {{ defaults.name }} - </template> - </template> - </h1> - <template v-if="!config?.lockNetwork"> - <h2>Network settings</h2> - <div class="connect-row"> - <label for="connect:name">Name</label> - <input - id="connect:name" - v-model.trim="defaults.name" - class="input" - name="name" - maxlength="100" - /> - </div> - <div class="connect-row"> - <label for="connect:host">Server</label> - <div class="input-wrap"> - <input - id="connect:host" - v-model.trim="defaults.host" - class="input" - name="host" - aria-label="Server address" - maxlength="255" - required - /> - <span id="connect:portseparator">:</span> - <input - id="connect:port" - v-model="defaults.port" - class="input" - type="number" - min="1" - max="65535" - name="port" - aria-label="Server port" - /> - </div> - </div> - <div class="connect-row"> - <label for="connect:password">Password</label> - <RevealPassword - v-slot:default="slotProps" - class="input-wrap password-container" - > - <input - id="connect:password" - v-model="defaults.password" - class="input" - :type="slotProps.isVisible ? 'text' : 'password'" - placeholder="Server password (optional)" - name="password" - maxlength="300" - /> - </RevealPassword> - </div> - <div class="connect-row"> - <label></label> - <div class="input-wrap"> - <label class="tls"> - <input - v-model="defaults.tls" - type="checkbox" - name="tls" - :disabled="defaults.hasSTSPolicy" - /> - Use secure connection (TLS) - <span - v-if="defaults.hasSTSPolicy" - class="tooltipped tooltipped-n tooltipped-no-delay" - aria-label="This network has a strict transport security policy, you will be unable to disable TLS" - >🔒 STS</span - > - </label> - <label class="tls"> - <input - v-model="defaults.rejectUnauthorized" - type="checkbox" - name="rejectUnauthorized" - /> - Only allow trusted certificates - </label> - </div> - </div> - - <h2>Proxy Settings</h2> - <div class="connect-row"> - <label></label> - <div class="input-wrap"> - <label for="connect:proxyEnabled"> - <input - id="connect:proxyEnabled" - v-model="defaults.proxyEnabled" - type="checkbox" - name="proxyEnabled" - /> - Enable Proxy - </label> - </div> - </div> - <template v-if="defaults.proxyEnabled"> - <div class="connect-row"> - <label for="connect:proxyHost">SOCKS Address</label> - <div class="input-wrap"> - <input - id="connect:proxyHost" - v-model.trim="defaults.proxyHost" - class="input" - name="proxyHost" - aria-label="Proxy host" - maxlength="255" - /> - <span id="connect:proxyPortSeparator">:</span> - <input - id="connect:proxyPort" - v-model="defaults.proxyPort" - class="input" - type="number" - min="1" - max="65535" - name="proxyPort" - aria-label="SOCKS port" - /> - </div> - </div> - - <div class="connect-row"> - <label for="connect:proxyUsername">Proxy username</label> - <input - id="connect:proxyUsername" - ref="proxyUsernameInput" - v-model.trim="defaults.proxyUsername" - class="input username" - name="proxyUsername" - maxlength="100" - placeholder="Proxy username" - /> - </div> - - <div class="connect-row"> - <label for="connect:proxyPassword">Proxy password</label> - <RevealPassword - v-slot:default="slotProps" - class="input-wrap password-container" - > - <input - id="connect:proxyPassword" - ref="proxyPassword" - v-model="defaults.proxyPassword" - class="input" - :type="slotProps.isVisible ? 'text' : 'password'" - placeholder="Proxy password" - name="proxyPassword" - maxlength="300" - /> - </RevealPassword> - </div> - </template> - </template> - <template v-else-if="config.lockNetwork && !store.state.serverConfiguration?.public"> - <h2>Network settings</h2> - <div class="connect-row"> - <label for="connect:name">Name</label> - <input - id="connect:name" - v-model.trim="defaults.name" - class="input" - name="name" - maxlength="100" - /> - </div> - <div class="connect-row"> - <label for="connect:password">Password</label> - <RevealPassword - v-slot:default="slotProps" - class="input-wrap password-container" - > - <input - id="connect:password" - v-model="defaults.password" - class="input" - :type="slotProps.isVisible ? 'text' : 'password'" - placeholder="Server password (optional)" - name="password" - maxlength="300" - /> - </RevealPassword> - </div> - </template> - - <h2>User preferences</h2> - <div class="connect-row"> - <label for="connect:nick">Nick</label> - <input - id="connect:nick" - v-model="defaults.nick" - class="input nick" - name="nick" - pattern="[^\s:!@]+" - maxlength="100" - required - @input="onNickChanged" - /> - </div> - <template v-if="!config?.useHexIp"> - <div class="connect-row"> - <label for="connect:username">Username</label> - <input - id="connect:username" - ref="usernameInput" - v-model.trim="defaults.username" - class="input username" - name="username" - maxlength="100" - /> - </div> - </template> - <div class="connect-row"> - <label for="connect:realname">Real name</label> - <input - id="connect:realname" - v-model.trim="defaults.realname" - class="input" - name="realname" - maxlength="300" - /> - </div> - <div class="connect-row"> - <label for="connect:leaveMessage">Leave message</label> - <input - id="connect:leaveMessage" - v-model.trim="defaults.leaveMessage" - autocomplete="off" - class="input" - name="leaveMessage" - placeholder="The Lounge - https://thelounge.chat" - /> - </div> - <template v-if="defaults.uuid && !store.state.serverConfiguration?.public"> - <div class="connect-row"> - <label for="connect:commands"> - Commands - <span - class="tooltipped tooltipped-ne tooltipped-no-delay" - aria-label="One /command per line. -Each command will be executed in -the server tab on new connection" - > - <button class="extra-help" /> - </span> - </label> - <textarea - id="connect:commands" - ref="commandsInput" - autocomplete="off" - :value="defaults.commands ? defaults.commands.join('\n') : ''" - class="input" - name="commands" - @input="resizeCommandsInput" - /> - </div> - </template> - <template v-else-if="!defaults.uuid"> - <div class="connect-row"> - <label for="connect:channels">Channels</label> - <input - id="connect:channels" - v-model.trim="defaults.join" - class="input" - name="join" - /> - </div> - </template> - - <template v-if="store.state.serverConfiguration?.public"> - <template v-if="config?.lockNetwork"> - <div class="connect-row"> - <label></label> - <div class="input-wrap"> - <label class="tls"> - <input v-model="displayPasswordField" type="checkbox" /> - I have a password - </label> - </div> - </div> - <div v-if="displayPasswordField" class="connect-row"> - <label for="connect:password">Password</label> - <RevealPassword - v-slot:default="slotProps" - class="input-wrap password-container" - > - <input - id="connect:password" - ref="publicPassword" - v-model="defaults.password" - class="input" - :type="slotProps.isVisible ? 'text' : 'password'" - placeholder="Server password (optional)" - name="password" - maxlength="300" - /> - </RevealPassword> - </div> - </template> - </template> - <template v-else> - <h2 id="label-auth">Authentication</h2> - <div class="connect-row connect-auth" role="group" aria-labelledby="label-auth"> - <label class="opt"> - <input - :checked="!defaults.sasl" - type="radio" - name="sasl" - value="" - @change="setSaslAuth('')" - /> - No authentication - </label> - <label class="opt"> - <input - :checked="defaults.sasl === 'plain'" - type="radio" - name="sasl" - value="plain" - @change="setSaslAuth('plain')" - /> - Username + password (SASL PLAIN) - </label> - <label - v-if="!store.state.serverConfiguration?.public && defaults.tls" - class="opt" - > - <input - :checked="defaults.sasl === 'external'" - type="radio" - name="sasl" - value="external" - @change="setSaslAuth('external')" - /> - Client certificate (SASL EXTERNAL) - </label> - </div> - - <template v-if="defaults.sasl === 'plain'"> - <div class="connect-row"> - <label for="connect:username">Account</label> - <input - id="connect:saslAccount" - v-model.trim="defaults.saslAccount" - class="input" - name="saslAccount" - maxlength="100" - required - /> - </div> - <div class="connect-row"> - <label for="connect:password">Password</label> - <RevealPassword - v-slot:default="slotProps" - class="input-wrap password-container" - > - <input - id="connect:saslPassword" - v-model="defaults.saslPassword" - class="input" - :type="slotProps.isVisible ? 'text' : 'password'" - name="saslPassword" - maxlength="300" - required - /> - </RevealPassword> - </div> - </template> - <div v-else-if="defaults.sasl === 'external'" class="connect-sasl-external"> - <p>The Lounge automatically generates and manages the client certificate.</p> - <p> - On the IRC server, you will need to tell the services to attach the - certificate fingerprint (certfp) to your account, for example: - </p> - <pre><code>/msg NickServ CERT ADD</code></pre> - </div> - </template> - - <div> - <button type="submit" class="btn" :disabled="disabled ? true : false"> - <template v-if="defaults.uuid">Save network</template> - <template v-else>Connect</template> - </button> - </div> - </form> - </div> -</template> - -<style> -#connect .connect-auth { - display: block; - margin-bottom: 10px; -} - -#connect .connect-auth .opt { - display: block; - width: 100%; -} - -#connect .connect-auth input { - margin: 3px 10px 0 0; -} - -#connect .connect-sasl-external { - padding: 10px; - border-radius: 2px; - background-color: #d9edf7; - color: #31708f; -} - -#connect .connect-sasl-external pre { - margin: 0; - user-select: text; -} -</style> - -<script lang="ts"> -import RevealPassword from "./RevealPassword.vue"; -import SidebarToggle from "./SidebarToggle.vue"; -import {defineComponent, nextTick, PropType, ref, watch} from "vue"; -import {useStore} from "../js/store"; -import {ClientNetwork} from "../js/types"; - -export type NetworkFormDefaults = Partial<ClientNetwork> & { - join?: string; -}; - -export default defineComponent({ - name: "NetworkForm", - components: { - RevealPassword, - SidebarToggle, - }, - props: { - handleSubmit: { - type: Function as PropType<(network: ClientNetwork) => void>, - required: true, - }, - defaults: { - type: Object as PropType<NetworkFormDefaults>, - required: true, - }, - disabled: Boolean, - }, - setup(props) { - const store = useStore(); - const config = ref(store.state.serverConfiguration); - const previousUsername = ref(props.defaults?.username); - const displayPasswordField = ref(false); - - const publicPassword = ref<HTMLInputElement | null>(null); - - watch(displayPasswordField, (newValue) => { - if (newValue) { - void nextTick(() => { - publicPassword.value?.focus(); - }); - } - }); - - const commandsInput = ref<HTMLInputElement | null>(null); - - const resizeCommandsInput = () => { - if (!commandsInput.value) { - return; - } - - // Reset height first so it can down size - commandsInput.value.style.height = ""; - - // 2 pixels to account for the border - commandsInput.value.style.height = `${Math.ceil( - commandsInput.value.scrollHeight + 2 - )}px`; - }; - - watch( - // eslint-disable-next-line - () => props.defaults?.commands, - () => { - void nextTick(() => { - resizeCommandsInput(); - }); - } - ); - - watch( - // eslint-disable-next-line - () => props.defaults?.tls, - (isSecureChecked) => { - const ports = [6667, 6697]; - const newPort = isSecureChecked ? 0 : 1; - - // If you disable TLS and current port is 6697, - // set it to 6667, and vice versa - if (props.defaults?.port === ports[newPort]) { - props.defaults.port = ports[1 - newPort]; - } - } - ); - - const setSaslAuth = (type: string) => { - if (props.defaults) { - props.defaults.sasl = type; - } - }; - - const usernameInput = ref<HTMLInputElement | null>(null); - - const onNickChanged = (event: Event) => { - if (!usernameInput.value) { - return; - } - - const usernameRef = usernameInput.value; - - if (!usernameRef.value || usernameRef.value === previousUsername.value) { - usernameRef.value = (event.target as HTMLInputElement)?.value; - } - - previousUsername.value = (event.target as HTMLInputElement)?.value; - }; - - const onSubmit = (event: Event) => { - const formData = new FormData(event.target as HTMLFormElement); - const data: Partial<ClientNetwork> = {}; - - formData.forEach((value, key) => { - data[key] = value; - }); - - props.handleSubmit(data as ClientNetwork); - }; - - return { - store, - config, - displayPasswordField, - publicPassword, - commandsInput, - resizeCommandsInput, - setSaslAuth, - usernameInput, - onNickChanged, - onSubmit, - }; - }, -}); -</script> diff --git a/client/components/NetworkList.vue b/client/components/NetworkList.vue deleted file mode 100644 index 659af67f..00000000 --- a/client/components/NetworkList.vue +++ /dev/null @@ -1,576 +0,0 @@ -<template> - <div - v-if="store.state.networks.length === 0" - class="empty" - role="navigation" - aria-label="Network and Channel list" - > - You are not connected to any networks yet. - </div> - <div v-else ref="networklist" role="navigation" aria-label="Network and Channel list"> - <div class="jump-to-input"> - <input - ref="searchInput" - :value="searchText" - placeholder="Jump to..." - type="search" - class="search input mousetrap" - aria-label="Search among the channel list" - tabindex="-1" - @input="setSearchText" - @keydown.up="navigateResults($event, -1)" - @keydown.down="navigateResults($event, 1)" - @keydown.page-up="navigateResults($event, -10)" - @keydown.page-down="navigateResults($event, 10)" - @keydown.enter="selectResult" - @keydown.escape="deactivateSearch" - @focus="activateSearch" - /> - </div> - <div v-if="searchText" class="jump-to-results"> - <div v-if="results.length"> - <div - v-for="item in results" - :key="item.channel.id" - @mouseenter="setActiveSearchItem(item.channel)" - @click.prevent="selectResult" - > - <Channel - v-if="item.channel.type !== 'lobby'" - :channel="item.channel" - :network="item.network" - :active="item.channel === activeSearchItem" - :is-filtering="true" - /> - <NetworkLobby - v-else - :channel="item.channel" - :network="item.network" - :active="item.channel === activeSearchItem" - :is-filtering="true" - /> - </div> - </div> - <div v-else class="no-results">No results found.</div> - </div> - <Draggable - v-else - :list="store.state.networks" - :delay="LONG_TOUCH_DURATION" - :delay-on-touch-only="true" - :touch-start-threshold="10" - handle=".channel-list-item[data-type='lobby']" - draggable=".network" - ghost-class="ui-sortable-ghost" - drag-class="ui-sortable-dragging" - group="networks" - class="networks" - item-key="uuid" - @change="onNetworkSort" - @choose="onDraggableChoose" - @unchoose="onDraggableUnchoose" - > - <template v-slot:item="{element: network}"> - <div - :id="'network-' + network.uuid" - :key="network.uuid" - :class="{ - collapsed: network.isCollapsed, - 'not-connected': !network.status.connected, - 'not-secure': !network.status.secure, - }" - class="network" - role="region" - aria-live="polite" - @touchstart="onDraggableTouchStart" - @touchmove="onDraggableTouchMove" - @touchend="onDraggableTouchEnd" - @touchcancel="onDraggableTouchEnd" - > - <NetworkLobby - :network="network" - :is-join-channel-shown="network.isJoinChannelShown" - :active=" - store.state.activeChannel && - network.channels[0] === store.state.activeChannel.channel - " - @toggle-join-channel=" - network.isJoinChannelShown = !network.isJoinChannelShown - " - /> - <JoinChannel - v-if="network.isJoinChannelShown" - :network="network" - :channel="network.channels[0]" - @toggle-join-channel=" - network.isJoinChannelShown = !network.isJoinChannelShown - " - /> - - <Draggable - draggable=".channel-list-item" - ghost-class="ui-sortable-ghost" - drag-class="ui-sortable-dragging" - :group="network.uuid" - :list="network.channels" - :delay="LONG_TOUCH_DURATION" - :delay-on-touch-only="true" - :touch-start-threshold="10" - class="channels" - item-key="name" - @change="onChannelSort" - @choose="onDraggableChoose" - @unchoose="onDraggableUnchoose" - > - <template v-slot:item="{element: channel, index}"> - <Channel - v-if="index > 0" - :key="channel.id" - :data-item="channel.id" - :channel="channel" - :network="network" - :active=" - store.state.activeChannel && - channel === store.state.activeChannel.channel - " - /> - </template> - </Draggable> - </div> - </template> - </Draggable> - </div> -</template> - -<style> -.jump-to-input { - margin: 8px; - position: relative; -} - -.jump-to-input .input { - margin: 0; - width: 100%; - border: 0; - color: #fff; - background-color: rgba(255, 255, 255, 0.1); - padding-right: 35px; - appearance: none; -} - -.jump-to-input .input::placeholder { - color: rgba(255, 255, 255, 0.35); -} - -.jump-to-input::before { - content: "\f002"; /* http://fontawesome.io/icon/search/ */ - color: rgba(255, 255, 255, 0.35); - position: absolute; - right: 8px; - top: 0; - bottom: 0; - pointer-events: none; - line-height: 35px !important; -} - -.jump-to-results { - margin: 0; - padding: 0; - list-style: none; - overflow: auto; -} - -.jump-to-results .no-results { - margin: 14px 8px; - text-align: center; -} - -.jump-to-results .channel-list-item.active { - cursor: pointer; -} - -.jump-to-results .channel-list-item .add-channel, -.jump-to-results .channel-list-item .close-tooltip { - display: none; -} - -.jump-to-results .channel-list-item[data-type="lobby"] { - padding: 8px 14px; -} - -.jump-to-results .channel-list-item[data-type="lobby"]::before { - content: "\f233"; -} -</style> - -<script lang="ts"> -import {computed, watch, defineComponent, nextTick, onBeforeUnmount, onMounted, ref} from "vue"; - -import Mousetrap from "mousetrap"; -import Draggable from "./Draggable.vue"; -import {filter as fuzzyFilter} from "fuzzy"; -import NetworkLobby from "./NetworkLobby.vue"; -import Channel from "./Channel.vue"; -import JoinChannel from "./JoinChannel.vue"; - -import socket from "../js/socket"; -import collapseNetworkHelper from "../js/helpers/collapseNetwork"; -import isIgnoredKeybind from "../js/helpers/isIgnoredKeybind"; -import distance from "../js/helpers/distance"; -import eventbus from "../js/eventbus"; -import {ClientChan, NetChan} from "../js/types"; -import {useStore} from "../js/store"; -import {switchToChannel} from "../js/router"; -import Sortable from "sortablejs"; - -export default defineComponent({ - name: "NetworkList", - components: { - JoinChannel, - NetworkLobby, - Channel, - Draggable, - }, - setup() { - const store = useStore(); - const searchText = ref(""); - const activeSearchItem = ref<ClientChan | null>(); - // Number of milliseconds a touch has to last to be considered long - const LONG_TOUCH_DURATION = 500; - - const startDrag = ref<[number, number] | null>(); - const searchInput = ref<HTMLInputElement | null>(null); - const networklist = ref<HTMLDivElement | null>(null); - - const sidebarWasClosed = ref(false); - - const moveItemInArray = <T>(array: T[], from: number, to: number) => { - const item = array.splice(from, 1)[0]; - array.splice(to, 0, item); - }; - - const items = computed(() => { - const newItems: NetChan[] = []; - - for (const network of store.state.networks) { - for (const channel of network.channels) { - if ( - store.state.activeChannel && - channel === store.state.activeChannel.channel - ) { - continue; - } - - newItems.push({network, channel}); - } - } - - return newItems; - }); - - const results = computed(() => { - const newResults = fuzzyFilter(searchText.value, items.value, { - extract: (item) => item.channel.name, - }).map((item) => item.original); - - return newResults; - }); - - const collapseNetwork = (event: Mousetrap.ExtendedKeyboardEvent) => { - if (isIgnoredKeybind(event)) { - return true; - } - - if (store.state.activeChannel) { - collapseNetworkHelper(store.state.activeChannel.network, true); - } - - return false; - }; - - const expandNetwork = (event: Mousetrap.ExtendedKeyboardEvent) => { - if (isIgnoredKeybind(event)) { - return true; - } - - if (store.state.activeChannel) { - collapseNetworkHelper(store.state.activeChannel.network, false); - } - - return false; - }; - - const onNetworkSort = (e: Sortable.SortableEvent) => { - const {oldIndex, newIndex} = e; - - if (oldIndex === undefined || newIndex === undefined || oldIndex === newIndex) { - return; - } - - moveItemInArray(store.state.networks, oldIndex, newIndex); - - socket.emit("sort:networks", { - order: store.state.networks.map((n) => n.uuid), - }); - }; - - const onChannelSort = (e: Sortable.SortableEvent) => { - let {oldIndex, newIndex} = e; - - if (oldIndex === undefined || newIndex === undefined || oldIndex === newIndex) { - return; - } - - // Indexes are offset by one due to the lobby - oldIndex += 1; - newIndex += 1; - - const unparsedId = e.item.getAttribute("data-item"); - - if (!unparsedId) { - return; - } - - const id = parseInt(unparsedId); - const netChan = store.getters.findChannel(id); - - if (!netChan) { - return; - } - - moveItemInArray(netChan.network.channels, oldIndex, newIndex); - - socket.emit("sort:channels", { - network: netChan.network.uuid, - order: netChan.network.channels.map((c) => c.id), - }); - }; - - const isTouchEvent = (event: any): boolean => { - // This is the same way Sortable.js detects a touch event. See - // SortableJS/Sortable@daaefeda:/src/Sortable.js#L465 - - return !!( - (event.touches && event.touches[0]) || - (event.pointerType && event.pointerType === "touch") - ); - }; - - const onDraggableChoose = (event: any) => { - const original = event.originalEvent; - - if (isTouchEvent(original)) { - // onDrag is only triggered when the user actually moves the - // dragged object but onChoose is triggered as soon as the - // item is eligible for dragging. This gives us an opportunity - // to tell the user they've held the touch long enough. - event.item.classList.add("ui-sortable-dragging-touch-cue"); - - if (original instanceof TouchEvent && original.touches.length > 0) { - startDrag.value = [original.touches[0].clientX, original.touches[0].clientY]; - } else if (original instanceof PointerEvent) { - startDrag.value = [original.clientX, original.clientY]; - } - } - }; - - const onDraggableUnchoose = (event: any) => { - event.item.classList.remove("ui-sortable-dragging-touch-cue"); - startDrag.value = null; - }; - - const onDraggableTouchStart = (event: TouchEvent) => { - if (event.touches.length === 1) { - // This prevents an iOS long touch default behavior: selecting - // the nearest selectable text. - document.body.classList.add("force-no-select"); - } - }; - - const onDraggableTouchMove = (event: TouchEvent) => { - if (startDrag.value && event.touches.length > 0) { - const touch = event.touches[0]; - const currentPosition = [touch.clientX, touch.clientY]; - - if (distance(startDrag.value, currentPosition as [number, number]) > 10) { - // Context menu is shown on Android after long touch. - // Dismiss it now that we're sure the user is dragging. - eventbus.emit("contextmenu:cancel"); - } - } - }; - - const onDraggableTouchEnd = (event: TouchEvent) => { - if (event.touches.length === 0) { - document.body.classList.remove("force-no-select"); - } - }; - - const activateSearch = () => { - if (searchInput.value === document.activeElement) { - return; - } - - sidebarWasClosed.value = store.state.sidebarOpen ? false : true; - store.commit("sidebarOpen", true); - - void nextTick(() => { - searchInput.value?.focus(); - }); - }; - - const deactivateSearch = () => { - activeSearchItem.value = null; - searchText.value = ""; - searchInput.value?.blur(); - - if (sidebarWasClosed.value) { - store.commit("sidebarOpen", false); - } - }; - - const toggleSearch = (event: Mousetrap.ExtendedKeyboardEvent) => { - if (isIgnoredKeybind(event)) { - return true; - } - - if (searchInput.value === document.activeElement) { - deactivateSearch(); - return false; - } - - activateSearch(); - return false; - }; - - const setSearchText = (e: Event) => { - searchText.value = (e.target as HTMLInputElement).value; - }; - - const setActiveSearchItem = (channel?: ClientChan) => { - if (!results.value.length) { - return; - } - - if (!channel) { - channel = results.value[0].channel; - } - - activeSearchItem.value = channel; - }; - - const scrollToActive = () => { - // Scroll the list if needed after the active class is applied - void nextTick(() => { - const el = networklist.value?.querySelector(".channel-list-item.active"); - - if (el) { - el.scrollIntoView({block: "nearest", inline: "nearest"}); - } - }); - }; - - const selectResult = () => { - if (!searchText.value || !results.value.length) { - return; - } - - if (activeSearchItem.value) { - switchToChannel(activeSearchItem.value); - deactivateSearch(); - scrollToActive(); - } - }; - - const navigateResults = (event: Event, direction: number) => { - // Prevent propagation to stop global keybind handler from capturing pagedown/pageup - // and redirecting it to the message list container for scrolling - event.stopImmediatePropagation(); - event.preventDefault(); - - if (!searchText.value) { - return; - } - - const channels = results.value.map((r) => r.channel); - - // Bail out if there's no channels to select - if (!channels.length) { - activeSearchItem.value = null; - return; - } - - let currentIndex = activeSearchItem.value - ? channels.indexOf(activeSearchItem.value) - : -1; - - // If there's no active channel select the first or last one depending on direction - if (!activeSearchItem.value || currentIndex === -1) { - activeSearchItem.value = direction ? channels[0] : channels[channels.length - 1]; - scrollToActive(); - return; - } - - currentIndex += direction; - - // Wrap around the list if necessary. Normaly each loop iterates once at most, - // but might iterate more often if pgup or pgdown are used in a very short list - while (currentIndex < 0) { - currentIndex += channels.length; - } - - while (currentIndex > channels.length - 1) { - currentIndex -= channels.length; - } - - activeSearchItem.value = channels[currentIndex]; - scrollToActive(); - }; - - watch(searchText, () => { - setActiveSearchItem(); - }); - - onMounted(() => { - Mousetrap.bind("alt+shift+right", expandNetwork); - Mousetrap.bind("alt+shift+left", collapseNetwork); - Mousetrap.bind("alt+j", toggleSearch); - }); - - onBeforeUnmount(() => { - Mousetrap.unbind("alt+shift+right"); - Mousetrap.unbind("alt+shift+left"); - Mousetrap.unbind("alt+j"); - }); - - const networkContainerRef = ref<HTMLDivElement>(); - const channelRefs = ref<{[key: string]: HTMLDivElement}>({}); - - return { - store, - networklist, - searchInput, - searchText, - results, - activeSearchItem, - LONG_TOUCH_DURATION, - - activateSearch, - deactivateSearch, - toggleSearch, - setSearchText, - setActiveSearchItem, - scrollToActive, - selectResult, - navigateResults, - onChannelSort, - onNetworkSort, - onDraggableTouchStart, - onDraggableTouchMove, - onDraggableTouchEnd, - onDraggableChoose, - onDraggableUnchoose, - }; - }, -}); -</script> diff --git a/client/components/NetworkLobby.vue b/client/components/NetworkLobby.vue deleted file mode 100644 index a2c08660..00000000 --- a/client/components/NetworkLobby.vue +++ /dev/null @@ -1,101 +0,0 @@ -<template> - <ChannelWrapper v-bind="$props" :channel="channel"> - <button - v-if="network.channels.length > 1" - :aria-controls="'network-' + network.uuid" - :aria-label="getExpandLabel(network)" - :aria-expanded="!network.isCollapsed" - class="collapse-network" - @click.stop="onCollapseClick" - > - <span class="collapse-network-icon" /> - </button> - <span v-else class="collapse-network" /> - <div class="lobby-wrap"> - <span :title="channel.name" class="name">{{ channel.name }}</span> - <span - v-if="network.status.connected && !network.status.secure" - class="not-secure-tooltip tooltipped tooltipped-w" - aria-label="Insecure connection" - > - <span class="not-secure-icon" /> - </span> - <span - v-if="!network.status.connected" - class="not-connected-tooltip tooltipped tooltipped-w" - aria-label="Disconnected" - > - <span class="not-connected-icon" /> - </span> - <span v-if="channel.unread" :class="{highlight: channel.highlight}" class="badge">{{ - unreadCount - }}</span> - </div> - <span - :aria-label="joinChannelLabel" - class="add-channel-tooltip tooltipped tooltipped-w tooltipped-no-touch" - > - <button - :class="['add-channel', {opened: isJoinChannelShown}]" - :aria-controls="'join-channel-' + channel.id" - :aria-label="joinChannelLabel" - @click.stop="$emit('toggle-join-channel')" - /> - </span> - </ChannelWrapper> -</template> - -<script lang="ts"> -import {computed, defineComponent, PropType} from "vue"; -import collapseNetwork from "../js/helpers/collapseNetwork"; -import roundBadgeNumber from "../js/helpers/roundBadgeNumber"; -import ChannelWrapper from "./ChannelWrapper.vue"; - -import type {ClientChan, ClientNetwork} from "../js/types"; - -export default defineComponent({ - name: "Channel", - components: { - ChannelWrapper, - }, - props: { - network: { - type: Object as PropType<ClientNetwork>, - required: true, - }, - isJoinChannelShown: Boolean, - active: Boolean, - isFiltering: Boolean, - }, - emits: ["toggle-join-channel"], - setup(props) { - const channel = computed(() => { - return props.network.channels[0]; - }); - - const joinChannelLabel = computed(() => { - return props.isJoinChannelShown ? "Cancel" : "Join a channel…"; - }); - - const unreadCount = computed(() => { - return roundBadgeNumber(channel.value.unread); - }); - - const onCollapseClick = () => { - collapseNetwork(props.network, !props.network.isCollapsed); - }; - - const getExpandLabel = (network: ClientNetwork) => { - return network.isCollapsed ? "Expand" : "Collapse"; - }; - - return { - channel, - joinChannelLabel, - unreadCount, - onCollapseClick, - getExpandLabel, - }; - }, -}); -</script> diff --git a/client/components/ParsedMessage.vue b/client/components/ParsedMessage.vue deleted file mode 100644 index 95311a09..00000000 --- a/client/components/ParsedMessage.vue +++ /dev/null @@ -1,22 +0,0 @@ -<script lang="ts"> -import {defineComponent, PropType, h} from "vue"; -import parse from "../js/helpers/parse"; -import type {ClientMessage, ClientNetwork} from "../js/types"; - -export default defineComponent({ - name: "ParsedMessage", - functional: true, - props: { - text: String, - message: {type: Object as PropType<ClientMessage | string>, required: false}, - network: {type: Object as PropType<ClientNetwork>, required: false}, - }, - render(context) { - return parse( - typeof context.text !== "undefined" ? context.text : context.message.text, - context.message, - context.network - ); - }, -}); -</script> diff --git a/client/components/RevealPassword.vue b/client/components/RevealPassword.vue deleted file mode 100644 index fcc2f804..00000000 --- a/client/components/RevealPassword.vue +++ /dev/null @@ -1,37 +0,0 @@ -<template> - <div> - <slot :is-visible="isVisible" /> - <span - ref="revealButton" - type="button" - :class="[ - 'reveal-password tooltipped tooltipped-n tooltipped-no-delay', - {'reveal-password-visible': isVisible}, - ]" - :aria-label="isVisible ? 'Hide password' : 'Show password'" - @click="onClick" - > - <span :aria-label="isVisible ? 'Hide password' : 'Show password'" /> - </span> - </div> -</template> - -<script lang="ts"> -import {defineComponent, ref} from "vue"; - -export default defineComponent({ - name: "RevealPassword", - setup() { - const isVisible = ref(false); - - const onClick = () => { - isVisible.value = !isVisible.value; - }; - - return { - isVisible, - onClick, - }; - }, -}); -</script> diff --git a/client/components/RoutedChat.vue b/client/components/RoutedChat.vue deleted file mode 100644 index 21452e1d..00000000 --- a/client/components/RoutedChat.vue +++ /dev/null @@ -1,66 +0,0 @@ -<template> - <Chat - v-if="activeChannel" - :network="activeChannel.network" - :channel="activeChannel.channel" - :focused="parseInt(String(route.query.focused), 10)" - @channel-changed="channelChanged" - /> -</template> - -<script lang="ts"> -import {watch, computed, defineComponent, onMounted} from "vue"; -import {useRoute} from "vue-router"; -import {useStore} from "../js/store"; -import {ClientChan} from "../js/types"; - -// Temporary component for routing channels and lobbies -import Chat from "./Chat.vue"; - -export default defineComponent({ - name: "RoutedChat", - components: { - Chat, - }, - setup() { - const route = useRoute(); - const store = useStore(); - - const activeChannel = computed(() => { - const chanId = parseInt(String(route.params.id || ""), 10); - const channel = store.getters.findChannel(chanId); - return channel; - }); - - const setActiveChannel = () => { - if (activeChannel.value) { - store.commit("activeChannel", activeChannel.value); - } - }; - - watch(activeChannel, () => { - setActiveChannel(); - }); - - onMounted(() => { - setActiveChannel(); - }); - - const channelChanged = (channel: ClientChan) => { - const chanId = channel.id; - const chanInStore = store.getters.findChannel(chanId); - - if (chanInStore?.channel) { - chanInStore.channel.unread = 0; - chanInStore.channel.highlight = 0; - } - }; - - return { - route, - activeChannel, - channelChanged, - }; - }, -}); -</script> diff --git a/client/components/Session.vue b/client/components/Session.vue deleted file mode 100644 index f827d43c..00000000 --- a/client/components/Session.vue +++ /dev/null @@ -1,83 +0,0 @@ -<template> - <div class="session-item"> - <div class="session-item-info"> - <strong>{{ session.agent }}</strong> - - <a :href="'https://ipinfo.io/' + session.ip" target="_blank" rel="noopener">{{ - session.ip - }}</a> - - <p v-if="session.active > 1" class="session-usage"> - Active in {{ session.active }} browsers - </p> - <p v-else-if="!session.current && !session.active" class="session-usage"> - Last used on <time>{{ lastUse }}</time> - </p> - </div> - <div class="session-item-btn"> - <button class="btn" @click.prevent="signOut"> - <template v-if="session.current">Sign out</template> - <template v-else>Revoke</template> - </button> - </div> - </div> -</template> - -<style> -.session-list .session-item { - display: flex; - font-size: 14px; -} - -.session-list .session-item-info { - display: flex; - flex-direction: column; - flex-grow: 1; -} - -.session-list .session-item-btn { - flex-shrink: 0; -} - -.session-list .session-usage { - font-style: italic; - color: var(--body-color-muted); -} -</style> - -<script lang="ts"> -import {computed, defineComponent, PropType} from "vue"; -import localetime from "../js/helpers/localetime"; -import Auth from "../js/auth"; -import socket from "../js/socket"; -import {ClientSession} from "../js/store"; - -export default defineComponent({ - name: "Session", - props: { - session: { - type: Object as PropType<ClientSession>, - required: true, - }, - }, - setup(props) { - const lastUse = computed(() => { - return localetime(props.session.lastUse); - }); - - const signOut = () => { - if (!props.session.current) { - socket.emit("sign-out", props.session.token); - } else { - socket.emit("sign-out"); - Auth.signout(); - } - }; - - return { - lastUse, - signOut, - }; - }, -}); -</script> diff --git a/client/components/Settings/Account.vue b/client/components/Settings/Account.vue deleted file mode 100644 index 07f836ef..00000000 --- a/client/components/Settings/Account.vue +++ /dev/null @@ -1,197 +0,0 @@ -<template> - <div> - <div - v-if=" - !store.state.serverConfiguration?.public && - !store.state.serverConfiguration?.ldapEnabled - " - id="change-password" - role="group" - aria-labelledby="label-change-password" - > - <h2 id="label-change-password">Change password</h2> - <div class="password-container"> - <label for="current-password" class="sr-only"> Enter current password </label> - <RevealPassword v-slot:default="slotProps"> - <input - id="current-password" - v-model="old_password" - autocomplete="current-password" - :type="slotProps.isVisible ? 'text' : 'password'" - name="old_password" - class="input" - placeholder="Enter current password" - /> - </RevealPassword> - </div> - <div class="password-container"> - <label for="new-password" class="sr-only"> Enter desired new password </label> - <RevealPassword v-slot:default="slotProps"> - <input - id="new-password" - v-model="new_password" - :type="slotProps.isVisible ? 'text' : 'password'" - name="new_password" - autocomplete="new-password" - class="input" - placeholder="Enter desired new password" - /> - </RevealPassword> - </div> - <div class="password-container"> - <label for="new-password-verify" class="sr-only"> Repeat new password </label> - <RevealPassword v-slot:default="slotProps"> - <input - id="new-password-verify" - v-model="verify_password" - :type="slotProps.isVisible ? 'text' : 'password'" - name="verify_password" - autocomplete="new-password" - class="input" - placeholder="Repeat new password" - /> - </RevealPassword> - </div> - <div - v-if="passwordChangeStatus && passwordChangeStatus.success" - class="feedback success" - > - Successfully updated your password - </div> - <div - v-else-if="passwordChangeStatus && passwordChangeStatus.error" - class="feedback error" - > - {{ passwordErrors[passwordChangeStatus.error] }} - </div> - <div> - <button type="submit" class="btn" @click.prevent="changePassword"> - Change password - </button> - </div> - </div> - - <div v-if="!store.state.serverConfiguration?.public" class="session-list" role="group"> - <h2>Sessions</h2> - - <h3>Current session</h3> - <Session v-if="currentSession" :session="currentSession" /> - - <template v-if="activeSessions.length > 0"> - <h3>Active sessions</h3> - <Session - v-for="session in activeSessions" - :key="session.token" - :session="session" - /> - </template> - - <h3>Other sessions</h3> - <p v-if="store.state.sessions.length === 0">Loading…</p> - <p v-else-if="otherSessions.length === 0"> - <em>You are not currently logged in to any other device.</em> - </p> - <Session - v-for="session in otherSessions" - v-else - :key="session.token" - :session="session" - /> - </div> - </div> -</template> - -<script lang="ts"> -import socket from "../../js/socket"; -import RevealPassword from "../RevealPassword.vue"; -import Session from "../Session.vue"; -import {computed, defineComponent, onMounted, PropType, ref} from "vue"; -import {useStore} from "../../js/store"; - -export default defineComponent({ - name: "UserSettings", - components: { - RevealPassword, - Session, - }, - setup() { - const store = useStore(); - - const passwordErrors = { - missing_fields: "Please fill in all fields", - password_mismatch: "Both new password fields must match", - password_incorrect: "The current password field does not match your account password", - update_failed: "Failed to update your password", - }; - - const passwordChangeStatus = ref<{ - success: boolean; - error: keyof typeof passwordErrors; - }>(); - - const old_password = ref(""); - const new_password = ref(""); - const verify_password = ref(""); - - const currentSession = computed(() => { - return store.state.sessions.find((item) => item.current); - }); - - const activeSessions = computed(() => { - return store.state.sessions.filter((item) => !item.current && item.active > 0); - }); - - const otherSessions = computed(() => { - return store.state.sessions.filter((item) => !item.current && !item.active); - }); - - onMounted(() => { - socket.emit("sessions:get"); - }); - - const changePassword = () => { - const data = { - old_password: old_password.value, - new_password: new_password.value, - verify_password: verify_password.value, - }; - - if (!data.old_password || !data.new_password || !data.verify_password) { - passwordChangeStatus.value = { - success: false, - error: "missing_fields", - }; - return; - } - - if (data.new_password !== data.verify_password) { - passwordChangeStatus.value = { - success: false, - error: "password_mismatch", - }; - return; - } - - socket.once("change-password", (response) => { - // TODO type - passwordChangeStatus.value = response as any; - }); - - socket.emit("change-password", data); - }; - - return { - store, - passwordChangeStatus, - passwordErrors, - currentSession, - activeSessions, - otherSessions, - changePassword, - old_password, - new_password, - verify_password, - }; - }, -}); -</script> diff --git a/client/components/Settings/Appearance.vue b/client/components/Settings/Appearance.vue deleted file mode 100644 index 529c0272..00000000 --- a/client/components/Settings/Appearance.vue +++ /dev/null @@ -1,179 +0,0 @@ -<template> - <div> - <h2>Messages</h2> - <div> - <label class="opt"> - <input :checked="store.state.settings.motd" type="checkbox" name="motd" /> - Show <abbr title="Message Of The Day">MOTD</abbr> - </label> - </div> - <div> - <label class="opt"> - <input - :checked="store.state.settings.showSeconds" - type="checkbox" - name="showSeconds" - /> - Include seconds in timestamp - </label> - </div> - <div> - <label class="opt"> - <input - :checked="store.state.settings.use12hClock" - type="checkbox" - name="use12hClock" - /> - Use 12-hour timestamps - </label> - </div> - <template v-if="store.state.serverConfiguration?.prefetch"> - <h2>Link previews</h2> - <div> - <label class="opt"> - <input :checked="store.state.settings.media" type="checkbox" name="media" /> - Auto-expand media - </label> - </div> - <div> - <label class="opt"> - <input :checked="store.state.settings.links" type="checkbox" name="links" /> - Auto-expand websites - </label> - </div> - </template> - <h2 id="label-status-messages"> - Status messages - <span - class="tooltipped tooltipped-n tooltipped-no-delay" - aria-label="Joins, parts, quits, kicks, nick changes, and mode changes" - > - <button class="extra-help" /> - </span> - </h2> - <div role="group" aria-labelledby="label-status-messages"> - <label class="opt"> - <input - :checked="store.state.settings.statusMessages === 'shown'" - type="radio" - name="statusMessages" - value="shown" - /> - Show all status messages individually - </label> - <label class="opt"> - <input - :checked="store.state.settings.statusMessages === 'condensed'" - type="radio" - name="statusMessages" - value="condensed" - /> - Condense status messages together - </label> - <label class="opt"> - <input - :checked="store.state.settings.statusMessages === 'hidden'" - type="radio" - name="statusMessages" - value="hidden" - /> - Hide all status messages - </label> - </div> - <h2>Visual Aids</h2> - <div> - <label class="opt"> - <input - :checked="store.state.settings.coloredNicks" - type="checkbox" - name="coloredNicks" - /> - Enable colored nicknames - </label> - <label class="opt"> - <input - :checked="store.state.settings.autocomplete" - type="checkbox" - name="autocomplete" - /> - Enable autocomplete - </label> - </div> - <div> - <label class="opt"> - <label for="nickPostfix" class="opt"> - Nick autocomplete postfix - <span - class="tooltipped tooltipped-n tooltipped-no-delay" - aria-label="Nick autocomplete postfix (for example a comma)" - > - <button class="extra-help" /> - </span> - </label> - <input - id="nickPostfix" - :value="store.state.settings.nickPostfix" - type="text" - name="nickPostfix" - class="input" - placeholder="Nick autocomplete postfix (e.g. ', ')" - /> - </label> - </div> - - <h2>Theme</h2> - <div> - <label for="theme-select" class="sr-only">Theme</label> - <select - id="theme-select" - :value="store.state.settings.theme" - name="theme" - class="input" - > - <option - v-for="theme in store.state.serverConfiguration?.themes" - :key="theme.name" - :value="theme.name" - > - {{ theme.displayName }} - </option> - </select> - </div> - - <div> - <h2>Custom Stylesheet</h2> - <label for="user-specified-css-input" class="sr-only"> - Custom stylesheet. You can override any style with CSS here. - </label> - <textarea - id="user-specified-css-input" - :value="store.state.settings.userStyles" - class="input" - name="userStyles" - placeholder="/* You can override any style with CSS here */" - /> - </div> - </div> -</template> - -<style> -textarea#user-specified-css-input { - height: 100px; -} -</style> - -<script lang="ts"> -import {defineComponent} from "vue"; -import {useStore} from "../../js/store"; - -export default defineComponent({ - name: "AppearanceSettings", - setup() { - const store = useStore(); - - return { - store, - }; - }, -}); -</script> diff --git a/client/components/Settings/General.vue b/client/components/Settings/General.vue deleted file mode 100644 index 9482554a..00000000 --- a/client/components/Settings/General.vue +++ /dev/null @@ -1,175 +0,0 @@ -<template> - <div> - <div v-if="canRegisterProtocol || hasInstallPromptEvent"> - <h2>Native app</h2> - <button - v-if="hasInstallPromptEvent" - type="button" - class="btn" - @click.prevent="nativeInstallPrompt" - > - Add The Lounge to Home screen - </button> - <button - v-if="canRegisterProtocol" - type="button" - class="btn" - @click.prevent="registerProtocol" - > - Open irc:// URLs with The Lounge - </button> - </div> - <div v-if="store.state.serverConfiguration?.fileUpload"> - <h2>File uploads</h2> - <div> - <label class="opt"> - <input - :checked="store.state.settings.uploadCanvas" - type="checkbox" - name="uploadCanvas" - /> - Attempt to remove metadata from images before uploading - <span - class="tooltipped tooltipped-n tooltipped-no-delay" - aria-label="This option renders the image into a canvas element to remove metadata from the image. - This may break orientation if your browser does not support that." - > - <button class="extra-help" /> - </span> - </label> - </div> - </div> - <div v-if="!store.state.serverConfiguration?.public"> - <h2>Settings synchronisation</h2> - <label class="opt"> - <input - :checked="store.state.settings.syncSettings" - type="checkbox" - name="syncSettings" - /> - Synchronize settings with other clients - </label> - <template v-if="!store.state.settings.syncSettings"> - <div v-if="store.state.serverHasSettings" class="settings-sync-panel"> - <p> - <strong>Warning:</strong> Checking this box will override the settings of - this client with those stored on the server. - </p> - <p> - Use the button below to enable synchronization, and override any settings - already synced to the server. - </p> - <button type="button" class="btn btn-small" @click="onForceSyncClick"> - Sync settings and enable - </button> - </div> - <div v-else class="settings-sync-panel"> - <p> - <strong>Warning:</strong> No settings have been synced before. Enabling this - will sync all settings of this client as the base for other clients. - </p> - </div> - </template> - </div> - <div v-if="!store.state.serverConfiguration?.public"> - <h2>Automatic away message</h2> - - <label class="opt"> - <label for="awayMessage" class="sr-only">Automatic away message</label> - <input - id="awayMessage" - :value="store.state.settings.awayMessage" - type="text" - name="awayMessage" - class="input" - placeholder="Away message if The Lounge is not open" - /> - </label> - </div> - </div> -</template> - -<style></style> - -<script lang="ts"> -import {computed, defineComponent, onMounted, ref} from "vue"; -import {useStore} from "../../js/store"; -import {BeforeInstallPromptEvent} from "../../js/types"; - -let installPromptEvent: BeforeInstallPromptEvent | null = null; - -window.addEventListener("beforeinstallprompt", (e) => { - e.preventDefault(); - installPromptEvent = e as BeforeInstallPromptEvent; -}); - -export default defineComponent({ - name: "GeneralSettings", - setup() { - const store = useStore(); - const canRegisterProtocol = ref(false); - - const hasInstallPromptEvent = computed(() => { - // TODO: This doesn't hide the button after clicking - return installPromptEvent !== null; - }); - - onMounted(() => { - // Enable protocol handler registration if supported, - // and the network configuration is not locked - canRegisterProtocol.value = - !!window.navigator.registerProtocolHandler && - !store.state.serverConfiguration?.lockNetwork; - }); - - const nativeInstallPrompt = () => { - if (!installPromptEvent) { - return; - } - - installPromptEvent.prompt().catch((e) => { - // eslint-disable-next-line no-console - console.error(e); - }); - - installPromptEvent = null; - }; - - const onForceSyncClick = () => { - store.dispatch("settings/syncAll", true).catch((e) => { - // eslint-disable-next-line no-console - console.error(e); - }); - - store - .dispatch("settings/update", { - name: "syncSettings", - value: true, - sync: true, - }) - .catch((e) => { - // eslint-disable-next-line no-console - console.error(e); - }); - }; - - const registerProtocol = () => { - const uri = document.location.origin + document.location.pathname + "?uri=%s"; - // @ts-expect-error - // the third argument is deprecated but recommended for compatibility: https://developer.mozilla.org/en-US/docs/Web/API/Navigator/registerProtocolHandler - window.navigator.registerProtocolHandler("irc", uri, "The Lounge"); - // @ts-expect-error - window.navigator.registerProtocolHandler("ircs", uri, "The Lounge"); - }; - - return { - store, - canRegisterProtocol, - hasInstallPromptEvent, - nativeInstallPrompt, - onForceSyncClick, - registerProtocol, - }; - }, -}); -</script> diff --git a/client/components/Settings/Navigation.vue b/client/components/Settings/Navigation.vue deleted file mode 100644 index 1b8c5f39..00000000 --- a/client/components/Settings/Navigation.vue +++ /dev/null @@ -1,103 +0,0 @@ -<template> - <!-- 220px is the width of the sidebar, and we add 100px to allow for the text --> - <aside class="settings-menu"> - <h2>Settings</h2> - <ul role="navigation" aria-label="Settings tabs"> - <SettingTabItem name="General" class-name="general" to="" /> - <SettingTabItem name="Appearance" class-name="appearance" to="appearance" /> - <SettingTabItem name="Notifications" class-name="notifications" to="notifications" /> - <SettingTabItem name="Account" class-name="account" to="account" /> - </ul> - </aside> -</template> - -<style> -.settings-menu { - position: fixed; - /* top: Header + (padding bottom of h2 - border) */ - top: calc(45px + 5px); - /* Mid page minus width of container and 30 pixels for padding */ - margin-left: calc(50% - 480px - 30px); -} - -/** The calculation is mobile + 2/3 of container width. Fairly arbitrary. */ -@media screen and (max-width: calc(768px + 320px)) { - .settings-menu { - position: static; - width: min(480px, 100%); - align-self: center; - margin: 0 auto; - padding: 0 15px; - } -} - -.settings-menu ul { - padding: 0; -} - -.settings-menu li { - font-size: 18px; - list-style: none; -} - -.settings-menu button { - color: var(--body-color-muted); - width: 100%; - height: 100%; - display: inline-block; - text-align: left; -} - -.settings-menu li:not(:last-of-type) button { - margin-bottom: 8px; -} - -.settings-menu button::before { - width: 18px; - height: 18px; - display: inline-block; - content: ""; - margin-right: 8px; -} - -.settings-menu .appearance::before { - content: "\f108"; /* http://fontawesome.io/icon/desktop/ */ -} - -.settings-menu .account::before { - content: "\f007"; /* http://fontawesome.io/icon/user/ */ -} - -.settings-menu .messages::before { - content: "\f0e0"; /* http://fontawesome.io/icon/envelope/ */ -} - -.settings-menu .notifications::before { - content: "\f0f3"; /* http://fontawesome.io/icon/bell/ */ -} - -.settings-menu .general::before { - content: "\f013"; /* http://fontawesome.io/icon/cog/ */ -} - -.settings-menu button:hover, -.settings-menu button.active { - color: var(--body-color); -} - -.settings-menu button.active { - cursor: default; -} -</style> - -<script lang="ts"> -import SettingTabItem from "./SettingTabItem.vue"; -import {defineComponent} from "vue"; - -export default defineComponent({ - name: "SettingsTabs", - components: { - SettingTabItem, - }, -}); -</script> diff --git a/client/components/Settings/Notifications.vue b/client/components/Settings/Notifications.vue deleted file mode 100644 index 4599c7c0..00000000 --- a/client/components/Settings/Notifications.vue +++ /dev/null @@ -1,188 +0,0 @@ -<template> - <div> - <template v-if="!store.state.serverConfiguration?.public"> - <h2>Push Notifications</h2> - <div> - <button - id="pushNotifications" - type="button" - class="btn" - :disabled=" - store.state.pushNotificationState !== 'supported' && - store.state.pushNotificationState !== 'subscribed' - " - @click="onPushButtonClick" - > - <template v-if="store.state.pushNotificationState === 'subscribed'"> - Unsubscribe from push notifications - </template> - <template v-else-if="store.state.pushNotificationState === 'loading'"> - Loading… - </template> - <template v-else> Subscribe to push notifications </template> - </button> - <div v-if="store.state.pushNotificationState === 'nohttps'" class="error"> - <strong>Warning</strong>: Push notifications are only supported over HTTPS - connections. - </div> - <div v-if="store.state.pushNotificationState === 'unsupported'" class="error"> - <strong>Warning</strong>: - <span>Push notifications are not supported by your browser.</span> - </div> - </div> - </template> - - <h2>Browser Notifications</h2> - <div> - <label class="opt"> - <input - id="desktopNotifications" - :checked="store.state.settings.desktopNotifications" - :disabled="store.state.desktopNotificationState === 'nohttps'" - type="checkbox" - name="desktopNotifications" - /> - Enable browser notifications<br /> - <div v-if="store.state.desktopNotificationState === 'unsupported'" class="error"> - <strong>Warning</strong>: Notifications are not supported by your browser. - </div> - <div - v-if="store.state.desktopNotificationState === 'nohttps'" - id="warnBlockedDesktopNotifications" - class="error" - > - <strong>Warning</strong>: Notifications are only supported over HTTPS - connections. - </div> - <div - v-if="store.state.desktopNotificationState === 'blocked'" - id="warnBlockedDesktopNotifications" - class="error" - > - <strong>Warning</strong>: Notifications are blocked by your browser. - </div> - </label> - </div> - <div> - <label class="opt"> - <input - :checked="store.state.settings.notification" - type="checkbox" - name="notification" - /> - Enable notification sound - </label> - </div> - <div> - <div class="opt"> - <button id="play" @click.prevent="playNotification">Play sound</button> - </div> - </div> - - <div> - <label class="opt"> - <input - :checked="store.state.settings.notifyAllMessages" - type="checkbox" - name="notifyAllMessages" - /> - Enable notification for all messages - </label> - </div> - - <div v-if="!store.state.serverConfiguration?.public"> - <label class="opt"> - <label for="highlights" class="opt"> - Custom highlights - <span - class="tooltipped tooltipped-n tooltipped-no-delay" - aria-label="If a message contains any of these comma-separated -expressions, it will trigger a highlight." - > - <button class="extra-help" /> - </span> - </label> - <input - id="highlights" - :value="store.state.settings.highlights" - type="text" - name="highlights" - class="input" - autocomplete="off" - placeholder="Comma-separated, e.g.: word, some more words, anotherword" - /> - </label> - </div> - - <div v-if="!store.state.serverConfiguration?.public"> - <label class="opt"> - <label for="highlightExceptions" class="opt"> - Highlight exceptions - <span - class="tooltipped tooltipped-n tooltipped-no-delay" - aria-label="If a message contains any of these comma-separated -expressions, it will not trigger a highlight even if it contains -your nickname or expressions defined in custom highlights." - > - <button class="extra-help" /> - </span> - </label> - <input - id="highlightExceptions" - :value="store.state.settings.highlightExceptions" - type="text" - name="highlightExceptions" - class="input" - autocomplete="off" - placeholder="Comma-separated, e.g.: word, some more words, anotherword" - /> - </label> - </div> - </div> -</template> - -<script lang="ts"> -import {computed, defineComponent} from "vue"; -import {useStore} from "../../js/store"; -import webpush from "../../js/webpush"; - -export default defineComponent({ - name: "NotificationSettings", - setup() { - const store = useStore(); - - const isIOS = computed( - () => - [ - "iPad Simulator", - "iPhone Simulator", - "iPod Simulator", - "iPad", - "iPhone", - "iPod", - ].includes(navigator.platform) || - // iPad on iOS 13 detection - (navigator.userAgent.includes("Mac") && "ontouchend" in document) - ); - - const playNotification = () => { - const pop = new Audio(); - pop.src = "audio/pop.wav"; - - // eslint-disable-next-line - pop.play(); - }; - - const onPushButtonClick = () => { - webpush.togglePushSubscription(); - }; - - return { - isIOS, - store, - playNotification, - onPushButtonClick, - }; - }, -}); -</script> diff --git a/client/components/Settings/SettingTabItem.vue b/client/components/Settings/SettingTabItem.vue deleted file mode 100644 index 6512db61..00000000 --- a/client/components/Settings/SettingTabItem.vue +++ /dev/null @@ -1,43 +0,0 @@ -<template> - <li :aria-label="name" role="tab" :aria-selected="route.name === name" aria-controls="settings"> - <router-link v-slot:default="{navigate, isExactActive}" :to="'/settings/' + to" custom> - <button - :class="['icon', className, {active: isExactActive}]" - @click="navigate" - @keypress.enter="navigate" - > - {{ name }} - </button> - </router-link> - </li> -</template> - -<script lang="ts"> -import {defineComponent} from "vue"; -import {useRoute} from "vue-router"; - -export default defineComponent({ - name: "SettingTabListItem", - props: { - name: { - type: String, - required: true, - }, - className: { - type: String, - required: true, - }, - to: { - type: String, - required: true, - }, - }, - setup() { - const route = useRoute(); - - return { - route, - }; - }, -}); -</script> diff --git a/client/components/Sidebar.vue b/client/components/Sidebar.vue deleted file mode 100644 index bc6abfbd..00000000 --- a/client/components/Sidebar.vue +++ /dev/null @@ -1,269 +0,0 @@ -<template> - <aside id="sidebar" ref="sidebar"> - <div class="scrollable-area"> - <div class="logo-container"> - <img - :src="`img/logo-${isPublic() ? 'horizontal-' : ''}transparent-bg.svg`" - class="logo" - alt="The Lounge" - role="presentation" - /> - <img - :src="`img/logo-${isPublic() ? 'horizontal-' : ''}transparent-bg-inverted.svg`" - class="logo-inverted" - alt="The Lounge" - role="presentation" - /> - <span - v-if="isDevelopment" - title="The Lounge has been built in development mode" - :style="{ - backgroundColor: '#ff9e18', - color: '#000', - padding: '2px', - borderRadius: '4px', - fontSize: '12px', - }" - >DEVELOPER</span - > - </div> - <NetworkList /> - </div> - <footer id="footer"> - <span - class="tooltipped tooltipped-n tooltipped-no-touch" - aria-label="Connect to network" - ><router-link - v-slot:default="{navigate, isActive}" - to="/connect" - role="tab" - aria-controls="connect" - > - <button - :class="['icon', 'connect', {active: isActive}]" - :aria-selected="isActive" - @click="navigate" - @keypress.enter="navigate" - /> </router-link - ></span> - <span class="tooltipped tooltipped-n tooltipped-no-touch" aria-label="Settings" - ><router-link - v-slot:default="{navigate, isActive}" - to="/settings" - role="tab" - aria-controls="settings" - > - <button - :class="['icon', 'settings', {active: isActive}]" - :aria-selected="isActive" - @click="navigate" - @keypress.enter="navigate" - ></button> </router-link - ></span> - <span - class="tooltipped tooltipped-n tooltipped-no-touch" - :aria-label=" - store.state.serverConfiguration?.isUpdateAvailable - ? 'Help\n(update available)' - : 'Help' - " - ><router-link - v-slot:default="{navigate, isActive}" - to="/help" - role="tab" - aria-controls="help" - > - <button - :aria-selected="route.name === 'Help'" - :class="[ - 'icon', - 'help', - {notified: store.state.serverConfiguration?.isUpdateAvailable}, - {active: isActive}, - ]" - @click="navigate" - @keypress.enter="navigate" - ></button> </router-link - ></span> - </footer> - </aside> -</template> - -<script lang="ts"> -import {defineComponent, nextTick, onMounted, onUnmounted, PropType, ref} from "vue"; -import {useRoute} from "vue-router"; -import {useStore} from "../js/store"; -import NetworkList from "./NetworkList.vue"; - -export default defineComponent({ - name: "Sidebar", - components: { - NetworkList, - }, - props: { - overlay: {type: Object as PropType<HTMLElement | null>, required: true}, - }, - setup(props) { - const isDevelopment = process.env.NODE_ENV !== "production"; - - const store = useStore(); - const route = useRoute(); - - const touchStartPos = ref<Touch | null>(); - const touchCurPos = ref<Touch | null>(); - const touchStartTime = ref<number>(0); - const menuWidth = ref<number>(0); - const menuIsMoving = ref<boolean>(false); - const menuIsAbsolute = ref<boolean>(false); - - const sidebar = ref<HTMLElement | null>(null); - - const toggle = (state: boolean) => { - store.commit("sidebarOpen", state); - }; - - const onTouchMove = (e: TouchEvent) => { - const touch = (touchCurPos.value = e.touches.item(0)); - - if ( - !touch || - !touchStartPos.value || - !touchStartPos.value.screenX || - !touchStartPos.value.screenY - ) { - return; - } - - let distX = touch.screenX - touchStartPos.value.screenX; - const distY = touch.screenY - touchStartPos.value.screenY; - - if (!menuIsMoving.value) { - // tan(45°) is 1. Gestures in 0°-45° (< 1) are considered horizontal, so - // menu must be open; gestures in 45°-90° (>1) are considered vertical, so - // chat windows must be scrolled. - if (Math.abs(distY / distX) >= 1) { - // eslint-disable-next-line no-use-before-define - onTouchEnd(); - return; - } - - const devicePixelRatio = window.devicePixelRatio || 2; - - if (Math.abs(distX) > devicePixelRatio) { - store.commit("sidebarDragging", true); - menuIsMoving.value = true; - } - } - - // Do not animate the menu on desktop view - if (!menuIsAbsolute.value) { - return; - } - - if (store.state.sidebarOpen) { - distX += menuWidth.value; - } - - if (distX > menuWidth.value) { - distX = menuWidth.value; - } else if (distX < 0) { - distX = 0; - } - - if (sidebar.value) { - sidebar.value.style.transform = "translate3d(" + distX.toString() + "px, 0, 0)"; - } - - if (props.overlay) { - props.overlay.style.opacity = `${distX / menuWidth.value}`; - } - }; - - const onTouchEnd = () => { - if (!touchStartPos.value?.screenX || !touchCurPos.value?.screenX) { - return; - } - - const diff = touchCurPos.value.screenX - touchStartPos.value.screenX; - const absDiff = Math.abs(diff); - - if ( - absDiff > menuWidth.value / 2 || - (Date.now() - touchStartTime.value < 180 && absDiff > 50) - ) { - toggle(diff > 0); - } - - document.body.removeEventListener("touchmove", onTouchMove); - document.body.removeEventListener("touchend", onTouchEnd); - - store.commit("sidebarDragging", false); - - touchStartPos.value = null; - touchCurPos.value = null; - touchStartTime.value = 0; - menuIsMoving.value = false; - - void nextTick(() => { - if (sidebar.value) { - sidebar.value.style.transform = ""; - } - - if (props.overlay) { - props.overlay.style.opacity = ""; - } - }); - }; - - const onTouchStart = (e: TouchEvent) => { - if (!sidebar.value) { - return; - } - - touchStartPos.value = touchCurPos.value = e.touches.item(0); - - if (e.touches.length !== 1) { - onTouchEnd(); - return; - } - - const styles = window.getComputedStyle(sidebar.value); - - menuWidth.value = parseFloat(styles.width); - menuIsAbsolute.value = styles.position === "absolute"; - - if ( - !store.state.sidebarOpen || - (touchStartPos.value?.screenX && touchStartPos.value.screenX > menuWidth.value) - ) { - touchStartTime.value = Date.now(); - - document.body.addEventListener("touchmove", onTouchMove, {passive: true}); - document.body.addEventListener("touchend", onTouchEnd, {passive: true}); - } - }; - - onMounted(() => { - document.body.addEventListener("touchstart", onTouchStart, {passive: true}); - }); - - onUnmounted(() => { - document.body.removeEventListener("touchstart", onTouchStart); - }); - - const isPublic = () => document.body.classList.contains("public"); - - return { - isDevelopment, - store, - route, - sidebar, - toggle, - onTouchStart, - onTouchMove, - onTouchEnd, - isPublic, - }; - }, -}); -</script> diff --git a/client/components/SidebarToggle.vue b/client/components/SidebarToggle.vue deleted file mode 100644 index c260cac7..00000000 --- a/client/components/SidebarToggle.vue +++ /dev/null @@ -1,19 +0,0 @@ -<template> - <button class="lt" aria-label="Toggle channel list" @click="store.commit('toggleSidebar')" /> -</template> - -<script lang="ts"> -import {defineComponent} from "vue"; -import {useStore} from "../js/store"; - -export default defineComponent({ - name: "SidebarToggle", - setup() { - const store = useStore(); - - return { - store, - }; - }, -}); -</script> diff --git a/client/components/Special/ListBans.vue b/client/components/Special/ListBans.vue deleted file mode 100644 index b9c6a528..00000000 --- a/client/components/Special/ListBans.vue +++ /dev/null @@ -1,45 +0,0 @@ -<template> - <table class="ban-list"> - <thead> - <tr> - <th class="hostmask">Banned</th> - <th class="banned_by">Banned By</th> - <th class="banned_at">Banned At</th> - </tr> - </thead> - <tbody> - <tr v-for="ban in channel.data" :key="ban.hostmask"> - <td class="hostmask"><ParsedMessage :network="network" :text="ban.hostmask" /></td> - <td class="banned_by">{{ ban.banned_by }}</td> - <td class="banned_at">{{ localetime(ban.banned_at) }}</td> - </tr> - </tbody> - </table> -</template> - -<script lang="ts"> -import ParsedMessage from "../ParsedMessage.vue"; -import localeTime from "../../js/helpers/localetime"; -import {defineComponent, PropType} from "vue"; -import type {ClientNetwork, ClientChan} from "../../js/types"; - -export default defineComponent({ - name: "ListBans", - components: { - ParsedMessage, - }, - props: { - network: {type: Object as PropType<ClientNetwork>, required: true}, - channel: {type: Object as PropType<ClientChan>, required: true}, - }, - setup() { - const localetime = (date: number | Date) => { - return localeTime(date); - }; - - return { - localetime, - }; - }, -}); -</script> diff --git a/client/components/Special/ListChannels.vue b/client/components/Special/ListChannels.vue deleted file mode 100644 index fcc188e9..00000000 --- a/client/components/Special/ListChannels.vue +++ /dev/null @@ -1,36 +0,0 @@ -<template> - <span v-if="channel.data.text">{{ channel.data.text }}</span> - <table v-else class="channel-list"> - <thead> - <tr> - <th class="channel">Channel</th> - <th class="users">Users</th> - <th class="topic">Topic</th> - </tr> - </thead> - <tbody> - <tr v-for="chan in channel.data" :key="chan.channel"> - <td class="channel"><ParsedMessage :network="network" :text="chan.channel" /></td> - <td class="users">{{ chan.num_users }}</td> - <td class="topic"><ParsedMessage :network="network" :text="chan.topic" /></td> - </tr> - </tbody> - </table> -</template> - -<script lang="ts"> -import {defineComponent, PropType} from "vue"; -import {ClientChan, ClientNetwork} from "../../js/types"; -import ParsedMessage from "../ParsedMessage.vue"; - -export default defineComponent({ - name: "ListChannels", - components: { - ParsedMessage, - }, - props: { - network: {type: Object as PropType<ClientNetwork>, required: true}, - channel: {type: Object as PropType<ClientChan>, required: true}, - }, -}); -</script> diff --git a/client/components/Special/ListIgnored.vue b/client/components/Special/ListIgnored.vue deleted file mode 100644 index 4ea399de..00000000 --- a/client/components/Special/ListIgnored.vue +++ /dev/null @@ -1,39 +0,0 @@ -<template> - <table class="ignore-list"> - <thead> - <tr> - <th class="hostmask">Hostmask</th> - <th class="when">Ignored At</th> - </tr> - </thead> - <tbody> - <tr v-for="user in channel.data" :key="user.hostmask"> - <td class="hostmask"><ParsedMessage :network="network" :text="user.hostmask" /></td> - <td class="when">{{ localetime(user.when) }}</td> - </tr> - </tbody> - </table> -</template> - -<script lang="ts"> -import ParsedMessage from "../ParsedMessage.vue"; -import localetime from "../../js/helpers/localetime"; -import {defineComponent, PropType} from "vue"; -import {ClientNetwork, ClientChan} from "../../js/types"; - -export default defineComponent({ - name: "ListIgnored", - components: { - ParsedMessage, - }, - props: { - network: {type: Object as PropType<ClientNetwork>, required: true}, - channel: {type: Object as PropType<ClientChan>, required: true}, - }, - setup() { - return { - localetime, - }; - }, -}); -</script> diff --git a/client/components/Special/ListInvites.vue b/client/components/Special/ListInvites.vue deleted file mode 100644 index c04a83a5..00000000 --- a/client/components/Special/ListInvites.vue +++ /dev/null @@ -1,43 +0,0 @@ -<template> - <table class="invite-list"> - <thead> - <tr> - <th class="hostmask">Invited</th> - <th class="invitened_by">Invited By</th> - <th class="invitened_at">Invited At</th> - </tr> - </thead> - <tbody> - <tr v-for="invite in channel.data" :key="invite.hostmask"> - <td class="hostmask"> - <ParsedMessage :network="network" :text="invite.hostmask" /> - </td> - <td class="invitened_by">{{ invite.invited_by }}</td> - <td class="invitened_at">{{ localetime(invite.invited_at) }}</td> - </tr> - </tbody> - </table> -</template> - -<script lang="ts"> -import ParsedMessage from "../ParsedMessage.vue"; -import localetime from "../../js/helpers/localetime"; -import {defineComponent, PropType} from "vue"; -import {ClientNetwork, ClientChan} from "../../js/types"; - -export default defineComponent({ - name: "ListInvites", - components: { - ParsedMessage, - }, - props: { - network: {type: Object as PropType<ClientNetwork>, required: true}, - channel: {type: Object as PropType<ClientChan>, required: true}, - }, - setup() { - return { - localetime: (date: Date) => localetime(date), - }; - }, -}); -</script> diff --git a/client/components/Username.vue b/client/components/Username.vue deleted file mode 100644 index 3c5d644d..00000000 --- a/client/components/Username.vue +++ /dev/null @@ -1,84 +0,0 @@ -<template> - <span - :class="['user', {[nickColor]: store.state.settings.coloredNicks}, {active: active}]" - :data-name="user.nick" - role="button" - v-on="onHover ? {mouseenter: hover} : {}" - @click.prevent="openContextMenu" - @contextmenu.prevent="openContextMenu" - ><slot>{{ mode }}{{ user.nick }}</slot></span - > -</template> - -<script lang="ts"> -import {computed, defineComponent, PropType} from "vue"; -import {UserInMessage} from "../../shared/types/msg"; -import eventbus from "../js/eventbus"; -import colorClass from "../js/helpers/colorClass"; -import type {ClientChan, ClientNetwork} from "../js/types"; -import {useStore} from "../js/store"; - -type UsernameUser = Partial<UserInMessage> & { - mode?: string; - nick: string; -}; - -export default defineComponent({ - name: "Username", - props: { - user: { - // TODO: UserInMessage shouldn't be necessary here. - type: Object as PropType<UsernameUser | UserInMessage>, - required: true, - }, - active: Boolean, - onHover: { - type: Function as PropType<(user: UserInMessage) => void>, - required: false, - }, - channel: {type: Object as PropType<ClientChan>, required: false}, - network: {type: Object as PropType<ClientNetwork>, required: false}, - }, - setup(props) { - const mode = computed(() => { - // Message objects have a singular mode, but user objects have modes array - if (props.user.modes) { - return props.user.modes[0]; - } - - return props.user.mode; - }); - - // TODO: Nick must be ! because our user prop union includes UserInMessage - const nickColor = computed(() => colorClass(props.user.nick!)); - - const hover = () => { - if (props.onHover) { - // eslint-disable-next-line @typescript-eslint/no-unsafe-return - return props.onHover(props.user as UserInMessage); - } - - return null; - }; - - const openContextMenu = (event: Event) => { - eventbus.emit("contextmenu:user", { - event: event, - user: props.user, - network: props.network, - channel: props.channel, - }); - }; - - const store = useStore(); - - return { - mode, - nickColor, - hover, - openContextMenu, - store, - }; - }, -}); -</script> diff --git a/client/components/VersionChecker.vue b/client/components/VersionChecker.vue deleted file mode 100644 index 3070924d..00000000 --- a/client/components/VersionChecker.vue +++ /dev/null @@ -1,66 +0,0 @@ -<template> - <div id="version-checker" :class="[store.state.versionStatus]"> - <p v-if="store.state.versionStatus === 'loading'">Checking for updates…</p> - <p v-if="store.state.versionStatus === 'new-version'"> - The Lounge <b>{{ store.state.versionData?.latest.version }}</b> - <template v-if="store.state.versionData?.latest.prerelease"> (pre-release) </template> - is now available. - <br /> - - <a :href="store.state.versionData?.latest.url" target="_blank" rel="noopener"> - Read more on GitHub - </a> - </p> - <p v-if="store.state.versionStatus === 'new-packages'"> - The Lounge is up to date, but there are out of date packages Run - <code>thelounge upgrade</code> on the server to upgrade packages. - </p> - <template v-if="store.state.versionStatus === 'up-to-date'"> - <p>The Lounge is up to date!</p> - - <button - v-if="store.state.versionDataExpired" - id="check-now" - class="btn btn-small" - @click="checkNow" - > - Check now - </button> - </template> - <template v-if="store.state.versionStatus === 'error'"> - <p>Information about latest release could not be retrieved.</p> - - <button id="check-now" class="btn btn-small" @click="checkNow">Try again</button> - </template> - </div> -</template> - -<script lang="ts"> -import {defineComponent, onMounted} from "vue"; -import socket from "../js/socket"; -import {useStore} from "../js/store"; - -export default defineComponent({ - name: "VersionChecker", - setup() { - const store = useStore(); - - const checkNow = () => { - store.commit("versionData", null); - store.commit("versionStatus", "loading"); - socket.emit("changelog"); - }; - - onMounted(() => { - if (!store.state.versionData) { - checkNow(); - } - }); - - return { - store, - checkNow, - }; - }, -}); -</script> diff --git a/client/components/Windows/Changelog.vue b/client/components/Windows/Changelog.vue deleted file mode 100644 index 4515e6b5..00000000 --- a/client/components/Windows/Changelog.vue +++ /dev/null @@ -1,93 +0,0 @@ -<template> - <div id="changelog" class="window" aria-label="Changelog"> - <div class="header"> - <SidebarToggle /> - </div> - <div class="container"> - <router-link id="back-to-help" to="/help">« Help</router-link> - - <template - v-if="store.state.versionData?.current && store.state.versionData?.current.version" - > - <h1 class="title"> - Release notes for {{ store.state.versionData.current.version }} - </h1> - - <template v-if="store.state.versionData.current.changelog"> - <h3>Introduction</h3> - <div - ref="changelog" - class="changelog-text" - v-html="store.state.versionData.current.changelog" - ></div> - </template> - <template v-else> - <p>Unable to retrieve changelog for current release from GitHub.</p> - <p> - <a - v-if="store.state.serverConfiguration?.version" - :href="`https://github.com/thelounge/thelounge/releases/tag/v${store.state.serverConfiguration?.version}`" - target="_blank" - rel="noopener" - >View release notes for this version on GitHub</a - > - </p> - </template> - </template> - <p v-else>Loading changelog…</p> - </div> - </div> -</template> - -<script lang="ts"> -import {defineComponent, onMounted, onUpdated, ref} from "vue"; -import socket from "../../js/socket"; -import {useStore} from "../../js/store"; -import SidebarToggle from "../SidebarToggle.vue"; - -export default defineComponent({ - name: "Changelog", - components: { - SidebarToggle, - }, - setup() { - const store = useStore(); - const changelog = ref<HTMLDivElement | null>(null); - - const patchChangelog = () => { - if (!changelog.value) { - return; - } - - const links = changelog.value.querySelectorAll("a"); - - links.forEach((link) => { - // Make sure all links will open a new tab instead of exiting the application - link.setAttribute("target", "_blank"); - link.setAttribute("rel", "noopener"); - - if (link.querySelector("img")) { - // Add required metadata to image links, to support built-in image viewer - link.classList.add("toggle-thumbnail"); - } - }); - }; - - onMounted(() => { - if (!store.state.versionData) { - socket.emit("changelog"); - } - - patchChangelog(); - }); - - onUpdated(() => { - patchChangelog(); - }); - - return { - store, - }; - }, -}); -</script> diff --git a/client/components/Windows/Connect.vue b/client/components/Windows/Connect.vue deleted file mode 100644 index 66d2f6e4..00000000 --- a/client/components/Windows/Connect.vue +++ /dev/null @@ -1,117 +0,0 @@ -<template> - <NetworkForm :handle-submit="handleSubmit" :defaults="defaults" :disabled="disabled" /> -</template> - -<script lang="ts"> -import {defineComponent, ref} from "vue"; - -import socket from "../../js/socket"; -import {useStore} from "../../js/store"; -import NetworkForm, {NetworkFormDefaults} from "../NetworkForm.vue"; - -export default defineComponent({ - name: "Connect", - components: { - NetworkForm, - }, - props: { - queryParams: Object, - }, - setup(props) { - const store = useStore(); - - const disabled = ref(false); - - const handleSubmit = (data: Record<string, any>) => { - disabled.value = true; - socket.emit("network:new", data); - }; - - const parseOverrideParams = (params?: Record<string, string>) => { - if (!params) { - return {}; - } - - const parsedParams: Record<string, any> = {}; - - for (let key of Object.keys(params)) { - let value = params[key]; - - // Param can contain multiple values in an array if its supplied more than once - if (Array.isArray(value)) { - value = value[0]; - } - - // Support `channels` as a compatibility alias with other clients - if (key === "channels") { - key = "join"; - } - - if ( - !Object.prototype.hasOwnProperty.call( - store.state.serverConfiguration?.defaults, - key - ) - ) { - continue; - } - - // When the network is locked, URL overrides should not affect disabled fields - if ( - store.state.serverConfiguration?.lockNetwork && - ["name", "host", "port", "tls", "rejectUnauthorized"].includes(key) - ) { - continue; - } - - if (key === "join") { - value = value - .split(",") - .map((chan) => { - if (!chan.match(/^[#&!+]/)) { - return `#${chan}`; - } - - return chan; - }) - .join(", "); - } - - // Override server provided defaults with parameters passed in the URL if they match the data type - switch (typeof store.state.serverConfiguration?.defaults[key]) { - case "boolean": - if (value === "0" || value === "false") { - parsedParams[key] = false; - } else { - parsedParams[key] = !!value; - } - - break; - case "number": - parsedParams[key] = Number(value); - break; - case "string": - parsedParams[key] = String(value); - break; - } - } - - return parsedParams; - }; - - const defaults = ref<Partial<NetworkFormDefaults>>( - Object.assign( - {}, - store.state.serverConfiguration?.defaults, - parseOverrideParams(props.queryParams) - ) - ); - - return { - defaults, - disabled, - handleSubmit, - }; - }, -}); -</script> diff --git a/client/components/Windows/Help.vue b/client/components/Windows/Help.vue deleted file mode 100644 index d0715a2e..00000000 --- a/client/components/Windows/Help.vue +++ /dev/null @@ -1,879 +0,0 @@ -<template> - <div id="help" class="window" role="tabpanel" aria-label="Help"> - <div class="header"> - <SidebarToggle /> - </div> - <div class="container"> - <h1 class="title">Help</h1> - - <h2 class="help-version-title"> - <span>About The Lounge</span> - <small> - v{{ store.state.serverConfiguration?.version }} (<router-link - id="view-changelog" - to="/changelog" - >release notes</router-link - >) - </small> - </h2> - - <div class="about"> - <VersionChecker /> - - <template v-if="store.state.serverConfiguration?.gitCommit"> - <p> - The Lounge is running from source (<a - :href="`https://github.com/thelounge/thelounge/tree/${store.state.serverConfiguration?.gitCommit}`" - target="_blank" - rel="noopener" - >commit <code>{{ store.state.serverConfiguration?.gitCommit }}</code></a - >). - </p> - - <ul> - <li> - Compare - <a - :href="`https://github.com/thelounge/thelounge/compare/${store.state.serverConfiguration?.gitCommit}...master`" - target="_blank" - rel="noopener" - >between - <code>{{ store.state.serverConfiguration?.gitCommit }}</code> and - <code>master</code></a - > - to see what you are missing - </li> - <li> - Compare - <a - :href="`https://github.com/thelounge/thelounge/compare/${store.state.serverConfiguration?.version}...${store.state.serverConfiguration?.gitCommit}`" - target="_blank" - rel="noopener" - >between - <code>{{ store.state.serverConfiguration?.version }}</code> and - <code>{{ store.state.serverConfiguration?.gitCommit }}</code></a - > - to see your local changes - </li> - </ul> - </template> - - <p> - <a - href="https://thelounge.chat/" - target="_blank" - rel="noopener" - class="website-link" - >Website</a - > - </p> - <p> - <a - href="https://thelounge.chat/docs/" - target="_blank" - rel="noopener" - class="documentation-link" - >Documentation</a - > - </p> - <p> - <a - href="https://github.com/thelounge/thelounge/issues/new" - target="_blank" - rel="noopener" - class="report-issue-link" - >Report an issue…</a - > - </p> - </div> - - <h2 v-if="isTouch">Gestures</h2> - - <div v-if="isTouch" class="help-item"> - <div class="subject gesture">Single-Finger Swipe Left</div> - <div class="description"> - <p>Hide sidebar.</p> - </div> - </div> - - <div v-if="isTouch" class="help-item"> - <div class="subject gesture">Single-Finger Swipe Right</div> - <div class="description"> - <p>Show sidebar.</p> - </div> - </div> - - <div v-if="isTouch" class="help-item"> - <div class="subject gesture">Two-Finger Swipe Left</div> - <div class="description"> - <p>Switch to the next window in the channel list.</p> - </div> - </div> - - <div v-if="isTouch" class="help-item"> - <div class="subject gesture">Two-Finger Swipe Right</div> - <div class="description"> - <p>Switch to the previous window in the channel list.</p> - </div> - </div> - - <h2>Keyboard Shortcuts</h2> - - <div class="help-item"> - <div class="subject"> - <span v-if="!isApple"><kbd>Alt</kbd> <kbd>Shift</kbd> <kbd>↓</kbd></span> - <span v-else><kbd>⌥</kbd> <kbd>⇧</kbd> <kbd>↓</kbd></span> - </div> - <div class="description"> - <p>Switch to the next lobby in the channel list.</p> - </div> - </div> - - <div class="help-item"> - <div class="subject"> - <span v-if="!isApple"><kbd>Alt</kbd> <kbd>Shift</kbd> <kbd>↑</kbd></span> - <span v-else><kbd>⌥</kbd> <kbd>⇧</kbd> <kbd>↑</kbd></span> - </div> - <div class="description"> - <p>Switch to the previous lobby in the channel list.</p> - </div> - </div> - - <div class="help-item"> - <div class="subject"> - <span v-if="!isApple"><kbd>Alt</kbd> <kbd>Shift</kbd> <kbd>←</kbd></span> - <span v-else><kbd>⌥</kbd> <kbd>⇧</kbd> <kbd>←</kbd></span> - </div> - <div class="description"> - <p>Collapse current network.</p> - </div> - </div> - - <div class="help-item"> - <div class="subject"> - <span v-if="!isApple"><kbd>Alt</kbd> <kbd>Shift</kbd> <kbd>→</kbd></span> - <span v-else><kbd>⌥</kbd> <kbd>⇧</kbd> <kbd>→</kbd></span> - </div> - <div class="description"> - <p>Expand current network.</p> - </div> - </div> - - <div class="help-item"> - <div class="subject"> - <span v-if="!isApple"><kbd>Alt</kbd> <kbd>↓</kbd></span> - <span v-else><kbd>⌥</kbd> <kbd>↓</kbd></span> - </div> - <div class="description"> - <p>Switch to the next window in the channel list.</p> - </div> - </div> - - <div class="help-item"> - <div class="subject"> - <span v-if="!isApple"><kbd>Alt</kbd> <kbd>↑</kbd></span> - <span v-else><kbd>⌥</kbd> <kbd>↑</kbd></span> - </div> - <div class="description"> - <p>Switch to the previous window in the channel list.</p> - </div> - </div> - - <div class="help-item"> - <div class="subject"> - <span v-if="!isApple"><kbd>Alt</kbd> <kbd>Ctrl</kbd> <kbd>↓</kbd></span> - <span v-else><kbd>⌥</kbd> <kbd>⌘</kbd> <kbd>↓</kbd></span> - </div> - <div class="description"> - <p>Switch to the next window with unread messages in the channel list.</p> - </div> - </div> - - <div class="help-item"> - <div class="subject"> - <span v-if="!isApple"><kbd>Alt</kbd> <kbd>Ctrl</kbd> <kbd>↑</kbd></span> - <span v-else><kbd>⌥</kbd> <kbd>⌘</kbd> <kbd>↑</kbd></span> - </div> - <div class="description"> - <p>Switch to the previous window with unread messages in the channel list.</p> - </div> - </div> - - <div class="help-item"> - <div class="subject"> - <span v-if="!isApple"><kbd>Alt</kbd> <kbd>A</kbd></span> - <span v-else><kbd>⌥</kbd> <kbd>A</kbd></span> - </div> - <div class="description"> - <p>Switch to the first window with unread messages.</p> - </div> - </div> - - <div class="help-item"> - <div class="subject"> - <span v-if="!isApple"><kbd>Alt</kbd> <kbd>S</kbd></span> - <span v-else><kbd>⌥</kbd> <kbd>S</kbd></span> - </div> - <div class="description"> - <p>Toggle sidebar.</p> - </div> - </div> - - <div class="help-item"> - <div class="subject"> - <span v-if="!isApple"><kbd>Alt</kbd> <kbd>U</kbd></span> - <span v-else><kbd>⌥</kbd> <kbd>U</kbd></span> - </div> - <div class="description"> - <p>Toggle channel user list.</p> - </div> - </div> - - <div class="help-item"> - <div class="subject"> - <span v-if="!isApple"><kbd>Alt</kbd> <kbd>J</kbd></span> - <span v-else><kbd>⌥</kbd> <kbd>J</kbd></span> - </div> - <div class="description"> - <p>Toggle jump to channel switcher.</p> - </div> - </div> - - <div class="help-item"> - <div class="subject"> - <span v-if="!isApple"><kbd>Alt</kbd> <kbd>M</kbd></span> - <span v-else><kbd>⌥</kbd> <kbd>M</kbd></span> - </div> - <div class="description"> - <p>Toggle recent mentions popup.</p> - </div> - </div> - - <div class="help-item"> - <div class="subject"> - <span v-if="!isApple"><kbd>Alt</kbd> <kbd>/</kbd></span> - <span v-else><kbd>⌥</kbd> <kbd>/</kbd></span> - </div> - <div class="description"> - <p>Switch to the help menu.</p> - </div> - </div> - - <div class="help-item"> - <div class="subject"> - <span><kbd>Esc</kbd></span> - </div> - <div class="description"> - <p> - Close current contextual window (context menu, image viewer, topic edit, - etc) and remove focus from input. - </p> - </div> - </div> - - <h2>Formatting Shortcuts</h2> - - <div class="help-item"> - <div class="subject"> - <span v-if="!isApple"><kbd>Ctrl</kbd> <kbd>K</kbd></span> - <span v-else><kbd>⌘</kbd> <kbd>K</kbd></span> - </div> - <div class="description"> - <p> - Mark any text typed after this shortcut to be colored. After hitting this - shortcut, enter an integer in the range - <code>0—15</code> to select the desired color, or use the autocompletion - menu to choose a color name (see below). - </p> - <p> - Background color can be specified by putting a comma and another integer in - the range <code>0—15</code> after the foreground color number - (autocompletion works too). - </p> - <p> - A color reference can be found - <a - href="https://modern.ircdocs.horse/formatting.html#colors" - target="_blank" - rel="noopener" - >here</a - >. - </p> - </div> - </div> - - <div class="help-item"> - <div class="subject"> - <span v-if="!isApple"><kbd>Ctrl</kbd> <kbd>B</kbd></span> - <span v-else><kbd>⌘</kbd> <kbd>B</kbd></span> - </div> - <div class="description"> - <p> - Mark all text typed after this shortcut as - <span class="irc-bold">bold</span>. - </p> - </div> - </div> - - <div class="help-item"> - <div class="subject"> - <span v-if="!isApple"><kbd>Ctrl</kbd> <kbd>U</kbd></span> - <span v-else><kbd>⌘</kbd> <kbd>U</kbd></span> - </div> - <div class="description"> - <p> - Mark all text typed after this shortcut as - <span class="irc-underline">underlined</span>. - </p> - </div> - </div> - - <div class="help-item"> - <div class="subject"> - <span v-if="!isApple"><kbd>Ctrl</kbd> <kbd>I</kbd></span> - <span v-else><kbd>⌘</kbd> <kbd>I</kbd></span> - </div> - <div class="description"> - <p> - Mark all text typed after this shortcut as - <span class="irc-italic">italics</span>. - </p> - </div> - </div> - - <div class="help-item"> - <div class="subject"> - <span v-if="!isApple"><kbd>Ctrl</kbd> <kbd>S</kbd></span> - <span v-else><kbd>⌘</kbd> <kbd>S</kbd></span> - </div> - <div class="description"> - <p> - Mark all text typed after this shortcut as - <span class="irc-strikethrough">struck through</span>. - </p> - </div> - </div> - - <div class="help-item"> - <div class="subject"> - <span v-if="!isApple"><kbd>Ctrl</kbd> <kbd>M</kbd></span> - <span v-else><kbd>⌘</kbd> <kbd>M</kbd></span> - </div> - <div class="description"> - <p> - Mark all text typed after this shortcut as - <span class="irc-monospace">monospaced</span>. - </p> - </div> - </div> - - <div class="help-item"> - <div class="subject"> - <span v-if="!isApple"><kbd>Ctrl</kbd> <kbd>O</kbd></span> - <span v-else><kbd>⌘</kbd> <kbd>O</kbd></span> - </div> - <div class="description"> - <p> - Mark all text typed after this shortcut to be reset to its original - formatting. - </p> - </div> - </div> - - <h2>Autocompletion</h2> - - <p> - To auto-complete nicknames, channels, commands, and emoji, type one of the - characters below to open a suggestion list. Use the <kbd>↑</kbd> and - <kbd>↓</kbd> keys to highlight an item, and insert it by pressing <kbd>Tab</kbd> or - <kbd>Enter</kbd> (or by clicking the desired item). - </p> - <p>Autocompletion can be disabled in settings.</p> - - <div class="help-item"> - <div class="subject"> - <code>@</code> - </div> - <div class="description"> - <p>Nickname</p> - </div> - </div> - - <div class="help-item"> - <div class="subject"> - <code>#</code> - </div> - <div class="description"> - <p>Channel</p> - </div> - </div> - - <div class="help-item"> - <div class="subject"> - <code>/</code> - </div> - <div class="description"> - <p>Commands (see list of commands below)</p> - </div> - </div> - - <div class="help-item"> - <div class="subject"> - <code>:</code> - </div> - <div class="description"> - <p> - Emoji (note: requires two search characters, to avoid conflicting with - common emoticons like <code>:)</code>) - </p> - </div> - </div> - - <h2>Commands</h2> - - <div class="help-item"> - <div class="subject"> - <code>/away [message]</code> - </div> - <div class="description"> - <p>Mark yourself as away with an optional message.</p> - </div> - </div> - - <div class="help-item"> - <div class="subject"> - <code>/back</code> - </div> - <div class="description"> - <p>Remove your away status (set with <code>/away</code>).</p> - </div> - </div> - - <div class="help-item"> - <div class="subject"> - <code>/ban nick</code> - </div> - <div class="description"> - <p> - Ban (<code>+b</code>) a user from the current channel. This can be a - nickname or a hostmask. - </p> - </div> - </div> - - <div class="help-item"> - <div class="subject"> - <code>/banlist</code> - </div> - <div class="description"> - <p>Load the banlist for the current channel.</p> - </div> - </div> - - <div class="help-item"> - <div class="subject"> - <code>/collapse</code> - </div> - <div class="description"> - <p> - Collapse all previews in the current channel (opposite of - <code>/expand</code>) - </p> - </div> - </div> - - <div class="help-item"> - <div class="subject"> - <code>/connect host [port]</code> - </div> - <div class="description"> - <p> - Connect to a new IRC network. If <code>port</code> starts with a - <code>+</code> sign, the connection will be made secure using TLS. - </p> - <p>Alias: <code>/server</code></p> - </div> - </div> - - <div class="help-item"> - <div class="subject"> - <code>/ctcp target cmd [args]</code> - </div> - <div class="description"> - <p> - Send a <abbr title="Client-to-client protocol">CTCP</abbr> - request. Read more about this on - <a - href="https://en.wikipedia.org/wiki/Client-to-client_protocol" - target="_blank" - rel="noopener" - >the dedicated Wikipedia article</a - >. - </p> - </div> - </div> - - <div class="help-item"> - <div class="subject"> - <code>/deop nick [...nick]</code> - </div> - <div class="description"> - <p> - Remove op (<code>-o</code>) from one or several users in the current - channel. - </p> - </div> - </div> - - <div class="help-item"> - <div class="subject"> - <code>/devoice nick [...nick]</code> - </div> - <div class="description"> - <p> - Remove voice (<code>-v</code>) from one or several users in the current - channel. - </p> - </div> - </div> - - <div class="help-item"> - <div class="subject"> - <code>/disconnect [message]</code> - </div> - <div class="description"> - <p>Disconnect from the current network with an optionally-provided message.</p> - </div> - </div> - - <div class="help-item"> - <div class="subject"> - <code>/expand</code> - </div> - <div class="description"> - <p> - Expand all previews in the current channel (opposite of - <code>/collapse</code>) - </p> - </div> - </div> - - <div class="help-item"> - <div class="subject"> - <code>/invite nick [channel]</code> - </div> - <div class="description"> - <p> - Invite a user to the specified channel. If - <code>channel</code> is omitted, user will be invited to the current - channel. - </p> - </div> - </div> - - <div class="help-item"> - <div class="subject"> - <code>/ignore nick</code> - </div> - <div class="description"> - <p> - Block any messages from the specified user on the current network. This can - be a nickname or a hostmask. - </p> - </div> - </div> - - <div class="help-item"> - <div class="subject"> - <code>/ignorelist</code> - </div> - <div class="description"> - <p>Load the list of ignored users for the current network.</p> - </div> - </div> - - <div class="help-item"> - <div class="subject"> - <code>/join channel [password]</code> - </div> - <div class="description"> - <p> - Join a channel. Password is only needed in protected channels and can - usually be omitted. - </p> - </div> - </div> - - <div class="help-item"> - <div class="subject"> - <code>/kick nick [reason]</code> - </div> - <div class="description"> - <p>Kick a user from the current channel.</p> - </div> - </div> - - <div class="help-item"> - <div class="subject"> - <code>/kickban nick [reason]</code> - </div> - <div class="description"> - <p> - Kick and ban (<code>+b</code>) a user from the current channel. Unlike - <code>/ban</code>, only nicknames (and not host masks) can be used. - </p> - </div> - </div> - - <div class="help-item"> - <div class="subject"> - <code>/list</code> - </div> - <div class="description"> - <p>Retrieve a list of available channels on this network.</p> - </div> - </div> - - <div class="help-item"> - <div class="subject"> - <code>/me message</code> - </div> - <div class="description"> - <p> - Send an action message to the current channel. The Lounge will display it - inline, as if the message was posted in the third person. - </p> - </div> - </div> - - <div class="help-item"> - <div class="subject"> - <code>/mode flags [args]</code> - </div> - <div class="description"> - <p> - Set the given flags to the current channel if the active window is a - channel, another user if the active window is a private message window, or - yourself if the current window is a server window. - </p> - </div> - </div> - - <div class="help-item"> - <div class="subject"> - <code>/msg channel message</code> - </div> - <div class="description"> - <p>Send a message to the specified channel.</p> - </div> - </div> - - <div class="help-item"> - <div class="subject"> - <code>/mute [...channel]</code> - </div> - <div class="description"> - <p> - Prevent messages from generating any feedback for a channel. This turns off - the highlight indicator, hides mentions and inhibits push notifications. - Muting a network lobby mutes the entire network. Not specifying any channel - target mutes the current channel. Revert with <code>/unmute</code>. - </p> - </div> - </div> - - <div class="help-item"> - <div class="subject"> - <code>/nick newnick</code> - </div> - <div class="description"> - <p>Change your nickname on the current network.</p> - </div> - </div> - - <div class="help-item"> - <div class="subject"> - <code>/notice channel message</code> - </div> - <div class="description"> - <p>Sends a notice message to the specified channel.</p> - </div> - </div> - - <div class="help-item"> - <div class="subject"> - <code>/op nick [...nick]</code> - </div> - <div class="description"> - <p>Give op (<code>+o</code>) to one or several users in the current channel.</p> - </div> - </div> - - <div class="help-item"> - <div class="subject"> - <code>/part [channel]</code> - </div> - <div class="description"> - <p> - Close the specified channel or private message window, or the current - channel if <code>channel</code> is omitted. - </p> - <p>Aliases: <code>/close</code>, <code>/leave</code></p> - </div> - </div> - - <div class="help-item"> - <div class="subject"> - <code>/rejoin</code> - </div> - <div class="description"> - <p> - Leave and immediately rejoin the current channel. Useful to quickly get op - from ChanServ in an empty channel, for example. - </p> - <p>Alias: <code>/cycle</code></p> - </div> - </div> - - <div class="help-item"> - <div class="subject"> - <code>/query nick</code> - </div> - <div class="description"> - <p>Send a private message to the specified user.</p> - </div> - </div> - - <div class="help-item"> - <div class="subject"> - <code>/quit [message]</code> - </div> - <div class="description"> - <p>Disconnect from the current network with an optional message.</p> - </div> - </div> - - <div class="help-item"> - <div class="subject"> - <code>/raw message</code> - </div> - <div class="description"> - <p>Send a raw message to the current IRC network.</p> - <p>Aliases: <code>/quote</code>, <code>/send</code></p> - </div> - </div> - - <div class="help-item"> - <div class="subject"> - <code>/slap nick</code> - </div> - <div class="description"> - <p>Slap someone in the current channel with a trout!</p> - </div> - </div> - - <div v-if="store.state.settings.searchEnabled" class="help-item"> - <div class="subject"> - <code>/search query</code> - </div> - <div class="description"> - <p>Search for messages in the current channel / user</p> - </div> - </div> - - <div class="help-item"> - <div class="subject"> - <code>/topic [newtopic]</code> - </div> - <div class="description"> - <p> - Get the topic in the current channel. If <code>newtopic</code> is specified, - sets the topic in the current channel. - </p> - </div> - </div> - - <div class="help-item"> - <div class="subject"> - <code>/unban nick</code> - </div> - <div class="description"> - <p> - Unban (<code>-b</code>) a user from the current channel. This can be a - nickname or a hostmask. - </p> - </div> - </div> - - <div class="help-item"> - <div class="subject"> - <code>/unignore nick</code> - </div> - <div class="description"> - <p> - Unblock messages from the specified user on the current network. This can be - a nickname or a hostmask. - </p> - </div> - </div> - - <div class="help-item"> - <div class="subject"> - <code>/unmute [...channel]</code> - </div> - <div class="description"> - <p> - Un-mutes the given channel(s) or the current channel if no channel is - provided. See <code>/mute</code> for more information. - </p> - </div> - </div> - - <div class="help-item"> - <div class="subject"> - <code>/voice nick [...nick]</code> - </div> - <div class="description"> - <p> - Give voice (<code>+v</code>) to one or several users in the current channel. - </p> - </div> - </div> - - <div class="help-item"> - <div class="subject"> - <code>/whois nick</code> - </div> - <div class="description"> - <p>Retrieve information about the given user on the current network.</p> - </div> - </div> - </div> - </div> -</template> - -<script lang="ts"> -import {defineComponent, ref} from "vue"; -import {useStore} from "../../js/store"; -import SidebarToggle from "../SidebarToggle.vue"; -import VersionChecker from "../VersionChecker.vue"; - -export default defineComponent({ - name: "Help", - components: { - SidebarToggle, - VersionChecker, - }, - setup() { - const store = useStore(); - const isApple = navigator.platform.match(/(Mac|iPhone|iPod|iPad)/i) || false; - const isTouch = navigator.maxTouchPoints > 0; - - return { - isApple, - isTouch, - store, - }; - }, -}); -</script> diff --git a/client/components/Windows/NetworkEdit.vue b/client/components/Windows/NetworkEdit.vue deleted file mode 100644 index 822164ce..00000000 --- a/client/components/Windows/NetworkEdit.vue +++ /dev/null @@ -1,67 +0,0 @@ -<template> - <NetworkForm - v-if="networkData" - :handle-submit="handleSubmit" - :defaults="networkData" - :disabled="disabled" - /> -</template> - -<script lang="ts"> -import {defineComponent, onMounted, ref, watch} from "vue"; -import {useRoute} from "vue-router"; -import {switchToChannel} from "../../js/router"; -import socket from "../../js/socket"; -import {useStore} from "../../js/store"; -import NetworkForm, {NetworkFormDefaults} from "../NetworkForm.vue"; - -export default defineComponent({ - name: "NetworkEdit", - components: { - NetworkForm, - }, - setup() { - const route = useRoute(); - const store = useStore(); - - const disabled = ref(false); - const networkData = ref<NetworkFormDefaults | null>(null); - - const setNetworkData = () => { - socket.emit("network:get", String(route.params.uuid || "")); - networkData.value = store.getters.findNetwork(String(route.params.uuid || "")); - }; - - const handleSubmit = (data: {uuid: string; name: string}) => { - disabled.value = true; - socket.emit("network:edit", data); - - // TODO: move networks to vuex and update state when the network info comes in - const network = store.getters.findNetwork(data.uuid); - - if (network) { - network.name = network.channels[0].name = data.name; - - switchToChannel(network.channels[0]); - } - }; - - watch( - () => route.params.uuid, - () => { - setNetworkData(); - } - ); - - onMounted(() => { - setNetworkData(); - }); - - return { - disabled, - networkData, - handleSubmit, - }; - }, -}); -</script> diff --git a/client/components/Windows/SearchResults.vue b/client/components/Windows/SearchResults.vue deleted file mode 100644 index b182f9a0..00000000 --- a/client/components/Windows/SearchResults.vue +++ /dev/null @@ -1,321 +0,0 @@ -<template> - <div id="chat-container" class="window"> - <div - id="chat" - :class="{ - 'time-seconds': store.state.settings.showSeconds, - 'time-12h': store.state.settings.use12hClock, - }" - > - <div - class="chat-view" - data-type="search-results" - aria-label="Search results" - role="tabpanel" - > - <div v-if="network && channel" class="header"> - <SidebarToggle /> - <span class="title" - >Searching in <span class="channel-name">{{ channel.name }}</span> for</span - > - <span class="topic">{{ route.query.q }}</span> - <MessageSearchForm :network="network" :channel="channel" /> - <button - class="close" - aria-label="Close search window" - title="Close search window" - @click="closeSearch" - /> - </div> - <div v-if="network && channel" class="chat-content"> - <div ref="chat" class="chat" tabindex="-1"> - <div v-show="moreResultsAvailable" class="show-more"> - <button - ref="loadMoreButton" - :disabled=" - !!store.state.messageSearchPendingQuery || - !store.state.isConnected - " - class="btn" - @click="onShowMoreClick" - > - <span v-if="store.state.messageSearchPendingQuery">Loading…</span> - <span v-else>Show older messages</span> - </button> - </div> - - <div - v-if="store.state.messageSearchPendingQuery && !offset" - class="search-status" - > - Searching… - </div> - <div v-else-if="!messages.length && !offset" class="search-status"> - No results found. - </div> - <div - class="messages" - role="log" - aria-live="polite" - aria-relevant="additions" - > - <div - v-for="(message, id) in messages" - :key="message.id" - class="result" - @click="jump(message, id)" - > - <DateMarker - v-if="shouldDisplayDateMarker(message, id)" - :key="message.id + '-date'" - :message="message" - /> - <Message - :key="message.id" - :channel="channel" - :network="network" - :message="message" - :data-id="message.id" - /> - </div> - </div> - </div> - </div> - </div> - </div> - </div> -</template> - -<style> -.channel-name { - font-weight: 700; -} -</style> - -<script lang="ts"> -import socket from "../../js/socket"; -import eventbus from "../../js/eventbus"; - -import SidebarToggle from "../SidebarToggle.vue"; -import Message from "../Message.vue"; -import MessageSearchForm from "../MessageSearchForm.vue"; -import DateMarker from "../DateMarker.vue"; -import {watch, computed, defineComponent, nextTick, ref, onMounted, onUnmounted} from "vue"; -import type {ClientMessage} from "../../js/types"; - -import {useStore} from "../../js/store"; -import {useRoute, useRouter} from "vue-router"; -import {switchToChannel} from "../../js/router"; -import {SearchQuery} from "../../../shared/types/storage"; - -export default defineComponent({ - name: "SearchResults", - components: { - SidebarToggle, - Message, - DateMarker, - MessageSearchForm, - }, - setup() { - const store = useStore(); - const route = useRoute(); - const router = useRouter(); - - const chat = ref<HTMLDivElement>(); - - const loadMoreButton = ref<HTMLButtonElement>(); - - const offset = ref(0); - const moreResultsAvailable = ref(false); - const oldScrollTop = ref(0); - const oldChatHeight = ref(0); - - const messages = computed(() => { - const results = store.state.messageSearchResults?.results; - - if (!results) { - return []; - } - - return results; - }); - - const chan = computed(() => { - const chanId = parseInt(String(route.params.id || ""), 10); - return store.getters.findChannel(chanId); - }); - - const network = computed(() => { - if (!chan.value) { - return null; - } - - return chan.value.network; - }); - - const channel = computed(() => { - if (!chan.value) { - return null; - } - - return chan.value.channel; - }); - - const setActiveChannel = () => { - if (!chan.value) { - return; - } - - store.commit("activeChannel", chan.value); - }; - - const closeSearch = () => { - if (!channel.value) { - return; - } - - switchToChannel(channel.value); - }; - - const shouldDisplayDateMarker = (message: ClientMessage, id: number) => { - const previousMessage = messages.value[id - 1]; - - if (!previousMessage) { - return true; - } - - return new Date(previousMessage.time).getDay() !== new Date(message.time).getDay(); - }; - - const clearSearchState = () => { - offset.value = 0; - store.commit("messageSearchResults", null); - store.commit("messageSearchPendingQuery", null); - }; - - const doSearch = () => { - if (!network.value || !channel.value) { - return; - } - - clearSearchState(); // this is a new search, so we need to clear anything before that - const query: SearchQuery = { - networkUuid: network.value.uuid, - channelName: channel.value.name, - searchTerm: String(route.query.q || ""), - offset: offset.value, - }; - store.commit("messageSearchPendingQuery", query); - socket.emit("search", query); - }; - - const onShowMoreClick = () => { - if (!chat.value || !network.value || !channel.value) { - return; - } - - offset.value += 100; - - oldScrollTop.value = chat.value.scrollTop; - oldChatHeight.value = chat.value.scrollHeight; - - const query: SearchQuery = { - networkUuid: network.value.uuid, - channelName: channel.value.name, - searchTerm: String(route.query.q || ""), - offset: offset.value, - }; - store.commit("messageSearchPendingQuery", query); - socket.emit("search", query); - }; - - const jumpToBottom = async () => { - await nextTick(); - - const el = chat.value; - - if (!el) { - return; - } - - el.scrollTop = el.scrollHeight; - }; - - const jump = (message: ClientMessage, id: number) => { - // TODO: Implement jumping to messages! - // This is difficult because it means client will need to handle a potentially nonlinear message set - // (loading IntersectionObserver both before AND after the messages) - }; - - watch( - () => route.params.id, - () => { - doSearch(); - setActiveChannel(); - } - ); - - watch( - () => route.query, - () => { - doSearch(); - setActiveChannel(); - } - ); - - watch(messages, async () => { - moreResultsAvailable.value = !!( - messages.value.length && !(messages.value.length % 100) - ); - - if (!offset.value) { - await jumpToBottom(); - } else { - await nextTick(); - - const el = chat.value; - - if (!el) { - return; - } - - const currentChatHeight = el.scrollHeight; - el.scrollTop = oldScrollTop.value + currentChatHeight - oldChatHeight.value; - } - }); - - onMounted(() => { - setActiveChannel(); - doSearch(); - - eventbus.on("escapekey", closeSearch); - eventbus.on("re-search", doSearch); - }); - - onUnmounted(() => { - eventbus.off("escapekey", closeSearch); - eventbus.off("re-search", doSearch); - clearSearchState(); - }); - - return { - chat, - loadMoreButton, - messages, - moreResultsAvailable, - network, - channel, - route, - offset, - store, - setActiveChannel, - closeSearch, - shouldDisplayDateMarker, - doSearch, - onShowMoreClick, - jumpToBottom, - jump, - }; - }, -}); -</script> diff --git a/client/components/Windows/Settings.vue b/client/components/Windows/Settings.vue deleted file mode 100644 index 0fa95372..00000000 --- a/client/components/Windows/Settings.vue +++ /dev/null @@ -1,56 +0,0 @@ -<template> - <div id="settings" class="window" role="tabpanel" aria-label="Settings"> - <div class="header"> - <SidebarToggle /> - </div> - <Navigation /> - - <div class="container"> - <form ref="settingsForm" autocomplete="off" @change="onChange" @submit.prevent> - <router-view></router-view> - </form> - </div> - </div> -</template> - -<script lang="ts"> -import {defineComponent} from "vue"; -import SidebarToggle from "../SidebarToggle.vue"; -import Navigation from "../Settings/Navigation.vue"; -import {useStore} from "../../js/store"; - -export default defineComponent({ - name: "Settings", - components: { - SidebarToggle, - Navigation, - }, - setup() { - const store = useStore(); - - const onChange = (event: Event) => { - const ignore = ["old_password", "new_password", "verify_password"]; - - const name = (event.target as HTMLInputElement).name; - - if (ignore.includes(name)) { - return; - } - - let value: boolean | string; - - if ((event.target as HTMLInputElement).type === "checkbox") { - value = (event.target as HTMLInputElement).checked; - } else { - value = (event.target as HTMLInputElement).value; - } - - void store.dispatch("settings/update", {name, value, sync: true}); - }; - - return { - onChange, - }; - }, -}); -</script> diff --git a/client/components/Windows/SignIn.vue b/client/components/Windows/SignIn.vue deleted file mode 100644 index 6c095c6f..00000000 --- a/client/components/Windows/SignIn.vue +++ /dev/null @@ -1,116 +0,0 @@ -<template> - <div id="sign-in" class="window" role="tabpanel" aria-label="Sign-in"> - <form class="container" method="post" action="" @submit="onSubmit"> - <img - src="img/logo-vertical-transparent-bg.svg" - class="logo" - alt="The Lounge" - width="256" - height="170" - /> - <img - src="img/logo-vertical-transparent-bg-inverted.svg" - class="logo-inverted" - alt="The Lounge" - width="256" - height="170" - /> - - <label for="signin-username">Username</label> - <input - id="signin-username" - v-model.trim="username" - class="input" - type="text" - name="username" - autocapitalize="none" - autocorrect="off" - autocomplete="username" - required - autofocus - /> - - <div class="password-container"> - <label for="signin-password">Password</label> - <RevealPassword v-slot:default="slotProps"> - <input - id="signin-password" - v-model="password" - :type="slotProps.isVisible ? 'text' : 'password'" - class="input" - autocapitalize="none" - autocorrect="off" - autocomplete="current-password" - required - /> - </RevealPassword> - </div> - - <div v-if="errorShown" class="error">Authentication failed.</div> - - <button :disabled="inFlight" type="submit" class="btn">Sign in</button> - </form> - </div> -</template> - -<script lang="ts"> -import storage from "../../js/localStorage"; -import socket from "../../js/socket"; -import RevealPassword from "../RevealPassword.vue"; -import {defineComponent, onBeforeUnmount, onMounted, ref} from "vue"; - -export default defineComponent({ - name: "SignIn", - components: { - RevealPassword, - }, - setup() { - const inFlight = ref(false); - const errorShown = ref(false); - - const username = ref(storage.get("user") || ""); - const password = ref(""); - - const onAuthFailed = () => { - inFlight.value = false; - errorShown.value = true; - }; - - const onSubmit = (event: Event) => { - event.preventDefault(); - - if (!username.value || !password.value) { - return; - } - - inFlight.value = true; - errorShown.value = false; - - const values = { - user: username.value, - password: password.value, - }; - - storage.set("user", values.user); - - socket.emit("auth:perform", values); - }; - - onMounted(() => { - socket.on("auth:failed", onAuthFailed); - }); - - onBeforeUnmount(() => { - socket.off("auth:failed", onAuthFailed); - }); - - return { - inFlight, - errorShown, - username, - password, - onSubmit, - }; - }, -}); -</script> diff --git a/client/css/bootstrap.css b/client/css/bootstrap.css new file mode 100644 index 00000000..e1d5b223 --- /dev/null +++ b/client/css/bootstrap.css @@ -0,0 +1,1185 @@ +/*! + * Bootstrap v3.2.0 (http://getbootstrap.com) + * Copyright 2011-2014 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +/*! + * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=242b77ebf84da0cd12cf) + * Config saved to config.json and https://gist.github.com/242b77ebf84da0cd12cf + */ +/*! normalize.css v3.0.1 | MIT License | git.io/normalize */ +html { + font-family: sans-serif; + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; +} +body { + margin: 0; +} +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +nav, +section, +summary { + display: block; +} +audio, +canvas, +progress, +video { + display: inline-block; + vertical-align: baseline; +} +audio:not([controls]) { + display: none; + height: 0; +} +[hidden], +template { + display: none; +} +a { + background: transparent; +} +a:active, +a:hover { + outline: 0; +} +abbr[title] { + border-bottom: 1px dotted; +} +b, +strong { + font-weight: bold; +} +dfn { + font-style: italic; +} +h1 { + font-size: 2em; + margin: 0.67em 0; +} +mark { + background: #ff0; + color: #000; +} +small { + font-size: 80%; +} +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} +sup { + top: -0.5em; +} +sub { + bottom: -0.25em; +} +img { + border: 0; +} +svg:not(:root) { + overflow: hidden; +} +figure { + margin: 1em 40px; +} +hr { + -moz-box-sizing: content-box; + box-sizing: content-box; + height: 0; +} +pre { + overflow: auto; +} +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} +button, +input, +optgroup, +select, +textarea { + color: inherit; + font: inherit; + margin: 0; +} +button { + overflow: visible; +} +button, +select { + text-transform: none; +} +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; +} +button[disabled], +html input[disabled] { + cursor: default; +} +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} +input { + line-height: normal; +} +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; + padding: 0; +} +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} +input[type="search"] { + -webkit-appearance: textfield; + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; + box-sizing: content-box; +} +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} +legend { + border: 0; + padding: 0; +} +textarea { + overflow: auto; +} +optgroup { + font-weight: bold; +} +table { + border-collapse: collapse; + border-spacing: 0; +} +td, +th { + padding: 0; +} +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +*:before, +*:after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +html { + font-size: 10px; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} +body { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 1.42857143; + color: #333333; + background-color: #ffffff; +} +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} +a { + color: #428bca; + text-decoration: none; +} +a:hover, +a:focus { + color: #2a6496; + text-decoration: underline; +} +a:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +figure { + margin: 0; +} +img { + vertical-align: middle; +} +.img-responsive { + display: block; + width: 100% \9; + max-width: 100%; + height: auto; +} +.img-rounded { + border-radius: 6px; +} +.img-thumbnail { + padding: 4px; + line-height: 1.42857143; + background-color: #ffffff; + border: 1px solid #dddddd; + border-radius: 4px; + -webkit-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; + display: inline-block; + width: 100% \9; + max-width: 100%; + height: auto; +} +.img-circle { + border-radius: 50%; +} +hr { + margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #eeeeee; +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} +.sr-only-focusable:active, +.sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; +} +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + font-family: inherit; + font-weight: 500; + line-height: 1.1; + color: inherit; +} +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small, +.h1 small, +.h2 small, +.h3 small, +.h4 small, +.h5 small, +.h6 small, +h1 .small, +h2 .small, +h3 .small, +h4 .small, +h5 .small, +h6 .small, +.h1 .small, +.h2 .small, +.h3 .small, +.h4 .small, +.h5 .small, +.h6 .small { + font-weight: normal; + line-height: 1; + color: #777777; +} +h1, +.h1, +h2, +.h2, +h3, +.h3 { + margin-top: 20px; + margin-bottom: 10px; +} +h1 small, +.h1 small, +h2 small, +.h2 small, +h3 small, +.h3 small, +h1 .small, +.h1 .small, +h2 .small, +.h2 .small, +h3 .small, +.h3 .small { + font-size: 65%; +} +h4, +.h4, +h5, +.h5, +h6, +.h6 { + margin-top: 10px; + margin-bottom: 10px; +} +h4 small, +.h4 small, +h5 small, +.h5 small, +h6 small, +.h6 small, +h4 .small, +.h4 .small, +h5 .small, +.h5 .small, +h6 .small, +.h6 .small { + font-size: 75%; +} +h1, +.h1 { + font-size: 36px; +} +h2, +.h2 { + font-size: 30px; +} +h3, +.h3 { + font-size: 24px; +} +h4, +.h4 { + font-size: 18px; +} +h5, +.h5 { + font-size: 14px; +} +h6, +.h6 { + font-size: 12px; +} +p { + margin: 0 0 10px; +} +.lead { + margin-bottom: 20px; + font-size: 16px; + font-weight: 300; + line-height: 1.4; +} +@media (min-width: 768px) { + .lead { + font-size: 21px; + } +} +small, +.small { + font-size: 85%; +} +cite { + font-style: normal; +} +mark, +.mark { + background-color: #fcf8e3; + padding: .2em; +} +.text-left { + text-align: left; +} +.text-right { + text-align: right; +} +.text-center { + text-align: center; +} +.text-justify { + text-align: justify; +} +.text-nowrap { + white-space: nowrap; +} +.text-lowercase { + text-transform: lowercase; +} +.text-uppercase { + text-transform: uppercase; +} +.text-capitalize { + text-transform: capitalize; +} +.text-muted { + color: #777777; +} +.text-primary { + color: #428bca; +} +a.text-primary:hover { + color: #3071a9; +} +.text-success { + color: #3c763d; +} +a.text-success:hover { + color: #2b542c; +} +.text-info { + color: #31708f; +} +a.text-info:hover { + color: #245269; +} +.text-warning { + color: #8a6d3b; +} +a.text-warning:hover { + color: #66512c; +} +.text-danger { + color: #a94442; +} +a.text-danger:hover { + color: #843534; +} +.bg-primary { + color: #fff; + background-color: #428bca; +} +a.bg-primary:hover { + background-color: #3071a9; +} +.bg-success { + background-color: #dff0d8; +} +a.bg-success:hover { + background-color: #c1e2b3; +} +.bg-info { + background-color: #d9edf7; +} +a.bg-info:hover { + background-color: #afd9ee; +} +.bg-warning { + background-color: #fcf8e3; +} +a.bg-warning:hover { + background-color: #f7ecb5; +} +.bg-danger { + background-color: #f2dede; +} +a.bg-danger:hover { + background-color: #e4b9b9; +} +.page-header { + padding-bottom: 9px; + margin: 40px 0 20px; + border-bottom: 1px solid #eeeeee; +} +ul, +ol { + margin-top: 0; + margin-bottom: 10px; +} +ul ul, +ol ul, +ul ol, +ol ol { + margin-bottom: 0; +} +.list-unstyled { + padding-left: 0; + list-style: none; +} +.list-inline { + padding-left: 0; + list-style: none; + margin-left: -5px; +} +.list-inline > li { + display: inline-block; + padding-left: 5px; + padding-right: 5px; +} +dl { + margin-top: 0; + margin-bottom: 20px; +} +dt, +dd { + line-height: 1.42857143; +} +dt { + font-weight: bold; +} +dd { + margin-left: 0; +} +@media (min-width: 768px) { + .dl-horizontal dt { + float: left; + width: 160px; + clear: left; + text-align: right; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + .dl-horizontal dd { + margin-left: 180px; + } +} +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #777777; +} +.initialism { + font-size: 90%; + text-transform: uppercase; +} +blockquote { + padding: 10px 20px; + margin: 0 0 20px; + font-size: 17.5px; + border-left: 5px solid #eeeeee; +} +blockquote p:last-child, +blockquote ul:last-child, +blockquote ol:last-child { + margin-bottom: 0; +} +blockquote footer, +blockquote small, +blockquote .small { + display: block; + font-size: 80%; + line-height: 1.42857143; + color: #777777; +} +blockquote footer:before, +blockquote small:before, +blockquote .small:before { + content: '\2014 \00A0'; +} +.blockquote-reverse, +blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #eeeeee; + border-left: 0; + text-align: right; +} +.blockquote-reverse footer:before, +blockquote.pull-right footer:before, +.blockquote-reverse small:before, +blockquote.pull-right small:before, +.blockquote-reverse .small:before, +blockquote.pull-right .small:before { + content: ''; +} +.blockquote-reverse footer:after, +blockquote.pull-right footer:after, +.blockquote-reverse small:after, +blockquote.pull-right small:after, +.blockquote-reverse .small:after, +blockquote.pull-right .small:after { + content: '\00A0 \2014'; +} +blockquote:before, +blockquote:after { + content: ""; +} +address { + margin-bottom: 20px; + font-style: normal; + line-height: 1.42857143; +} +.container { + margin-right: auto; + margin-left: auto; + padding-left: 15px; + padding-right: 15px; +} +@media (min-width: 768px) { + .container { + width: 750px; + } +} +@media (min-width: 992px) { + .container { + width: 970px; + } +} +@media (min-width: 1200px) { + .container { + width: 1170px; + } +} +.container-fluid { + margin-right: auto; + margin-left: auto; + padding-left: 15px; + padding-right: 15px; +} +.row { + margin-left: -15px; + margin-right: -15px; +} +.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { + position: relative; + min-height: 1px; + padding-left: 15px; + padding-right: 15px; +} +.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { + float: left; +} +.col-xs-12 { + width: 100%; +} +.col-xs-11 { + width: 91.66666667%; +} +.col-xs-10 { + width: 83.33333333%; +} +.col-xs-9 { + width: 75%; +} +.col-xs-8 { + width: 66.66666667%; +} +.col-xs-7 { + width: 58.33333333%; +} +.col-xs-6 { + width: 50%; +} +.col-xs-5 { + width: 41.66666667%; +} +.col-xs-4 { + width: 33.33333333%; +} +.col-xs-3 { + width: 25%; +} +.col-xs-2 { + width: 16.66666667%; +} +.col-xs-1 { + width: 8.33333333%; +} +.col-xs-pull-12 { + right: 100%; +} +.col-xs-pull-11 { + right: 91.66666667%; +} +.col-xs-pull-10 { + right: 83.33333333%; +} +.col-xs-pull-9 { + right: 75%; +} +.col-xs-pull-8 { + right: 66.66666667%; +} +.col-xs-pull-7 { + right: 58.33333333%; +} +.col-xs-pull-6 { + right: 50%; +} +.col-xs-pull-5 { + right: 41.66666667%; +} +.col-xs-pull-4 { + right: 33.33333333%; +} +.col-xs-pull-3 { + right: 25%; +} +.col-xs-pull-2 { + right: 16.66666667%; +} +.col-xs-pull-1 { + right: 8.33333333%; +} +.col-xs-pull-0 { + right: auto; +} +.col-xs-push-12 { + left: 100%; +} +.col-xs-push-11 { + left: 91.66666667%; +} +.col-xs-push-10 { + left: 83.33333333%; +} +.col-xs-push-9 { + left: 75%; +} +.col-xs-push-8 { + left: 66.66666667%; +} +.col-xs-push-7 { + left: 58.33333333%; +} +.col-xs-push-6 { + left: 50%; +} +.col-xs-push-5 { + left: 41.66666667%; +} +.col-xs-push-4 { + left: 33.33333333%; +} +.col-xs-push-3 { + left: 25%; +} +.col-xs-push-2 { + left: 16.66666667%; +} +.col-xs-push-1 { + left: 8.33333333%; +} +.col-xs-push-0 { + left: auto; +} +.col-xs-offset-12 { + margin-left: 100%; +} +.col-xs-offset-11 { + margin-left: 91.66666667%; +} +.col-xs-offset-10 { + margin-left: 83.33333333%; +} +.col-xs-offset-9 { + margin-left: 75%; +} +.col-xs-offset-8 { + margin-left: 66.66666667%; +} +.col-xs-offset-7 { + margin-left: 58.33333333%; +} +.col-xs-offset-6 { + margin-left: 50%; +} +.col-xs-offset-5 { + margin-left: 41.66666667%; +} +.col-xs-offset-4 { + margin-left: 33.33333333%; +} +.col-xs-offset-3 { + margin-left: 25%; +} +.col-xs-offset-2 { + margin-left: 16.66666667%; +} +.col-xs-offset-1 { + margin-left: 8.33333333%; +} +.col-xs-offset-0 { + margin-left: 0%; +} +@media (min-width: 480px) { + .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { + float: left; + } + .col-sm-12 { + width: 100%; + } + .col-sm-11 { + width: 91.66666667%; + } + .col-sm-10 { + width: 83.33333333%; + } + .col-sm-9 { + width: 75%; + } + .col-sm-8 { + width: 66.66666667%; + } + .col-sm-7 { + width: 58.33333333%; + } + .col-sm-6 { + width: 50%; + } + .col-sm-5 { + width: 41.66666667%; + } + .col-sm-4 { + width: 33.33333333%; + } + .col-sm-3 { + width: 25%; + } + .col-sm-2 { + width: 16.66666667%; + } + .col-sm-1 { + width: 8.33333333%; + } + .col-sm-pull-12 { + right: 100%; + } + .col-sm-pull-11 { + right: 91.66666667%; + } + .col-sm-pull-10 { + right: 83.33333333%; + } + .col-sm-pull-9 { + right: 75%; + } + .col-sm-pull-8 { + right: 66.66666667%; + } + .col-sm-pull-7 { + right: 58.33333333%; + } + .col-sm-pull-6 { + right: 50%; + } + .col-sm-pull-5 { + right: 41.66666667%; + } + .col-sm-pull-4 { + right: 33.33333333%; + } + .col-sm-pull-3 { + right: 25%; + } + .col-sm-pull-2 { + right: 16.66666667%; + } + .col-sm-pull-1 { + right: 8.33333333%; + } + .col-sm-pull-0 { + right: auto; + } + .col-sm-push-12 { + left: 100%; + } + .col-sm-push-11 { + left: 91.66666667%; + } + .col-sm-push-10 { + left: 83.33333333%; + } + .col-sm-push-9 { + left: 75%; + } + .col-sm-push-8 { + left: 66.66666667%; + } + .col-sm-push-7 { + left: 58.33333333%; + } + .col-sm-push-6 { + left: 50%; + } + .col-sm-push-5 { + left: 41.66666667%; + } + .col-sm-push-4 { + left: 33.33333333%; + } + .col-sm-push-3 { + left: 25%; + } + .col-sm-push-2 { + left: 16.66666667%; + } + .col-sm-push-1 { + left: 8.33333333%; + } + .col-sm-push-0 { + left: auto; + } + .col-sm-offset-12 { + margin-left: 100%; + } + .col-sm-offset-11 { + margin-left: 91.66666667%; + } + .col-sm-offset-10 { + margin-left: 83.33333333%; + } + .col-sm-offset-9 { + margin-left: 75%; + } + .col-sm-offset-8 { + margin-left: 66.66666667%; + } + .col-sm-offset-7 { + margin-left: 58.33333333%; + } + .col-sm-offset-6 { + margin-left: 50%; + } + .col-sm-offset-5 { + margin-left: 41.66666667%; + } + .col-sm-offset-4 { + margin-left: 33.33333333%; + } + .col-sm-offset-3 { + margin-left: 25%; + } + .col-sm-offset-2 { + margin-left: 16.66666667%; + } + .col-sm-offset-1 { + margin-left: 8.33333333%; + } + .col-sm-offset-0 { + margin-left: 0%; + } +} +.fade { + opacity: 0; + -webkit-transition: opacity 0.15s linear; + -o-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; +} +.fade.in { + opacity: 1; +} +.collapse { + display: none; +} +.collapse.in { + display: block; +} +tr.collapse.in { + display: table-row; +} +tbody.collapse.in { + display: table-row-group; +} +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition: height 0.35s ease; + -o-transition: height 0.35s ease; + transition: height 0.35s ease; +} +.clearfix:before, +.clearfix:after, +.dl-horizontal dd:before, +.dl-horizontal dd:after, +.container:before, +.container:after, +.container-fluid:before, +.container-fluid:after, +.row:before, +.row:after { + content: " "; + display: table; +} +.clearfix:after, +.dl-horizontal dd:after, +.container:after, +.container-fluid:after, +.row:after { + clear: both; +} +.center-block { + display: block; + margin-left: auto; + margin-right: auto; +} +.pull-right { + float: right !important; +} +.pull-left { + float: left !important; +} +.hide { + display: none !important; +} +.show { + display: block !important; +} +.invisible { + visibility: hidden; +} +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} +.hidden { + display: none !important; + visibility: hidden !important; +} +.affix { + position: fixed; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); +} +@-ms-viewport { + width: device-width; +} +.visible-xs, +.visible-sm, +.visible-md, +.visible-lg { + display: none !important; +} +.visible-xs-block, +.visible-xs-inline, +.visible-xs-inline-block, +.visible-sm-block, +.visible-sm-inline, +.visible-sm-inline-block, +.visible-md-block, +.visible-md-inline, +.visible-md-inline-block, +.visible-lg-block, +.visible-lg-inline, +.visible-lg-inline-block { + display: none !important; +} +@media (max-width: 479px) { + .visible-xs { + display: block !important; + } + table.visible-xs { + display: table; + } + tr.visible-xs { + display: table-row !important; + } + th.visible-xs, + td.visible-xs { + display: table-cell !important; + } +} +@media (max-width: 479px) { + .visible-xs-block { + display: block !important; + } +} +@media (max-width: 479px) { + .visible-xs-inline { + display: inline !important; + } +} +@media (max-width: 479px) { + .visible-xs-inline-block { + display: inline-block !important; + } +} +@media (max-width: 479px) { + .hidden-xs { + display: none !important; + } +} +.visible-print { + display: none !important; +} +@media print { + .visible-print { + display: block !important; + } + table.visible-print { + display: table; + } + tr.visible-print { + display: table-row !important; + } + th.visible-print, + td.visible-print { + display: table-cell !important; + } +} +.visible-print-block { + display: none !important; +} +@media print { + .visible-print-block { + display: block !important; + } +} +.visible-print-inline { + display: none !important; +} +@media print { + .visible-print-inline { + display: inline !important; + } +} +.visible-print-inline-block { + display: none !important; +} +@media print { + .visible-print-inline-block { + display: inline-block !important; + } +} +@media print { + .hidden-print { + display: none !important; + } +} diff --git a/client/css/fontawesome.css b/client/css/fontawesome.css deleted file mode 100644 index a8016f53..00000000 --- a/client/css/fontawesome.css +++ /dev/null @@ -1,9 +0,0 @@ -@font-face { - /* We use free solid icons - https://fontawesome.com/icons?s=solid&m=free */ - font-family: FontAwesome; - font-weight: normal; - font-style: normal; - src: - url("../fonts/fa-solid-900.woff2") format("woff2"), - url("../fonts/fa-solid-900.woff") format("woff"); -} diff --git a/client/css/fonts/Lato-700/LICENSE.txt b/client/css/fonts/Lato-700/LICENSE.txt new file mode 100755 index 00000000..98383e3d --- /dev/null +++ b/client/css/fonts/Lato-700/LICENSE.txt @@ -0,0 +1,93 @@ +Copyright (c) 2010-2014 by tyPoland Lukasz Dziedzic (team@latofonts.com) with Reserved Font Name "Lato" + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/client/css/fonts/Lato-700/Lato-700.eot b/client/css/fonts/Lato-700/Lato-700.eot new file mode 100755 index 00000000..30b5dffe Binary files /dev/null and b/client/css/fonts/Lato-700/Lato-700.eot differ diff --git a/client/css/fonts/Lato-700/Lato-700.svg b/client/css/fonts/Lato-700/Lato-700.svg new file mode 100755 index 00000000..bac8d6da --- /dev/null +++ b/client/css/fonts/Lato-700/Lato-700.svg @@ -0,0 +1,4457 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg xmlns="http://www.w3.org/2000/svg"> +<defs > +<font id="Lato" horiz-adv-x="1060" ><font-face + font-family="Lato" + units-per-em="2000" + panose-1="2 15 8 2 2 2 4 3 2 3" + ascent="1974" + descent="-426" + alphabetic="0" /> +<glyph unicode=" " glyph-name="space" horiz-adv-x="386" /> +<glyph unicode="!" glyph-name="exclam" horiz-adv-x="721" d="M480 1446V874Q480 783 471 696T447 510H280Q265 608 256 695T247 874V1446H480ZM209 136Q209 167 220 195T252 243T301 275T361 287Q392 287 420 275T468 243T500 195T512 136Q512 104 500 77T468 +29T420 -2T361 -14Q329 -14 301 -3T253 29T221 76T209 136Z" /> +<glyph unicode=""" glyph-name="quotedbl" horiz-adv-x="844" d="M346 1446V1158L323 1002Q316 958 298 935T237 911Q201 911 180 934T153 1002L131 1158V1446H346ZM714 1446V1158L691 1002Q684 958 666 935T605 911Q569 911 548 934T521 1002L499 1158V1446H714Z" /> +<glyph unicode="#" glyph-name="numbersign" horiz-adv-x="1160" d="M831 408L754 0H641Q611 0 589 24T567 83Q567 88 567 92T569 102L628 408H423L365 90Q356 42 324 21T253 0H144L220 408H105Q73 408 56 423T39 475Q39 489 42 507L55 586H245L297 862H83L102 +965Q109 1003 133 1021T211 1040H322L384 1362Q392 1402 421 1424T489 1446H601L525 1040H729L806 1446H916Q951 1446 973 1426T995 1375Q995 1365 994 1360L932 1040H1135L1116 937Q1109 899 1085 881T1007 862H907L856 586H998Q1030 586 1046 571T1063 518Q1063 +504 1060 486L1048 408H831ZM448 586H653L704 862H500L448 586Z" /> +<glyph unicode="$" glyph-name="dollar" horiz-adv-x="1160" d="M463 -9Q346 7 244 55T69 174L145 287Q155 302 171 311T206 321Q228 321 253 306T310 269T383 227T480 196L518 644Q447 664 378 691T253 762T163 875T129 1045Q129 1121 159 1193T248 1323T391 +1417T586 1459L597 1585Q599 1609 617 1628T664 1647H755L738 1450Q844 1433 921 1390T1055 1293L995 1202Q981 1182 967 1172T933 1162Q918 1162 898 1171T851 1194T792 1222T721 1245L686 831Q758 809 828 783T955 714T1047 610T1082 453Q1082 360 1051 279T961 +135T814 33T615 -14L603 -161Q601 -184 583 -203T536 -223H445L463 -9ZM848 415Q848 453 835 481T797 532T739 570T667 599L633 193Q739 207 793 264T848 415ZM362 1069Q362 1031 375 1002T411 951T467 911T537 879L568 1249Q513 1242 474 1226T410 1185T374 1132T362 +1069Z" /> +<glyph unicode="%" glyph-name="percent" horiz-adv-x="1606" d="M729 1096Q729 1014 702 948T628 836T521 764T394 739Q322 739 261 764T156 835T86 948T61 1096Q61 1180 86 1248T155 1363T261 1435T394 1461Q466 1461 527 1436T634 1363T704 1248T729 1096ZM538 +1096Q538 1154 527 1193T497 1256T451 1290T394 1301Q364 1301 338 1291T293 1256T264 1193T253 1096Q253 1040 263 1003T293 942T338 909T394 899Q424 899 450 909T496 942T527 1002T538 1096ZM1210 1407Q1222 1422 1240 1434T1290 1446H1469L395 37Q383 21 365 +11T320 0H136L1210 1407ZM1545 340Q1545 258 1518 192T1444 80T1337 8T1210 -18Q1138 -18 1077 7T972 79T902 192T877 340Q877 424 902 492T971 607T1077 679T1210 705Q1282 705 1343 680T1450 607T1520 492T1545 340ZM1355 340Q1355 398 1344 437T1313 500T1267 +534T1210 545Q1180 545 1154 535T1110 500T1080 437T1069 340Q1069 284 1080 246T1109 185T1154 152T1210 142Q1240 142 1266 152T1312 185T1343 246T1355 340Z" /> +<glyph unicode="&" glyph-name="ampersand" horiz-adv-x="1428" d="M663 1462Q751 1462 820 1435T939 1363T1017 1260T1051 1140L894 1107Q891 1106 888 1106T881 1106Q864 1106 851 1115T829 1145Q820 1171 806 1194T772 1235T725 1263T663 1274Q621 1274 +588 1260T532 1221T497 1164T485 1095Q485 1065 491 1037T512 981T548 924T604 860L988 461Q1021 524 1041 594T1067 736Q1069 759 1082 773T1118 787H1273Q1272 655 1235 535T1129 314L1432 0H1190Q1171 0 1157 2T1129 9T1104 24T1079 47L979 150Q883 72 766 28T511 +-16Q427 -16 347 12T204 95T103 225T64 398Q64 465 86 525T147 638T239 732T357 804Q304 879 280 950T255 1093Q255 1168 282 1235T362 1353T491 1432T663 1462ZM315 418Q315 363 334 319T386 245T462 198T555 181Q643 181 715 208T848 285L468 675Q388 623 352 +558T315 418Z" /> +<glyph unicode="'" glyph-name="quotesingle" horiz-adv-x="476" d="M346 1446V1158L323 1002Q316 958 298 935T237 911Q201 911 180 934T153 1002L131 1158V1446H346Z" /> +<glyph unicode="(" glyph-name="parenleft" horiz-adv-x="600" d="M320 627Q320 421 370 222T513 -152Q520 -165 522 -176T525 -196Q525 -216 515 -228T491 -249L381 -316Q307 -202 255 -87T170 145T122 382T106 627Q106 752 121 872T170 1110T255 1341T381 1570L491 +1504Q505 1496 515 1484T525 1452Q525 1433 512 1407Q420 1232 370 1033T320 627Z" /> +<glyph unicode=")" glyph-name="parenright" horiz-adv-x="600" d="M280 627Q280 833 230 1032T88 1407Q75 1433 75 1452Q75 1471 85 1483T109 1504L219 1570Q293 1456 345 1342T430 1110T478 873T494 627Q494 502 479 382T430 145T345 -87T219 -316L109 -249Q95 +-241 85 -229T75 -196Q75 -187 77 -176T87 -152Q180 23 230 222T280 627Z" /> +<glyph unicode="*" glyph-name="asterisk" horiz-adv-x="800" d="M340 837V1020Q340 1040 342 1059T351 1095Q340 1081 325 1070T293 1048L135 956L76 1056L235 1148Q253 1159 270 1166T307 1176Q288 1178 271 1186T235 1205L76 1298L134 1398L293 1304Q310 1293 +325 1282T352 1256Q345 1273 343 1292T340 1331V1516H458V1333Q458 1312 456 1293T446 1256Q457 1270 472 1281T505 1304L663 1396L722 1296L563 1205Q545 1194 528 1187T491 1176Q525 1170 563 1148L722 1055L664 955L505 1048Q487 1059 472 1070T445 1095Q458 +1063 458 1021V837H340Z" /> +<glyph unicode="+" glyph-name="plus" horiz-adv-x="1160" d="M678 1173V763H1067V580H678V168H478V580H91V763H478V1173H678Z" /> +<glyph unicode="," glyph-name="comma" horiz-adv-x="450" d="M80 152Q80 180 90 204T120 247T166 276T225 287Q263 287 291 274T338 237T366 183T375 118Q375 70 361 17T318 -89T249 -192T155 -284L112 -245Q94 -230 94 -208Q94 -200 99 -190T113 -172Q124 -160 +140 -143T172 -103T201 -54T221 3Q190 3 164 14T120 46T91 93T80 152Z" /> +<glyph unicode="-" glyph-name="hyphen" horiz-adv-x="718" d="M100 707H618V501H100V707Z" /> +<glyph unicode="." glyph-name="period" horiz-adv-x="450" d="M73 136Q73 167 84 195T116 243T165 275T225 287Q256 287 284 275T332 243T364 195T376 136Q376 104 364 77T332 29T284 -2T225 -14Q193 -14 165 -3T117 29T85 76T73 136Z" /> +<glyph unicode="/" glyph-name="slash" horiz-adv-x="774" d="M218 -3Q209 -26 195 -43T163 -71T125 -89T86 -95H-18L566 1399Q583 1441 615 1463T692 1486H797L218 -3Z" /> +<glyph unicode="0" glyph-name="zero" horiz-adv-x="1160" d="M1110 723Q1110 534 1070 395T958 164T789 29T578 -16Q465 -16 369 28T201 164T90 394T50 723Q50 913 90 1052T201 1282T368 1417T578 1462Q691 1462 788 1418T957 1282T1069 1052T1110 723ZM855 723Q855 +880 832 983T771 1147T682 1232T578 1257Q525 1257 476 1233T388 1147T328 983T305 723Q305 566 327 463T388 299T475 214T578 189Q632 189 682 213T770 299T832 463T855 723Z" /> +<glyph unicode="1" glyph-name="one" horiz-adv-x="1160" d="M269 185H562V1028Q562 1077 565 1131L357 957Q344 946 331 942T304 938Q284 938 268 946T243 966L165 1073L606 1448H809V185H1069V0H269V185Z" /> +<glyph unicode="2" glyph-name="two" horiz-adv-x="1160" d="M602 1462Q702 1462 785 1433T927 1349T1019 1219T1052 1050Q1052 970 1029 902T966 772T873 652T762 534L436 201Q484 215 530 222T618 230H989Q1029 230 1052 208T1076 148V0H84V82Q84 107 94 134T128 +184L567 624Q622 680 665 731T738 832T783 933T799 1042Q799 1094 784 1133T741 1200T675 1240T588 1254Q499 1254 442 1209T361 1088Q350 1050 328 1034T272 1017Q257 1017 239 1020L109 1043Q124 1147 167 1225T274 1356T422 1435T602 1462Z" /> +<glyph unicode="3" glyph-name="three" horiz-adv-x="1160" d="M625 1462Q725 1462 805 1434T943 1355T1030 1236T1061 1089Q1061 1020 1046 968T1001 876T929 810T832 765Q962 724 1026 640T1090 429Q1090 321 1050 238T942 99T785 13T595 -16Q486 -16 405 9T264 +83T162 203T90 367L199 412Q227 424 256 424Q282 424 302 413T334 381Q352 346 373 312T425 252T495 209T592 192Q655 192 702 212T780 266T827 339T843 421Q843 473 832 515T786 588T686 635T510 652V828Q601 829 661 845T756 889T806 958T820 1046Q820 1149 764 +1201T611 1254Q523 1254 465 1208T384 1088Q372 1050 351 1034T296 1017Q280 1017 262 1020L132 1043Q147 1147 190 1225T297 1356T445 1435T625 1462Z" /> +<glyph unicode="4" glyph-name="four" horiz-adv-x="1160" d="M942 545H1124V402Q1124 382 1111 368T1073 353H942V0H726V353H116Q91 353 72 368T48 407L23 532L708 1447H942V545ZM726 1018Q726 1050 728 1087T735 1164L286 545H726V1018Z" /> +<glyph unicode="5" glyph-name="five" horiz-adv-x="1160" d="M989 1341Q989 1288 956 1255T844 1222H446L394 920Q492 940 573 940Q687 940 773 906T919 812T1008 672T1038 498Q1038 383 998 288T885 126T715 21T500 -16Q432 -16 371 -2T257 35T158 89T76 154L152 +259Q176 293 216 293Q241 293 266 277T326 242T405 207T514 191Q582 191 634 213T720 274T772 368T790 487Q790 605 722 671T520 738Q415 738 309 700L155 744L275 1446H989V1341Z" /> +<glyph unicode="6" glyph-name="six" horiz-adv-x="1160" d="M670 903Q752 903 829 876T966 795T1061 659T1097 470Q1097 369 1060 281T956 126T795 22T586 -16Q470 -16 378 21T221 124T122 284T87 492Q87 594 128 701T257 925L602 1388Q620 1412 654 1429T734 +1446H954L525 921Q511 904 499 889T474 858Q516 879 564 891T670 903ZM324 454Q324 394 340 345T389 260T470 206T581 186Q640 186 689 206T774 262T830 346T850 452Q850 514 831 563T777 647T693 700T585 718Q526 718 478 698T396 643T343 559T324 454Z" /> +<glyph unicode="7" glyph-name="seven" horiz-adv-x="1160" d="M1096 1446V1339Q1096 1291 1086 1262T1065 1212L518 84Q501 49 470 25T386 0H207L767 1105Q802 1173 845 1222H153Q130 1222 113 1239T96 1279V1446H1096Z" /> +<glyph unicode="8" glyph-name="eight" horiz-adv-x="1160" d="M580 -16Q468 -16 376 14T217 99T115 232T78 406Q78 534 141 622T337 754Q231 798 179 879T126 1074Q126 1156 159 1227T253 1350T396 1432T580 1462Q680 1462 763 1433T907 1351T1000 1227T1034 +1074Q1034 960 981 879T823 754Q956 711 1019 623T1082 406Q1082 310 1046 232T943 99T785 14T580 -16ZM580 177Q641 177 687 194T764 243T812 317T828 410Q828 529 762 590T580 651Q464 651 398 590T332 410Q332 360 348 317T395 243T473 195T580 177ZM580 845Q640 +845 681 864T747 914T782 986T793 1070Q793 1111 780 1148T741 1213T675 1259T580 1276Q525 1276 485 1259T419 1214T380 1148T367 1070Q367 1027 377 987T413 915T479 864T580 845Z" /> +<glyph unicode="9" glyph-name="nine" horiz-adv-x="1160" d="M530 577Q455 577 383 603T255 681T164 811T130 993Q130 1090 166 1175T267 1324T423 1425T624 1462Q735 1462 823 1427T974 1329T1070 1178T1104 985Q1104 918 1093 858T1060 743T1008 635T941 529L610 +57Q593 33 560 17T483 0H256L705 561Q722 582 737 602T766 642Q716 610 656 594T530 577ZM867 1010Q867 1069 849 1115T798 1194T720 1243T620 1260Q564 1260 519 1242T443 1190T394 1112T377 1012Q377 891 439 828T617 764Q677 764 723 783T802 835T850 913T867 +1010Z" /> +<glyph unicode=":" glyph-name="colon" horiz-adv-x="530" d="M113 136Q113 167 124 195T156 243T205 275T265 287Q296 287 324 275T372 243T404 195T416 136Q416 104 404 77T372 29T324 -2T265 -14Q233 -14 205 -3T157 29T125 76T113 136ZM113 849Q113 880 124 +908T156 956T205 988T265 1000Q296 1000 324 988T372 956T404 908T416 849Q416 817 404 790T372 742T324 711T265 699Q233 699 205 710T157 742T125 789T113 849Z" /> +<glyph unicode=";" glyph-name="semicolon" horiz-adv-x="530" d="M120 152Q120 180 130 204T160 247T206 276T265 287Q303 287 331 274T378 237T406 183T415 118Q415 70 401 17T358 -89T289 -192T195 -284L152 -245Q134 -230 134 -208Q134 -200 139 -190T153 +-172Q164 -160 180 -143T212 -103T241 -54T261 3Q230 3 204 14T160 46T131 93T120 152ZM113 849Q113 880 124 908T156 956T205 988T265 1000Q296 1000 324 988T372 956T404 908T416 849Q416 817 404 790T372 742T324 711T265 699Q233 699 205 710T157 742T125 789T113 +849Z" /> +<glyph unicode="<" glyph-name="less" horiz-adv-x="1160" d="M139 724L931 1137V961Q931 941 921 925T888 896L525 710Q502 698 477 690T422 674Q451 667 476 659T525 638L888 451Q911 439 921 423T931 386V210L139 624V724Z" /> +<glyph unicode="=" glyph-name="equal" horiz-adv-x="1160" d="M136 588H1022V404H136V588ZM136 940H1022V757H136V940Z" /> +<glyph unicode=">" glyph-name="greater" horiz-adv-x="1160" d="M229 210V386Q229 406 239 422T272 451L635 638Q679 660 738 674Q709 681 684 689T635 710L272 896Q249 908 239 924T229 961V1137L1021 724V624L229 210Z" /> +<glyph unicode="?" glyph-name="question" horiz-adv-x="841" d="M37 1315Q71 1345 111 1372T199 1419T301 1450T420 1462Q507 1462 578 1438T701 1370T780 1262T808 1121Q808 1045 786 990T731 893T658 822T584 766T524 714T493 656L470 510H301L284 673Q283 +678 283 681T283 690Q283 734 305 766T360 827T431 883T502 941T557 1013T579 1107Q579 1143 566 1171T528 1220T471 1252T398 1263Q341 1263 302 1251T235 1223T188 1195T154 1182Q118 1182 102 1212L37 1315ZM226 136Q226 167 237 195T269 243T318 275T378 287Q409 +287 437 275T485 243T517 195T529 136Q529 104 517 77T485 29T437 -2T378 -14Q346 -14 318 -3T270 29T238 76T226 136Z" /> +<glyph unicode="@" glyph-name="at" horiz-adv-x="1645" d="M1166 184Q1098 184 1045 216T970 319Q911 247 845 216T703 185Q640 185 594 207T516 267T469 358T453 473Q453 530 467 588T511 701T583 803T686 886T818 942T980 963Q1057 963 1112 951T1218 917L1122 +546Q1106 482 1106 439Q1106 409 1113 389T1133 357T1164 341T1203 336Q1245 336 1282 362T1348 437T1392 551T1409 695Q1409 825 1369 924T1256 1089T1082 1189T861 1223Q730 1223 618 1174T423 1038T294 835T247 583Q247 419 298 295T438 87T647 -39T908 -81Q985 +-81 1052 -73T1175 -50T1277 -17T1359 23Q1379 34 1393 34Q1422 34 1434 2L1468 -87Q1364 -155 1225 -198T908 -241Q727 -241 573 -184T307 -21T131 239T67 583Q67 690 94 791T173 980T296 1143T456 1270T646 1352T861 1382Q1003 1382 1133 1335T1364 1199T1525 +983T1585 695Q1585 588 1554 495T1466 332T1333 224T1166 184ZM752 344Q778 344 804 352T855 380T899 435T932 520L1005 802Q973 808 939 808Q877 808 823 781T730 708T667 603T644 479Q644 415 671 380T752 344Z" /> +<glyph unicode="A" glyph-name="A" horiz-adv-x="1420" d="M1417 0H1209Q1174 0 1152 17T1119 61L1011 356H412L304 61Q296 38 273 19T215 0H6L574 1446H849L1417 0ZM481 546H942L766 1027Q754 1059 740 1102T711 1197Q697 1146 684 1102T657 1025L481 546Z" /> +<glyph unicode="B" glyph-name="B" horiz-adv-x="1303" d="M146 0V1446H645Q787 1446 887 1419T1052 1342T1147 1221T1177 1061Q1177 1010 1162 964T1116 877T1036 803T920 747Q1218 680 1218 425Q1218 333 1183 255T1081 121T916 32T692 0H146ZM415 634V210H688Q763 +210 813 228T894 276T938 346T952 431Q952 478 937 515T890 579T808 620T687 634H415ZM415 820H630Q767 820 838 870T909 1029Q909 1142 845 1190T645 1238H415V820Z" /> +<glyph unicode="C" glyph-name="C" horiz-adv-x="1341" d="M1140 341Q1162 341 1178 324L1284 209Q1196 100 1068 42T759 -16Q598 -16 470 39T250 192T111 426T62 723Q62 886 116 1021T268 1255T502 1407T804 1462Q965 1462 1085 1411T1292 1274L1202 1149Q1194 +1137 1182 1128T1147 1119Q1124 1119 1100 1137T1039 1176T946 1215T802 1233Q700 1233 615 1198T468 1096T372 936T337 723Q337 601 371 506T465 346T604 247T776 212Q831 212 875 218T957 237T1028 270T1095 321Q1105 330 1116 335T1140 341Z" /> +<glyph unicode="D" glyph-name="D" horiz-adv-x="1495" d="M1430 723Q1430 564 1377 431T1228 202T997 53T698 0H146V1446H698Q862 1446 997 1393T1228 1244T1377 1015T1430 723ZM1155 723Q1155 842 1123 936T1032 1096T889 1197T698 1232H417V214H698Q804 214 +888 249T1032 349T1123 509T1155 723Z" /> +<glyph unicode="E" glyph-name="E" horiz-adv-x="1145" d="M1058 1446V1232H417V831H922V624H417V215H1058V0H146V1446H1058Z" /> +<glyph unicode="F" glyph-name="F" horiz-adv-x="1123" d="M1058 1446V1232H417V804H958V589H417V0H146V1446H1058Z" /> +<glyph unicode="G" glyph-name="G" horiz-adv-x="1446" d="M810 198Q901 198 968 214T1097 260V523H916Q890 523 875 537T860 573V725H1341V140Q1286 100 1227 71T1100 22T955 -6T789 -16Q631 -16 498 39T268 192T117 426T62 723Q62 886 115 1022T265 1256T502 +1408T814 1462Q991 1462 1120 1410T1340 1273L1262 1151Q1239 1114 1201 1114Q1177 1114 1152 1130Q1120 1149 1087 1168T1013 1201T922 1224T805 1233Q698 1233 612 1197T464 1094T370 933T337 723Q337 598 372 501T470 336T620 234T810 198Z" /> +<glyph unicode="H" glyph-name="H" horiz-adv-x="1512" d="M1366 0H1095V632H417V0H146V1446H417V824H1095V1446H1366V0Z" /> +<glyph unicode="I" glyph-name="I" horiz-adv-x="628" d="M449 0H179V1446H449V0Z" /> +<glyph unicode="J" glyph-name="J" horiz-adv-x="874" d="M728 514Q728 392 698 294T609 127T460 21T253 -16Q199 -16 147 -10T38 11L52 171Q54 193 68 206T111 220Q128 220 155 213T225 206Q282 206 326 222T399 275T444 368T459 508V1446H728V514Z" /> +<glyph unicode="K" glyph-name="K" horiz-adv-x="1396" d="M424 840H487Q525 840 550 850T593 884L992 1389Q1017 1421 1044 1433T1114 1446H1346L859 845Q836 817 815 798T770 767Q803 755 829 733T881 677L1383 0H1145Q1097 0 1074 13T1034 53L625 587Q605 613 +580 624T509 636H424V0H155V1447H424V840Z" /> +<glyph unicode="L" glyph-name="L" horiz-adv-x="1034" d="M415 222H994V0H146V1446H415V222Z" /> +<glyph unicode="M" glyph-name="M" horiz-adv-x="1860" d="M872 600Q889 568 903 534T932 464Q946 500 961 535T993 602L1421 1403Q1429 1418 1437 1427T1456 1440T1480 1445T1511 1446H1714V0H1477V934Q1477 960 1478 991T1483 1054L1046 234Q1031 206 1007 191T951 +175H914Q882 175 858 190T819 234L376 1057Q380 1024 381 993T383 934V0H146V1446H349Q367 1446 380 1445T403 1440T423 1427T440 1403L872 600V600Z" /> +<glyph unicode="N" glyph-name="N" horiz-adv-x="1512" d="M287 1446Q305 1446 317 1445T338 1439T357 1426T377 1403L1136 436Q1132 471 1131 504T1129 567V1446H1366V0H1227Q1195 0 1174 10T1133 46L377 1009Q380 977 381 946T383 888V0H146V1446H287V1446Z" /> +<glyph unicode="O" glyph-name="O" horiz-adv-x="1599" d="M1533 723Q1533 564 1480 429T1331 194T1100 40T801 -16Q637 -16 502 39T270 194T120 428T67 723Q67 882 120 1017T269 1252T501 1406T801 1462Q965 1462 1100 1406T1331 1252T1480 1018T1533 723ZM1257 +723Q1257 842 1226 936T1135 1097T992 1198T801 1233Q695 1233 610 1198T466 1097T374 937T342 723Q342 604 374 510T465 350T610 249T801 214Q907 214 991 249T1135 349T1225 509T1257 723Z" /> +<glyph unicode="P" glyph-name="P" horiz-adv-x="1250" d="M424 509V0H155V1446H626Q771 1446 877 1412T1052 1317T1154 1171T1187 985Q1187 880 1152 793T1047 642T872 544T626 509H424ZM424 719H626Q700 719 755 737T846 790T900 874T918 985Q918 1043 900 1090T846 +1170T755 1220T626 1238H424V719Z" /> +<glyph unicode="Q" glyph-name="Q" horiz-adv-x="1599" d="M1533 723Q1533 626 1513 538T1456 372T1364 231T1241 117L1608 -283H1386Q1338 -283 1300 -270T1229 -222L1017 12Q966 -2 913 -9T801 -16Q637 -16 502 39T270 194T120 428T67 723Q67 882 120 1017T269 +1252T501 1406T801 1462Q965 1462 1100 1406T1331 1252T1480 1018T1533 723ZM1257 723Q1257 842 1226 936T1135 1097T992 1198T801 1233Q695 1233 610 1198T466 1097T374 937T342 723Q342 604 374 510T465 350T610 249T801 214Q907 214 991 249T1135 349T1225 509T1257 +723Z" /> +<glyph unicode="R" glyph-name="R" horiz-adv-x="1310" d="M424 565V0H155V1446H596Q744 1446 849 1416T1022 1330T1121 1199T1153 1030Q1153 957 1132 892T1070 774T970 681T834 617Q885 588 922 534L1284 0H1042Q1007 0 983 14T941 54L637 517Q620 543 600 554T539 +565H424ZM424 758H592Q668 758 724 777T817 829T872 909T890 1010Q890 1120 818 1179T596 1238H424V758Z" /> +<glyph unicode="S" glyph-name="S" horiz-adv-x="1073" d="M921 1183Q910 1161 896 1152T861 1143Q841 1143 816 1158T757 1193T678 1227T570 1243Q514 1243 473 1230T403 1192T360 1135T346 1061Q346 1010 374 976T450 918T557 875T679 835T802 785T909 713T984 +606T1013 453Q1013 355 980 270T882 121T724 21T511 -16Q442 -16 375 -3T247 36T132 96T36 174L114 303Q125 317 140 326T175 336Q200 336 229 316T297 270T390 225T519 204Q634 204 697 258T760 415Q760 472 732 508T656 568T549 610T427 647T305 695T198 768T123 +880T94 1047Q94 1126 125 1201T217 1334T366 1427T567 1462Q695 1462 803 1422T987 1310L921 1183Z" /> +<glyph unicode="T" glyph-name="T" horiz-adv-x="1190" d="M1165 1446V1225H730V0H461V1225H24V1446H1165Z" /> +<glyph unicode="U" glyph-name="U" horiz-adv-x="1456" d="M728 217Q806 217 867 243T971 316T1036 430T1059 580V1446H1328V580Q1328 451 1287 342T1167 153T978 29T728 -16Q589 -16 478 28T290 152T171 341T129 580V1446H398V581Q398 498 420 431T485 317T588 +243T728 217Z" /> +<glyph unicode="V" glyph-name="V" horiz-adv-x="1420" d="M4 1446H221Q256 1446 278 1429T311 1385L651 503Q668 460 683 409T713 300Q736 415 770 503L1109 1385Q1118 1408 1141 1427T1198 1446H1415L831 0H588L4 1446Z" /> +<glyph unicode="W" glyph-name="W" horiz-adv-x="2093" d="M12 1446H238Q273 1446 296 1430T328 1385L574 520Q583 488 590 451T605 371Q613 413 622 450T643 520L927 1385Q935 1408 958 1427T1016 1446H1095Q1130 1446 1153 1430T1185 1385L1467 520Q1489 456 +1505 378Q1512 417 1519 453T1535 520L1781 1385Q1788 1410 1812 1428T1870 1446H2081L1632 0H1389L1073 988Q1067 1007 1061 1029T1048 1076Q1042 1051 1036 1029T1023 988L704 0H461L12 1446Z" /> +<glyph unicode="X" glyph-name="X" horiz-adv-x="1358" d="M493 744L32 1446H300Q328 1446 340 1439T363 1414L692 883Q697 896 703 908T717 934L1018 1409Q1040 1446 1075 1446H1333L867 755L1346 0H1077Q1050 0 1034 14T1006 46L671 600Q667 588 662 578T652 +558L331 46Q320 29 304 15T264 0H12L493 744Z" /> +<glyph unicode="Y" glyph-name="Y" horiz-adv-x="1309" d="M789 562V0H520V562L-7 1446H230Q265 1446 285 1429T320 1386L585 903Q608 860 625 822T656 746Q669 784 685 822T725 903L988 1386Q999 1408 1021 1427T1077 1446H1315L789 562Z" /> +<glyph unicode="Z" glyph-name="Z" horiz-adv-x="1234" d="M1179 1446V1347Q1179 1301 1153 1263L411 215H1161V0H62V106Q62 126 69 144T87 179L831 1232H109V1446H1179Z" /> +<glyph unicode="[" glyph-name="bracketleft" horiz-adv-x="600" d="M115 -308V1547H525V1450Q525 1424 507 1406T459 1387H321V-148H459Q488 -148 506 -166T525 -211V-308H115Z" /> +<glyph unicode="\" glyph-name="backslash" horiz-adv-x="781" d="M-28 1486H78Q122 1486 154 1464T204 1399L787 -95H683Q644 -95 607 -72T552 -3L-28 1486Z" /> +<glyph unicode="]" glyph-name="bracketright" horiz-adv-x="600" d="M75 -308V-211Q75 -185 93 -167T141 -148H279V1387H141Q112 1387 94 1405T75 1450V1547H485V-308H75Z" /> +<glyph unicode="^" glyph-name="asciicircum" horiz-adv-x="1160" d="M1028 777H847Q824 777 810 789T785 818L626 1107Q611 1135 599 1160T578 1211Q570 1185 559 1160T533 1107L377 818Q368 801 353 789T312 777H122L495 1446H655L1028 777Z" /> +<glyph unicode="_" glyph-name="underscore" horiz-adv-x="788" d="M788 -134V-294H0V-134H788Z" /> +<glyph unicode="`" glyph-name="grave" horiz-adv-x="638" d="M230 1462Q271 1462 290 1449T325 1409L468 1166H327Q299 1166 282 1173T246 1201L-1 1462H230Z" /> +<glyph unicode="a" glyph-name="a" horiz-adv-x="1047" d="M936 0H825Q790 0 770 10T740 53L718 126Q679 91 642 65T564 20T479 -7T379 -16Q314 -16 259 1T165 54T103 141T81 262Q81 320 111 376T213 478T402 554T695 588V648Q695 751 652 800T525 850Q465 850 +425 836T356 805T301 773T246 759Q221 759 203 772T174 804L129 883Q306 1045 556 1045Q646 1045 716 1016T836 934T910 808T936 648V0ZM456 154Q494 154 526 161T586 182T641 216T695 265V438Q587 433 515 420T398 385T336 336T317 275Q317 210 355 182T456 154Z" +/> +<glyph unicode="b" glyph-name="b" horiz-adv-x="1140" d="M135 0V1486H382V900Q443 965 520 1003T700 1042Q784 1042 853 1008T973 907T1051 744T1079 521Q1079 406 1048 308T960 138T821 26T638 -15Q591 -15 552 -6T481 21T422 62T369 117L358 48Q352 22 338 +11T298 0H135ZM615 850Q538 850 484 818T382 726V266Q424 214 473 194T581 173Q637 173 682 194T758 258T807 366T824 521Q824 611 810 673T768 775T703 832T615 850Z" /> +<glyph unicode="c" glyph-name="c" horiz-adv-x="954" d="M853 809Q842 795 832 787T801 779Q782 779 764 790T721 816T662 842T576 854Q511 854 462 831T381 763T332 657T316 515Q316 433 333 369T384 262T464 196T570 173Q629 173 665 187T727 219T770 251T812 +266Q842 266 857 243L928 153Q887 105 839 73T740 21T633 -7T524 -15Q429 -15 345 20T199 124T100 290T63 515Q63 628 95 724T191 891T347 1002T561 1042Q676 1042 762 1005T918 899L853 809Z" /> +<glyph unicode="d" glyph-name="d" horiz-adv-x="1140" d="M854 0Q806 0 791 45L771 144Q739 108 704 79T629 29T542 -3T441 -15Q357 -15 287 20T167 121T89 286T61 510Q61 624 92 722T181 892T320 1004T502 1045Q588 1045 649 1018T758 944V1486H1005V0H854ZM525 +181Q602 181 656 213T758 304V764Q716 815 667 836T560 857Q504 857 459 836T382 773T333 665T316 510Q316 420 330 358T372 256T438 199T525 181Z" /> +<glyph unicode="e" glyph-name="e" horiz-adv-x="1069" d="M556 1042Q653 1042 734 1011T875 921T967 775T1000 577Q1000 549 998 531T989 502T971 487T943 482H309Q320 324 394 250T590 176Q650 176 693 190T769 221T826 252T874 266Q889 266 900 260T919 243L991 +153Q950 105 899 73T793 21T680 -7T568 -15Q461 -15 369 20T209 125T102 297T63 535Q63 640 97 732T194 893T349 1002T556 1042ZM561 865Q453 865 392 804T314 631H778Q778 679 765 721T725 796T657 846T561 865Z" /> +<glyph unicode="f" glyph-name="f" horiz-adv-x="701" d="M176 0V840L87 854Q58 859 41 874T23 916V1017H176V1093Q176 1181 202 1251T278 1370T399 1445T559 1471Q630 1471 691 1452L686 1328Q684 1299 659 1292T601 1285Q557 1285 523 1276T464 1243T428 1181T415 +1085V1017H682V841H423V0H176Z" /> +<glyph unicode="g" glyph-name="g" horiz-adv-x="1035" d="M487 1044Q553 1044 611 1031T717 991H1012V899Q1012 876 1000 863T959 845L867 828Q877 802 882 773T888 712Q888 636 858 575T774 470T647 404T487 380Q429 380 374 391Q326 362 326 326Q326 295 354 +281T429 260T535 253T656 246T777 229T882 189T957 116T986 -4Q986 -72 953 -136T856 -250T700 -330T490 -361Q373 -361 287 -339T145 -279T60 -192T32 -90Q32 -18 76 31T198 109Q160 130 137 165T114 256Q114 279 122 303T146 352T188 397T247 436Q169 478 125 +548T80 712Q80 788 110 849T195 954T324 1021T487 1044ZM758 -46Q758 -16 740 3T691 32T619 48T531 55T435 60T339 69Q297 46 272 15T246 -58Q246 -85 259 -108T302 -149T379 -175T494 -185Q563 -185 613 -175T695 -146T743 -102T758 -46ZM487 538Q533 538 567 +550T623 585T657 638T669 706Q669 782 624 826T487 871Q396 871 351 827T305 706Q305 670 316 639T350 586T407 551T487 538Z" /> +<glyph unicode="h" glyph-name="h" horiz-adv-x="1137" d="M132 0V1486H379V915Q439 972 511 1007T680 1042Q764 1042 829 1014T937 934T1003 811T1026 653V0H779V653Q779 747 736 798T605 850Q541 850 485 821T379 742V0H132Z" /> +<glyph unicode="i" glyph-name="i" horiz-adv-x="542" d="M395 1026V0H148V1026H395ZM432 1325Q432 1293 419 1265T385 1216T334 1183T272 1170Q240 1170 212 1182T162 1216T129 1265T116 1325Q116 1358 128 1387T162 1437T211 1470T272 1483Q305 1483 334 1471T384 +1437T419 1387T432 1325Z" /> +<glyph unicode="j" glyph-name="j" horiz-adv-x="538" d="M395 1026V-35Q395 -102 378 -161T322 -264T221 -334T68 -360Q33 -360 3 -356T-58 -341L-50 -208Q-47 -188 -34 -183T16 -177Q53 -177 78 -170T119 -146T141 -102T148 -35V1026H395ZM432 1325Q432 1293 +419 1265T385 1216T334 1183T272 1170Q240 1170 212 1182T162 1216T129 1265T116 1325Q116 1358 128 1387T162 1437T211 1470T272 1483Q305 1483 334 1471T384 1437T419 1387T432 1325Z" /> +<glyph unicode="k" glyph-name="k" horiz-adv-x="1103" d="M382 1486V635H428Q453 635 467 642T497 668L752 983Q769 1003 788 1014T838 1026H1064L745 645Q728 624 710 607T671 576Q692 561 708 541T740 498L1082 0H859Q830 0 810 10T774 44L513 433Q498 456 +483 463T438 470H382V0H135V1486H382Z" /> +<glyph unicode="l" glyph-name="l" horiz-adv-x="542" d="M395 1486V0H148V1486H395Z" /> +<glyph unicode="m" glyph-name="m" horiz-adv-x="1684" d="M132 0V1026H283Q331 1026 346 981L362 905Q389 935 418 960T481 1003T553 1031T638 1042Q735 1042 797 990T891 850Q915 901 951 937T1030 997T1121 1031T1219 1042Q1304 1042 1370 1016T1481 940T1549 +818T1573 653V0H1326V653Q1326 751 1283 800T1157 850Q1119 850 1087 837T1030 800T991 738T977 653V0H729V653Q729 756 688 803T565 850Q512 850 466 824T379 751V0H132Z" /> +<glyph unicode="n" glyph-name="n" horiz-adv-x="1137" d="M132 0V1026H283Q331 1026 346 981L363 900Q394 932 428 958T501 1003T584 1032T680 1042Q764 1042 829 1014T937 934T1003 811T1026 653V0H779V653Q779 747 736 798T605 850Q541 850 485 821T379 742V0H132Z" /> +<glyph unicode="o" glyph-name="o" horiz-adv-x="1137" d="M570 1042Q685 1042 778 1005T938 900T1040 734T1076 515Q1076 393 1040 295T938 128T779 22T570 -15Q455 -15 361 22T201 128T98 295T61 515Q61 636 97 734T200 900T361 1005T570 1042ZM570 175Q698 +175 759 261T821 513Q821 679 760 766T570 853Q440 853 378 766T316 513Q316 348 378 262T570 175Z" /> +<glyph unicode="p" glyph-name="p" horiz-adv-x="1131" d="M132 -335V1026H283Q307 1026 324 1015T346 981L366 886Q428 957 508 1001T697 1045Q781 1045 850 1010T970 909T1048 745T1076 521Q1076 406 1045 308T957 138T818 26T635 -15Q548 -15 488 11T379 85V-335H132ZM612 +850Q535 850 481 818T379 726V266Q421 214 470 194T577 173Q633 173 678 194T755 258T804 366T821 521Q821 611 807 673T765 775T700 832T612 850Z" /> +<glyph unicode="q" glyph-name="q" horiz-adv-x="1140" d="M1005 1026V-335H758V129Q727 96 693 70T619 25T536 -4T441 -15Q357 -15 287 20T167 121T89 286T61 510Q61 624 92 722T181 892T320 1004T502 1045Q550 1045 589 1037T662 1012T724 974T778 924L791 981Q796 +1004 813 1015T854 1026H1005ZM525 181Q602 181 656 213T758 304V764Q716 815 667 836T560 857Q504 857 459 836T382 773T333 665T316 510Q316 420 330 358T372 256T438 199T525 181Z" /> +<glyph unicode="r" glyph-name="r" horiz-adv-x="817" d="M132 0V1026H277Q315 1026 330 1012T350 964L365 840Q420 935 494 990T660 1045Q736 1045 786 1010L754 825Q751 807 741 800T714 792Q699 792 673 799T604 806Q527 806 472 764T379 639V0H132Z" /> +<glyph unicode="s" glyph-name="s" horiz-adv-x="874" d="M741 826Q731 810 720 804T692 797Q674 797 654 807T606 829T545 852T463 862Q390 862 348 831T306 750Q306 717 327 695T384 655T465 625T557 595T649 559T729 507T786 431T808 325Q808 251 781 189T702 +81T574 10T398 -16Q345 -16 295 -7T198 20T112 60T42 110L99 204Q110 221 125 230T163 239Q186 239 206 226T254 198T317 170T410 157Q454 157 485 167T537 195T567 234T577 281Q577 317 556 340T499 380T418 410T325 440T232 477T151 532T94 613T72 729Q72 792 +97 849T170 948T291 1016T459 1042Q565 1042 652 1007T797 915L741 826Z" /> +<glyph unicode="t" glyph-name="t" horiz-adv-x="774" d="M469 -16Q336 -16 264 59T192 268V841H88Q68 841 54 854T39 893V991L204 1018L256 1298Q260 1318 274 1329T311 1340H439V1017H709V841H439V285Q439 237 463 210T527 183Q550 183 565 188T592 200T613 +211T631 217Q642 217 649 212T664 195L738 75Q684 30 614 7T469 -16Z" /> +<glyph unicode="u" glyph-name="u" horiz-adv-x="1137" d="M358 1026V374Q358 280 401 229T532 177Q596 177 652 205T758 284V1026H1005V0H854Q806 0 791 45L774 127Q742 95 708 69T636 24T553 -5T457 -16Q373 -16 309 12T200 93T134 216T111 374V1026H358Z" /> +<glyph unicode="v" glyph-name="v" horiz-adv-x="1067" d="M646 0H422L14 1026H219Q246 1026 264 1013T290 980L488 432Q505 384 516 338T537 246Q546 292 557 338T587 432L790 980Q797 1000 815 1013T858 1026H1053L646 0Z" /> +<glyph unicode="w" glyph-name="w" horiz-adv-x="1582" d="M7 1026H203Q231 1026 250 1013T274 980L421 432Q433 387 440 344T455 258Q466 301 478 344T505 432L675 982Q681 1002 699 1015T741 1028H850Q877 1028 895 1015T919 982L1087 422Q1100 379 1110 339T1131 +257Q1138 300 1146 343T1168 432L1320 980Q1325 1000 1344 1013T1388 1026H1575L1250 0H1051Q1019 0 1005 44L820 637Q811 666 804 695T791 754Q785 724 778 695T762 635L575 44Q561 0 521 0H332L7 1026Z" /> +<glyph unicode="x" glyph-name="x" horiz-adv-x="1080" d="M375 529L38 1026H276Q303 1026 316 1019T339 994L554 651Q559 668 566 685T585 719L758 989Q770 1008 783 1017T815 1026H1042L704 540L1056 0H818Q791 0 775 14T747 46L529 403Q520 367 504 343L312 +46Q301 29 285 15T245 0H24L375 529Z" /> +<glyph unicode="y" glyph-name="y" horiz-adv-x="1067" d="M496 -282Q485 -308 468 -321T414 -335H230L422 76L7 1026H223Q253 1026 269 1012T293 980L512 448Q523 422 531 394T545 338Q553 367 562 394T583 449L789 980Q797 1000 815 1013T857 1026H1055L496 -282Z" /> +<glyph unicode="z" glyph-name="z" horiz-adv-x="939" d="M874 924Q874 898 865 874T842 832L354 190H860V0H67V103Q67 120 75 143T100 188L592 837H96V1026H874V924Z" /> +<glyph unicode="{" glyph-name="braceleft" horiz-adv-x="600" d="M149 410Q149 471 121 509T29 548V691Q92 691 120 729T149 829Q149 876 143 922T128 1016T113 1110T106 1207Q106 1283 128 1345T195 1453T310 1522T474 1547H527V1437Q527 1424 522 1415T508 +1399T490 1390T474 1387H465Q395 1387 358 1343T321 1222Q321 1167 327 1117T339 1019T352 925T358 832Q358 794 348 760T317 699T268 650T203 619Q239 608 267 588T316 539T347 477T358 406Q358 359 352 313T340 220T327 122T321 16Q321 -60 358 -104T465 -148H474Q481 +-148 490 -151T507 -160T521 -176T527 -199V-308H474Q380 -308 311 -284T196 -215T128 -108T106 31Q106 80 112 127T127 222T142 316T149 410Z" /> +<glyph unicode="|" glyph-name="bar" horiz-adv-x="600" d="M204 1547H396V-335H204V1547Z" /> +<glyph unicode="}" glyph-name="braceright" horiz-adv-x="600" d="M451 410Q451 363 457 316T472 222T487 128T494 31Q494 -45 472 -107T405 -214T290 -283T126 -308H73V-199Q73 -186 78 -176T92 -160T110 -151T126 -148H135Q205 -148 242 -104T279 16Q279 71 +273 121T261 219T248 313T242 406Q242 443 252 477T283 539T332 587T397 619Q361 629 332 650T283 698T253 760T242 832Q242 879 248 925T260 1018T273 1116T279 1222Q279 1299 242 1343T135 1387H126Q119 1387 110 1390T93 1399T79 1414T73 1437V1547H126Q220 +1547 289 1523T404 1453T472 1346T494 1207Q494 1158 488 1111T473 1016T458 923T451 829Q451 768 479 730T571 691V548Q508 548 480 510T451 410Z" /> +<glyph unicode="~" glyph-name="asciitilde" horiz-adv-x="1160" d="M745 648Q801 648 832 684T863 785H1062Q1062 708 1042 646T983 539T888 470T760 446Q707 446 659 460T567 490T485 521T415 535Q359 535 328 499T297 398H98Q98 475 118 537T177 644T272 713T400 +737Q453 737 501 723T593 693T675 662T745 648Z" /> +<glyph unicode=" " glyph-name="uni00A0" horiz-adv-x="386" /> +<glyph unicode="¡" glyph-name="exclamdown" horiz-adv-x="721" d="M247 -335V198Q247 289 256 376T280 562H447Q462 464 471 377T480 198V-335H247ZM209 892Q209 924 220 951T252 999T300 1030T360 1042Q392 1042 419 1031T467 999T500 952T512 892Q512 +860 500 833T468 785T420 753T360 741Q328 741 300 753T252 785T221 832T209 892Z" /> +<glyph unicode="¢" glyph-name="cent" horiz-adv-x="1160" d="M539 -8Q450 5 374 45T242 152T155 309T123 513Q123 622 156 716T253 881T412 993T629 1040L643 1197Q645 1220 663 1239T710 1259H801L781 1030Q860 1016 924 983T1042 899L978 812Q968 798 +958 791T928 784Q914 784 899 790T865 807T821 827T765 845L707 172Q760 177 795 191T856 221T901 248T940 260Q970 260 986 239L1054 151Q1019 110 977 81T889 33T793 3T691 -12L679 -159Q677 -183 659 -202T612 -222H521L539 -8ZM367 513Q367 379 416 297T556 +185L613 852Q487 836 427 748T367 513Z" /> +<glyph unicode="£" glyph-name="sterling" horiz-adv-x="1160" d="M39 679Q39 713 60 737T122 762H230V998Q230 1092 258 1176T343 1324T486 1425T688 1462Q768 1462 831 1442T944 1386T1030 1304T1093 1201L994 1138Q962 1122 937 1122Q900 1122 871 1155Q852 +1177 834 1195T794 1227T747 1247T688 1254Q585 1254 534 1187T483 999V762H892V664Q892 640 873 620T822 600H483V406Q483 340 459 289T391 193Q465 210 538 210H1124V106Q1124 88 1117 69T1095 35T1062 10T1018 0H59V155Q93 163 124 177T178 214T216 267T230 +339V600H39V679Z" /> +<glyph unicode="¤" glyph-name="currency" horiz-adv-x="1160" d="M211 673Q211 726 224 773T263 863L110 1015L235 1137L385 987Q428 1013 477 1027T580 1042Q632 1042 680 1029T770 990L922 1142L1045 1019L894 868Q920 825 934 776T949 673Q949 620 936 +573T897 484L1050 332L925 209L774 359Q732 333 683 319T580 305Q528 305 481 318T391 356L238 204L115 328L266 478Q240 521 226 570T211 673ZM393 673Q393 635 407 601T447 541T507 500T580 485Q619 485 653 500T713 540T754 600T769 673Q769 713 754 747T714 +807T654 848T580 863Q541 863 507 848T448 808T408 748T393 673Z" /> +<glyph unicode="¥" glyph-name="yen" horiz-adv-x="1160" d="M133 633H409L11 1446H216Q251 1446 273 1430T307 1386L526 898Q546 853 558 815T578 740Q586 777 597 815T629 898L846 1386Q857 1409 879 1427T935 1446H1142L743 633H1019V495H700V400H1019V263H700V0H453V263H133V400H453V495H133V633Z" +/> +<glyph unicode="¦" glyph-name="brokenbar" horiz-adv-x="600" d="M204 1547H396V738H204V1547ZM204 473H396V-335H204V473Z" /> +<glyph unicode="§" glyph-name="section" horiz-adv-x="1010" d="M827 1245Q817 1229 806 1222T778 1215Q759 1215 739 1225T691 1247T630 1270T548 1280Q506 1280 474 1271T421 1245T388 1206T376 1159Q376 1127 399 1103T462 1058T550 1016T652 974T753 +924T842 862T904 781T928 675Q928 594 891 529T770 423Q815 386 843 337T872 220Q872 146 846 84T767 -24T639 -95T462 -121Q409 -121 359 -112T262 -85T176 -45T106 5L164 99Q175 116 189 125T227 134Q250 134 270 121T319 93T386 65T484 52Q566 52 611 86T657 +180Q657 220 633 249T569 300T479 341T376 381T273 427T182 488T118 571T94 685Q94 764 135 826T262 926Q216 965 187 1018T158 1148Q158 1211 182 1267T256 1367T377 1435T544 1461Q650 1461 737 1426T882 1334L827 1245ZM313 725Q313 683 342 653T417 598T522 +551T637 502Q677 522 695 552T713 619Q713 663 685 693T612 749T511 796T398 844Q353 820 333 792T313 725Z" /> +<glyph unicode="¨" glyph-name="dieresis" horiz-adv-x="638" d="M270 1292Q270 1264 259 1240T229 1197T184 1169T130 1158Q103 1158 79 1168T35 1197T5 1239T-6 1292Q-6 1321 5 1346T35 1391T78 1421T130 1432Q158 1432 183 1421T228 1391T259 1347T270 +1292ZM644 1292Q644 1264 633 1240T603 1197T559 1169T505 1158Q477 1158 452 1168T409 1197T379 1239T368 1292Q368 1321 379 1346T408 1391T452 1421T505 1432Q533 1432 558 1421T603 1391T633 1347T644 1292Z" /> +<glyph unicode="©" glyph-name="copyright" horiz-adv-x="1583" d="M1017 512Q1028 512 1037 508T1052 495L1134 408Q1078 337 993 300T793 262Q693 262 612 297T474 395T385 542T354 726Q354 828 389 913T486 1059T631 1155T813 1189Q925 1189 1004 1152T1138 +1056L1073 967Q1067 959 1057 951T1030 943Q1013 943 998 953T962 975T909 997T826 1007Q766 1007 719 988T640 932T590 843T573 726Q573 658 590 606T639 519T712 465T805 446Q854 446 885 454T939 473T978 495T1017 512ZM53 723Q53 825 79 919T154 1096T269 1245T419 +1361T595 1435T791 1462Q893 1462 987 1436T1164 1361T1313 1246T1429 1096T1503 920T1530 723Q1530 622 1504 528T1429 352T1314 203T1164 87T988 13T791 -14Q689 -14 595 12T419 87T270 202T154 351T80 527T53 723ZM188 723Q188 593 234 480T362 284T554 152T791 +104Q918 104 1029 152T1222 283T1351 480T1398 723Q1398 810 1377 890T1316 1039T1222 1165T1099 1262T954 1325T791 1347Q706 1347 629 1325T484 1263T363 1166T269 1040T209 890T188 723Z" /> +<glyph unicode="ª" glyph-name="ordfeminine" horiz-adv-x="696" d="M622 841H539Q515 841 501 847T479 877L467 913Q443 893 421 878T376 853T327 838T267 833Q225 833 191 844T133 876T95 929T81 1002Q81 1035 98 1069T157 1132T270 1178T449 1200V1225Q449 +1279 426 1301T357 1324Q323 1324 301 1317T262 1301T230 1285T194 1278Q175 1278 162 1288T142 1311L111 1368Q167 1419 234 1442T379 1466Q435 1466 480 1448T556 1398T605 1321T622 1225V841ZM323 954Q361 954 390 967T449 1010V1091Q390 1089 352 1082T292 +1065T260 1041T251 1011Q251 979 269 967T323 954Z" /> +<glyph unicode="«" glyph-name="guillemotleft" horiz-adv-x="972" d="M123 522V554L379 950L460 912Q480 903 489 889T498 858Q498 837 485 815L347 580Q333 554 315 538Q331 524 347 496L485 260Q498 238 498 216Q498 182 460 164L379 126L123 522ZM452 +522V554L708 950L789 912Q809 903 818 889T827 858Q827 837 814 815L676 580Q662 554 644 538Q660 524 676 496L814 260Q827 238 827 216Q827 182 789 164L708 126L452 522Z" /> +<glyph unicode="¬" glyph-name="logicalnot" horiz-adv-x="1160" d="M136 763H1022V297H813V580H136V763Z" /> +<glyph unicode="­" glyph-name="uni00AD" horiz-adv-x="718" d="M100 707H618V501H100V707Z" /> +<glyph unicode="®" glyph-name="registered" horiz-adv-x="1583" d="M53 723Q53 825 79 919T154 1096T269 1245T419 1361T595 1435T791 1462Q893 1462 987 1436T1164 1361T1313 1246T1429 1096T1503 920T1530 723Q1530 622 1504 528T1429 352T1314 203T1164 +87T988 13T791 -14Q689 -14 595 12T419 87T270 202T154 351T80 527T53 723ZM188 723Q188 593 234 480T362 284T554 152T791 104Q918 104 1029 152T1222 283T1351 480T1398 723Q1398 810 1377 890T1316 1039T1222 1165T1099 1262T954 1325T791 1347Q706 1347 629 +1325T484 1263T363 1166T269 1040T209 890T188 723ZM679 602V277H465V1174H786Q973 1174 1060 1107T1147 915Q1147 826 1101 760T958 662Q981 649 996 630T1026 584L1207 277H1001Q956 277 938 310L794 573Q784 587 772 594T734 602H679ZM679 755H768Q819 755 852 +763T903 789T929 831T936 888Q936 919 930 942T908 981T862 1004T786 1012H679V755Z" /> +<glyph unicode="¯" glyph-name="overscore" horiz-adv-x="638" d="M20 1372H618V1214H20V1372Z" /> +<glyph unicode="°" glyph-name="degree" horiz-adv-x="803" d="M55 1123Q55 1194 81 1256T154 1365T264 1437T400 1464Q473 1464 536 1438T647 1365T721 1257T748 1123Q748 1054 721 992T647 884T537 810T400 783Q327 783 264 810T155 883T82 992T55 1123ZM227 +1121Q227 1084 240 1052T276 997T331 960T400 946Q437 946 469 959T524 996T561 1052T574 1121Q574 1159 561 1191T525 1248T469 1286T400 1300Q363 1300 332 1286T277 1248T240 1192T227 1121Z" /> +<glyph unicode="±" glyph-name="plusminus" horiz-adv-x="1160" d="M678 1241V887H1067V703H678V362H478V703H91V887H478V1241H678ZM91 263H1067V80H91V263Z" /> +<glyph unicode="²" glyph-name="twosuperior" horiz-adv-x="666" d="M350 1649Q408 1649 453 1632T530 1586T578 1518T594 1432Q594 1391 582 1357T549 1292T501 1232T445 1173L317 1043Q345 1051 372 1055T422 1060H551Q579 1060 594 1045T610 1005V900H69V957Q69 +974 75 993T98 1028L307 1234Q329 1256 349 1280T383 1329T405 1378T414 1426Q414 1462 395 1484T340 1507Q307 1507 287 1491T254 1443Q243 1425 231 1416T195 1407Q190 1407 185 1407T172 1409L73 1424Q90 1539 164 1594T350 1649Z" /> +<glyph unicode="³" glyph-name="threesuperior" horiz-adv-x="666" d="M360 1649Q417 1649 461 1633T536 1589T583 1528T599 1456Q599 1393 573 1350T490 1282Q550 1262 581 1226T612 1130Q612 1068 589 1024T529 950T445 906T350 892Q296 892 253 902T177 +936T118 998T74 1093L151 1124Q173 1132 191 1132Q228 1132 242 1104Q248 1093 256 1081T276 1060T304 1044T341 1038Q386 1038 410 1063T434 1123Q434 1150 427 1168T404 1197T359 1212T288 1217V1333Q330 1333 357 1339T400 1357T422 1386T429 1424Q429 1461 +410 1482T351 1504Q316 1504 296 1488T264 1445Q255 1425 243 1416T211 1406Q200 1406 185 1409L94 1424Q102 1481 125 1523T184 1594T264 1635T360 1649Z" /> +<glyph unicode="´" glyph-name="acute" horiz-adv-x="638" d="M665 1462L418 1201Q399 1181 382 1174T336 1166H188L330 1409Q345 1435 365 1448T425 1462H665Z" /> +<glyph unicode="µ" glyph-name="mu" horiz-adv-x="1137" d="M358 1026V374Q358 280 401 229T532 177Q596 177 652 205T758 284V1026H1005V0H854Q806 0 791 45L774 128Q743 97 713 76T652 41T588 21T516 15Q457 15 409 33T324 84Q335 40 338 -7T342 -95V-335H220Q168 +-335 140 -309T111 -232V1026H358Z" /> +<glyph unicode="¶" glyph-name="paragraph" horiz-adv-x="1401" d="M1370 1446V1239H1156V-209H940V1239H705V-209H489V630Q385 630 301 662T158 750T66 880T33 1037Q33 1128 65 1203T157 1332T301 1416T489 1446H1370Z" /> +<glyph unicode="·" glyph-name="middot" horiz-adv-x="559" d="M91 595Q91 634 105 668T145 728T205 768T278 783Q318 783 352 769T412 729T453 669T468 595Q468 556 453 523T413 464T353 424T278 409Q239 409 205 423T146 463T106 522T91 595Z" /> +<glyph unicode="¸" glyph-name="cedilla" horiz-adv-x="638" d="M183 -227Q190 -227 197 -229T214 -234T235 -239T263 -241Q296 -241 312 -229T329 -198Q329 -169 293 -157T182 -134L227 14H381L361 -55Q450 -77 486 -114T522 -203Q522 -236 505 -263T455 +-309T378 -338T279 -349Q238 -349 203 -343T132 -326L155 -250Q161 -227 183 -227Z" /> +<glyph unicode="¹" glyph-name="onesuperior" horiz-adv-x="666" d="M161 1014H300V1374L305 1425L228 1364Q212 1352 194 1352Q179 1352 167 1358T150 1372L95 1447L328 1641H477V1014H592V900H161V1014Z" /> +<glyph unicode="º" glyph-name="ordmasculine" horiz-adv-x="776" d="M390 1464Q462 1464 522 1442T625 1380T691 1281T715 1149Q715 1075 692 1016T625 915T522 851T390 829Q316 829 256 851T152 914T85 1015T61 1149Q61 1222 85 1280T152 1379T255 1442T390 +1464ZM390 973Q457 973 489 1015T522 1147Q522 1236 490 1278T390 1320Q319 1320 287 1278T254 1147Q254 1058 286 1016T390 973Z" /> +<glyph unicode="»" glyph-name="guillemotright" horiz-adv-x="972" d="M263 126L182 164Q162 173 153 187T144 218Q144 238 157 260L295 496Q311 524 327 538Q309 554 295 580L157 815Q144 837 144 858Q144 894 182 912L263 950L519 554V522L263 126ZM592 +126L511 164Q491 173 482 187T473 218Q473 238 486 260L624 496Q640 524 656 538Q638 554 624 580L486 815Q473 837 473 858Q473 894 511 912L592 950L848 554V522L592 126Z" /> +<glyph unicode="¼" glyph-name="onequarter" horiz-adv-x="1424" d="M455 71Q429 30 400 15T332 0H226L1060 1365Q1083 1403 1114 1424T1190 1446H1295L455 71ZM1320 282H1414V194Q1414 181 1405 171T1380 161H1320V0H1172V161H883Q859 161 846 171T829 198L814 +274L1149 741H1320V282ZM142 820H281V1180L286 1231L209 1170Q193 1158 175 1158Q160 1158 148 1164T131 1178L76 1253L309 1447H458V820H573V706H142V820ZM1172 450Q1172 473 1173 501T1179 559L977 282H1172V450Z" /> +<glyph unicode="½" glyph-name="onehalf" horiz-adv-x="1424" d="M414 71Q388 30 359 15T291 0H185L1019 1365Q1042 1403 1073 1424T1149 1446H1254L414 71ZM1128 749Q1186 749 1231 732T1308 686T1356 618T1372 532Q1372 491 1360 457T1327 392T1279 332T1223 +273L1095 143Q1123 151 1150 155T1200 160H1329Q1357 160 1372 145T1388 105V0H847V57Q847 74 853 93T876 128L1085 334Q1107 356 1127 380T1161 429T1183 478T1192 526Q1192 562 1173 584T1118 607Q1085 607 1066 592T1032 543Q1016 507 973 507Q968 507 963 507T950 +509L851 524Q868 639 942 694T1128 749ZM142 820H281V1180L286 1231L209 1170Q193 1158 175 1158Q160 1158 148 1164T131 1178L76 1253L309 1447H458V820H573V706H142V820Z" /> +<glyph unicode="¾" glyph-name="threequarters" horiz-adv-x="1425" d="M458 71Q432 30 403 15T335 0H229L1063 1365Q1086 1403 1117 1424T1193 1446H1298L458 71ZM1320 282H1414V194Q1414 181 1405 171T1380 161H1320V0H1172V161H883Q859 161 846 171T829 +198L814 274L1149 741H1320V282ZM341 1455Q398 1455 442 1439T517 1395T564 1334T580 1262Q580 1199 554 1156T471 1088Q531 1068 562 1032T593 936Q593 874 570 830T510 756T426 712T331 698Q277 698 234 708T158 742T99 804T55 899L132 930Q154 938 172 938Q209 +938 223 910Q229 899 237 887T257 866T285 850T322 844Q367 844 391 869T415 929Q415 956 408 974T385 1003T340 1018T269 1023V1139Q311 1139 338 1145T381 1163T403 1192T410 1230Q410 1267 391 1288T332 1310Q297 1310 277 1294T245 1251Q235 1231 224 1222T192 +1212Q181 1212 166 1215L75 1230Q83 1287 106 1329T165 1400T245 1441T341 1455ZM1172 450Q1172 473 1173 501T1179 559L977 282H1172V450Z" /> +<glyph unicode="¿" glyph-name="questiondown" horiz-adv-x="841" d="M820 -203Q785 -233 745 -259T657 -306T555 -338T436 -350Q349 -350 278 -327T155 -261T76 -157T48 -17Q48 59 70 112T125 202T198 266T273 315T333 361T364 417L387 562H556L573 399Q574 +394 574 390T574 380Q574 334 552 303T497 248T426 203T355 155T300 93T278 5Q278 -31 291 -59T329 -108T386 -140T458 -151Q515 -151 554 -138T621 -110T668 -82T703 -69Q738 -69 754 -100L820 -203ZM324 892Q324 923 335 951T367 999T416 1031T476 1043Q507 1043 +535 1031T583 999T615 951T627 892Q627 860 615 833T583 785T535 754T476 742Q444 742 416 753T368 785T336 832T324 892Z" /> +<glyph unicode="À" glyph-name="Agrave" horiz-adv-x="1420" d="M1417 0H1209Q1174 0 1152 17T1119 61L1011 356H412L304 61Q296 38 273 19T215 0H6L574 1446H849L1417 0ZM481 546H942L766 1027Q754 1059 740 1102T711 1197Q697 1146 684 1102T657 1025L481 +546ZM568 1791Q588 1791 602 1790T627 1784T649 1771T671 1751L868 1549H673Q659 1549 649 1549T629 1552T611 1560T591 1573L294 1791H568Z" /> +<glyph unicode="Á" glyph-name="Aacute" horiz-adv-x="1420" d="M1417 0H1209Q1174 0 1152 17T1119 61L1011 356H412L304 61Q296 38 273 19T215 0H6L574 1446H849L1417 0ZM481 546H942L766 1027Q754 1059 740 1102T711 1197Q697 1146 684 1102T657 1025L481 +546ZM1095 1791L799 1575Q788 1567 779 1562T760 1554T740 1550T715 1549H521L717 1751Q729 1763 739 1771T761 1783T786 1789T820 1791H1095Z" /> +<glyph unicode="Â" glyph-name="Acircumflex" horiz-adv-x="1420" d="M1417 0H1209Q1174 0 1152 17T1119 61L1011 356H412L304 61Q296 38 273 19T215 0H6L574 1446H849L1417 0ZM481 546H942L766 1027Q754 1059 740 1102T711 1197Q697 1146 684 1102T657 1025L481 +546ZM1076 1549H889Q874 1549 856 1553T827 1565L726 1632Q722 1634 719 1637T711 1643Q709 1641 705 1638T696 1632L595 1565Q584 1557 566 1553T533 1549H346L588 1768H834L1076 1549Z" /> +<glyph unicode="Ã" glyph-name="Atilde" horiz-adv-x="1420" d="M1417 0H1209Q1174 0 1152 17T1119 61L1011 356H412L304 61Q296 38 273 19T215 0H6L574 1446H849L1417 0ZM481 546H942L766 1027Q754 1059 740 1102T711 1197Q697 1146 684 1102T657 1025L481 +546ZM834 1699Q861 1699 877 1714T895 1762H1029Q1029 1712 1016 1671T979 1601T920 1556T840 1539Q804 1539 771 1550T707 1574T650 1598T602 1609Q575 1609 559 1593T542 1544H406Q406 1593 419 1634T457 1706T517 1752T596 1769Q632 1769 666 1758T730 1734T787 +1710T834 1699Z" /> +<glyph unicode="Ä" glyph-name="Adieresis" horiz-adv-x="1420" d="M1417 0H1209Q1174 0 1152 17T1119 61L1011 356H412L304 61Q296 38 273 19T215 0H6L574 1446H849L1417 0ZM481 546H942L766 1027Q754 1059 740 1102T711 1197Q697 1146 684 1102T657 1025L481 +546ZM629 1667Q629 1640 618 1616T588 1574T544 1546T491 1536Q465 1536 442 1546T400 1574T372 1616T361 1667Q361 1694 371 1718T400 1761T441 1791T491 1802Q519 1802 544 1791T588 1762T618 1719T629 1667ZM1061 1667Q1061 1640 1051 1616T1022 1574T980 1546T927 +1536Q900 1536 876 1546T833 1574T804 1616T793 1667Q793 1694 803 1718T832 1761T875 1791T927 1802Q955 1802 979 1791T1022 1762T1050 1719T1061 1667Z" /> +<glyph unicode="Å" glyph-name="Aring" horiz-adv-x="1420" d="M1417 0H1209Q1174 0 1152 17T1119 61L1011 356H412L304 61Q296 38 273 19T215 0H6L574 1446H849L1417 0ZM481 546H942L766 1027Q754 1059 740 1102T711 1197Q697 1146 684 1102T657 1025L481 +546ZM505 1683Q505 1726 522 1761T567 1821T632 1860T710 1874Q753 1874 791 1860T858 1821T904 1761T921 1683Q921 1641 904 1607T858 1547T791 1509T710 1495Q669 1495 632 1508T567 1547T522 1606T505 1683ZM623 1683Q623 1644 646 1619T714 1594Q754 1594 778 +1619T802 1683Q802 1725 778 1749T714 1773Q670 1773 647 1749T623 1683Z" /> +<glyph unicode="Æ" glyph-name="AE" horiz-adv-x="1868" d="M1780 1232H1086L1136 831H1645V624H1161L1211 215H1780V0H983L939 356H419L277 60Q264 33 238 17T176 0H-28L707 1446H1780V1232ZM511 546H916L830 1246Q814 1195 797 1150T762 1067L511 546Z" /> +<glyph unicode="Ç" glyph-name="Ccedilla" horiz-adv-x="1341" d="M632 -227Q639 -227 646 -229T663 -234T684 -239T712 -241Q745 -241 761 -229T778 -198Q778 -169 742 -157T631 -134L668 -11Q527 4 415 64T225 221T104 445T62 723Q62 886 116 1021T268 +1255T502 1407T804 1462Q965 1462 1085 1411T1292 1274L1202 1149Q1194 1137 1182 1128T1147 1119Q1124 1119 1100 1137T1039 1176T946 1215T802 1233Q700 1233 615 1198T468 1096T372 936T337 723Q337 601 371 506T465 346T604 247T776 212Q831 212 875 218T957 +237T1028 270T1095 321Q1105 330 1116 335T1140 341Q1162 341 1178 324L1284 209Q1204 109 1091 53T822 -14L810 -55Q899 -77 935 -114T971 -203Q971 -236 954 -263T904 -309T827 -338T728 -349Q687 -349 652 -343T581 -326L604 -250Q610 -227 632 -227Z" /> +<glyph unicode="È" glyph-name="Egrave" horiz-adv-x="1145" d="M1058 1446V1232H417V831H922V624H417V215H1058V0H146V1446H1058ZM474 1791Q494 1791 508 1790T533 1784T555 1771T577 1751L774 1549H579Q565 1549 555 1549T535 1552T517 1560T497 1573L200 +1791H474Z" /> +<glyph unicode="É" glyph-name="Eacute" horiz-adv-x="1145" d="M1058 1446V1232H417V831H922V624H417V215H1058V0H146V1446H1058ZM1001 1791L705 1575Q694 1567 685 1562T666 1554T646 1550T621 1549H427L623 1751Q635 1763 645 1771T667 1783T692 1789T726 +1791H1001Z" /> +<glyph unicode="Ê" glyph-name="Ecircumflex" horiz-adv-x="1145" d="M1058 1446V1232H417V831H922V624H417V215H1058V0H146V1446H1058ZM982 1549H795Q780 1549 762 1553T733 1565L632 1632Q628 1634 625 1637T617 1643Q615 1641 611 1638T602 1632L501 1565Q490 +1557 472 1553T439 1549H252L494 1768H740L982 1549Z" /> +<glyph unicode="Ë" glyph-name="Edieresis" horiz-adv-x="1145" d="M1058 1446V1232H417V831H922V624H417V215H1058V0H146V1446H1058ZM535 1667Q535 1640 524 1616T494 1574T450 1546T397 1536Q371 1536 348 1546T306 1574T278 1616T267 1667Q267 1694 277 +1718T306 1761T347 1791T397 1802Q425 1802 450 1791T494 1762T524 1719T535 1667ZM967 1667Q967 1640 957 1616T928 1574T886 1546T833 1536Q806 1536 782 1546T739 1574T710 1616T699 1667Q699 1694 709 1718T738 1761T781 1791T833 1802Q861 1802 885 1791T928 +1762T956 1719T967 1667Z" /> +<glyph unicode="Ì" glyph-name="Igrave" horiz-adv-x="628" d="M449 0H179V1446H449V0ZM432 1791Q452 1791 466 1790T491 1784T513 1771T535 1751L732 1549H537Q523 1549 513 1549T493 1552T475 1560T455 1573L158 1791H432Z" /> +<glyph unicode="Í" glyph-name="Iacute" horiz-adv-x="628" d="M449 0H179V1446H449V0ZM959 1791L663 1575Q652 1567 643 1562T624 1554T604 1550T579 1549H385L581 1751Q593 1763 603 1771T625 1783T650 1789T684 1791H959Z" /> +<glyph unicode="Î" glyph-name="Icircumflex" horiz-adv-x="628" d="M449 0H179V1446H449V0ZM939 1549H752Q737 1549 719 1553T690 1565L589 1632Q585 1634 582 1637T574 1643Q572 1641 568 1638T559 1632L458 1565Q447 1557 429 1553T396 1549H209L451 1768H697L939 +1549Z" /> +<glyph unicode="Ï" glyph-name="Idieresis" horiz-adv-x="628" d="M449 0H179V1446H449V0ZM492 1667Q492 1640 481 1616T451 1574T407 1546T354 1536Q328 1536 305 1546T263 1574T235 1616T224 1667Q224 1694 234 1718T263 1761T304 1791T354 1802Q382 1802 +407 1791T451 1762T481 1719T492 1667ZM924 1667Q924 1640 914 1616T885 1574T843 1546T790 1536Q763 1536 739 1546T696 1574T667 1616T656 1667Q656 1694 666 1718T695 1761T738 1791T790 1802Q818 1802 842 1791T885 1762T913 1719T924 1667Z" /> +<glyph unicode="Ð" glyph-name="Eth" horiz-adv-x="1581" d="M53 804H233V1446H785Q949 1446 1084 1393T1315 1244T1464 1015T1517 723Q1517 564 1464 431T1315 202T1084 53T785 0H233V651H53V804ZM1241 723Q1241 842 1210 936T1119 1096T976 1197T785 1232H504V804H865V651H504V214H785Q891 +214 975 249T1119 349T1209 509T1241 723Z" /> +<glyph unicode="Ñ" glyph-name="Ntilde" horiz-adv-x="1512" d="M287 1446Q305 1446 317 1445T338 1439T357 1426T377 1403L1136 436Q1132 471 1131 504T1129 567V1446H1366V0H1227Q1195 0 1174 10T1133 46L377 1009Q380 977 381 946T383 888V0H146V1446H287V1446ZM895 +1699Q922 1699 938 1714T956 1762H1090Q1090 1712 1077 1671T1040 1601T981 1556T901 1539Q865 1539 832 1550T768 1574T711 1598T663 1609Q636 1609 620 1593T603 1544H467Q467 1593 480 1634T518 1706T578 1752T657 1769Q693 1769 727 1758T791 1734T848 1710T895 +1699Z" /> +<glyph unicode="Ò" glyph-name="Ograve" horiz-adv-x="1599" d="M1533 723Q1533 564 1480 429T1331 194T1100 40T801 -16Q637 -16 502 39T270 194T120 428T67 723Q67 882 120 1017T269 1252T501 1406T801 1462Q965 1462 1100 1406T1331 1252T1480 1018T1533 +723ZM1257 723Q1257 842 1226 936T1135 1097T992 1198T801 1233Q695 1233 610 1198T466 1097T374 937T342 723Q342 604 374 510T465 350T610 249T801 214Q907 214 991 249T1135 349T1225 509T1257 723ZM660 1791Q680 1791 694 1790T719 1784T741 1771T763 1751L960 +1549H765Q751 1549 741 1549T721 1552T703 1560T683 1573L386 1791H660Z" /> +<glyph unicode="Ó" glyph-name="Oacute" horiz-adv-x="1599" d="M1533 723Q1533 564 1480 429T1331 194T1100 40T801 -16Q637 -16 502 39T270 194T120 428T67 723Q67 882 120 1017T269 1252T501 1406T801 1462Q965 1462 1100 1406T1331 1252T1480 1018T1533 +723ZM1257 723Q1257 842 1226 936T1135 1097T992 1198T801 1233Q695 1233 610 1198T466 1097T374 937T342 723Q342 604 374 510T465 350T610 249T801 214Q907 214 991 249T1135 349T1225 509T1257 723ZM1187 1791L891 1575Q880 1567 871 1562T852 1554T832 1550T807 +1549H613L809 1751Q821 1763 831 1771T853 1783T878 1789T912 1791H1187Z" /> +<glyph unicode="Ô" glyph-name="Ocircumflex" horiz-adv-x="1599" d="M1533 723Q1533 564 1480 429T1331 194T1100 40T801 -16Q637 -16 502 39T270 194T120 428T67 723Q67 882 120 1017T269 1252T501 1406T801 1462Q965 1462 1100 1406T1331 1252T1480 1018T1533 +723ZM1257 723Q1257 842 1226 936T1135 1097T992 1198T801 1233Q695 1233 610 1198T466 1097T374 937T342 723Q342 604 374 510T465 350T610 249T801 214Q907 214 991 249T1135 349T1225 509T1257 723ZM1168 1549H981Q966 1549 948 1553T919 1565L818 1632Q814 +1634 811 1637T803 1643Q801 1641 797 1638T788 1632L687 1565Q676 1557 658 1553T625 1549H438L680 1768H926L1168 1549Z" /> +<glyph unicode="Õ" glyph-name="Otilde" horiz-adv-x="1599" d="M1533 723Q1533 564 1480 429T1331 194T1100 40T801 -16Q637 -16 502 39T270 194T120 428T67 723Q67 882 120 1017T269 1252T501 1406T801 1462Q965 1462 1100 1406T1331 1252T1480 1018T1533 +723ZM1257 723Q1257 842 1226 936T1135 1097T992 1198T801 1233Q695 1233 610 1198T466 1097T374 937T342 723Q342 604 374 510T465 350T610 249T801 214Q907 214 991 249T1135 349T1225 509T1257 723ZM926 1699Q953 1699 969 1714T987 1762H1121Q1121 1712 1108 +1671T1071 1601T1012 1556T932 1539Q896 1539 863 1550T799 1574T742 1598T694 1609Q667 1609 651 1593T634 1544H498Q498 1593 511 1634T549 1706T609 1752T688 1769Q724 1769 758 1758T822 1734T879 1710T926 1699Z" /> +<glyph unicode="Ö" glyph-name="Odieresis" horiz-adv-x="1599" d="M1533 723Q1533 564 1480 429T1331 194T1100 40T801 -16Q637 -16 502 39T270 194T120 428T67 723Q67 882 120 1017T269 1252T501 1406T801 1462Q965 1462 1100 1406T1331 1252T1480 1018T1533 +723ZM1257 723Q1257 842 1226 936T1135 1097T992 1198T801 1233Q695 1233 610 1198T466 1097T374 937T342 723Q342 604 374 510T465 350T610 249T801 214Q907 214 991 249T1135 349T1225 509T1257 723ZM721 1667Q721 1640 710 1616T680 1574T636 1546T583 1536Q557 +1536 534 1546T492 1574T464 1616T453 1667Q453 1694 463 1718T492 1761T533 1791T583 1802Q611 1802 636 1791T680 1762T710 1719T721 1667ZM1153 1667Q1153 1640 1143 1616T1114 1574T1072 1546T1019 1536Q992 1536 968 1546T925 1574T896 1616T885 1667Q885 +1694 895 1718T924 1761T967 1791T1019 1802Q1047 1802 1071 1791T1114 1762T1142 1719T1153 1667Z" /> +<glyph unicode="×" glyph-name="multiply" horiz-adv-x="1160" d="M1033 996L708 671L1049 331L918 202L578 541L237 200L106 329L448 671L121 998L251 1128L578 801L902 1126L1033 996Z" /> +<glyph unicode="Ø" glyph-name="Oslash" horiz-adv-x="1599" d="M1533 723Q1533 564 1480 429T1331 194T1100 40T801 -16Q700 -16 611 5T444 66L368 -39Q339 -79 299 -95T220 -111H114L309 157Q194 257 131 402T67 723Q67 882 120 1017T269 1252T501 1406T801 +1462Q911 1462 1007 1437T1186 1364L1245 1446Q1258 1464 1269 1477T1292 1497T1320 1508T1357 1512H1495L1316 1266Q1420 1166 1476 1028T1533 723ZM342 723Q342 608 371 517T456 360L1045 1170Q941 1233 801 1233Q695 1233 610 1198T466 1097T374 937T342 723ZM1257 +723Q1257 826 1234 910T1165 1058L585 260Q680 214 801 214Q907 214 991 249T1135 349T1225 509T1257 723Z" /> +<glyph unicode="Ù" glyph-name="Ugrave" horiz-adv-x="1456" d="M728 217Q806 217 867 243T971 316T1036 430T1059 580V1446H1328V580Q1328 451 1287 342T1167 153T978 29T728 -16Q589 -16 478 28T290 152T171 341T129 580V1446H398V581Q398 498 420 431T485 +317T588 243T728 217ZM586 1791Q606 1791 620 1790T645 1784T667 1771T689 1751L886 1549H691Q677 1549 667 1549T647 1552T629 1560T609 1573L312 1791H586Z" /> +<glyph unicode="Ú" glyph-name="Uacute" horiz-adv-x="1456" d="M728 217Q806 217 867 243T971 316T1036 430T1059 580V1446H1328V580Q1328 451 1287 342T1167 153T978 29T728 -16Q589 -16 478 28T290 152T171 341T129 580V1446H398V581Q398 498 420 431T485 +317T588 243T728 217ZM1113 1791L817 1575Q806 1567 797 1562T778 1554T758 1550T733 1549H539L735 1751Q747 1763 757 1771T779 1783T804 1789T838 1791H1113Z" /> +<glyph unicode="Û" glyph-name="Ucircumflex" horiz-adv-x="1456" d="M728 217Q806 217 867 243T971 316T1036 430T1059 580V1446H1328V580Q1328 451 1287 342T1167 153T978 29T728 -16Q589 -16 478 28T290 152T171 341T129 580V1446H398V581Q398 498 420 +431T485 317T588 243T728 217ZM1093 1549H906Q891 1549 873 1553T844 1565L743 1632Q739 1634 736 1637T728 1643Q726 1641 722 1638T713 1632L612 1565Q601 1557 583 1553T550 1549H363L605 1768H851L1093 1549Z" /> +<glyph unicode="Ü" glyph-name="Udieresis" horiz-adv-x="1456" d="M728 217Q806 217 867 243T971 316T1036 430T1059 580V1446H1328V580Q1328 451 1287 342T1167 153T978 29T728 -16Q589 -16 478 28T290 152T171 341T129 580V1446H398V581Q398 498 420 431T485 +317T588 243T728 217ZM646 1667Q646 1640 635 1616T605 1574T561 1546T508 1536Q482 1536 459 1546T417 1574T389 1616T378 1667Q378 1694 388 1718T417 1761T458 1791T508 1802Q536 1802 561 1791T605 1762T635 1719T646 1667ZM1078 1667Q1078 1640 1068 1616T1039 +1574T997 1546T944 1536Q917 1536 893 1546T850 1574T821 1616T810 1667Q810 1694 820 1718T849 1761T892 1791T944 1802Q972 1802 996 1791T1039 1762T1067 1719T1078 1667Z" /> +<glyph unicode="Ý" glyph-name="Yacute" horiz-adv-x="1309" d="M789 562V0H520V562L-7 1446H230Q265 1446 285 1429T320 1386L585 903Q608 860 625 822T656 746Q669 784 685 822T725 903L988 1386Q999 1408 1021 1427T1077 1446H1315L789 562ZM1041 1791L745 +1575Q734 1567 725 1562T706 1554T686 1550T661 1549H467L663 1751Q675 1763 685 1771T707 1783T732 1789T766 1791H1041Z" /> +<glyph unicode="Þ" glyph-name="Thorn" horiz-adv-x="1250" d="M424 261V0H155V1446H424V1198H626Q771 1198 877 1164T1052 1069T1154 923T1187 737Q1187 632 1152 545T1047 394T872 296T626 261H424ZM424 471H626Q700 471 755 489T846 542T900 626T918 737Q918 +795 900 842T846 922T755 972T626 990H424V471Z" /> +<glyph unicode="ß" glyph-name="germandbls" horiz-adv-x="1270" d="M700 1471Q817 1471 900 1437T1035 1352T1111 1242T1135 1132Q1135 1074 1116 1033T1067 961T1003 907T940 863T891 820T871 768Q871 735 896 711T958 664T1039 615T1120 552T1182 461T1207 +331Q1207 246 1176 182T1090 73T965 7T813 -16Q767 -16 722 -7T636 20T557 60T490 110L548 204Q558 221 573 230T611 239Q634 239 655 226T701 198T758 170T835 157Q898 157 937 194T976 292Q976 339 949 370T882 425T794 473T707 528T639 605T612 719Q612 776 +633 817T685 890T754 947T822 1000T875 1058T896 1131Q896 1164 885 1193T848 1244T784 1279T689 1292Q558 1292 491 1212T423 976V0H176V984Q176 1090 212 1179T316 1333T481 1434T700 1471Z" /> +<glyph unicode="à" glyph-name="agrave" horiz-adv-x="1047" d="M936 0H825Q790 0 770 10T740 53L718 126Q679 91 642 65T564 20T479 -7T379 -16Q314 -16 259 1T165 54T103 141T81 262Q81 320 111 376T213 478T402 554T695 588V648Q695 751 652 800T525 850Q465 +850 425 836T356 805T301 773T246 759Q221 759 203 772T174 804L129 883Q306 1045 556 1045Q646 1045 716 1016T836 934T910 808T936 648V0ZM456 154Q494 154 526 161T586 182T641 216T695 265V438Q587 433 515 420T398 385T336 336T317 275Q317 210 355 182T456 +154ZM457 1462Q498 1462 517 1449T552 1409L695 1166H554Q526 1166 509 1173T473 1201L226 1462H457Z" /> +<glyph unicode="á" glyph-name="aacute" horiz-adv-x="1047" d="M936 0H825Q790 0 770 10T740 53L718 126Q679 91 642 65T564 20T479 -7T379 -16Q314 -16 259 1T165 54T103 141T81 262Q81 320 111 376T213 478T402 554T695 588V648Q695 751 652 800T525 850Q465 +850 425 836T356 805T301 773T246 759Q221 759 203 772T174 804L129 883Q306 1045 556 1045Q646 1045 716 1016T836 934T910 808T936 648V0ZM456 154Q494 154 526 161T586 182T641 216T695 265V438Q587 433 515 420T398 385T336 336T317 275Q317 210 355 182T456 +154ZM892 1462L645 1201Q626 1181 609 1174T563 1166H415L557 1409Q572 1435 592 1448T652 1462H892Z" /> +<glyph unicode="â" glyph-name="acircumflex" horiz-adv-x="1047" d="M936 0H825Q790 0 770 10T740 53L718 126Q679 91 642 65T564 20T479 -7T379 -16Q314 -16 259 1T165 54T103 141T81 262Q81 320 111 376T213 478T402 554T695 588V648Q695 751 652 800T525 +850Q465 850 425 836T356 805T301 773T246 759Q221 759 203 772T174 804L129 883Q306 1045 556 1045Q646 1045 716 1016T836 934T910 808T936 648V0ZM456 154Q494 154 526 161T586 182T641 216T695 265V438Q587 433 515 420T398 385T336 336T317 275Q317 210 355 +182T456 154ZM891 1168H726Q695 1168 676 1186L571 1281Q566 1286 561 1291T550 1303Q545 1296 540 1291T529 1281L422 1186Q414 1179 401 1174T372 1168H201L430 1446H662L891 1168Z" /> +<glyph unicode="ã" glyph-name="atilde" horiz-adv-x="1047" d="M936 0H825Q790 0 770 10T740 53L718 126Q679 91 642 65T564 20T479 -7T379 -16Q314 -16 259 1T165 54T103 141T81 262Q81 320 111 376T213 478T402 554T695 588V648Q695 751 652 800T525 850Q465 +850 425 836T356 805T301 773T246 759Q221 759 203 772T174 804L129 883Q306 1045 556 1045Q646 1045 716 1016T836 934T910 808T936 648V0ZM456 154Q494 154 526 161T586 182T641 216T695 265V438Q587 433 515 420T398 385T336 336T317 275Q317 210 355 182T456 +154ZM653 1359Q683 1359 700 1375T717 1435H867Q867 1379 852 1334T809 1256T745 1206T662 1188Q626 1188 595 1201T537 1229T487 1257T443 1270Q414 1270 398 1253T381 1193H228Q228 1249 243 1294T287 1372T352 1423T434 1441Q470 1441 501 1428T560 1400T610 +1372T653 1359Z" /> +<glyph unicode="ä" glyph-name="adieresis" horiz-adv-x="1047" d="M936 0H825Q790 0 770 10T740 53L718 126Q679 91 642 65T564 20T479 -7T379 -16Q314 -16 259 1T165 54T103 141T81 262Q81 320 111 376T213 478T402 554T695 588V648Q695 751 652 800T525 +850Q465 850 425 836T356 805T301 773T246 759Q221 759 203 772T174 804L129 883Q306 1045 556 1045Q646 1045 716 1016T836 934T910 808T936 648V0ZM456 154Q494 154 526 161T586 182T641 216T695 265V438Q587 433 515 420T398 385T336 336T317 275Q317 210 355 +182T456 154ZM497 1292Q497 1264 486 1240T456 1197T411 1169T357 1158Q330 1158 306 1168T262 1197T232 1239T221 1292Q221 1321 232 1346T262 1391T305 1421T357 1432Q385 1432 410 1421T455 1391T486 1347T497 1292ZM871 1292Q871 1264 860 1240T830 1197T786 +1169T732 1158Q704 1158 679 1168T636 1197T606 1239T595 1292Q595 1321 606 1346T635 1391T679 1421T732 1432Q760 1432 785 1421T830 1391T860 1347T871 1292Z" /> +<glyph unicode="å" glyph-name="aring" horiz-adv-x="1047" d="M936 0H825Q790 0 770 10T740 53L718 126Q679 91 642 65T564 20T479 -7T379 -16Q314 -16 259 1T165 54T103 141T81 262Q81 320 111 376T213 478T402 554T695 588V648Q695 751 652 800T525 850Q465 +850 425 836T356 805T301 773T246 759Q221 759 203 772T174 804L129 883Q306 1045 556 1045Q646 1045 716 1016T836 934T910 808T936 648V0ZM456 154Q494 154 526 161T586 182T641 216T695 265V438Q587 433 515 420T398 385T336 336T317 275Q317 210 355 182T456 +154ZM324 1325Q324 1371 342 1409T390 1474T461 1516T545 1531Q590 1531 631 1516T703 1474T752 1409T771 1325Q771 1280 753 1243T703 1180T631 1139T545 1124Q501 1124 461 1138T391 1179T342 1243T324 1325ZM458 1325Q458 1287 481 1262T549 1236Q589 1236 613 +1261T637 1325Q637 1367 613 1391T549 1416Q505 1416 482 1392T458 1325Z" /> +<glyph unicode="æ" glyph-name="ae" horiz-adv-x="1651" d="M1174 1042Q1261 1042 1336 1009T1465 912T1551 759T1582 557Q1582 529 1580 511T1571 482T1555 467T1527 462H929Q943 315 1012 246T1192 176Q1260 176 1302 189T1373 218T1420 247T1460 260Q1478 +260 1490 254T1510 237L1576 153Q1535 105 1486 73T1384 21T1275 -7T1168 -15Q1059 -15 965 34T809 187Q779 133 735 95T638 32T525 -4T404 -16Q329 -16 270 3T168 58T104 149T81 275Q81 333 111 391T213 498T402 577T695 613V648Q695 751 652 804T525 857Q465 +857 425 842T356 808T301 775T246 759Q221 759 203 772T174 804L129 883Q218 964 314 1004T529 1045Q645 1045 719 1001T832 880Q889 955 974 998T1174 1042ZM695 462Q587 457 515 442T398 403T336 350T317 287Q317 218 356 186T463 154Q512 154 554 169T628 215T677 +297T695 416V462ZM1163 865Q1058 865 1001 799T930 611H1363Q1363 660 1351 706T1315 787T1252 844T1163 865Z" /> +<glyph unicode="ç" glyph-name="ccedilla" horiz-adv-x="954" d="M405 -227Q412 -227 419 -229T436 -234T457 -239T485 -241Q518 -241 534 -229T551 -198Q551 -169 515 -157T404 -134L442 -8Q362 6 293 47T172 155T92 312T63 515Q63 628 95 724T191 891T347 +1002T561 1042Q676 1042 762 1005T918 899L853 809Q842 795 832 787T801 779Q782 779 764 790T721 816T662 842T576 854Q511 854 462 831T381 763T332 657T316 515Q316 433 333 369T384 262T464 196T570 173Q629 173 665 187T727 219T770 251T812 266Q839 266 857 +243L928 153Q859 72 773 35T595 -11L583 -55Q672 -77 708 -114T744 -203Q744 -236 727 -263T677 -309T600 -338T501 -349Q460 -349 425 -343T354 -326L377 -250Q383 -227 405 -227Z" /> +<glyph unicode="è" glyph-name="egrave" horiz-adv-x="1069" d="M556 1042Q653 1042 734 1011T875 921T967 775T1000 577Q1000 549 998 531T989 502T971 487T943 482H309Q320 324 394 250T590 176Q650 176 693 190T769 221T826 252T874 266Q889 266 900 260T919 +243L991 153Q950 105 899 73T793 21T680 -7T568 -15Q461 -15 369 20T209 125T102 297T63 535Q63 640 97 732T194 893T349 1002T556 1042ZM561 865Q453 865 392 804T314 631H778Q778 679 765 721T725 796T657 846T561 865ZM473 1462Q514 1462 533 1449T568 1409L711 +1166H570Q542 1166 525 1173T489 1201L242 1462H473Z" /> +<glyph unicode="é" glyph-name="eacute" horiz-adv-x="1069" d="M556 1042Q653 1042 734 1011T875 921T967 775T1000 577Q1000 549 998 531T989 502T971 487T943 482H309Q320 324 394 250T590 176Q650 176 693 190T769 221T826 252T874 266Q889 266 900 260T919 +243L991 153Q950 105 899 73T793 21T680 -7T568 -15Q461 -15 369 20T209 125T102 297T63 535Q63 640 97 732T194 893T349 1002T556 1042ZM561 865Q453 865 392 804T314 631H778Q778 679 765 721T725 796T657 846T561 865ZM908 1462L661 1201Q642 1181 625 1174T579 +1166H431L573 1409Q588 1435 608 1448T668 1462H908Z" /> +<glyph unicode="ê" glyph-name="ecircumflex" horiz-adv-x="1069" d="M556 1042Q653 1042 734 1011T875 921T967 775T1000 577Q1000 549 998 531T989 502T971 487T943 482H309Q320 324 394 250T590 176Q650 176 693 190T769 221T826 252T874 266Q889 266 +900 260T919 243L991 153Q950 105 899 73T793 21T680 -7T568 -15Q461 -15 369 20T209 125T102 297T63 535Q63 640 97 732T194 893T349 1002T556 1042ZM561 865Q453 865 392 804T314 631H778Q778 679 765 721T725 796T657 846T561 865ZM907 1168H742Q711 1168 692 +1186L587 1281Q582 1286 577 1291T566 1303Q561 1296 556 1291T545 1281L438 1186Q430 1179 417 1174T388 1168H217L446 1446H678L907 1168Z" /> +<glyph unicode="ë" glyph-name="edieresis" horiz-adv-x="1069" d="M556 1042Q653 1042 734 1011T875 921T967 775T1000 577Q1000 549 998 531T989 502T971 487T943 482H309Q320 324 394 250T590 176Q650 176 693 190T769 221T826 252T874 266Q889 266 900 +260T919 243L991 153Q950 105 899 73T793 21T680 -7T568 -15Q461 -15 369 20T209 125T102 297T63 535Q63 640 97 732T194 893T349 1002T556 1042ZM561 865Q453 865 392 804T314 631H778Q778 679 765 721T725 796T657 846T561 865ZM513 1292Q513 1264 502 1240T472 +1197T427 1169T373 1158Q346 1158 322 1168T278 1197T248 1239T237 1292Q237 1321 248 1346T278 1391T321 1421T373 1432Q401 1432 426 1421T471 1391T502 1347T513 1292ZM887 1292Q887 1264 876 1240T846 1197T802 1169T748 1158Q720 1158 695 1168T652 1197T622 +1239T611 1292Q611 1321 622 1346T651 1391T695 1421T748 1432Q776 1432 801 1421T846 1391T876 1347T887 1292Z" /> +<glyph unicode="ì" glyph-name="igrave" horiz-adv-x="542" d="M395 1026V0H148V1026H395ZM446 1462Q487 1462 506 1449T541 1409L684 1166H543Q515 1166 498 1173T462 1201L215 1462H446Z" /> +<glyph unicode="í" glyph-name="iacute" horiz-adv-x="542" d="M395 1026V0H148V1026H395ZM881 1462L634 1201Q615 1181 598 1174T552 1166H404L546 1409Q561 1435 581 1448T641 1462H881Z" /> +<glyph unicode="î" glyph-name="icircumflex" horiz-adv-x="542" d="M395 1026V0H148V1026H395ZM880 1168H715Q684 1168 665 1186L560 1281Q555 1286 550 1291T539 1303Q534 1296 529 1291T518 1281L411 1186Q403 1179 390 1174T361 1168H190L419 1446H651L880 +1168Z" /> +<glyph unicode="ï" glyph-name="idieresis" horiz-adv-x="542" d="M395 1026V0H148V1026H395ZM486 1292Q486 1264 475 1240T445 1197T400 1169T346 1158Q319 1158 295 1168T251 1197T221 1239T210 1292Q210 1321 221 1346T251 1391T294 1421T346 1432Q374 +1432 399 1421T444 1391T475 1347T486 1292ZM860 1292Q860 1264 849 1240T819 1197T775 1169T721 1158Q693 1158 668 1168T625 1197T595 1239T584 1292Q584 1321 595 1346T624 1391T668 1421T721 1432Q749 1432 774 1421T819 1391T849 1347T860 1292Z" /> +<glyph unicode="ð" glyph-name="eth" horiz-adv-x="1136" d="M386 1062Q376 1078 376 1095Q376 1125 408 1143L483 1186Q451 1199 416 1210T341 1232Q316 1239 300 1257T283 1305Q283 1321 291 1347L320 1432Q421 1415 514 1384T691 1304L867 1418L916 1338Q926 +1321 926 1307Q926 1293 919 1281T897 1261L816 1215Q873 1164 919 1102T998 964T1048 800T1066 608Q1066 461 1033 346T934 150T773 27T553 -15Q449 -15 360 18T206 115T104 268T66 474Q66 566 98 649T190 794T334 894T522 931Q617 931 696 897T836 796Q815 902 +765 978T630 1112L432 984L386 1062ZM559 173Q617 173 666 194T751 261T808 382T833 562Q818 599 795 632T739 689T666 728T572 743Q508 743 460 722T378 664T328 578T311 472Q311 399 330 344T383 250T462 193T559 173Z" /> +<glyph unicode="ñ" glyph-name="ntilde" horiz-adv-x="1137" d="M132 0V1026H283Q331 1026 346 981L363 900Q394 932 428 958T501 1003T584 1032T680 1042Q764 1042 829 1014T937 934T1003 811T1026 653V0H779V653Q779 747 736 798T605 850Q541 850 485 821T379 +742V0H132ZM685 1359Q715 1359 732 1375T749 1435H899Q899 1379 884 1334T841 1256T777 1206T694 1188Q658 1188 627 1201T569 1229T519 1257T475 1270Q446 1270 430 1253T413 1193H260Q260 1249 275 1294T319 1372T384 1423T466 1441Q502 1441 533 1428T592 1400T642 +1372T685 1359Z" /> +<glyph unicode="ò" glyph-name="ograve" horiz-adv-x="1137" d="M570 1042Q685 1042 778 1005T938 900T1040 734T1076 515Q1076 393 1040 295T938 128T779 22T570 -15Q455 -15 361 22T201 128T98 295T61 515Q61 636 97 734T200 900T361 1005T570 1042ZM570 +175Q698 175 759 261T821 513Q821 679 760 766T570 853Q440 853 378 766T316 513Q316 348 378 262T570 175ZM482 1462Q523 1462 542 1449T577 1409L720 1166H579Q551 1166 534 1173T498 1201L251 1462H482Z" /> +<glyph unicode="ó" glyph-name="oacute" horiz-adv-x="1137" d="M570 1042Q685 1042 778 1005T938 900T1040 734T1076 515Q1076 393 1040 295T938 128T779 22T570 -15Q455 -15 361 22T201 128T98 295T61 515Q61 636 97 734T200 900T361 1005T570 1042ZM570 +175Q698 175 759 261T821 513Q821 679 760 766T570 853Q440 853 378 766T316 513Q316 348 378 262T570 175ZM917 1462L670 1201Q651 1181 634 1174T588 1166H440L582 1409Q597 1435 617 1448T677 1462H917Z" /> +<glyph unicode="ô" glyph-name="ocircumflex" horiz-adv-x="1137" d="M570 1042Q685 1042 778 1005T938 900T1040 734T1076 515Q1076 393 1040 295T938 128T779 22T570 -15Q455 -15 361 22T201 128T98 295T61 515Q61 636 97 734T200 900T361 1005T570 1042ZM570 +175Q698 175 759 261T821 513Q821 679 760 766T570 853Q440 853 378 766T316 513Q316 348 378 262T570 175ZM916 1168H751Q720 1168 701 1186L596 1281Q591 1286 586 1291T575 1303Q570 1296 565 1291T554 1281L447 1186Q439 1179 426 1174T397 1168H226L455 1446H687L916 +1168Z" /> +<glyph unicode="õ" glyph-name="otilde" horiz-adv-x="1137" d="M570 1042Q685 1042 778 1005T938 900T1040 734T1076 515Q1076 393 1040 295T938 128T779 22T570 -15Q455 -15 361 22T201 128T98 295T61 515Q61 636 97 734T200 900T361 1005T570 1042ZM570 +175Q698 175 759 261T821 513Q821 679 760 766T570 853Q440 853 378 766T316 513Q316 348 378 262T570 175ZM678 1359Q708 1359 725 1375T742 1435H892Q892 1379 877 1334T834 1256T770 1206T687 1188Q651 1188 620 1201T562 1229T512 1257T468 1270Q439 1270 423 +1253T406 1193H253Q253 1249 268 1294T312 1372T377 1423T459 1441Q495 1441 526 1428T585 1400T635 1372T678 1359Z" /> +<glyph unicode="ö" glyph-name="odieresis" horiz-adv-x="1137" d="M570 1042Q685 1042 778 1005T938 900T1040 734T1076 515Q1076 393 1040 295T938 128T779 22T570 -15Q455 -15 361 22T201 128T98 295T61 515Q61 636 97 734T200 900T361 1005T570 1042ZM570 +175Q698 175 759 261T821 513Q821 679 760 766T570 853Q440 853 378 766T316 513Q316 348 378 262T570 175ZM522 1292Q522 1264 511 1240T481 1197T436 1169T382 1158Q355 1158 331 1168T287 1197T257 1239T246 1292Q246 1321 257 1346T287 1391T330 1421T382 1432Q410 +1432 435 1421T480 1391T511 1347T522 1292ZM896 1292Q896 1264 885 1240T855 1197T811 1169T757 1158Q729 1158 704 1168T661 1197T631 1239T620 1292Q620 1321 631 1346T660 1391T704 1421T757 1432Q785 1432 810 1421T855 1391T885 1347T896 1292Z" /> +<glyph unicode="÷" glyph-name="divide" horiz-adv-x="1160" d="M91 763H1067V580H91V763ZM427 1027Q427 1058 438 1086T470 1134T518 1166T578 1178Q609 1178 637 1166T685 1134T718 1086T730 1027Q730 995 718 968T686 920T637 889T578 877Q546 877 518 +888T470 920T439 967T427 1027ZM427 315Q427 346 438 374T470 422T518 454T578 466Q609 466 637 454T685 422T718 374T730 315Q730 283 718 256T686 208T637 177T578 165Q546 165 518 176T470 208T439 255T427 315Z" /> +<glyph unicode="ø" glyph-name="oslash" horiz-adv-x="1137" d="M943 893Q1007 824 1041 729T1076 515Q1076 393 1040 295T938 128T779 22T570 -15Q498 -15 435 -1T316 42L282 -5Q253 -44 213 -60T134 -77H43L197 132Q131 201 96 297T61 515Q61 636 97 734T200 +900T361 1005T570 1042Q642 1042 706 1027T824 984L880 1059Q893 1077 904 1089T927 1110T955 1121T992 1125H1114L943 893ZM300 513Q300 394 332 316L708 826Q652 860 570 860Q439 860 370 770T300 513ZM570 167Q698 167 767 257T837 513Q837 572 829 620T806 +706L432 199Q487 167 570 167Z" /> +<glyph unicode="ù" glyph-name="ugrave" horiz-adv-x="1137" d="M358 1026V374Q358 280 401 229T532 177Q596 177 652 205T758 284V1026H1005V0H854Q806 0 791 45L774 127Q742 95 708 69T636 24T553 -5T457 -16Q373 -16 309 12T200 93T134 216T111 374V1026H358ZM477 +1462Q518 1462 537 1449T572 1409L715 1166H574Q546 1166 529 1173T493 1201L246 1462H477Z" /> +<glyph unicode="ú" glyph-name="uacute" horiz-adv-x="1137" d="M358 1026V374Q358 280 401 229T532 177Q596 177 652 205T758 284V1026H1005V0H854Q806 0 791 45L774 127Q742 95 708 69T636 24T553 -5T457 -16Q373 -16 309 12T200 93T134 216T111 374V1026H358ZM912 +1462L665 1201Q646 1181 629 1174T583 1166H435L577 1409Q592 1435 612 1448T672 1462H912Z" /> +<glyph unicode="û" glyph-name="ucircumflex" horiz-adv-x="1137" d="M358 1026V374Q358 280 401 229T532 177Q596 177 652 205T758 284V1026H1005V0H854Q806 0 791 45L774 127Q742 95 708 69T636 24T553 -5T457 -16Q373 -16 309 12T200 93T134 216T111 374V1026H358ZM911 +1168H746Q715 1168 696 1186L591 1281Q586 1286 581 1291T570 1303Q565 1296 560 1291T549 1281L442 1186Q434 1179 421 1174T392 1168H221L450 1446H682L911 1168Z" /> +<glyph unicode="ü" glyph-name="udieresis" horiz-adv-x="1137" d="M358 1026V374Q358 280 401 229T532 177Q596 177 652 205T758 284V1026H1005V0H854Q806 0 791 45L774 127Q742 95 708 69T636 24T553 -5T457 -16Q373 -16 309 12T200 93T134 216T111 374V1026H358ZM517 +1292Q517 1264 506 1240T476 1197T431 1169T377 1158Q350 1158 326 1168T282 1197T252 1239T241 1292Q241 1321 252 1346T282 1391T325 1421T377 1432Q405 1432 430 1421T475 1391T506 1347T517 1292ZM891 1292Q891 1264 880 1240T850 1197T806 1169T752 1158Q724 +1158 699 1168T656 1197T626 1239T615 1292Q615 1321 626 1346T655 1391T699 1421T752 1432Q780 1432 805 1421T850 1391T880 1347T891 1292Z" /> +<glyph unicode="ý" glyph-name="yacute" horiz-adv-x="1067" d="M496 -282Q485 -308 468 -321T414 -335H230L422 76L7 1026H223Q253 1026 269 1012T293 980L512 448Q523 422 531 394T545 338Q553 367 562 394T583 449L789 980Q797 1000 815 1013T857 1026H1055L496 +-282ZM899 1462L652 1201Q633 1181 616 1174T570 1166H422L564 1409Q579 1435 599 1448T659 1462H899Z" /> +<glyph unicode="þ" glyph-name="thorn" horiz-adv-x="1131" d="M132 -335V1486H379V900Q440 965 517 1003T697 1042Q781 1042 850 1008T970 907T1048 744T1076 521Q1076 406 1045 308T957 138T818 26T635 -15Q591 -15 554 -7T486 16T429 53T379 102V-335H132ZM612 +850Q535 850 481 818T379 726V266Q421 214 470 194T577 173Q633 173 678 194T755 258T804 366T821 521Q821 611 807 673T765 775T700 832T612 850Z" /> +<glyph unicode="ÿ" glyph-name="ydieresis" horiz-adv-x="1067" d="M496 -282Q485 -308 468 -321T414 -335H230L422 76L7 1026H223Q253 1026 269 1012T293 980L512 448Q523 422 531 394T545 338Q553 367 562 394T583 449L789 980Q797 1000 815 1013T857 1026H1055L496 +-282ZM504 1292Q504 1264 493 1240T463 1197T418 1169T364 1158Q337 1158 313 1168T269 1197T239 1239T228 1292Q228 1321 239 1346T269 1391T312 1421T364 1432Q392 1432 417 1421T462 1391T493 1347T504 1292ZM878 1292Q878 1264 867 1240T837 1197T793 1169T739 +1158Q711 1158 686 1168T643 1197T613 1239T602 1292Q602 1321 613 1346T642 1391T686 1421T739 1432Q767 1432 792 1421T837 1391T867 1347T878 1292Z" /> +<glyph unicode="–" glyph-name="endash" horiz-adv-x="1137" d="M163 687H974V512H163V687Z" /> +<glyph unicode="—" glyph-name="emdash" horiz-adv-x="1684" d="M163 687H1520V512H163V687Z" /> +<glyph unicode="‘" glyph-name="quoteleft" horiz-adv-x="450" d="M166 977Q98 1088 98 1201Q98 1301 148 1392T295 1560L372 1513Q382 1507 386 1499T390 1482Q390 1473 386 1465T377 1451Q364 1436 350 1416T323 1373T303 1321T295 1261Q295 1227 306 +1189T343 1108Q352 1094 352 1080Q352 1048 316 1035L166 977Z" /> +<glyph unicode="’" glyph-name="quoteright" horiz-adv-x="450" d="M309 1532Q344 1476 360 1420T377 1308Q377 1208 327 1117T181 949L104 996Q94 1002 90 1010T86 1027Q86 1046 99 1059Q112 1074 126 1093T153 1136T172 1188T180 1248Q180 1282 169 1320T132 +1402Q123 1415 123 1429Q123 1461 160 1474L309 1532Z" /> +<glyph unicode="‚" glyph-name="quotesinglbase" horiz-adv-x="450" d="M309 291Q344 235 360 179T377 67Q377 -33 327 -124T181 -292L104 -245Q94 -239 90 -231T86 -214Q86 -195 99 -182Q112 -167 126 -148T153 -105T172 -53T180 7Q180 41 169 79T132 +161Q123 174 123 188Q123 220 160 233L309 291Z" /> +<glyph unicode="“" glyph-name="quotedblleft" horiz-adv-x="782" d="M166 977Q98 1088 98 1201Q98 1301 148 1392T295 1560L372 1513Q382 1507 386 1499T390 1482Q390 1473 386 1465T377 1451Q364 1436 350 1416T323 1373T303 1321T295 1261Q295 1227 +306 1189T343 1108Q352 1094 352 1080Q352 1048 316 1035L166 977ZM498 977Q430 1088 430 1201Q430 1301 480 1392T627 1560L704 1513Q714 1507 718 1499T722 1482Q722 1473 718 1465T709 1451Q696 1436 682 1416T655 1373T635 1321T627 1261Q627 1227 638 1189T675 +1108Q684 1094 684 1080Q684 1048 648 1035L498 977Z" /> +<glyph unicode="”" glyph-name="quotedblright" horiz-adv-x="782" d="M309 1532Q344 1476 360 1420T377 1308Q377 1208 327 1117T181 949L104 996Q94 1002 90 1010T86 1027Q86 1046 99 1059Q112 1074 126 1093T153 1136T172 1188T180 1248Q180 1282 169 +1320T132 1402Q123 1415 123 1429Q123 1461 160 1474L309 1532ZM641 1532Q676 1476 692 1420T709 1308Q709 1208 659 1117T513 949L436 996Q426 1002 422 1010T418 1027Q418 1046 431 1059Q444 1074 458 1093T485 1136T504 1188T512 1248Q512 1282 501 1320T464 +1402Q455 1415 455 1429Q455 1461 492 1474L641 1532Z" /> +<glyph unicode="„" glyph-name="quotedblbase" horiz-adv-x="782" d="M309 291Q344 235 360 179T377 67Q377 -33 327 -124T181 -292L104 -245Q94 -239 90 -231T86 -214Q86 -195 99 -182Q112 -167 126 -148T153 -105T172 -53T180 7Q180 41 169 79T132 161Q123 +174 123 188Q123 220 160 233L309 291ZM641 291Q676 235 692 179T709 67Q709 -33 659 -124T513 -292L436 -245Q426 -239 422 -231T418 -214Q418 -195 431 -182Q444 -167 458 -148T485 -105T504 -53T512 7Q512 41 501 79T464 161Q455 174 455 188Q455 220 492 233L641 +291Z" /> +<glyph unicode="•" glyph-name="bullet" horiz-adv-x="1160" d="M143 593Q143 683 177 762T271 900T409 994T578 1028Q668 1028 748 994T887 901T980 762T1015 593Q1015 504 981 426T887 288T748 195T578 161Q488 161 409 195T271 288T178 425T143 593Z" /> +<glyph unicode="‹" glyph-name="guilsinglleft" horiz-adv-x="642" d="M123 522V554L379 950L460 912Q480 903 489 889T498 858Q498 837 485 815L347 580Q333 554 315 538Q331 524 347 496L485 260Q498 238 498 217Q498 182 460 164L379 126L123 522Z" /> +<glyph unicode="›" glyph-name="guilsinglright" horiz-adv-x="642" d="M263 126L182 164Q162 173 153 187T144 218Q144 238 157 260L295 496Q311 524 327 538Q309 554 295 580L157 815Q144 837 144 858Q144 894 182 912L263 950L519 554V522L263 126Z" /> +<hkern g1="quotedbl" g2="ampersand" k="191" /> +<hkern g1="quotedbl" g2="comma" k="213" /> +<hkern g1="quotedbl" g2="hyphen" k="169" /> +<hkern g1="quotedbl" g2="period" k="213" /> +<hkern g1="quotedbl" g2="slash" k="191" /> +<hkern g1="quotedbl" g2="at" k="42" /> +<hkern g1="quotedbl" g2="A" k="191" /> +<hkern g1="quotedbl" g2="C" k="42" /> +<hkern g1="quotedbl" g2="G" k="42" /> +<hkern g1="quotedbl" g2="O" k="42" /> +<hkern g1="quotedbl" g2="Q" k="42" /> +<hkern g1="quotedbl" g2="V" k="-44" /> +<hkern g1="quotedbl" g2="W" k="-44" /> +<hkern g1="quotedbl" g2="Y" k="-36" /> +<hkern g1="quotedbl" g2="backslash" k="-44" /> +<hkern g1="quotedbl" g2="a" k="66" /> +<hkern g1="quotedbl" g2="c" k="96" /> +<hkern g1="quotedbl" g2="d" k="96" /> +<hkern g1="quotedbl" g2="e" k="96" /> +<hkern g1="quotedbl" g2="o" k="96" /> +<hkern g1="quotedbl" g2="q" k="96" /> +<hkern g1="quotedbl" g2="copyright" k="42" /> +<hkern g1="quotedbl" g2="guillemotleft" k="169" /> +<hkern g1="quotedbl" g2="uni00AD" k="169" /> +<hkern g1="quotedbl" g2="registered" k="42" /> +<hkern g1="quotedbl" g2="middot" k="169" /> +<hkern g1="quotedbl" g2="guillemotright" k="169" /> +<hkern g1="quotedbl" g2="Agrave" k="191" /> +<hkern g1="quotedbl" g2="Aacute" k="191" /> +<hkern g1="quotedbl" g2="Acircumflex" k="191" /> +<hkern g1="quotedbl" g2="Atilde" k="191" /> +<hkern g1="quotedbl" g2="Adieresis" k="191" /> +<hkern g1="quotedbl" g2="Aring" k="191" /> +<hkern g1="quotedbl" g2="AE" k="191" /> +<hkern g1="quotedbl" g2="Ccedilla" k="42" /> +<hkern g1="quotedbl" g2="Ograve" k="42" /> +<hkern g1="quotedbl" g2="Oacute" k="42" /> +<hkern g1="quotedbl" g2="Ocircumflex" k="42" /> +<hkern g1="quotedbl" g2="Otilde" k="42" /> +<hkern g1="quotedbl" g2="Odieresis" k="42" /> +<hkern g1="quotedbl" g2="Oslash" k="42" /> +<hkern g1="quotedbl" g2="Yacute" k="-36" /> +<hkern g1="quotedbl" g2="agrave" k="66" /> +<hkern g1="quotedbl" g2="aacute" k="66" /> +<hkern g1="quotedbl" g2="acircumflex" k="66" /> +<hkern g1="quotedbl" g2="atilde" k="66" /> +<hkern g1="quotedbl" g2="adieresis" k="66" /> +<hkern g1="quotedbl" g2="aring" k="66" /> +<hkern g1="quotedbl" g2="ae" k="66" /> +<hkern g1="quotedbl" g2="ccedilla" k="96" /> +<hkern g1="quotedbl" g2="egrave" k="96" /> +<hkern g1="quotedbl" g2="eacute" k="96" /> +<hkern g1="quotedbl" g2="ecircumflex" k="96" /> +<hkern g1="quotedbl" g2="edieresis" k="96" /> +<hkern g1="quotedbl" g2="eth" k="96" /> +<hkern g1="quotedbl" g2="ograve" k="96" /> +<hkern g1="quotedbl" g2="oacute" k="96" /> +<hkern g1="quotedbl" g2="ocircumflex" k="96" /> +<hkern g1="quotedbl" g2="otilde" k="96" /> +<hkern g1="quotedbl" g2="odieresis" k="96" /> +<hkern g1="quotedbl" g2="oslash" k="96" /> +<hkern g1="quotedbl" g2="OE" k="42" /> +<hkern g1="quotedbl" g2="oe" k="96" /> +<hkern g1="quotedbl" g2="endash" k="169" /> +<hkern g1="quotedbl" g2="emdash" k="169" /> +<hkern g1="quotedbl" g2="quotesinglbase" k="213" /> +<hkern g1="quotedbl" g2="quotedblbase" k="213" /> +<hkern g1="quotedbl" g2="bullet" k="169" /> +<hkern g1="quotedbl" g2="guilsinglleft" k="169" /> +<hkern g1="quotedbl" g2="guilsinglright" k="169" /> +<hkern g1="quotesingle" g2="ampersand" k="191" /> +<hkern g1="quotesingle" g2="comma" k="213" /> +<hkern g1="quotesingle" g2="hyphen" k="169" /> +<hkern g1="quotesingle" g2="period" k="213" /> +<hkern g1="quotesingle" g2="slash" k="191" /> +<hkern g1="quotesingle" g2="at" k="42" /> +<hkern g1="quotesingle" g2="A" k="191" /> +<hkern g1="quotesingle" g2="C" k="42" /> +<hkern g1="quotesingle" g2="G" k="42" /> +<hkern g1="quotesingle" g2="O" k="42" /> +<hkern g1="quotesingle" g2="Q" k="42" /> +<hkern g1="quotesingle" g2="V" k="-44" /> +<hkern g1="quotesingle" g2="W" k="-44" /> +<hkern g1="quotesingle" g2="Y" k="-36" /> +<hkern g1="quotesingle" g2="backslash" k="-44" /> +<hkern g1="quotesingle" g2="a" k="66" /> +<hkern g1="quotesingle" g2="c" k="96" /> +<hkern g1="quotesingle" g2="d" k="96" /> +<hkern g1="quotesingle" g2="e" k="96" /> +<hkern g1="quotesingle" g2="o" k="96" /> +<hkern g1="quotesingle" g2="q" k="96" /> +<hkern g1="quotesingle" g2="copyright" k="42" /> +<hkern g1="quotesingle" g2="guillemotleft" k="169" /> +<hkern g1="quotesingle" g2="uni00AD" k="169" /> +<hkern g1="quotesingle" g2="registered" k="42" /> +<hkern g1="quotesingle" g2="middot" k="169" /> +<hkern g1="quotesingle" g2="guillemotright" k="169" /> +<hkern g1="quotesingle" g2="Agrave" k="191" /> +<hkern g1="quotesingle" g2="Aacute" k="191" /> +<hkern g1="quotesingle" g2="Acircumflex" k="191" /> +<hkern g1="quotesingle" g2="Atilde" k="191" /> +<hkern g1="quotesingle" g2="Adieresis" k="191" /> +<hkern g1="quotesingle" g2="Aring" k="191" /> +<hkern g1="quotesingle" g2="AE" k="191" /> +<hkern g1="quotesingle" g2="Ccedilla" k="42" /> +<hkern g1="quotesingle" g2="Ograve" k="42" /> +<hkern g1="quotesingle" g2="Oacute" k="42" /> +<hkern g1="quotesingle" g2="Ocircumflex" k="42" /> +<hkern g1="quotesingle" g2="Otilde" k="42" /> +<hkern g1="quotesingle" g2="Odieresis" k="42" /> +<hkern g1="quotesingle" g2="Oslash" k="42" /> +<hkern g1="quotesingle" g2="Yacute" k="-36" /> +<hkern g1="quotesingle" g2="agrave" k="66" /> +<hkern g1="quotesingle" g2="aacute" k="66" /> +<hkern g1="quotesingle" g2="acircumflex" k="66" /> +<hkern g1="quotesingle" g2="atilde" k="66" /> +<hkern g1="quotesingle" g2="adieresis" k="66" /> +<hkern g1="quotesingle" g2="aring" k="66" /> +<hkern g1="quotesingle" g2="ae" k="66" /> +<hkern g1="quotesingle" g2="ccedilla" k="96" /> +<hkern g1="quotesingle" g2="egrave" k="96" /> +<hkern g1="quotesingle" g2="eacute" k="96" /> +<hkern g1="quotesingle" g2="ecircumflex" k="96" /> +<hkern g1="quotesingle" g2="edieresis" k="96" /> +<hkern g1="quotesingle" g2="eth" k="96" /> +<hkern g1="quotesingle" g2="ograve" k="96" /> +<hkern g1="quotesingle" g2="oacute" k="96" /> +<hkern g1="quotesingle" g2="ocircumflex" k="96" /> +<hkern g1="quotesingle" g2="otilde" k="96" /> +<hkern g1="quotesingle" g2="odieresis" k="96" /> +<hkern g1="quotesingle" g2="oslash" k="96" /> +<hkern g1="quotesingle" g2="OE" k="42" /> +<hkern g1="quotesingle" g2="oe" k="96" /> +<hkern g1="quotesingle" g2="endash" k="169" /> +<hkern g1="quotesingle" g2="emdash" k="169" /> +<hkern g1="quotesingle" g2="quotesinglbase" k="213" /> +<hkern g1="quotesingle" g2="quotedblbase" k="213" /> +<hkern g1="quotesingle" g2="bullet" k="169" /> +<hkern g1="quotesingle" g2="guilsinglleft" k="169" /> +<hkern g1="quotesingle" g2="guilsinglright" k="169" /> +<hkern g1="parenleft" g2="at" k="40" /> +<hkern g1="parenleft" g2="C" k="40" /> +<hkern g1="parenleft" g2="G" k="40" /> +<hkern g1="parenleft" g2="O" k="40" /> +<hkern g1="parenleft" g2="Q" k="40" /> +<hkern g1="parenleft" g2="c" k="36" /> +<hkern g1="parenleft" g2="d" k="36" /> +<hkern g1="parenleft" g2="e" k="36" /> +<hkern g1="parenleft" g2="o" k="36" /> +<hkern g1="parenleft" g2="q" k="36" /> +<hkern g1="parenleft" g2="copyright" k="40" /> +<hkern g1="parenleft" g2="registered" k="40" /> +<hkern g1="parenleft" g2="Ccedilla" k="40" /> +<hkern g1="parenleft" g2="Ograve" k="40" /> +<hkern g1="parenleft" g2="Oacute" k="40" /> +<hkern g1="parenleft" g2="Ocircumflex" k="40" /> +<hkern g1="parenleft" g2="Otilde" k="40" /> +<hkern g1="parenleft" g2="Odieresis" k="40" /> +<hkern g1="parenleft" g2="Oslash" k="40" /> +<hkern g1="parenleft" g2="ccedilla" k="36" /> +<hkern g1="parenleft" g2="egrave" k="36" /> +<hkern g1="parenleft" g2="eacute" k="36" /> +<hkern g1="parenleft" g2="ecircumflex" k="36" /> +<hkern g1="parenleft" g2="edieresis" k="36" /> +<hkern g1="parenleft" g2="eth" k="36" /> +<hkern g1="parenleft" g2="ograve" k="36" /> +<hkern g1="parenleft" g2="oacute" k="36" /> +<hkern g1="parenleft" g2="ocircumflex" k="36" /> +<hkern g1="parenleft" g2="otilde" k="36" /> +<hkern g1="parenleft" g2="odieresis" k="36" /> +<hkern g1="parenleft" g2="oslash" k="36" /> +<hkern g1="parenleft" g2="OE" k="40" /> +<hkern g1="parenleft" g2="oe" k="36" /> +<hkern g1="asterisk" g2="ampersand" k="191" /> +<hkern g1="asterisk" g2="comma" k="213" /> +<hkern g1="asterisk" g2="hyphen" k="169" /> +<hkern g1="asterisk" g2="period" k="213" /> +<hkern g1="asterisk" g2="slash" k="191" /> +<hkern g1="asterisk" g2="at" k="42" /> +<hkern g1="asterisk" g2="A" k="191" /> +<hkern g1="asterisk" g2="C" k="42" /> +<hkern g1="asterisk" g2="G" k="42" /> +<hkern g1="asterisk" g2="O" k="42" /> +<hkern g1="asterisk" g2="Q" k="42" /> +<hkern g1="asterisk" g2="V" k="-44" /> +<hkern g1="asterisk" g2="W" k="-44" /> +<hkern g1="asterisk" g2="Y" k="-36" /> +<hkern g1="asterisk" g2="backslash" k="-44" /> +<hkern g1="asterisk" g2="a" k="66" /> +<hkern g1="asterisk" g2="c" k="96" /> +<hkern g1="asterisk" g2="d" k="96" /> +<hkern g1="asterisk" g2="e" k="96" /> +<hkern g1="asterisk" g2="o" k="96" /> +<hkern g1="asterisk" g2="q" k="96" /> +<hkern g1="asterisk" g2="copyright" k="42" /> +<hkern g1="asterisk" g2="guillemotleft" k="169" /> +<hkern g1="asterisk" g2="uni00AD" k="169" /> +<hkern g1="asterisk" g2="registered" k="42" /> +<hkern g1="asterisk" g2="middot" k="169" /> +<hkern g1="asterisk" g2="guillemotright" k="169" /> +<hkern g1="asterisk" g2="Agrave" k="191" /> +<hkern g1="asterisk" g2="Aacute" k="191" /> +<hkern g1="asterisk" g2="Acircumflex" k="191" /> +<hkern g1="asterisk" g2="Atilde" k="191" /> +<hkern g1="asterisk" g2="Adieresis" k="191" /> +<hkern g1="asterisk" g2="Aring" k="191" /> +<hkern g1="asterisk" g2="AE" k="191" /> +<hkern g1="asterisk" g2="Ccedilla" k="42" /> +<hkern g1="asterisk" g2="Ograve" k="42" /> +<hkern g1="asterisk" g2="Oacute" k="42" /> +<hkern g1="asterisk" g2="Ocircumflex" k="42" /> +<hkern g1="asterisk" g2="Otilde" k="42" /> +<hkern g1="asterisk" g2="Odieresis" k="42" /> +<hkern g1="asterisk" g2="Oslash" k="42" /> +<hkern g1="asterisk" g2="Yacute" k="-36" /> +<hkern g1="asterisk" g2="agrave" k="66" /> +<hkern g1="asterisk" g2="aacute" k="66" /> +<hkern g1="asterisk" g2="acircumflex" k="66" /> +<hkern g1="asterisk" g2="atilde" k="66" /> +<hkern g1="asterisk" g2="adieresis" k="66" /> +<hkern g1="asterisk" g2="aring" k="66" /> +<hkern g1="asterisk" g2="ae" k="66" /> +<hkern g1="asterisk" g2="ccedilla" k="96" /> +<hkern g1="asterisk" g2="egrave" k="96" /> +<hkern g1="asterisk" g2="eacute" k="96" /> +<hkern g1="asterisk" g2="ecircumflex" k="96" /> +<hkern g1="asterisk" g2="edieresis" k="96" /> +<hkern g1="asterisk" g2="eth" k="96" /> +<hkern g1="asterisk" g2="ograve" k="96" /> +<hkern g1="asterisk" g2="oacute" k="96" /> +<hkern g1="asterisk" g2="ocircumflex" k="96" /> +<hkern g1="asterisk" g2="otilde" k="96" /> +<hkern g1="asterisk" g2="odieresis" k="96" /> +<hkern g1="asterisk" g2="oslash" k="96" /> +<hkern g1="asterisk" g2="OE" k="42" /> +<hkern g1="asterisk" g2="oe" k="96" /> +<hkern g1="asterisk" g2="endash" k="169" /> +<hkern g1="asterisk" g2="emdash" k="169" /> +<hkern g1="asterisk" g2="quotesinglbase" k="213" /> +<hkern g1="asterisk" g2="quotedblbase" k="213" /> +<hkern g1="asterisk" g2="bullet" k="169" /> +<hkern g1="asterisk" g2="guilsinglleft" k="169" /> +<hkern g1="asterisk" g2="guilsinglright" k="169" /> +<hkern g1="comma" g2="quotedbl" k="213" /> +<hkern g1="comma" g2="quotesingle" k="213" /> +<hkern g1="comma" g2="asterisk" k="213" /> +<hkern g1="comma" g2="hyphen" k="132" /> +<hkern g1="comma" g2="at" k="52" /> +<hkern g1="comma" g2="C" k="52" /> +<hkern g1="comma" g2="G" k="52" /> +<hkern g1="comma" g2="O" k="52" /> +<hkern g1="comma" g2="Q" k="52" /> +<hkern g1="comma" g2="T" k="180" /> +<hkern g1="comma" g2="V" k="180" /> +<hkern g1="comma" g2="W" k="131" /> +<hkern g1="comma" g2="Y" k="167" /> +<hkern g1="comma" g2="backslash" k="180" /> +<hkern g1="comma" g2="v" k="136" /> +<hkern g1="comma" g2="w" k="71" /> +<hkern g1="comma" g2="y" k="136" /> +<hkern g1="comma" g2="copyright" k="52" /> +<hkern g1="comma" g2="ordfeminine" k="213" /> +<hkern g1="comma" g2="guillemotleft" k="132" /> +<hkern g1="comma" g2="uni00AD" k="132" /> +<hkern g1="comma" g2="registered" k="52" /> +<hkern g1="comma" g2="degree" k="213" /> +<hkern g1="comma" g2="middot" k="132" /> +<hkern g1="comma" g2="ordmasculine" k="213" /> +<hkern g1="comma" g2="guillemotright" k="132" /> +<hkern g1="comma" g2="Ccedilla" k="52" /> +<hkern g1="comma" g2="Ograve" k="52" /> +<hkern g1="comma" g2="Oacute" k="52" /> +<hkern g1="comma" g2="Ocircumflex" k="52" /> +<hkern g1="comma" g2="Otilde" k="52" /> +<hkern g1="comma" g2="Odieresis" k="52" /> +<hkern g1="comma" g2="Oslash" k="52" /> +<hkern g1="comma" g2="Yacute" k="167" /> +<hkern g1="comma" g2="yacute" k="136" /> +<hkern g1="comma" g2="ydieresis" k="136" /> +<hkern g1="comma" g2="OE" k="52" /> +<hkern g1="comma" g2="endash" k="132" /> +<hkern g1="comma" g2="emdash" k="132" /> +<hkern g1="comma" g2="quoteleft" k="213" /> +<hkern g1="comma" g2="quoteright" k="213" /> +<hkern g1="comma" g2="quotedblleft" k="213" /> +<hkern g1="comma" g2="quotedblright" k="213" /> +<hkern g1="comma" g2="bullet" k="132" /> +<hkern g1="comma" g2="guilsinglleft" k="132" /> +<hkern g1="comma" g2="guilsinglright" k="132" /> +<hkern g1="hyphen" g2="quotedbl" k="169" /> +<hkern g1="hyphen" g2="ampersand" k="67" /> +<hkern g1="hyphen" g2="quotesingle" k="169" /> +<hkern g1="hyphen" g2="asterisk" k="169" /> +<hkern g1="hyphen" g2="comma" k="132" /> +<hkern g1="hyphen" g2="period" k="132" /> +<hkern g1="hyphen" g2="slash" k="67" /> +<hkern g1="hyphen" g2="A" k="67" /> +<hkern g1="hyphen" g2="T" k="180" /> +<hkern g1="hyphen" g2="V" k="116" /> +<hkern g1="hyphen" g2="W" k="36" /> +<hkern g1="hyphen" g2="X" k="66" /> +<hkern g1="hyphen" g2="Y" k="160" /> +<hkern g1="hyphen" g2="Z" k="48" /> +<hkern g1="hyphen" g2="backslash" k="116" /> +<hkern g1="hyphen" g2="ordfeminine" k="169" /> +<hkern g1="hyphen" g2="degree" k="169" /> +<hkern g1="hyphen" g2="ordmasculine" k="169" /> +<hkern g1="hyphen" g2="Agrave" k="67" /> +<hkern g1="hyphen" g2="Aacute" k="67" /> +<hkern g1="hyphen" g2="Acircumflex" k="67" /> +<hkern g1="hyphen" g2="Atilde" k="67" /> +<hkern g1="hyphen" g2="Adieresis" k="67" /> +<hkern g1="hyphen" g2="Aring" k="67" /> +<hkern g1="hyphen" g2="AE" k="67" /> +<hkern g1="hyphen" g2="Yacute" k="160" /> +<hkern g1="hyphen" g2="quoteleft" k="169" /> +<hkern g1="hyphen" g2="quoteright" k="169" /> +<hkern g1="hyphen" g2="quotesinglbase" k="132" /> +<hkern g1="hyphen" g2="quotedblleft" k="169" /> +<hkern g1="hyphen" g2="quotedblright" k="169" /> +<hkern g1="hyphen" g2="quotedblbase" k="132" /> +<hkern g1="period" g2="quotedbl" k="213" /> +<hkern g1="period" g2="quotesingle" k="213" /> +<hkern g1="period" g2="asterisk" k="213" /> +<hkern g1="period" g2="hyphen" k="132" /> +<hkern g1="period" g2="at" k="52" /> +<hkern g1="period" g2="C" k="52" /> +<hkern g1="period" g2="G" k="52" /> +<hkern g1="period" g2="O" k="52" /> +<hkern g1="period" g2="Q" k="52" /> +<hkern g1="period" g2="T" k="180" /> +<hkern g1="period" g2="V" k="180" /> +<hkern g1="period" g2="W" k="131" /> +<hkern g1="period" g2="Y" k="167" /> +<hkern g1="period" g2="backslash" k="180" /> +<hkern g1="period" g2="v" k="136" /> +<hkern g1="period" g2="w" k="71" /> +<hkern g1="period" g2="y" k="136" /> +<hkern g1="period" g2="copyright" k="52" /> +<hkern g1="period" g2="ordfeminine" k="213" /> +<hkern g1="period" g2="guillemotleft" k="132" /> +<hkern g1="period" g2="uni00AD" k="132" /> +<hkern g1="period" g2="registered" k="52" /> +<hkern g1="period" g2="degree" k="213" /> +<hkern g1="period" g2="middot" k="132" /> +<hkern g1="period" g2="ordmasculine" k="213" /> +<hkern g1="period" g2="guillemotright" k="132" /> +<hkern g1="period" g2="Ccedilla" k="52" /> +<hkern g1="period" g2="Ograve" k="52" /> +<hkern g1="period" g2="Oacute" k="52" /> +<hkern g1="period" g2="Ocircumflex" k="52" /> +<hkern g1="period" g2="Otilde" k="52" /> +<hkern g1="period" g2="Odieresis" k="52" /> +<hkern g1="period" g2="Oslash" k="52" /> +<hkern g1="period" g2="Yacute" k="167" /> +<hkern g1="period" g2="yacute" k="136" /> +<hkern g1="period" g2="ydieresis" k="136" /> +<hkern g1="period" g2="OE" k="52" /> +<hkern g1="period" g2="endash" k="132" /> +<hkern g1="period" g2="emdash" k="132" /> +<hkern g1="period" g2="quoteleft" k="213" /> +<hkern g1="period" g2="quoteright" k="213" /> +<hkern g1="period" g2="quotedblleft" k="213" /> +<hkern g1="period" g2="quotedblright" k="213" /> +<hkern g1="period" g2="bullet" k="132" /> +<hkern g1="period" g2="guilsinglleft" k="132" /> +<hkern g1="period" g2="guilsinglright" k="132" /> +<hkern g1="slash" g2="quotedbl" k="-44" /> +<hkern g1="slash" g2="ampersand" k="169" /> +<hkern g1="slash" g2="quotesingle" k="-44" /> +<hkern g1="slash" g2="asterisk" k="-44" /> +<hkern g1="slash" g2="comma" k="196" /> +<hkern g1="slash" g2="hyphen" k="116" /> +<hkern g1="slash" g2="period" k="196" /> +<hkern g1="slash" g2="slash" k="169" /> +<hkern g1="slash" g2="colon" k="99" /> +<hkern g1="slash" g2="semicolon" k="99" /> +<hkern g1="slash" g2="question" k="-39" /> +<hkern g1="slash" g2="at" k="56" /> +<hkern g1="slash" g2="A" k="169" /> +<hkern g1="slash" g2="C" k="56" /> +<hkern g1="slash" g2="G" k="56" /> +<hkern g1="slash" g2="J" k="156" /> +<hkern g1="slash" g2="O" k="56" /> +<hkern g1="slash" g2="Q" k="56" /> +<hkern g1="slash" g2="a" k="123" /> +<hkern g1="slash" g2="c" k="123" /> +<hkern g1="slash" g2="d" k="123" /> +<hkern g1="slash" g2="e" k="123" /> +<hkern g1="slash" g2="f" k="30" /> +<hkern g1="slash" g2="g" k="138" /> +<hkern g1="slash" g2="m" k="99" /> +<hkern g1="slash" g2="n" k="99" /> +<hkern g1="slash" g2="o" k="123" /> +<hkern g1="slash" g2="p" k="99" /> +<hkern g1="slash" g2="q" k="123" /> +<hkern g1="slash" g2="r" k="99" /> +<hkern g1="slash" g2="s" k="108" /> +<hkern g1="slash" g2="t" k="46" /> +<hkern g1="slash" g2="u" k="99" /> +<hkern g1="slash" g2="v" k="59" /> +<hkern g1="slash" g2="x" k="67" /> +<hkern g1="slash" g2="y" k="59" /> +<hkern g1="slash" g2="z" k="91" /> +<hkern g1="slash" g2="copyright" k="56" /> +<hkern g1="slash" g2="ordfeminine" k="-44" /> +<hkern g1="slash" g2="guillemotleft" k="116" /> +<hkern g1="slash" g2="uni00AD" k="116" /> +<hkern g1="slash" g2="registered" k="56" /> +<hkern g1="slash" g2="degree" k="-44" /> +<hkern g1="slash" g2="twosuperior" k="-49" /> +<hkern g1="slash" g2="threesuperior" k="-49" /> +<hkern g1="slash" g2="mu" k="99" /> +<hkern g1="slash" g2="middot" k="116" /> +<hkern g1="slash" g2="onesuperior" k="-49" /> +<hkern g1="slash" g2="ordmasculine" k="-44" /> +<hkern g1="slash" g2="guillemotright" k="116" /> +<hkern g1="slash" g2="Agrave" k="169" /> +<hkern g1="slash" g2="Aacute" k="169" /> +<hkern g1="slash" g2="Acircumflex" k="169" /> +<hkern g1="slash" g2="Atilde" k="169" /> +<hkern g1="slash" g2="Adieresis" k="169" /> +<hkern g1="slash" g2="Aring" k="169" /> +<hkern g1="slash" g2="AE" k="169" /> +<hkern g1="slash" g2="Ccedilla" k="56" /> +<hkern g1="slash" g2="Ograve" k="56" /> +<hkern g1="slash" g2="Oacute" k="56" /> +<hkern g1="slash" g2="Ocircumflex" k="56" /> +<hkern g1="slash" g2="Otilde" k="56" /> +<hkern g1="slash" g2="Odieresis" k="56" /> +<hkern g1="slash" g2="Oslash" k="56" /> +<hkern g1="slash" g2="agrave" k="123" /> +<hkern g1="slash" g2="aacute" k="123" /> +<hkern g1="slash" g2="acircumflex" k="123" /> +<hkern g1="slash" g2="atilde" k="123" /> +<hkern g1="slash" g2="adieresis" k="123" /> +<hkern g1="slash" g2="aring" k="123" /> +<hkern g1="slash" g2="ae" k="123" /> +<hkern g1="slash" g2="ccedilla" k="123" /> +<hkern g1="slash" g2="egrave" k="123" /> +<hkern g1="slash" g2="eacute" k="123" /> +<hkern g1="slash" g2="ecircumflex" k="123" /> +<hkern g1="slash" g2="edieresis" k="123" /> +<hkern g1="slash" g2="eth" k="123" /> +<hkern g1="slash" g2="ntilde" k="99" /> +<hkern g1="slash" g2="ograve" k="123" /> +<hkern g1="slash" g2="oacute" k="123" /> +<hkern g1="slash" g2="ocircumflex" k="123" /> +<hkern g1="slash" g2="otilde" k="123" /> +<hkern g1="slash" g2="odieresis" k="123" /> +<hkern g1="slash" g2="oslash" k="123" /> +<hkern g1="slash" g2="ugrave" k="99" /> +<hkern g1="slash" g2="uacute" k="99" /> +<hkern g1="slash" g2="ucircumflex" k="99" /> +<hkern g1="slash" g2="udieresis" k="99" /> +<hkern g1="slash" g2="yacute" k="59" /> +<hkern g1="slash" g2="ydieresis" k="59" /> +<hkern g1="slash" g2="dotlessi" k="99" /> +<hkern g1="slash" g2="OE" k="56" /> +<hkern g1="slash" g2="oe" k="123" /> +<hkern g1="slash" g2="endash" k="116" /> +<hkern g1="slash" g2="emdash" k="116" /> +<hkern g1="slash" g2="quoteleft" k="-44" /> +<hkern g1="slash" g2="quoteright" k="-44" /> +<hkern g1="slash" g2="quotesinglbase" k="196" /> +<hkern g1="slash" g2="quotedblleft" k="-44" /> +<hkern g1="slash" g2="quotedblright" k="-44" /> +<hkern g1="slash" g2="quotedblbase" k="196" /> +<hkern g1="slash" g2="bullet" k="116" /> +<hkern g1="slash" g2="guilsinglleft" k="116" /> +<hkern g1="slash" g2="guilsinglright" k="116" /> +<hkern g1="at" g2="quotedbl" k="42" /> +<hkern g1="at" g2="ampersand" k="51" /> +<hkern g1="at" g2="quotesingle" k="42" /> +<hkern g1="at" g2="parenright" k="40" /> +<hkern g1="at" g2="asterisk" k="42" /> +<hkern g1="at" g2="comma" k="52" /> +<hkern g1="at" g2="period" k="52" /> +<hkern g1="at" g2="slash" k="51" /> +<hkern g1="at" g2="A" k="51" /> +<hkern g1="at" g2="T" k="78" /> +<hkern g1="at" g2="V" k="56" /> +<hkern g1="at" g2="X" k="30" /> +<hkern g1="at" g2="Y" k="80" /> +<hkern g1="at" g2="Z" k="64" /> +<hkern g1="at" g2="backslash" k="56" /> +<hkern g1="at" g2="bracketright" k="40" /> +<hkern g1="at" g2="braceright" k="40" /> +<hkern g1="at" g2="ordfeminine" k="42" /> +<hkern g1="at" g2="degree" k="42" /> +<hkern g1="at" g2="ordmasculine" k="42" /> +<hkern g1="at" g2="Agrave" k="51" /> +<hkern g1="at" g2="Aacute" k="51" /> +<hkern g1="at" g2="Acircumflex" k="51" /> +<hkern g1="at" g2="Atilde" k="51" /> +<hkern g1="at" g2="Adieresis" k="51" /> +<hkern g1="at" g2="Aring" k="51" /> +<hkern g1="at" g2="AE" k="51" /> +<hkern g1="at" g2="Yacute" k="80" /> +<hkern g1="at" g2="quoteleft" k="42" /> +<hkern g1="at" g2="quoteright" k="42" /> +<hkern g1="at" g2="quotesinglbase" k="52" /> +<hkern g1="at" g2="quotedblleft" k="42" /> +<hkern g1="at" g2="quotedblright" k="42" /> +<hkern g1="at" g2="quotedblbase" k="52" /> +<hkern g1="A" g2="quotedbl" k="191" /> +<hkern g1="A" g2="quotesingle" k="191" /> +<hkern g1="A" g2="asterisk" k="191" /> +<hkern g1="A" g2="hyphen" k="67" /> +<hkern g1="A" g2="question" k="63" /> +<hkern g1="A" g2="at" k="51" /> +<hkern g1="A" g2="C" k="51" /> +<hkern g1="A" g2="G" k="51" /> +<hkern g1="A" g2="J" k="-56" /> +<hkern g1="A" g2="O" k="51" /> +<hkern g1="A" g2="Q" k="51" /> +<hkern g1="A" g2="T" k="147" /> +<hkern g1="A" g2="U" k="52" /> +<hkern g1="A" g2="V" k="169" /> +<hkern g1="A" g2="W" k="102" /> +<hkern g1="A" g2="Y" k="182" /> +<hkern g1="A" g2="backslash" k="169" /> +<hkern g1="A" g2="v" k="91" /> +<hkern g1="A" g2="y" k="91" /> +<hkern g1="A" g2="copyright" k="51" /> +<hkern g1="A" g2="ordfeminine" k="191" /> +<hkern g1="A" g2="guillemotleft" k="67" /> +<hkern g1="A" g2="uni00AD" k="67" /> +<hkern g1="A" g2="registered" k="51" /> +<hkern g1="A" g2="degree" k="191" /> +<hkern g1="A" g2="twosuperior" k="202" /> +<hkern g1="A" g2="threesuperior" k="202" /> +<hkern g1="A" g2="middot" k="67" /> +<hkern g1="A" g2="onesuperior" k="202" /> +<hkern g1="A" g2="ordmasculine" k="191" /> +<hkern g1="A" g2="guillemotright" k="67" /> +<hkern g1="A" g2="Ccedilla" k="51" /> +<hkern g1="A" g2="Ograve" k="51" /> +<hkern g1="A" g2="Oacute" k="51" /> +<hkern g1="A" g2="Ocircumflex" k="51" /> +<hkern g1="A" g2="Otilde" k="51" /> +<hkern g1="A" g2="Odieresis" k="51" /> +<hkern g1="A" g2="Oslash" k="51" /> +<hkern g1="A" g2="Ugrave" k="52" /> +<hkern g1="A" g2="Uacute" k="52" /> +<hkern g1="A" g2="Ucircumflex" k="52" /> +<hkern g1="A" g2="Udieresis" k="52" /> +<hkern g1="A" g2="Yacute" k="182" /> +<hkern g1="A" g2="yacute" k="91" /> +<hkern g1="A" g2="ydieresis" k="91" /> +<hkern g1="A" g2="OE" k="51" /> +<hkern g1="A" g2="endash" k="67" /> +<hkern g1="A" g2="emdash" k="67" /> +<hkern g1="A" g2="quoteleft" k="191" /> +<hkern g1="A" g2="quoteright" k="191" /> +<hkern g1="A" g2="quotedblleft" k="191" /> +<hkern g1="A" g2="quotedblright" k="191" /> +<hkern g1="A" g2="bullet" k="67" /> +<hkern g1="A" g2="guilsinglleft" k="67" /> +<hkern g1="A" g2="guilsinglright" k="67" /> +<hkern g1="C" g2="hyphen" k="144" /> +<hkern g1="C" g2="guillemotleft" k="144" /> +<hkern g1="C" g2="uni00AD" k="144" /> +<hkern g1="C" g2="middot" k="144" /> +<hkern g1="C" g2="guillemotright" k="144" /> +<hkern g1="C" g2="endash" k="144" /> +<hkern g1="C" g2="emdash" k="144" /> +<hkern g1="C" g2="bullet" k="144" /> +<hkern g1="C" g2="guilsinglleft" k="144" /> +<hkern g1="C" g2="guilsinglright" k="144" /> +<hkern g1="D" g2="quotedbl" k="42" /> +<hkern g1="D" g2="ampersand" k="51" /> +<hkern g1="D" g2="quotesingle" k="42" /> +<hkern g1="D" g2="parenright" k="40" /> +<hkern g1="D" g2="asterisk" k="42" /> +<hkern g1="D" g2="comma" k="52" /> +<hkern g1="D" g2="period" k="52" /> +<hkern g1="D" g2="slash" k="51" /> +<hkern g1="D" g2="A" k="51" /> +<hkern g1="D" g2="T" k="78" /> +<hkern g1="D" g2="V" k="56" /> +<hkern g1="D" g2="X" k="30" /> +<hkern g1="D" g2="Y" k="80" /> +<hkern g1="D" g2="Z" k="64" /> +<hkern g1="D" g2="backslash" k="56" /> +<hkern g1="D" g2="bracketright" k="40" /> +<hkern g1="D" g2="braceright" k="40" /> +<hkern g1="D" g2="ordfeminine" k="42" /> +<hkern g1="D" g2="degree" k="42" /> +<hkern g1="D" g2="ordmasculine" k="42" /> +<hkern g1="D" g2="Agrave" k="51" /> +<hkern g1="D" g2="Aacute" k="51" /> +<hkern g1="D" g2="Acircumflex" k="51" /> +<hkern g1="D" g2="Atilde" k="51" /> +<hkern g1="D" g2="Adieresis" k="51" /> +<hkern g1="D" g2="Aring" k="51" /> +<hkern g1="D" g2="AE" k="51" /> +<hkern g1="D" g2="Yacute" k="80" /> +<hkern g1="D" g2="quoteleft" k="42" /> +<hkern g1="D" g2="quoteright" k="42" /> +<hkern g1="D" g2="quotesinglbase" k="52" /> +<hkern g1="D" g2="quotedblleft" k="42" /> +<hkern g1="D" g2="quotedblright" k="42" /> +<hkern g1="D" g2="quotedblbase" k="52" /> +<hkern g1="F" g2="ampersand" k="147" /> +<hkern g1="F" g2="comma" k="180" /> +<hkern g1="F" g2="period" k="180" /> +<hkern g1="F" g2="slash" k="147" /> +<hkern g1="F" g2="colon" k="60" /> +<hkern g1="F" g2="semicolon" k="60" /> +<hkern g1="F" g2="question" k="-30" /> +<hkern g1="F" g2="A" k="147" /> +<hkern g1="F" g2="J" k="189" /> +<hkern g1="F" g2="c" k="64" /> +<hkern g1="F" g2="d" k="64" /> +<hkern g1="F" g2="e" k="64" /> +<hkern g1="F" g2="m" k="60" /> +<hkern g1="F" g2="n" k="60" /> +<hkern g1="F" g2="o" k="64" /> +<hkern g1="F" g2="p" k="60" /> +<hkern g1="F" g2="q" k="64" /> +<hkern g1="F" g2="r" k="60" /> +<hkern g1="F" g2="u" k="60" /> +<hkern g1="F" g2="mu" k="60" /> +<hkern g1="F" g2="Agrave" k="147" /> +<hkern g1="F" g2="Aacute" k="147" /> +<hkern g1="F" g2="Acircumflex" k="147" /> +<hkern g1="F" g2="Atilde" k="147" /> +<hkern g1="F" g2="Adieresis" k="147" /> +<hkern g1="F" g2="Aring" k="147" /> +<hkern g1="F" g2="AE" k="147" /> +<hkern g1="F" g2="ccedilla" k="64" /> +<hkern g1="F" g2="egrave" k="64" /> +<hkern g1="F" g2="eacute" k="64" /> +<hkern g1="F" g2="ecircumflex" k="64" /> +<hkern g1="F" g2="edieresis" k="64" /> +<hkern g1="F" g2="eth" k="64" /> +<hkern g1="F" g2="ntilde" k="60" /> +<hkern g1="F" g2="ograve" k="64" /> +<hkern g1="F" g2="oacute" k="64" /> +<hkern g1="F" g2="ocircumflex" k="64" /> +<hkern g1="F" g2="otilde" k="64" /> +<hkern g1="F" g2="odieresis" k="64" /> +<hkern g1="F" g2="oslash" k="64" /> +<hkern g1="F" g2="ugrave" k="60" /> +<hkern g1="F" g2="uacute" k="60" /> +<hkern g1="F" g2="ucircumflex" k="60" /> +<hkern g1="F" g2="udieresis" k="60" /> +<hkern g1="F" g2="dotlessi" k="60" /> +<hkern g1="F" g2="oe" k="64" /> +<hkern g1="F" g2="quotesinglbase" k="180" /> +<hkern g1="F" g2="quotedblbase" k="180" /> +<hkern g1="J" g2="ampersand" k="52" /> +<hkern g1="J" g2="comma" k="50" /> +<hkern g1="J" g2="period" k="50" /> +<hkern g1="J" g2="slash" k="52" /> +<hkern g1="J" g2="A" k="52" /> +<hkern g1="J" g2="Agrave" k="52" /> +<hkern g1="J" g2="Aacute" k="52" /> +<hkern g1="J" g2="Acircumflex" k="52" /> +<hkern g1="J" g2="Atilde" k="52" /> +<hkern g1="J" g2="Adieresis" k="52" /> +<hkern g1="J" g2="Aring" k="52" /> +<hkern g1="J" g2="AE" k="52" /> +<hkern g1="J" g2="quotesinglbase" k="50" /> +<hkern g1="J" g2="quotedblbase" k="50" /> +<hkern g1="K" g2="hyphen" k="66" /> +<hkern g1="K" g2="at" k="30" /> +<hkern g1="K" g2="C" k="30" /> +<hkern g1="K" g2="G" k="30" /> +<hkern g1="K" g2="O" k="30" /> +<hkern g1="K" g2="Q" k="30" /> +<hkern g1="K" g2="c" k="43" /> +<hkern g1="K" g2="d" k="43" /> +<hkern g1="K" g2="e" k="43" /> +<hkern g1="K" g2="f" k="56" /> +<hkern g1="K" g2="o" k="43" /> +<hkern g1="K" g2="q" k="43" /> +<hkern g1="K" g2="t" k="91" /> +<hkern g1="K" g2="v" k="73" /> +<hkern g1="K" g2="w" k="52" /> +<hkern g1="K" g2="y" k="73" /> +<hkern g1="K" g2="copyright" k="30" /> +<hkern g1="K" g2="guillemotleft" k="66" /> +<hkern g1="K" g2="uni00AD" k="66" /> +<hkern g1="K" g2="registered" k="30" /> +<hkern g1="K" g2="middot" k="66" /> +<hkern g1="K" g2="guillemotright" k="66" /> +<hkern g1="K" g2="Ccedilla" k="30" /> +<hkern g1="K" g2="Ograve" k="30" /> +<hkern g1="K" g2="Oacute" k="30" /> +<hkern g1="K" g2="Ocircumflex" k="30" /> +<hkern g1="K" g2="Otilde" k="30" /> +<hkern g1="K" g2="Odieresis" k="30" /> +<hkern g1="K" g2="Oslash" k="30" /> +<hkern g1="K" g2="ccedilla" k="43" /> +<hkern g1="K" g2="egrave" k="43" /> +<hkern g1="K" g2="eacute" k="43" /> +<hkern g1="K" g2="ecircumflex" k="43" /> +<hkern g1="K" g2="edieresis" k="43" /> +<hkern g1="K" g2="eth" k="43" /> +<hkern g1="K" g2="ograve" k="43" /> +<hkern g1="K" g2="oacute" k="43" /> +<hkern g1="K" g2="ocircumflex" k="43" /> +<hkern g1="K" g2="otilde" k="43" /> +<hkern g1="K" g2="odieresis" k="43" /> +<hkern g1="K" g2="oslash" k="43" /> +<hkern g1="K" g2="yacute" k="73" /> +<hkern g1="K" g2="ydieresis" k="73" /> +<hkern g1="K" g2="OE" k="30" /> +<hkern g1="K" g2="oe" k="43" /> +<hkern g1="K" g2="endash" k="66" /> +<hkern g1="K" g2="emdash" k="66" /> +<hkern g1="K" g2="bullet" k="66" /> +<hkern g1="K" g2="guilsinglleft" k="66" /> +<hkern g1="K" g2="guilsinglright" k="66" /> +<hkern g1="L" g2="quotedbl" k="284" /> +<hkern g1="L" g2="quotesingle" k="284" /> +<hkern g1="L" g2="asterisk" k="284" /> +<hkern g1="L" g2="comma" k="-58" /> +<hkern g1="L" g2="hyphen" k="178" /> +<hkern g1="L" g2="period" k="-58" /> +<hkern g1="L" g2="question" k="50" /> +<hkern g1="L" g2="at" k="80" /> +<hkern g1="L" g2="C" k="80" /> +<hkern g1="L" g2="G" k="80" /> +<hkern g1="L" g2="O" k="80" /> +<hkern g1="L" g2="Q" k="80" /> +<hkern g1="L" g2="T" k="176" /> +<hkern g1="L" g2="V" k="191" /> +<hkern g1="L" g2="W" k="167" /> +<hkern g1="L" g2="Y" k="227" /> +<hkern g1="L" g2="backslash" k="191" /> +<hkern g1="L" g2="c" k="38" /> +<hkern g1="L" g2="d" k="38" /> +<hkern g1="L" g2="e" k="38" /> +<hkern g1="L" g2="o" k="38" /> +<hkern g1="L" g2="q" k="38" /> +<hkern g1="L" g2="v" k="119" /> +<hkern g1="L" g2="w" k="80" /> +<hkern g1="L" g2="y" k="119" /> +<hkern g1="L" g2="copyright" k="80" /> +<hkern g1="L" g2="ordfeminine" k="284" /> +<hkern g1="L" g2="guillemotleft" k="178" /> +<hkern g1="L" g2="uni00AD" k="178" /> +<hkern g1="L" g2="registered" k="80" /> +<hkern g1="L" g2="degree" k="284" /> +<hkern g1="L" g2="twosuperior" k="211" /> +<hkern g1="L" g2="threesuperior" k="211" /> +<hkern g1="L" g2="middot" k="178" /> +<hkern g1="L" g2="onesuperior" k="211" /> +<hkern g1="L" g2="ordmasculine" k="284" /> +<hkern g1="L" g2="guillemotright" k="178" /> +<hkern g1="L" g2="Ccedilla" k="80" /> +<hkern g1="L" g2="Ograve" k="80" /> +<hkern g1="L" g2="Oacute" k="80" /> +<hkern g1="L" g2="Ocircumflex" k="80" /> +<hkern g1="L" g2="Otilde" k="80" /> +<hkern g1="L" g2="Odieresis" k="80" /> +<hkern g1="L" g2="Oslash" k="80" /> +<hkern g1="L" g2="Yacute" k="227" /> +<hkern g1="L" g2="ccedilla" k="38" /> +<hkern g1="L" g2="egrave" k="38" /> +<hkern g1="L" g2="eacute" k="38" /> +<hkern g1="L" g2="ecircumflex" k="38" /> +<hkern g1="L" g2="edieresis" k="38" /> +<hkern g1="L" g2="eth" k="38" /> +<hkern g1="L" g2="ograve" k="38" /> +<hkern g1="L" g2="oacute" k="38" /> +<hkern g1="L" g2="ocircumflex" k="38" /> +<hkern g1="L" g2="otilde" k="38" /> +<hkern g1="L" g2="odieresis" k="38" /> +<hkern g1="L" g2="oslash" k="38" /> +<hkern g1="L" g2="yacute" k="119" /> +<hkern g1="L" g2="ydieresis" k="119" /> +<hkern g1="L" g2="OE" k="80" /> +<hkern g1="L" g2="oe" k="38" /> +<hkern g1="L" g2="endash" k="178" /> +<hkern g1="L" g2="emdash" k="178" /> +<hkern g1="L" g2="quoteleft" k="284" /> +<hkern g1="L" g2="quoteright" k="284" /> +<hkern g1="L" g2="quotesinglbase" k="-58" /> +<hkern g1="L" g2="quotedblleft" k="284" /> +<hkern g1="L" g2="quotedblright" k="284" /> +<hkern g1="L" g2="quotedblbase" k="-58" /> +<hkern g1="L" g2="bullet" k="178" /> +<hkern g1="L" g2="guilsinglleft" k="178" /> +<hkern g1="L" g2="guilsinglright" k="178" /> +<hkern g1="O" g2="quotedbl" k="42" /> +<hkern g1="O" g2="ampersand" k="51" /> +<hkern g1="O" g2="quotesingle" k="42" /> +<hkern g1="O" g2="parenright" k="40" /> +<hkern g1="O" g2="asterisk" k="42" /> +<hkern g1="O" g2="comma" k="52" /> +<hkern g1="O" g2="period" k="52" /> +<hkern g1="O" g2="slash" k="51" /> +<hkern g1="O" g2="A" k="51" /> +<hkern g1="O" g2="T" k="78" /> +<hkern g1="O" g2="V" k="56" /> +<hkern g1="O" g2="X" k="30" /> +<hkern g1="O" g2="Y" k="80" /> +<hkern g1="O" g2="Z" k="64" /> +<hkern g1="O" g2="backslash" k="56" /> +<hkern g1="O" g2="bracketright" k="40" /> +<hkern g1="O" g2="braceright" k="40" /> +<hkern g1="O" g2="ordfeminine" k="42" /> +<hkern g1="O" g2="degree" k="42" /> +<hkern g1="O" g2="ordmasculine" k="42" /> +<hkern g1="O" g2="Agrave" k="51" /> +<hkern g1="O" g2="Aacute" k="51" /> +<hkern g1="O" g2="Acircumflex" k="51" /> +<hkern g1="O" g2="Atilde" k="51" /> +<hkern g1="O" g2="Adieresis" k="51" /> +<hkern g1="O" g2="Aring" k="51" /> +<hkern g1="O" g2="AE" k="51" /> +<hkern g1="O" g2="Yacute" k="80" /> +<hkern g1="O" g2="quoteleft" k="42" /> +<hkern g1="O" g2="quoteright" k="42" /> +<hkern g1="O" g2="quotesinglbase" k="52" /> +<hkern g1="O" g2="quotedblleft" k="42" /> +<hkern g1="O" g2="quotedblright" k="42" /> +<hkern g1="O" g2="quotedblbase" k="52" /> +<hkern g1="P" g2="ampersand" k="155" /> +<hkern g1="P" g2="comma" k="265" /> +<hkern g1="P" g2="period" k="265" /> +<hkern g1="P" g2="slash" k="155" /> +<hkern g1="P" g2="A" k="155" /> +<hkern g1="P" g2="J" k="191" /> +<hkern g1="P" g2="a" k="50" /> +<hkern g1="P" g2="c" k="30" /> +<hkern g1="P" g2="d" k="30" /> +<hkern g1="P" g2="e" k="30" /> +<hkern g1="P" g2="o" k="30" /> +<hkern g1="P" g2="q" k="30" /> +<hkern g1="P" g2="Agrave" k="155" /> +<hkern g1="P" g2="Aacute" k="155" /> +<hkern g1="P" g2="Acircumflex" k="155" /> +<hkern g1="P" g2="Atilde" k="155" /> +<hkern g1="P" g2="Adieresis" k="155" /> +<hkern g1="P" g2="Aring" k="155" /> +<hkern g1="P" g2="AE" k="155" /> +<hkern g1="P" g2="agrave" k="50" /> +<hkern g1="P" g2="aacute" k="50" /> +<hkern g1="P" g2="acircumflex" k="50" /> +<hkern g1="P" g2="atilde" k="50" /> +<hkern g1="P" g2="adieresis" k="50" /> +<hkern g1="P" g2="aring" k="50" /> +<hkern g1="P" g2="ae" k="50" /> +<hkern g1="P" g2="ccedilla" k="30" /> +<hkern g1="P" g2="egrave" k="30" /> +<hkern g1="P" g2="eacute" k="30" /> +<hkern g1="P" g2="ecircumflex" k="30" /> +<hkern g1="P" g2="edieresis" k="30" /> +<hkern g1="P" g2="eth" k="30" /> +<hkern g1="P" g2="ograve" k="30" /> +<hkern g1="P" g2="oacute" k="30" /> +<hkern g1="P" g2="ocircumflex" k="30" /> +<hkern g1="P" g2="otilde" k="30" /> +<hkern g1="P" g2="odieresis" k="30" /> +<hkern g1="P" g2="oslash" k="30" /> +<hkern g1="P" g2="oe" k="30" /> +<hkern g1="P" g2="quotesinglbase" k="265" /> +<hkern g1="P" g2="quotedblbase" k="265" /> +<hkern g1="Q" g2="quotedbl" k="42" /> +<hkern g1="Q" g2="ampersand" k="51" /> +<hkern g1="Q" g2="quotesingle" k="42" /> +<hkern g1="Q" g2="parenright" k="40" /> +<hkern g1="Q" g2="asterisk" k="42" /> +<hkern g1="Q" g2="comma" k="52" /> +<hkern g1="Q" g2="period" k="52" /> +<hkern g1="Q" g2="slash" k="51" /> +<hkern g1="Q" g2="A" k="51" /> +<hkern g1="Q" g2="T" k="78" /> +<hkern g1="Q" g2="V" k="56" /> +<hkern g1="Q" g2="X" k="30" /> +<hkern g1="Q" g2="Y" k="80" /> +<hkern g1="Q" g2="Z" k="64" /> +<hkern g1="Q" g2="backslash" k="56" /> +<hkern g1="Q" g2="bracketright" k="40" /> +<hkern g1="Q" g2="braceright" k="40" /> +<hkern g1="Q" g2="ordfeminine" k="42" /> +<hkern g1="Q" g2="degree" k="42" /> +<hkern g1="Q" g2="ordmasculine" k="42" /> +<hkern g1="Q" g2="Agrave" k="51" /> +<hkern g1="Q" g2="Aacute" k="51" /> +<hkern g1="Q" g2="Acircumflex" k="51" /> +<hkern g1="Q" g2="Atilde" k="51" /> +<hkern g1="Q" g2="Adieresis" k="51" /> +<hkern g1="Q" g2="Aring" k="51" /> +<hkern g1="Q" g2="AE" k="51" /> +<hkern g1="Q" g2="Yacute" k="80" /> +<hkern g1="Q" g2="quoteleft" k="42" /> +<hkern g1="Q" g2="quoteright" k="42" /> +<hkern g1="Q" g2="quotesinglbase" k="52" /> +<hkern g1="Q" g2="quotedblleft" k="42" /> +<hkern g1="Q" g2="quotedblright" k="42" /> +<hkern g1="Q" g2="quotedblbase" k="52" /> +<hkern g1="R" g2="at" k="48" /> +<hkern g1="R" g2="C" k="48" /> +<hkern g1="R" g2="G" k="48" /> +<hkern g1="R" g2="O" k="48" /> +<hkern g1="R" g2="Q" k="48" /> +<hkern g1="R" g2="T" k="56" /> +<hkern g1="R" g2="U" k="51" /> +<hkern g1="R" g2="copyright" k="48" /> +<hkern g1="R" g2="registered" k="48" /> +<hkern g1="R" g2="Ccedilla" k="48" /> +<hkern g1="R" g2="Ograve" k="48" /> +<hkern g1="R" g2="Oacute" k="48" /> +<hkern g1="R" g2="Ocircumflex" k="48" /> +<hkern g1="R" g2="Otilde" k="48" /> +<hkern g1="R" g2="Odieresis" k="48" /> +<hkern g1="R" g2="Oslash" k="48" /> +<hkern g1="R" g2="Ugrave" k="51" /> +<hkern g1="R" g2="Uacute" k="51" /> +<hkern g1="R" g2="Ucircumflex" k="51" /> +<hkern g1="R" g2="Udieresis" k="51" /> +<hkern g1="R" g2="OE" k="48" /> +<hkern g1="T" g2="ampersand" k="147" /> +<hkern g1="T" g2="comma" k="180" /> +<hkern g1="T" g2="hyphen" k="180" /> +<hkern g1="T" g2="period" k="180" /> +<hkern g1="T" g2="slash" k="147" /> +<hkern g1="T" g2="colon" k="160" /> +<hkern g1="T" g2="semicolon" k="160" /> +<hkern g1="T" g2="at" k="78" /> +<hkern g1="T" g2="A" k="147" /> +<hkern g1="T" g2="C" k="78" /> +<hkern g1="T" g2="G" k="78" /> +<hkern g1="T" g2="J" k="200" /> +<hkern g1="T" g2="O" k="78" /> +<hkern g1="T" g2="Q" k="78" /> +<hkern g1="T" g2="a" k="244" /> +<hkern g1="T" g2="c" k="204" /> +<hkern g1="T" g2="d" k="204" /> +<hkern g1="T" g2="e" k="204" /> +<hkern g1="T" g2="g" k="181" /> +<hkern g1="T" g2="m" k="160" /> +<hkern g1="T" g2="n" k="160" /> +<hkern g1="T" g2="o" k="204" /> +<hkern g1="T" g2="p" k="160" /> +<hkern g1="T" g2="q" k="204" /> +<hkern g1="T" g2="r" k="160" /> +<hkern g1="T" g2="s" k="140" /> +<hkern g1="T" g2="u" k="160" /> +<hkern g1="T" g2="v" k="180" /> +<hkern g1="T" g2="w" k="140" /> +<hkern g1="T" g2="x" k="137" /> +<hkern g1="T" g2="y" k="180" /> +<hkern g1="T" g2="z" k="120" /> +<hkern g1="T" g2="copyright" k="78" /> +<hkern g1="T" g2="guillemotleft" k="180" /> +<hkern g1="T" g2="uni00AD" k="180" /> +<hkern g1="T" g2="registered" k="78" /> +<hkern g1="T" g2="mu" k="160" /> +<hkern g1="T" g2="middot" k="180" /> +<hkern g1="T" g2="guillemotright" k="180" /> +<hkern g1="T" g2="Agrave" k="147" /> +<hkern g1="T" g2="Aacute" k="147" /> +<hkern g1="T" g2="Acircumflex" k="147" /> +<hkern g1="T" g2="Atilde" k="147" /> +<hkern g1="T" g2="Adieresis" k="147" /> +<hkern g1="T" g2="Aring" k="147" /> +<hkern g1="T" g2="AE" k="147" /> +<hkern g1="T" g2="Ccedilla" k="78" /> +<hkern g1="T" g2="Ograve" k="78" /> +<hkern g1="T" g2="Oacute" k="78" /> +<hkern g1="T" g2="Ocircumflex" k="78" /> +<hkern g1="T" g2="Otilde" k="78" /> +<hkern g1="T" g2="Odieresis" k="78" /> +<hkern g1="T" g2="Oslash" k="78" /> +<hkern g1="T" g2="agrave" k="244" /> +<hkern g1="T" g2="aacute" k="244" /> +<hkern g1="T" g2="acircumflex" k="244" /> +<hkern g1="T" g2="atilde" k="244" /> +<hkern g1="T" g2="adieresis" k="244" /> +<hkern g1="T" g2="aring" k="244" /> +<hkern g1="T" g2="ae" k="244" /> +<hkern g1="T" g2="ccedilla" k="204" /> +<hkern g1="T" g2="egrave" k="204" /> +<hkern g1="T" g2="eacute" k="204" /> +<hkern g1="T" g2="ecircumflex" k="204" /> +<hkern g1="T" g2="edieresis" k="204" /> +<hkern g1="T" g2="eth" k="204" /> +<hkern g1="T" g2="ntilde" k="160" /> +<hkern g1="T" g2="ograve" k="204" /> +<hkern g1="T" g2="oacute" k="204" /> +<hkern g1="T" g2="ocircumflex" k="204" /> +<hkern g1="T" g2="otilde" k="204" /> +<hkern g1="T" g2="odieresis" k="204" /> +<hkern g1="T" g2="oslash" k="204" /> +<hkern g1="T" g2="ugrave" k="160" /> +<hkern g1="T" g2="uacute" k="160" /> +<hkern g1="T" g2="ucircumflex" k="160" /> +<hkern g1="T" g2="udieresis" k="160" /> +<hkern g1="T" g2="yacute" k="180" /> +<hkern g1="T" g2="ydieresis" k="180" /> +<hkern g1="T" g2="dotlessi" k="160" /> +<hkern g1="T" g2="OE" k="78" /> +<hkern g1="T" g2="oe" k="204" /> +<hkern g1="T" g2="endash" k="180" /> +<hkern g1="T" g2="emdash" k="180" /> +<hkern g1="T" g2="quotesinglbase" k="180" /> +<hkern g1="T" g2="quotedblbase" k="180" /> +<hkern g1="T" g2="bullet" k="180" /> +<hkern g1="T" g2="guilsinglleft" k="180" /> +<hkern g1="T" g2="guilsinglright" k="180" /> +<hkern g1="U" g2="ampersand" k="52" /> +<hkern g1="U" g2="comma" k="50" /> +<hkern g1="U" g2="period" k="50" /> +<hkern g1="U" g2="slash" k="52" /> +<hkern g1="U" g2="A" k="52" /> +<hkern g1="U" g2="Agrave" k="52" /> +<hkern g1="U" g2="Aacute" k="52" /> +<hkern g1="U" g2="Acircumflex" k="52" /> +<hkern g1="U" g2="Atilde" k="52" /> +<hkern g1="U" g2="Adieresis" k="52" /> +<hkern g1="U" g2="Aring" k="52" /> +<hkern g1="U" g2="AE" k="52" /> +<hkern g1="U" g2="quotesinglbase" k="50" /> +<hkern g1="U" g2="quotedblbase" k="50" /> +<hkern g1="V" g2="quotedbl" k="-44" /> +<hkern g1="V" g2="ampersand" k="169" /> +<hkern g1="V" g2="quotesingle" k="-44" /> +<hkern g1="V" g2="asterisk" k="-44" /> +<hkern g1="V" g2="comma" k="196" /> +<hkern g1="V" g2="hyphen" k="116" /> +<hkern g1="V" g2="period" k="196" /> +<hkern g1="V" g2="slash" k="169" /> +<hkern g1="V" g2="colon" k="99" /> +<hkern g1="V" g2="semicolon" k="99" /> +<hkern g1="V" g2="question" k="-39" /> +<hkern g1="V" g2="at" k="56" /> +<hkern g1="V" g2="A" k="169" /> +<hkern g1="V" g2="C" k="56" /> +<hkern g1="V" g2="G" k="56" /> +<hkern g1="V" g2="J" k="156" /> +<hkern g1="V" g2="O" k="56" /> +<hkern g1="V" g2="Q" k="56" /> +<hkern g1="V" g2="a" k="123" /> +<hkern g1="V" g2="c" k="123" /> +<hkern g1="V" g2="d" k="123" /> +<hkern g1="V" g2="e" k="123" /> +<hkern g1="V" g2="f" k="30" /> +<hkern g1="V" g2="g" k="138" /> +<hkern g1="V" g2="m" k="99" /> +<hkern g1="V" g2="n" k="99" /> +<hkern g1="V" g2="o" k="123" /> +<hkern g1="V" g2="p" k="99" /> +<hkern g1="V" g2="q" k="123" /> +<hkern g1="V" g2="r" k="99" /> +<hkern g1="V" g2="s" k="108" /> +<hkern g1="V" g2="t" k="46" /> +<hkern g1="V" g2="u" k="99" /> +<hkern g1="V" g2="v" k="59" /> +<hkern g1="V" g2="x" k="67" /> +<hkern g1="V" g2="y" k="59" /> +<hkern g1="V" g2="z" k="91" /> +<hkern g1="V" g2="copyright" k="56" /> +<hkern g1="V" g2="ordfeminine" k="-44" /> +<hkern g1="V" g2="guillemotleft" k="116" /> +<hkern g1="V" g2="uni00AD" k="116" /> +<hkern g1="V" g2="registered" k="56" /> +<hkern g1="V" g2="degree" k="-44" /> +<hkern g1="V" g2="twosuperior" k="-49" /> +<hkern g1="V" g2="threesuperior" k="-49" /> +<hkern g1="V" g2="mu" k="99" /> +<hkern g1="V" g2="middot" k="116" /> +<hkern g1="V" g2="onesuperior" k="-49" /> +<hkern g1="V" g2="ordmasculine" k="-44" /> +<hkern g1="V" g2="guillemotright" k="116" /> +<hkern g1="V" g2="Agrave" k="169" /> +<hkern g1="V" g2="Aacute" k="169" /> +<hkern g1="V" g2="Acircumflex" k="169" /> +<hkern g1="V" g2="Atilde" k="169" /> +<hkern g1="V" g2="Adieresis" k="169" /> +<hkern g1="V" g2="Aring" k="169" /> +<hkern g1="V" g2="AE" k="169" /> +<hkern g1="V" g2="Ccedilla" k="56" /> +<hkern g1="V" g2="Ograve" k="56" /> +<hkern g1="V" g2="Oacute" k="56" /> +<hkern g1="V" g2="Ocircumflex" k="56" /> +<hkern g1="V" g2="Otilde" k="56" /> +<hkern g1="V" g2="Odieresis" k="56" /> +<hkern g1="V" g2="Oslash" k="56" /> +<hkern g1="V" g2="agrave" k="123" /> +<hkern g1="V" g2="aacute" k="123" /> +<hkern g1="V" g2="acircumflex" k="123" /> +<hkern g1="V" g2="atilde" k="123" /> +<hkern g1="V" g2="adieresis" k="123" /> +<hkern g1="V" g2="aring" k="123" /> +<hkern g1="V" g2="ae" k="123" /> +<hkern g1="V" g2="ccedilla" k="123" /> +<hkern g1="V" g2="egrave" k="123" /> +<hkern g1="V" g2="eacute" k="123" /> +<hkern g1="V" g2="ecircumflex" k="123" /> +<hkern g1="V" g2="edieresis" k="123" /> +<hkern g1="V" g2="eth" k="123" /> +<hkern g1="V" g2="ntilde" k="99" /> +<hkern g1="V" g2="ograve" k="123" /> +<hkern g1="V" g2="oacute" k="123" /> +<hkern g1="V" g2="ocircumflex" k="123" /> +<hkern g1="V" g2="otilde" k="123" /> +<hkern g1="V" g2="odieresis" k="123" /> +<hkern g1="V" g2="oslash" k="123" /> +<hkern g1="V" g2="ugrave" k="99" /> +<hkern g1="V" g2="uacute" k="99" /> +<hkern g1="V" g2="ucircumflex" k="99" /> +<hkern g1="V" g2="udieresis" k="99" /> +<hkern g1="V" g2="yacute" k="59" /> +<hkern g1="V" g2="ydieresis" k="59" /> +<hkern g1="V" g2="dotlessi" k="99" /> +<hkern g1="V" g2="OE" k="56" /> +<hkern g1="V" g2="oe" k="123" /> +<hkern g1="V" g2="endash" k="116" /> +<hkern g1="V" g2="emdash" k="116" /> +<hkern g1="V" g2="quoteleft" k="-44" /> +<hkern g1="V" g2="quoteright" k="-44" /> +<hkern g1="V" g2="quotesinglbase" k="196" /> +<hkern g1="V" g2="quotedblleft" k="-44" /> +<hkern g1="V" g2="quotedblright" k="-44" /> +<hkern g1="V" g2="quotedblbase" k="196" /> +<hkern g1="V" g2="bullet" k="116" /> +<hkern g1="V" g2="guilsinglleft" k="116" /> +<hkern g1="V" g2="guilsinglright" k="116" /> +<hkern g1="W" g2="quotedbl" k="-44" /> +<hkern g1="W" g2="ampersand" k="118" /> +<hkern g1="W" g2="quotesingle" k="-44" /> +<hkern g1="W" g2="asterisk" k="-44" /> +<hkern g1="W" g2="comma" k="131" /> +<hkern g1="W" g2="hyphen" k="36" /> +<hkern g1="W" g2="period" k="131" /> +<hkern g1="W" g2="slash" k="118" /> +<hkern g1="W" g2="question" k="-32" /> +<hkern g1="W" g2="A" k="118" /> +<hkern g1="W" g2="J" k="111" /> +<hkern g1="W" g2="a" k="99" /> +<hkern g1="W" g2="c" k="41" /> +<hkern g1="W" g2="d" k="41" /> +<hkern g1="W" g2="e" k="41" /> +<hkern g1="W" g2="g" k="96" /> +<hkern g1="W" g2="o" k="41" /> +<hkern g1="W" g2="q" k="41" /> +<hkern g1="W" g2="s" k="53" /> +<hkern g1="W" g2="ordfeminine" k="-44" /> +<hkern g1="W" g2="guillemotleft" k="36" /> +<hkern g1="W" g2="uni00AD" k="36" /> +<hkern g1="W" g2="degree" k="-44" /> +<hkern g1="W" g2="twosuperior" k="-44" /> +<hkern g1="W" g2="threesuperior" k="-44" /> +<hkern g1="W" g2="middot" k="36" /> +<hkern g1="W" g2="onesuperior" k="-44" /> +<hkern g1="W" g2="ordmasculine" k="-44" /> +<hkern g1="W" g2="guillemotright" k="36" /> +<hkern g1="W" g2="Agrave" k="118" /> +<hkern g1="W" g2="Aacute" k="118" /> +<hkern g1="W" g2="Acircumflex" k="118" /> +<hkern g1="W" g2="Atilde" k="118" /> +<hkern g1="W" g2="Adieresis" k="118" /> +<hkern g1="W" g2="Aring" k="118" /> +<hkern g1="W" g2="AE" k="118" /> +<hkern g1="W" g2="agrave" k="99" /> +<hkern g1="W" g2="aacute" k="99" /> +<hkern g1="W" g2="acircumflex" k="99" /> +<hkern g1="W" g2="atilde" k="99" /> +<hkern g1="W" g2="adieresis" k="99" /> +<hkern g1="W" g2="aring" k="99" /> +<hkern g1="W" g2="ae" k="99" /> +<hkern g1="W" g2="ccedilla" k="41" /> +<hkern g1="W" g2="egrave" k="41" /> +<hkern g1="W" g2="eacute" k="41" /> +<hkern g1="W" g2="ecircumflex" k="41" /> +<hkern g1="W" g2="edieresis" k="41" /> +<hkern g1="W" g2="eth" k="41" /> +<hkern g1="W" g2="ograve" k="41" /> +<hkern g1="W" g2="oacute" k="41" /> +<hkern g1="W" g2="ocircumflex" k="41" /> +<hkern g1="W" g2="otilde" k="41" /> +<hkern g1="W" g2="odieresis" k="41" /> +<hkern g1="W" g2="oslash" k="41" /> +<hkern g1="W" g2="oe" k="41" /> +<hkern g1="W" g2="endash" k="36" /> +<hkern g1="W" g2="emdash" k="36" /> +<hkern g1="W" g2="quoteleft" k="-44" /> +<hkern g1="W" g2="quoteright" k="-44" /> +<hkern g1="W" g2="quotesinglbase" k="131" /> +<hkern g1="W" g2="quotedblleft" k="-44" /> +<hkern g1="W" g2="quotedblright" k="-44" /> +<hkern g1="W" g2="quotedblbase" k="131" /> +<hkern g1="W" g2="bullet" k="36" /> +<hkern g1="W" g2="guilsinglleft" k="36" /> +<hkern g1="W" g2="guilsinglright" k="36" /> +<hkern g1="X" g2="hyphen" k="66" /> +<hkern g1="X" g2="at" k="30" /> +<hkern g1="X" g2="C" k="30" /> +<hkern g1="X" g2="G" k="30" /> +<hkern g1="X" g2="O" k="30" /> +<hkern g1="X" g2="Q" k="30" /> +<hkern g1="X" g2="c" k="43" /> +<hkern g1="X" g2="d" k="43" /> +<hkern g1="X" g2="e" k="43" /> +<hkern g1="X" g2="f" k="56" /> +<hkern g1="X" g2="o" k="43" /> +<hkern g1="X" g2="q" k="43" /> +<hkern g1="X" g2="t" k="91" /> +<hkern g1="X" g2="v" k="73" /> +<hkern g1="X" g2="w" k="52" /> +<hkern g1="X" g2="y" k="73" /> +<hkern g1="X" g2="copyright" k="30" /> +<hkern g1="X" g2="guillemotleft" k="66" /> +<hkern g1="X" g2="uni00AD" k="66" /> +<hkern g1="X" g2="registered" k="30" /> +<hkern g1="X" g2="middot" k="66" /> +<hkern g1="X" g2="guillemotright" k="66" /> +<hkern g1="X" g2="Ccedilla" k="30" /> +<hkern g1="X" g2="Ograve" k="30" /> +<hkern g1="X" g2="Oacute" k="30" /> +<hkern g1="X" g2="Ocircumflex" k="30" /> +<hkern g1="X" g2="Otilde" k="30" /> +<hkern g1="X" g2="Odieresis" k="30" /> +<hkern g1="X" g2="Oslash" k="30" /> +<hkern g1="X" g2="ccedilla" k="43" /> +<hkern g1="X" g2="egrave" k="43" /> +<hkern g1="X" g2="eacute" k="43" /> +<hkern g1="X" g2="ecircumflex" k="43" /> +<hkern g1="X" g2="edieresis" k="43" /> +<hkern g1="X" g2="eth" k="43" /> +<hkern g1="X" g2="ograve" k="43" /> +<hkern g1="X" g2="oacute" k="43" /> +<hkern g1="X" g2="ocircumflex" k="43" /> +<hkern g1="X" g2="otilde" k="43" /> +<hkern g1="X" g2="odieresis" k="43" /> +<hkern g1="X" g2="oslash" k="43" /> +<hkern g1="X" g2="yacute" k="73" /> +<hkern g1="X" g2="ydieresis" k="73" /> +<hkern g1="X" g2="OE" k="30" /> +<hkern g1="X" g2="oe" k="43" /> +<hkern g1="X" g2="endash" k="66" /> +<hkern g1="X" g2="emdash" k="66" /> +<hkern g1="X" g2="bullet" k="66" /> +<hkern g1="X" g2="guilsinglleft" k="66" /> +<hkern g1="X" g2="guilsinglright" k="66" /> +<hkern g1="Y" g2="quotedbl" k="-36" /> +<hkern g1="Y" g2="ampersand" k="182" /> +<hkern g1="Y" g2="quotesingle" k="-36" /> +<hkern g1="Y" g2="asterisk" k="-36" /> +<hkern g1="Y" g2="comma" k="167" /> +<hkern g1="Y" g2="hyphen" k="160" /> +<hkern g1="Y" g2="period" k="167" /> +<hkern g1="Y" g2="slash" k="182" /> +<hkern g1="Y" g2="colon" k="131" /> +<hkern g1="Y" g2="semicolon" k="131" /> +<hkern g1="Y" g2="question" k="-32" /> +<hkern g1="Y" g2="at" k="80" /> +<hkern g1="Y" g2="A" k="182" /> +<hkern g1="Y" g2="C" k="80" /> +<hkern g1="Y" g2="G" k="80" /> +<hkern g1="Y" g2="J" k="200" /> +<hkern g1="Y" g2="O" k="80" /> +<hkern g1="Y" g2="Q" k="80" /> +<hkern g1="Y" g2="a" k="145" /> +<hkern g1="Y" g2="c" k="160" /> +<hkern g1="Y" g2="d" k="160" /> +<hkern g1="Y" g2="e" k="160" /> +<hkern g1="Y" g2="g" k="176" /> +<hkern g1="Y" g2="m" k="131" /> +<hkern g1="Y" g2="n" k="131" /> +<hkern g1="Y" g2="o" k="160" /> +<hkern g1="Y" g2="p" k="131" /> +<hkern g1="Y" g2="q" k="160" /> +<hkern g1="Y" g2="r" k="131" /> +<hkern g1="Y" g2="s" k="139" /> +<hkern g1="Y" g2="u" k="131" /> +<hkern g1="Y" g2="v" k="100" /> +<hkern g1="Y" g2="w" k="96" /> +<hkern g1="Y" g2="x" k="136" /> +<hkern g1="Y" g2="y" k="100" /> +<hkern g1="Y" g2="copyright" k="80" /> +<hkern g1="Y" g2="ordfeminine" k="-36" /> +<hkern g1="Y" g2="guillemotleft" k="160" /> +<hkern g1="Y" g2="uni00AD" k="160" /> +<hkern g1="Y" g2="registered" k="80" /> +<hkern g1="Y" g2="degree" k="-36" /> +<hkern g1="Y" g2="twosuperior" k="-56" /> +<hkern g1="Y" g2="threesuperior" k="-56" /> +<hkern g1="Y" g2="mu" k="131" /> +<hkern g1="Y" g2="middot" k="160" /> +<hkern g1="Y" g2="onesuperior" k="-56" /> +<hkern g1="Y" g2="ordmasculine" k="-36" /> +<hkern g1="Y" g2="guillemotright" k="160" /> +<hkern g1="Y" g2="Agrave" k="182" /> +<hkern g1="Y" g2="Aacute" k="182" /> +<hkern g1="Y" g2="Acircumflex" k="182" /> +<hkern g1="Y" g2="Atilde" k="182" /> +<hkern g1="Y" g2="Adieresis" k="182" /> +<hkern g1="Y" g2="Aring" k="182" /> +<hkern g1="Y" g2="AE" k="182" /> +<hkern g1="Y" g2="Ccedilla" k="80" /> +<hkern g1="Y" g2="Ograve" k="80" /> +<hkern g1="Y" g2="Oacute" k="80" /> +<hkern g1="Y" g2="Ocircumflex" k="80" /> +<hkern g1="Y" g2="Otilde" k="80" /> +<hkern g1="Y" g2="Odieresis" k="80" /> +<hkern g1="Y" g2="Oslash" k="80" /> +<hkern g1="Y" g2="agrave" k="145" /> +<hkern g1="Y" g2="aacute" k="145" /> +<hkern g1="Y" g2="acircumflex" k="145" /> +<hkern g1="Y" g2="atilde" k="145" /> +<hkern g1="Y" g2="adieresis" k="145" /> +<hkern g1="Y" g2="aring" k="145" /> +<hkern g1="Y" g2="ae" k="145" /> +<hkern g1="Y" g2="ccedilla" k="160" /> +<hkern g1="Y" g2="egrave" k="160" /> +<hkern g1="Y" g2="eacute" k="160" /> +<hkern g1="Y" g2="ecircumflex" k="160" /> +<hkern g1="Y" g2="edieresis" k="160" /> +<hkern g1="Y" g2="eth" k="160" /> +<hkern g1="Y" g2="ntilde" k="131" /> +<hkern g1="Y" g2="ograve" k="160" /> +<hkern g1="Y" g2="oacute" k="160" /> +<hkern g1="Y" g2="ocircumflex" k="160" /> +<hkern g1="Y" g2="otilde" k="160" /> +<hkern g1="Y" g2="odieresis" k="160" /> +<hkern g1="Y" g2="oslash" k="160" /> +<hkern g1="Y" g2="ugrave" k="131" /> +<hkern g1="Y" g2="uacute" k="131" /> +<hkern g1="Y" g2="ucircumflex" k="131" /> +<hkern g1="Y" g2="udieresis" k="131" /> +<hkern g1="Y" g2="yacute" k="100" /> +<hkern g1="Y" g2="ydieresis" k="100" /> +<hkern g1="Y" g2="dotlessi" k="131" /> +<hkern g1="Y" g2="OE" k="80" /> +<hkern g1="Y" g2="oe" k="160" /> +<hkern g1="Y" g2="endash" k="160" /> +<hkern g1="Y" g2="emdash" k="160" /> +<hkern g1="Y" g2="quoteleft" k="-36" /> +<hkern g1="Y" g2="quoteright" k="-36" /> +<hkern g1="Y" g2="quotesinglbase" k="167" /> +<hkern g1="Y" g2="quotedblleft" k="-36" /> +<hkern g1="Y" g2="quotedblright" k="-36" /> +<hkern g1="Y" g2="quotedblbase" k="167" /> +<hkern g1="Y" g2="bullet" k="160" /> +<hkern g1="Y" g2="guilsinglleft" k="160" /> +<hkern g1="Y" g2="guilsinglright" k="160" /> +<hkern g1="Z" g2="hyphen" k="64" /> +<hkern g1="Z" g2="question" k="-32" /> +<hkern g1="Z" g2="at" k="49" /> +<hkern g1="Z" g2="C" k="49" /> +<hkern g1="Z" g2="G" k="49" /> +<hkern g1="Z" g2="O" k="49" /> +<hkern g1="Z" g2="Q" k="49" /> +<hkern g1="Z" g2="c" k="29" /> +<hkern g1="Z" g2="d" k="29" /> +<hkern g1="Z" g2="e" k="29" /> +<hkern g1="Z" g2="o" k="29" /> +<hkern g1="Z" g2="q" k="29" /> +<hkern g1="Z" g2="s" k="19" /> +<hkern g1="Z" g2="v" k="34" /> +<hkern g1="Z" g2="y" k="34" /> +<hkern g1="Z" g2="copyright" k="49" /> +<hkern g1="Z" g2="guillemotleft" k="64" /> +<hkern g1="Z" g2="uni00AD" k="64" /> +<hkern g1="Z" g2="registered" k="49" /> +<hkern g1="Z" g2="middot" k="64" /> +<hkern g1="Z" g2="guillemotright" k="64" /> +<hkern g1="Z" g2="Ccedilla" k="49" /> +<hkern g1="Z" g2="Ograve" k="49" /> +<hkern g1="Z" g2="Oacute" k="49" /> +<hkern g1="Z" g2="Ocircumflex" k="49" /> +<hkern g1="Z" g2="Otilde" k="49" /> +<hkern g1="Z" g2="Odieresis" k="49" /> +<hkern g1="Z" g2="Oslash" k="49" /> +<hkern g1="Z" g2="ccedilla" k="29" /> +<hkern g1="Z" g2="egrave" k="29" /> +<hkern g1="Z" g2="eacute" k="29" /> +<hkern g1="Z" g2="ecircumflex" k="29" /> +<hkern g1="Z" g2="edieresis" k="29" /> +<hkern g1="Z" g2="eth" k="29" /> +<hkern g1="Z" g2="ograve" k="29" /> +<hkern g1="Z" g2="oacute" k="29" /> +<hkern g1="Z" g2="ocircumflex" k="29" /> +<hkern g1="Z" g2="otilde" k="29" /> +<hkern g1="Z" g2="odieresis" k="29" /> +<hkern g1="Z" g2="oslash" k="29" /> +<hkern g1="Z" g2="yacute" k="34" /> +<hkern g1="Z" g2="ydieresis" k="34" /> +<hkern g1="Z" g2="OE" k="49" /> +<hkern g1="Z" g2="oe" k="29" /> +<hkern g1="Z" g2="endash" k="64" /> +<hkern g1="Z" g2="emdash" k="64" /> +<hkern g1="Z" g2="bullet" k="64" /> +<hkern g1="Z" g2="guilsinglleft" k="64" /> +<hkern g1="Z" g2="guilsinglright" k="64" /> +<hkern g1="bracketleft" g2="at" k="40" /> +<hkern g1="bracketleft" g2="C" k="40" /> +<hkern g1="bracketleft" g2="G" k="40" /> +<hkern g1="bracketleft" g2="O" k="40" /> +<hkern g1="bracketleft" g2="Q" k="40" /> +<hkern g1="bracketleft" g2="c" k="36" /> +<hkern g1="bracketleft" g2="d" k="36" /> +<hkern g1="bracketleft" g2="e" k="36" /> +<hkern g1="bracketleft" g2="o" k="36" /> +<hkern g1="bracketleft" g2="q" k="36" /> +<hkern g1="bracketleft" g2="copyright" k="40" /> +<hkern g1="bracketleft" g2="registered" k="40" /> +<hkern g1="bracketleft" g2="Ccedilla" k="40" /> +<hkern g1="bracketleft" g2="Ograve" k="40" /> +<hkern g1="bracketleft" g2="Oacute" k="40" /> +<hkern g1="bracketleft" g2="Ocircumflex" k="40" /> +<hkern g1="bracketleft" g2="Otilde" k="40" /> +<hkern g1="bracketleft" g2="Odieresis" k="40" /> +<hkern g1="bracketleft" g2="Oslash" k="40" /> +<hkern g1="bracketleft" g2="ccedilla" k="36" /> +<hkern g1="bracketleft" g2="egrave" k="36" /> +<hkern g1="bracketleft" g2="eacute" k="36" /> +<hkern g1="bracketleft" g2="ecircumflex" k="36" /> +<hkern g1="bracketleft" g2="edieresis" k="36" /> +<hkern g1="bracketleft" g2="eth" k="36" /> +<hkern g1="bracketleft" g2="ograve" k="36" /> +<hkern g1="bracketleft" g2="oacute" k="36" /> +<hkern g1="bracketleft" g2="ocircumflex" k="36" /> +<hkern g1="bracketleft" g2="otilde" k="36" /> +<hkern g1="bracketleft" g2="odieresis" k="36" /> +<hkern g1="bracketleft" g2="oslash" k="36" /> +<hkern g1="bracketleft" g2="OE" k="40" /> +<hkern g1="bracketleft" g2="oe" k="36" /> +<hkern g1="backslash" g2="quotedbl" k="191" /> +<hkern g1="backslash" g2="quotesingle" k="191" /> +<hkern g1="backslash" g2="asterisk" k="191" /> +<hkern g1="backslash" g2="hyphen" k="67" /> +<hkern g1="backslash" g2="question" k="63" /> +<hkern g1="backslash" g2="at" k="51" /> +<hkern g1="backslash" g2="C" k="51" /> +<hkern g1="backslash" g2="G" k="51" /> +<hkern g1="backslash" g2="J" k="-56" /> +<hkern g1="backslash" g2="O" k="51" /> +<hkern g1="backslash" g2="Q" k="51" /> +<hkern g1="backslash" g2="T" k="147" /> +<hkern g1="backslash" g2="U" k="52" /> +<hkern g1="backslash" g2="V" k="169" /> +<hkern g1="backslash" g2="W" k="102" /> +<hkern g1="backslash" g2="Y" k="182" /> +<hkern g1="backslash" g2="backslash" k="169" /> +<hkern g1="backslash" g2="v" k="91" /> +<hkern g1="backslash" g2="y" k="91" /> +<hkern g1="backslash" g2="copyright" k="51" /> +<hkern g1="backslash" g2="ordfeminine" k="191" /> +<hkern g1="backslash" g2="guillemotleft" k="67" /> +<hkern g1="backslash" g2="uni00AD" k="67" /> +<hkern g1="backslash" g2="registered" k="51" /> +<hkern g1="backslash" g2="degree" k="191" /> +<hkern g1="backslash" g2="twosuperior" k="202" /> +<hkern g1="backslash" g2="threesuperior" k="202" /> +<hkern g1="backslash" g2="middot" k="67" /> +<hkern g1="backslash" g2="onesuperior" k="202" /> +<hkern g1="backslash" g2="ordmasculine" k="191" /> +<hkern g1="backslash" g2="guillemotright" k="67" /> +<hkern g1="backslash" g2="Ccedilla" k="51" /> +<hkern g1="backslash" g2="Ograve" k="51" /> +<hkern g1="backslash" g2="Oacute" k="51" /> +<hkern g1="backslash" g2="Ocircumflex" k="51" /> +<hkern g1="backslash" g2="Otilde" k="51" /> +<hkern g1="backslash" g2="Odieresis" k="51" /> +<hkern g1="backslash" g2="Oslash" k="51" /> +<hkern g1="backslash" g2="Ugrave" k="52" /> +<hkern g1="backslash" g2="Uacute" k="52" /> +<hkern g1="backslash" g2="Ucircumflex" k="52" /> +<hkern g1="backslash" g2="Udieresis" k="52" /> +<hkern g1="backslash" g2="Yacute" k="182" /> +<hkern g1="backslash" g2="yacute" k="91" /> +<hkern g1="backslash" g2="ydieresis" k="91" /> +<hkern g1="backslash" g2="OE" k="51" /> +<hkern g1="backslash" g2="endash" k="67" /> +<hkern g1="backslash" g2="emdash" k="67" /> +<hkern g1="backslash" g2="quoteleft" k="191" /> +<hkern g1="backslash" g2="quoteright" k="191" /> +<hkern g1="backslash" g2="quotedblleft" k="191" /> +<hkern g1="backslash" g2="quotedblright" k="191" /> +<hkern g1="backslash" g2="bullet" k="67" /> +<hkern g1="backslash" g2="guilsinglleft" k="67" /> +<hkern g1="backslash" g2="guilsinglright" k="67" /> +<hkern g1="a" g2="quotedbl" k="76" /> +<hkern g1="a" g2="quotesingle" k="76" /> +<hkern g1="a" g2="asterisk" k="76" /> +<hkern g1="a" g2="v" k="36" /> +<hkern g1="a" g2="w" k="18" /> +<hkern g1="a" g2="y" k="36" /> +<hkern g1="a" g2="ordfeminine" k="76" /> +<hkern g1="a" g2="degree" k="76" /> +<hkern g1="a" g2="twosuperior" k="76" /> +<hkern g1="a" g2="threesuperior" k="76" /> +<hkern g1="a" g2="onesuperior" k="76" /> +<hkern g1="a" g2="ordmasculine" k="76" /> +<hkern g1="a" g2="yacute" k="36" /> +<hkern g1="a" g2="ydieresis" k="36" /> +<hkern g1="a" g2="quoteleft" k="76" /> +<hkern g1="a" g2="quoteright" k="76" /> +<hkern g1="a" g2="quotedblleft" k="76" /> +<hkern g1="a" g2="quotedblright" k="76" /> +<hkern g1="b" g2="quotedbl" k="96" /> +<hkern g1="b" g2="quotesingle" k="96" /> +<hkern g1="b" g2="parenright" k="36" /> +<hkern g1="b" g2="asterisk" k="96" /> +<hkern g1="b" g2="V" k="123" /> +<hkern g1="b" g2="W" k="41" /> +<hkern g1="b" g2="backslash" k="123" /> +<hkern g1="b" g2="bracketright" k="36" /> +<hkern g1="b" g2="v" k="33" /> +<hkern g1="b" g2="x" k="60" /> +<hkern g1="b" g2="y" k="33" /> +<hkern g1="b" g2="braceright" k="36" /> +<hkern g1="b" g2="ordfeminine" k="96" /> +<hkern g1="b" g2="degree" k="96" /> +<hkern g1="b" g2="ordmasculine" k="96" /> +<hkern g1="b" g2="yacute" k="33" /> +<hkern g1="b" g2="ydieresis" k="33" /> +<hkern g1="b" g2="quoteleft" k="96" /> +<hkern g1="b" g2="quoteright" k="96" /> +<hkern g1="b" g2="quotedblleft" k="96" /> +<hkern g1="b" g2="quotedblright" k="96" /> +<hkern g1="e" g2="quotedbl" k="96" /> +<hkern g1="e" g2="quotesingle" k="96" /> +<hkern g1="e" g2="parenright" k="36" /> +<hkern g1="e" g2="asterisk" k="96" /> +<hkern g1="e" g2="V" k="123" /> +<hkern g1="e" g2="W" k="41" /> +<hkern g1="e" g2="backslash" k="123" /> +<hkern g1="e" g2="bracketright" k="36" /> +<hkern g1="e" g2="v" k="33" /> +<hkern g1="e" g2="x" k="60" /> +<hkern g1="e" g2="y" k="33" /> +<hkern g1="e" g2="braceright" k="36" /> +<hkern g1="e" g2="ordfeminine" k="96" /> +<hkern g1="e" g2="degree" k="96" /> +<hkern g1="e" g2="ordmasculine" k="96" /> +<hkern g1="e" g2="yacute" k="33" /> +<hkern g1="e" g2="ydieresis" k="33" /> +<hkern g1="e" g2="quoteleft" k="96" /> +<hkern g1="e" g2="quoteright" k="96" /> +<hkern g1="e" g2="quotedblleft" k="96" /> +<hkern g1="e" g2="quotedblright" k="96" /> +<hkern g1="f" g2="quotedbl" k="-64" /> +<hkern g1="f" g2="quotesingle" k="-64" /> +<hkern g1="f" g2="asterisk" k="-64" /> +<hkern g1="f" g2="comma" k="124" /> +<hkern g1="f" g2="period" k="124" /> +<hkern g1="f" g2="ordfeminine" k="-64" /> +<hkern g1="f" g2="degree" k="-64" /> +<hkern g1="f" g2="twosuperior" k="-100" /> +<hkern g1="f" g2="threesuperior" k="-100" /> +<hkern g1="f" g2="onesuperior" k="-100" /> +<hkern g1="f" g2="ordmasculine" k="-64" /> +<hkern g1="f" g2="quoteleft" k="-64" /> +<hkern g1="f" g2="quoteright" k="-64" /> +<hkern g1="f" g2="quotesinglbase" k="124" /> +<hkern g1="f" g2="quotedblleft" k="-64" /> +<hkern g1="f" g2="quotedblright" k="-64" /> +<hkern g1="f" g2="quotedblbase" k="124" /> +<hkern g1="h" g2="quotedbl" k="76" /> +<hkern g1="h" g2="quotesingle" k="76" /> +<hkern g1="h" g2="asterisk" k="76" /> +<hkern g1="h" g2="v" k="36" /> +<hkern g1="h" g2="w" k="18" /> +<hkern g1="h" g2="y" k="36" /> +<hkern g1="h" g2="ordfeminine" k="76" /> +<hkern g1="h" g2="degree" k="76" /> +<hkern g1="h" g2="twosuperior" k="76" /> +<hkern g1="h" g2="threesuperior" k="76" /> +<hkern g1="h" g2="onesuperior" k="76" /> +<hkern g1="h" g2="ordmasculine" k="76" /> +<hkern g1="h" g2="yacute" k="36" /> +<hkern g1="h" g2="ydieresis" k="36" /> +<hkern g1="h" g2="quoteleft" k="76" /> +<hkern g1="h" g2="quoteright" k="76" /> +<hkern g1="h" g2="quotedblleft" k="76" /> +<hkern g1="h" g2="quotedblright" k="76" /> +<hkern g1="k" g2="c" k="60" /> +<hkern g1="k" g2="d" k="60" /> +<hkern g1="k" g2="e" k="60" /> +<hkern g1="k" g2="o" k="60" /> +<hkern g1="k" g2="q" k="60" /> +<hkern g1="k" g2="ccedilla" k="60" /> +<hkern g1="k" g2="egrave" k="60" /> +<hkern g1="k" g2="eacute" k="60" /> +<hkern g1="k" g2="ecircumflex" k="60" /> +<hkern g1="k" g2="edieresis" k="60" /> +<hkern g1="k" g2="eth" k="60" /> +<hkern g1="k" g2="ograve" k="60" /> +<hkern g1="k" g2="oacute" k="60" /> +<hkern g1="k" g2="ocircumflex" k="60" /> +<hkern g1="k" g2="otilde" k="60" /> +<hkern g1="k" g2="odieresis" k="60" /> +<hkern g1="k" g2="oslash" k="60" /> +<hkern g1="k" g2="oe" k="60" /> +<hkern g1="m" g2="quotedbl" k="76" /> +<hkern g1="m" g2="quotesingle" k="76" /> +<hkern g1="m" g2="asterisk" k="76" /> +<hkern g1="m" g2="v" k="36" /> +<hkern g1="m" g2="w" k="18" /> +<hkern g1="m" g2="y" k="36" /> +<hkern g1="m" g2="ordfeminine" k="76" /> +<hkern g1="m" g2="degree" k="76" /> +<hkern g1="m" g2="twosuperior" k="76" /> +<hkern g1="m" g2="threesuperior" k="76" /> +<hkern g1="m" g2="onesuperior" k="76" /> +<hkern g1="m" g2="ordmasculine" k="76" /> +<hkern g1="m" g2="yacute" k="36" /> +<hkern g1="m" g2="ydieresis" k="36" /> +<hkern g1="m" g2="quoteleft" k="76" /> +<hkern g1="m" g2="quoteright" k="76" /> +<hkern g1="m" g2="quotedblleft" k="76" /> +<hkern g1="m" g2="quotedblright" k="76" /> +<hkern g1="n" g2="quotedbl" k="76" /> +<hkern g1="n" g2="quotesingle" k="76" /> +<hkern g1="n" g2="asterisk" k="76" /> +<hkern g1="n" g2="v" k="36" /> +<hkern g1="n" g2="w" k="18" /> +<hkern g1="n" g2="y" k="36" /> +<hkern g1="n" g2="ordfeminine" k="76" /> +<hkern g1="n" g2="degree" k="76" /> +<hkern g1="n" g2="twosuperior" k="76" /> +<hkern g1="n" g2="threesuperior" k="76" /> +<hkern g1="n" g2="onesuperior" k="76" /> +<hkern g1="n" g2="ordmasculine" k="76" /> +<hkern g1="n" g2="yacute" k="36" /> +<hkern g1="n" g2="ydieresis" k="36" /> +<hkern g1="n" g2="quoteleft" k="76" /> +<hkern g1="n" g2="quoteright" k="76" /> +<hkern g1="n" g2="quotedblleft" k="76" /> +<hkern g1="n" g2="quotedblright" k="76" /> +<hkern g1="o" g2="quotedbl" k="96" /> +<hkern g1="o" g2="quotesingle" k="96" /> +<hkern g1="o" g2="parenright" k="36" /> +<hkern g1="o" g2="asterisk" k="96" /> +<hkern g1="o" g2="V" k="123" /> +<hkern g1="o" g2="W" k="41" /> +<hkern g1="o" g2="backslash" k="123" /> +<hkern g1="o" g2="bracketright" k="36" /> +<hkern g1="o" g2="v" k="33" /> +<hkern g1="o" g2="x" k="60" /> +<hkern g1="o" g2="y" k="33" /> +<hkern g1="o" g2="braceright" k="36" /> +<hkern g1="o" g2="ordfeminine" k="96" /> +<hkern g1="o" g2="degree" k="96" /> +<hkern g1="o" g2="ordmasculine" k="96" /> +<hkern g1="o" g2="yacute" k="33" /> +<hkern g1="o" g2="ydieresis" k="33" /> +<hkern g1="o" g2="quoteleft" k="96" /> +<hkern g1="o" g2="quoteright" k="96" /> +<hkern g1="o" g2="quotedblleft" k="96" /> +<hkern g1="o" g2="quotedblright" k="96" /> +<hkern g1="p" g2="quotedbl" k="96" /> +<hkern g1="p" g2="quotesingle" k="96" /> +<hkern g1="p" g2="parenright" k="36" /> +<hkern g1="p" g2="asterisk" k="96" /> +<hkern g1="p" g2="V" k="123" /> +<hkern g1="p" g2="W" k="41" /> +<hkern g1="p" g2="backslash" k="123" /> +<hkern g1="p" g2="bracketright" k="36" /> +<hkern g1="p" g2="v" k="33" /> +<hkern g1="p" g2="x" k="60" /> +<hkern g1="p" g2="y" k="33" /> +<hkern g1="p" g2="braceright" k="36" /> +<hkern g1="p" g2="ordfeminine" k="96" /> +<hkern g1="p" g2="degree" k="96" /> +<hkern g1="p" g2="ordmasculine" k="96" /> +<hkern g1="p" g2="yacute" k="33" /> +<hkern g1="p" g2="ydieresis" k="33" /> +<hkern g1="p" g2="quoteleft" k="96" /> +<hkern g1="p" g2="quoteright" k="96" /> +<hkern g1="p" g2="quotedblleft" k="96" /> +<hkern g1="p" g2="quotedblright" k="96" /> +<hkern g1="r" g2="comma" k="136" /> +<hkern g1="r" g2="period" k="136" /> +<hkern g1="r" g2="a" k="29" /> +<hkern g1="r" g2="agrave" k="29" /> +<hkern g1="r" g2="aacute" k="29" /> +<hkern g1="r" g2="acircumflex" k="29" /> +<hkern g1="r" g2="atilde" k="29" /> +<hkern g1="r" g2="adieresis" k="29" /> +<hkern g1="r" g2="aring" k="29" /> +<hkern g1="r" g2="ae" k="29" /> +<hkern g1="r" g2="quotesinglbase" k="136" /> +<hkern g1="r" g2="quotedblbase" k="136" /> +<hkern g1="v" g2="ampersand" k="91" /> +<hkern g1="v" g2="comma" k="136" /> +<hkern g1="v" g2="period" k="136" /> +<hkern g1="v" g2="slash" k="91" /> +<hkern g1="v" g2="A" k="91" /> +<hkern g1="v" g2="c" k="33" /> +<hkern g1="v" g2="d" k="33" /> +<hkern g1="v" g2="e" k="33" /> +<hkern g1="v" g2="o" k="33" /> +<hkern g1="v" g2="q" k="33" /> +<hkern g1="v" g2="Agrave" k="91" /> +<hkern g1="v" g2="Aacute" k="91" /> +<hkern g1="v" g2="Acircumflex" k="91" /> +<hkern g1="v" g2="Atilde" k="91" /> +<hkern g1="v" g2="Adieresis" k="91" /> +<hkern g1="v" g2="Aring" k="91" /> +<hkern g1="v" g2="AE" k="91" /> +<hkern g1="v" g2="ccedilla" k="33" /> +<hkern g1="v" g2="egrave" k="33" /> +<hkern g1="v" g2="eacute" k="33" /> +<hkern g1="v" g2="ecircumflex" k="33" /> +<hkern g1="v" g2="edieresis" k="33" /> +<hkern g1="v" g2="eth" k="33" /> +<hkern g1="v" g2="ograve" k="33" /> +<hkern g1="v" g2="oacute" k="33" /> +<hkern g1="v" g2="ocircumflex" k="33" /> +<hkern g1="v" g2="otilde" k="33" /> +<hkern g1="v" g2="odieresis" k="33" /> +<hkern g1="v" g2="oslash" k="33" /> +<hkern g1="v" g2="oe" k="33" /> +<hkern g1="v" g2="quotesinglbase" k="136" /> +<hkern g1="v" g2="quotedblbase" k="136" /> +<hkern g1="w" g2="comma" k="71" /> +<hkern g1="w" g2="period" k="71" /> +<hkern g1="w" g2="quotesinglbase" k="71" /> +<hkern g1="w" g2="quotedblbase" k="71" /> +<hkern g1="x" g2="c" k="60" /> +<hkern g1="x" g2="d" k="60" /> +<hkern g1="x" g2="e" k="60" /> +<hkern g1="x" g2="o" k="60" /> +<hkern g1="x" g2="q" k="60" /> +<hkern g1="x" g2="ccedilla" k="60" /> +<hkern g1="x" g2="egrave" k="60" /> +<hkern g1="x" g2="eacute" k="60" /> +<hkern g1="x" g2="ecircumflex" k="60" /> +<hkern g1="x" g2="edieresis" k="60" /> +<hkern g1="x" g2="eth" k="60" /> +<hkern g1="x" g2="ograve" k="60" /> +<hkern g1="x" g2="oacute" k="60" /> +<hkern g1="x" g2="ocircumflex" k="60" /> +<hkern g1="x" g2="otilde" k="60" /> +<hkern g1="x" g2="odieresis" k="60" /> +<hkern g1="x" g2="oslash" k="60" /> +<hkern g1="x" g2="oe" k="60" /> +<hkern g1="y" g2="ampersand" k="91" /> +<hkern g1="y" g2="comma" k="136" /> +<hkern g1="y" g2="period" k="136" /> +<hkern g1="y" g2="slash" k="91" /> +<hkern g1="y" g2="A" k="91" /> +<hkern g1="y" g2="c" k="33" /> +<hkern g1="y" g2="d" k="33" /> +<hkern g1="y" g2="e" k="33" /> +<hkern g1="y" g2="o" k="33" /> +<hkern g1="y" g2="q" k="33" /> +<hkern g1="y" g2="Agrave" k="91" /> +<hkern g1="y" g2="Aacute" k="91" /> +<hkern g1="y" g2="Acircumflex" k="91" /> +<hkern g1="y" g2="Atilde" k="91" /> +<hkern g1="y" g2="Adieresis" k="91" /> +<hkern g1="y" g2="Aring" k="91" /> +<hkern g1="y" g2="AE" k="91" /> +<hkern g1="y" g2="ccedilla" k="33" /> +<hkern g1="y" g2="egrave" k="33" /> +<hkern g1="y" g2="eacute" k="33" /> +<hkern g1="y" g2="ecircumflex" k="33" /> +<hkern g1="y" g2="edieresis" k="33" /> +<hkern g1="y" g2="eth" k="33" /> +<hkern g1="y" g2="ograve" k="33" /> +<hkern g1="y" g2="oacute" k="33" /> +<hkern g1="y" g2="ocircumflex" k="33" /> +<hkern g1="y" g2="otilde" k="33" /> +<hkern g1="y" g2="odieresis" k="33" /> +<hkern g1="y" g2="oslash" k="33" /> +<hkern g1="y" g2="oe" k="33" /> +<hkern g1="y" g2="quotesinglbase" k="136" /> +<hkern g1="y" g2="quotedblbase" k="136" /> +<hkern g1="braceleft" g2="at" k="40" /> +<hkern g1="braceleft" g2="C" k="40" /> +<hkern g1="braceleft" g2="G" k="40" /> +<hkern g1="braceleft" g2="O" k="40" /> +<hkern g1="braceleft" g2="Q" k="40" /> +<hkern g1="braceleft" g2="c" k="36" /> +<hkern g1="braceleft" g2="d" k="36" /> +<hkern g1="braceleft" g2="e" k="36" /> +<hkern g1="braceleft" g2="o" k="36" /> +<hkern g1="braceleft" g2="q" k="36" /> +<hkern g1="braceleft" g2="copyright" k="40" /> +<hkern g1="braceleft" g2="registered" k="40" /> +<hkern g1="braceleft" g2="Ccedilla" k="40" /> +<hkern g1="braceleft" g2="Ograve" k="40" /> +<hkern g1="braceleft" g2="Oacute" k="40" /> +<hkern g1="braceleft" g2="Ocircumflex" k="40" /> +<hkern g1="braceleft" g2="Otilde" k="40" /> +<hkern g1="braceleft" g2="Odieresis" k="40" /> +<hkern g1="braceleft" g2="Oslash" k="40" /> +<hkern g1="braceleft" g2="ccedilla" k="36" /> +<hkern g1="braceleft" g2="egrave" k="36" /> +<hkern g1="braceleft" g2="eacute" k="36" /> +<hkern g1="braceleft" g2="ecircumflex" k="36" /> +<hkern g1="braceleft" g2="edieresis" k="36" /> +<hkern g1="braceleft" g2="eth" k="36" /> +<hkern g1="braceleft" g2="ograve" k="36" /> +<hkern g1="braceleft" g2="oacute" k="36" /> +<hkern g1="braceleft" g2="ocircumflex" k="36" /> +<hkern g1="braceleft" g2="otilde" k="36" /> +<hkern g1="braceleft" g2="odieresis" k="36" /> +<hkern g1="braceleft" g2="oslash" k="36" /> +<hkern g1="braceleft" g2="OE" k="40" /> +<hkern g1="braceleft" g2="oe" k="36" /> +<hkern g1="copyright" g2="quotedbl" k="42" /> +<hkern g1="copyright" g2="ampersand" k="51" /> +<hkern g1="copyright" g2="quotesingle" k="42" /> +<hkern g1="copyright" g2="parenright" k="40" /> +<hkern g1="copyright" g2="asterisk" k="42" /> +<hkern g1="copyright" g2="comma" k="52" /> +<hkern g1="copyright" g2="period" k="52" /> +<hkern g1="copyright" g2="slash" k="51" /> +<hkern g1="copyright" g2="A" k="51" /> +<hkern g1="copyright" g2="T" k="78" /> +<hkern g1="copyright" g2="V" k="56" /> +<hkern g1="copyright" g2="X" k="30" /> +<hkern g1="copyright" g2="Y" k="80" /> +<hkern g1="copyright" g2="Z" k="64" /> +<hkern g1="copyright" g2="backslash" k="56" /> +<hkern g1="copyright" g2="bracketright" k="40" /> +<hkern g1="copyright" g2="braceright" k="40" /> +<hkern g1="copyright" g2="ordfeminine" k="42" /> +<hkern g1="copyright" g2="degree" k="42" /> +<hkern g1="copyright" g2="ordmasculine" k="42" /> +<hkern g1="copyright" g2="Agrave" k="51" /> +<hkern g1="copyright" g2="Aacute" k="51" /> +<hkern g1="copyright" g2="Acircumflex" k="51" /> +<hkern g1="copyright" g2="Atilde" k="51" /> +<hkern g1="copyright" g2="Adieresis" k="51" /> +<hkern g1="copyright" g2="Aring" k="51" /> +<hkern g1="copyright" g2="AE" k="51" /> +<hkern g1="copyright" g2="Yacute" k="80" /> +<hkern g1="copyright" g2="quoteleft" k="42" /> +<hkern g1="copyright" g2="quoteright" k="42" /> +<hkern g1="copyright" g2="quotesinglbase" k="52" /> +<hkern g1="copyright" g2="quotedblleft" k="42" /> +<hkern g1="copyright" g2="quotedblright" k="42" /> +<hkern g1="copyright" g2="quotedblbase" k="52" /> +<hkern g1="ordfeminine" g2="ampersand" k="191" /> +<hkern g1="ordfeminine" g2="comma" k="213" /> +<hkern g1="ordfeminine" g2="hyphen" k="169" /> +<hkern g1="ordfeminine" g2="period" k="213" /> +<hkern g1="ordfeminine" g2="slash" k="191" /> +<hkern g1="ordfeminine" g2="at" k="42" /> +<hkern g1="ordfeminine" g2="A" k="191" /> +<hkern g1="ordfeminine" g2="C" k="42" /> +<hkern g1="ordfeminine" g2="G" k="42" /> +<hkern g1="ordfeminine" g2="O" k="42" /> +<hkern g1="ordfeminine" g2="Q" k="42" /> +<hkern g1="ordfeminine" g2="V" k="-44" /> +<hkern g1="ordfeminine" g2="W" k="-44" /> +<hkern g1="ordfeminine" g2="Y" k="-36" /> +<hkern g1="ordfeminine" g2="backslash" k="-44" /> +<hkern g1="ordfeminine" g2="a" k="66" /> +<hkern g1="ordfeminine" g2="c" k="96" /> +<hkern g1="ordfeminine" g2="d" k="96" /> +<hkern g1="ordfeminine" g2="e" k="96" /> +<hkern g1="ordfeminine" g2="o" k="96" /> +<hkern g1="ordfeminine" g2="q" k="96" /> +<hkern g1="ordfeminine" g2="copyright" k="42" /> +<hkern g1="ordfeminine" g2="guillemotleft" k="169" /> +<hkern g1="ordfeminine" g2="uni00AD" k="169" /> +<hkern g1="ordfeminine" g2="registered" k="42" /> +<hkern g1="ordfeminine" g2="middot" k="169" /> +<hkern g1="ordfeminine" g2="guillemotright" k="169" /> +<hkern g1="ordfeminine" g2="Agrave" k="191" /> +<hkern g1="ordfeminine" g2="Aacute" k="191" /> +<hkern g1="ordfeminine" g2="Acircumflex" k="191" /> +<hkern g1="ordfeminine" g2="Atilde" k="191" /> +<hkern g1="ordfeminine" g2="Adieresis" k="191" /> +<hkern g1="ordfeminine" g2="Aring" k="191" /> +<hkern g1="ordfeminine" g2="AE" k="191" /> +<hkern g1="ordfeminine" g2="Ccedilla" k="42" /> +<hkern g1="ordfeminine" g2="Ograve" k="42" /> +<hkern g1="ordfeminine" g2="Oacute" k="42" /> +<hkern g1="ordfeminine" g2="Ocircumflex" k="42" /> +<hkern g1="ordfeminine" g2="Otilde" k="42" /> +<hkern g1="ordfeminine" g2="Odieresis" k="42" /> +<hkern g1="ordfeminine" g2="Oslash" k="42" /> +<hkern g1="ordfeminine" g2="Yacute" k="-36" /> +<hkern g1="ordfeminine" g2="agrave" k="66" /> +<hkern g1="ordfeminine" g2="aacute" k="66" /> +<hkern g1="ordfeminine" g2="acircumflex" k="66" /> +<hkern g1="ordfeminine" g2="atilde" k="66" /> +<hkern g1="ordfeminine" g2="adieresis" k="66" /> +<hkern g1="ordfeminine" g2="aring" k="66" /> +<hkern g1="ordfeminine" g2="ae" k="66" /> +<hkern g1="ordfeminine" g2="ccedilla" k="96" /> +<hkern g1="ordfeminine" g2="egrave" k="96" /> +<hkern g1="ordfeminine" g2="eacute" k="96" /> +<hkern g1="ordfeminine" g2="ecircumflex" k="96" /> +<hkern g1="ordfeminine" g2="edieresis" k="96" /> +<hkern g1="ordfeminine" g2="eth" k="96" /> +<hkern g1="ordfeminine" g2="ograve" k="96" /> +<hkern g1="ordfeminine" g2="oacute" k="96" /> +<hkern g1="ordfeminine" g2="ocircumflex" k="96" /> +<hkern g1="ordfeminine" g2="otilde" k="96" /> +<hkern g1="ordfeminine" g2="odieresis" k="96" /> +<hkern g1="ordfeminine" g2="oslash" k="96" /> +<hkern g1="ordfeminine" g2="OE" k="42" /> +<hkern g1="ordfeminine" g2="oe" k="96" /> +<hkern g1="ordfeminine" g2="endash" k="169" /> +<hkern g1="ordfeminine" g2="emdash" k="169" /> +<hkern g1="ordfeminine" g2="quotesinglbase" k="213" /> +<hkern g1="ordfeminine" g2="quotedblbase" k="213" /> +<hkern g1="ordfeminine" g2="bullet" k="169" /> +<hkern g1="ordfeminine" g2="guilsinglleft" k="169" /> +<hkern g1="ordfeminine" g2="guilsinglright" k="169" /> +<hkern g1="guillemotleft" g2="quotedbl" k="169" /> +<hkern g1="guillemotleft" g2="ampersand" k="67" /> +<hkern g1="guillemotleft" g2="quotesingle" k="169" /> +<hkern g1="guillemotleft" g2="asterisk" k="169" /> +<hkern g1="guillemotleft" g2="comma" k="132" /> +<hkern g1="guillemotleft" g2="period" k="132" /> +<hkern g1="guillemotleft" g2="slash" k="67" /> +<hkern g1="guillemotleft" g2="A" k="67" /> +<hkern g1="guillemotleft" g2="T" k="180" /> +<hkern g1="guillemotleft" g2="V" k="116" /> +<hkern g1="guillemotleft" g2="W" k="36" /> +<hkern g1="guillemotleft" g2="X" k="66" /> +<hkern g1="guillemotleft" g2="Y" k="160" /> +<hkern g1="guillemotleft" g2="Z" k="48" /> +<hkern g1="guillemotleft" g2="backslash" k="116" /> +<hkern g1="guillemotleft" g2="ordfeminine" k="169" /> +<hkern g1="guillemotleft" g2="degree" k="169" /> +<hkern g1="guillemotleft" g2="ordmasculine" k="169" /> +<hkern g1="guillemotleft" g2="Agrave" k="67" /> +<hkern g1="guillemotleft" g2="Aacute" k="67" /> +<hkern g1="guillemotleft" g2="Acircumflex" k="67" /> +<hkern g1="guillemotleft" g2="Atilde" k="67" /> +<hkern g1="guillemotleft" g2="Adieresis" k="67" /> +<hkern g1="guillemotleft" g2="Aring" k="67" /> +<hkern g1="guillemotleft" g2="AE" k="67" /> +<hkern g1="guillemotleft" g2="Yacute" k="160" /> +<hkern g1="guillemotleft" g2="quoteleft" k="169" /> +<hkern g1="guillemotleft" g2="quoteright" k="169" /> +<hkern g1="guillemotleft" g2="quotesinglbase" k="132" /> +<hkern g1="guillemotleft" g2="quotedblleft" k="169" /> +<hkern g1="guillemotleft" g2="quotedblright" k="169" /> +<hkern g1="guillemotleft" g2="quotedblbase" k="132" /> +<hkern g1="uni00AD" g2="quotedbl" k="169" /> +<hkern g1="uni00AD" g2="ampersand" k="67" /> +<hkern g1="uni00AD" g2="quotesingle" k="169" /> +<hkern g1="uni00AD" g2="asterisk" k="169" /> +<hkern g1="uni00AD" g2="comma" k="132" /> +<hkern g1="uni00AD" g2="period" k="132" /> +<hkern g1="uni00AD" g2="slash" k="67" /> +<hkern g1="uni00AD" g2="A" k="67" /> +<hkern g1="uni00AD" g2="T" k="180" /> +<hkern g1="uni00AD" g2="V" k="116" /> +<hkern g1="uni00AD" g2="W" k="36" /> +<hkern g1="uni00AD" g2="X" k="66" /> +<hkern g1="uni00AD" g2="Y" k="160" /> +<hkern g1="uni00AD" g2="Z" k="48" /> +<hkern g1="uni00AD" g2="backslash" k="116" /> +<hkern g1="uni00AD" g2="ordfeminine" k="169" /> +<hkern g1="uni00AD" g2="degree" k="169" /> +<hkern g1="uni00AD" g2="ordmasculine" k="169" /> +<hkern g1="uni00AD" g2="Agrave" k="67" /> +<hkern g1="uni00AD" g2="Aacute" k="67" /> +<hkern g1="uni00AD" g2="Acircumflex" k="67" /> +<hkern g1="uni00AD" g2="Atilde" k="67" /> +<hkern g1="uni00AD" g2="Adieresis" k="67" /> +<hkern g1="uni00AD" g2="Aring" k="67" /> +<hkern g1="uni00AD" g2="AE" k="67" /> +<hkern g1="uni00AD" g2="Yacute" k="160" /> +<hkern g1="uni00AD" g2="quoteleft" k="169" /> +<hkern g1="uni00AD" g2="quoteright" k="169" /> +<hkern g1="uni00AD" g2="quotesinglbase" k="132" /> +<hkern g1="uni00AD" g2="quotedblleft" k="169" /> +<hkern g1="uni00AD" g2="quotedblright" k="169" /> +<hkern g1="uni00AD" g2="quotedblbase" k="132" /> +<hkern g1="registered" g2="quotedbl" k="42" /> +<hkern g1="registered" g2="ampersand" k="51" /> +<hkern g1="registered" g2="quotesingle" k="42" /> +<hkern g1="registered" g2="parenright" k="40" /> +<hkern g1="registered" g2="asterisk" k="42" /> +<hkern g1="registered" g2="comma" k="52" /> +<hkern g1="registered" g2="period" k="52" /> +<hkern g1="registered" g2="slash" k="51" /> +<hkern g1="registered" g2="A" k="51" /> +<hkern g1="registered" g2="T" k="78" /> +<hkern g1="registered" g2="V" k="56" /> +<hkern g1="registered" g2="X" k="30" /> +<hkern g1="registered" g2="Y" k="80" /> +<hkern g1="registered" g2="Z" k="64" /> +<hkern g1="registered" g2="backslash" k="56" /> +<hkern g1="registered" g2="bracketright" k="40" /> +<hkern g1="registered" g2="braceright" k="40" /> +<hkern g1="registered" g2="ordfeminine" k="42" /> +<hkern g1="registered" g2="degree" k="42" /> +<hkern g1="registered" g2="ordmasculine" k="42" /> +<hkern g1="registered" g2="Agrave" k="51" /> +<hkern g1="registered" g2="Aacute" k="51" /> +<hkern g1="registered" g2="Acircumflex" k="51" /> +<hkern g1="registered" g2="Atilde" k="51" /> +<hkern g1="registered" g2="Adieresis" k="51" /> +<hkern g1="registered" g2="Aring" k="51" /> +<hkern g1="registered" g2="AE" k="51" /> +<hkern g1="registered" g2="Yacute" k="80" /> +<hkern g1="registered" g2="quoteleft" k="42" /> +<hkern g1="registered" g2="quoteright" k="42" /> +<hkern g1="registered" g2="quotesinglbase" k="52" /> +<hkern g1="registered" g2="quotedblleft" k="42" /> +<hkern g1="registered" g2="quotedblright" k="42" /> +<hkern g1="registered" g2="quotedblbase" k="52" /> +<hkern g1="degree" g2="ampersand" k="191" /> +<hkern g1="degree" g2="comma" k="213" /> +<hkern g1="degree" g2="hyphen" k="169" /> +<hkern g1="degree" g2="period" k="213" /> +<hkern g1="degree" g2="slash" k="191" /> +<hkern g1="degree" g2="at" k="42" /> +<hkern g1="degree" g2="A" k="191" /> +<hkern g1="degree" g2="C" k="42" /> +<hkern g1="degree" g2="G" k="42" /> +<hkern g1="degree" g2="O" k="42" /> +<hkern g1="degree" g2="Q" k="42" /> +<hkern g1="degree" g2="V" k="-44" /> +<hkern g1="degree" g2="W" k="-44" /> +<hkern g1="degree" g2="Y" k="-36" /> +<hkern g1="degree" g2="backslash" k="-44" /> +<hkern g1="degree" g2="a" k="66" /> +<hkern g1="degree" g2="c" k="96" /> +<hkern g1="degree" g2="d" k="96" /> +<hkern g1="degree" g2="e" k="96" /> +<hkern g1="degree" g2="o" k="96" /> +<hkern g1="degree" g2="q" k="96" /> +<hkern g1="degree" g2="copyright" k="42" /> +<hkern g1="degree" g2="guillemotleft" k="169" /> +<hkern g1="degree" g2="uni00AD" k="169" /> +<hkern g1="degree" g2="registered" k="42" /> +<hkern g1="degree" g2="middot" k="169" /> +<hkern g1="degree" g2="guillemotright" k="169" /> +<hkern g1="degree" g2="Agrave" k="191" /> +<hkern g1="degree" g2="Aacute" k="191" /> +<hkern g1="degree" g2="Acircumflex" k="191" /> +<hkern g1="degree" g2="Atilde" k="191" /> +<hkern g1="degree" g2="Adieresis" k="191" /> +<hkern g1="degree" g2="Aring" k="191" /> +<hkern g1="degree" g2="AE" k="191" /> +<hkern g1="degree" g2="Ccedilla" k="42" /> +<hkern g1="degree" g2="Ograve" k="42" /> +<hkern g1="degree" g2="Oacute" k="42" /> +<hkern g1="degree" g2="Ocircumflex" k="42" /> +<hkern g1="degree" g2="Otilde" k="42" /> +<hkern g1="degree" g2="Odieresis" k="42" /> +<hkern g1="degree" g2="Oslash" k="42" /> +<hkern g1="degree" g2="Yacute" k="-36" /> +<hkern g1="degree" g2="agrave" k="66" /> +<hkern g1="degree" g2="aacute" k="66" /> +<hkern g1="degree" g2="acircumflex" k="66" /> +<hkern g1="degree" g2="atilde" k="66" /> +<hkern g1="degree" g2="adieresis" k="66" /> +<hkern g1="degree" g2="aring" k="66" /> +<hkern g1="degree" g2="ae" k="66" /> +<hkern g1="degree" g2="ccedilla" k="96" /> +<hkern g1="degree" g2="egrave" k="96" /> +<hkern g1="degree" g2="eacute" k="96" /> +<hkern g1="degree" g2="ecircumflex" k="96" /> +<hkern g1="degree" g2="edieresis" k="96" /> +<hkern g1="degree" g2="eth" k="96" /> +<hkern g1="degree" g2="ograve" k="96" /> +<hkern g1="degree" g2="oacute" k="96" /> +<hkern g1="degree" g2="ocircumflex" k="96" /> +<hkern g1="degree" g2="otilde" k="96" /> +<hkern g1="degree" g2="odieresis" k="96" /> +<hkern g1="degree" g2="oslash" k="96" /> +<hkern g1="degree" g2="OE" k="42" /> +<hkern g1="degree" g2="oe" k="96" /> +<hkern g1="degree" g2="endash" k="169" /> +<hkern g1="degree" g2="emdash" k="169" /> +<hkern g1="degree" g2="quotesinglbase" k="213" /> +<hkern g1="degree" g2="quotedblbase" k="213" /> +<hkern g1="degree" g2="bullet" k="169" /> +<hkern g1="degree" g2="guilsinglleft" k="169" /> +<hkern g1="degree" g2="guilsinglright" k="169" /> +<hkern g1="twosuperior" g2="ampersand" k="202" /> +<hkern g1="twosuperior" g2="slash" k="202" /> +<hkern g1="twosuperior" g2="A" k="202" /> +<hkern g1="twosuperior" g2="V" k="-49" /> +<hkern g1="twosuperior" g2="W" k="-49" /> +<hkern g1="twosuperior" g2="Y" k="-40" /> +<hkern g1="twosuperior" g2="backslash" k="-49" /> +<hkern g1="twosuperior" g2="Agrave" k="202" /> +<hkern g1="twosuperior" g2="Aacute" k="202" /> +<hkern g1="twosuperior" g2="Acircumflex" k="202" /> +<hkern g1="twosuperior" g2="Atilde" k="202" /> +<hkern g1="twosuperior" g2="Adieresis" k="202" /> +<hkern g1="twosuperior" g2="Aring" k="202" /> +<hkern g1="twosuperior" g2="AE" k="202" /> +<hkern g1="twosuperior" g2="Yacute" k="-40" /> +<hkern g1="threesuperior" g2="ampersand" k="202" /> +<hkern g1="threesuperior" g2="slash" k="202" /> +<hkern g1="threesuperior" g2="A" k="202" /> +<hkern g1="threesuperior" g2="V" k="-49" /> +<hkern g1="threesuperior" g2="W" k="-49" /> +<hkern g1="threesuperior" g2="Y" k="-40" /> +<hkern g1="threesuperior" g2="backslash" k="-49" /> +<hkern g1="threesuperior" g2="Agrave" k="202" /> +<hkern g1="threesuperior" g2="Aacute" k="202" /> +<hkern g1="threesuperior" g2="Acircumflex" k="202" /> +<hkern g1="threesuperior" g2="Atilde" k="202" /> +<hkern g1="threesuperior" g2="Adieresis" k="202" /> +<hkern g1="threesuperior" g2="Aring" k="202" /> +<hkern g1="threesuperior" g2="AE" k="202" /> +<hkern g1="threesuperior" g2="Yacute" k="-40" /> +<hkern g1="middot" g2="quotedbl" k="169" /> +<hkern g1="middot" g2="ampersand" k="67" /> +<hkern g1="middot" g2="quotesingle" k="169" /> +<hkern g1="middot" g2="asterisk" k="169" /> +<hkern g1="middot" g2="comma" k="132" /> +<hkern g1="middot" g2="period" k="132" /> +<hkern g1="middot" g2="slash" k="67" /> +<hkern g1="middot" g2="A" k="67" /> +<hkern g1="middot" g2="T" k="180" /> +<hkern g1="middot" g2="V" k="116" /> +<hkern g1="middot" g2="W" k="36" /> +<hkern g1="middot" g2="X" k="66" /> +<hkern g1="middot" g2="Y" k="160" /> +<hkern g1="middot" g2="Z" k="48" /> +<hkern g1="middot" g2="backslash" k="116" /> +<hkern g1="middot" g2="ordfeminine" k="169" /> +<hkern g1="middot" g2="degree" k="169" /> +<hkern g1="middot" g2="ordmasculine" k="169" /> +<hkern g1="middot" g2="Agrave" k="67" /> +<hkern g1="middot" g2="Aacute" k="67" /> +<hkern g1="middot" g2="Acircumflex" k="67" /> +<hkern g1="middot" g2="Atilde" k="67" /> +<hkern g1="middot" g2="Adieresis" k="67" /> +<hkern g1="middot" g2="Aring" k="67" /> +<hkern g1="middot" g2="AE" k="67" /> +<hkern g1="middot" g2="Yacute" k="160" /> +<hkern g1="middot" g2="quoteleft" k="169" /> +<hkern g1="middot" g2="quoteright" k="169" /> +<hkern g1="middot" g2="quotesinglbase" k="132" /> +<hkern g1="middot" g2="quotedblleft" k="169" /> +<hkern g1="middot" g2="quotedblright" k="169" /> +<hkern g1="middot" g2="quotedblbase" k="132" /> +<hkern g1="onesuperior" g2="ampersand" k="202" /> +<hkern g1="onesuperior" g2="slash" k="202" /> +<hkern g1="onesuperior" g2="A" k="202" /> +<hkern g1="onesuperior" g2="V" k="-49" /> +<hkern g1="onesuperior" g2="W" k="-49" /> +<hkern g1="onesuperior" g2="Y" k="-40" /> +<hkern g1="onesuperior" g2="backslash" k="-49" /> +<hkern g1="onesuperior" g2="Agrave" k="202" /> +<hkern g1="onesuperior" g2="Aacute" k="202" /> +<hkern g1="onesuperior" g2="Acircumflex" k="202" /> +<hkern g1="onesuperior" g2="Atilde" k="202" /> +<hkern g1="onesuperior" g2="Adieresis" k="202" /> +<hkern g1="onesuperior" g2="Aring" k="202" /> +<hkern g1="onesuperior" g2="AE" k="202" /> +<hkern g1="onesuperior" g2="Yacute" k="-40" /> +<hkern g1="ordmasculine" g2="ampersand" k="191" /> +<hkern g1="ordmasculine" g2="comma" k="213" /> +<hkern g1="ordmasculine" g2="hyphen" k="169" /> +<hkern g1="ordmasculine" g2="period" k="213" /> +<hkern g1="ordmasculine" g2="slash" k="191" /> +<hkern g1="ordmasculine" g2="at" k="42" /> +<hkern g1="ordmasculine" g2="A" k="191" /> +<hkern g1="ordmasculine" g2="C" k="42" /> +<hkern g1="ordmasculine" g2="G" k="42" /> +<hkern g1="ordmasculine" g2="O" k="42" /> +<hkern g1="ordmasculine" g2="Q" k="42" /> +<hkern g1="ordmasculine" g2="V" k="-44" /> +<hkern g1="ordmasculine" g2="W" k="-44" /> +<hkern g1="ordmasculine" g2="Y" k="-36" /> +<hkern g1="ordmasculine" g2="backslash" k="-44" /> +<hkern g1="ordmasculine" g2="a" k="66" /> +<hkern g1="ordmasculine" g2="c" k="96" /> +<hkern g1="ordmasculine" g2="d" k="96" /> +<hkern g1="ordmasculine" g2="e" k="96" /> +<hkern g1="ordmasculine" g2="o" k="96" /> +<hkern g1="ordmasculine" g2="q" k="96" /> +<hkern g1="ordmasculine" g2="copyright" k="42" /> +<hkern g1="ordmasculine" g2="guillemotleft" k="169" /> +<hkern g1="ordmasculine" g2="uni00AD" k="169" /> +<hkern g1="ordmasculine" g2="registered" k="42" /> +<hkern g1="ordmasculine" g2="middot" k="169" /> +<hkern g1="ordmasculine" g2="guillemotright" k="169" /> +<hkern g1="ordmasculine" g2="Agrave" k="191" /> +<hkern g1="ordmasculine" g2="Aacute" k="191" /> +<hkern g1="ordmasculine" g2="Acircumflex" k="191" /> +<hkern g1="ordmasculine" g2="Atilde" k="191" /> +<hkern g1="ordmasculine" g2="Adieresis" k="191" /> +<hkern g1="ordmasculine" g2="Aring" k="191" /> +<hkern g1="ordmasculine" g2="AE" k="191" /> +<hkern g1="ordmasculine" g2="Ccedilla" k="42" /> +<hkern g1="ordmasculine" g2="Ograve" k="42" /> +<hkern g1="ordmasculine" g2="Oacute" k="42" /> +<hkern g1="ordmasculine" g2="Ocircumflex" k="42" /> +<hkern g1="ordmasculine" g2="Otilde" k="42" /> +<hkern g1="ordmasculine" g2="Odieresis" k="42" /> +<hkern g1="ordmasculine" g2="Oslash" k="42" /> +<hkern g1="ordmasculine" g2="Yacute" k="-36" /> +<hkern g1="ordmasculine" g2="agrave" k="66" /> +<hkern g1="ordmasculine" g2="aacute" k="66" /> +<hkern g1="ordmasculine" g2="acircumflex" k="66" /> +<hkern g1="ordmasculine" g2="atilde" k="66" /> +<hkern g1="ordmasculine" g2="adieresis" k="66" /> +<hkern g1="ordmasculine" g2="aring" k="66" /> +<hkern g1="ordmasculine" g2="ae" k="66" /> +<hkern g1="ordmasculine" g2="ccedilla" k="96" /> +<hkern g1="ordmasculine" g2="egrave" k="96" /> +<hkern g1="ordmasculine" g2="eacute" k="96" /> +<hkern g1="ordmasculine" g2="ecircumflex" k="96" /> +<hkern g1="ordmasculine" g2="edieresis" k="96" /> +<hkern g1="ordmasculine" g2="eth" k="96" /> +<hkern g1="ordmasculine" g2="ograve" k="96" /> +<hkern g1="ordmasculine" g2="oacute" k="96" /> +<hkern g1="ordmasculine" g2="ocircumflex" k="96" /> +<hkern g1="ordmasculine" g2="otilde" k="96" /> +<hkern g1="ordmasculine" g2="odieresis" k="96" /> +<hkern g1="ordmasculine" g2="oslash" k="96" /> +<hkern g1="ordmasculine" g2="OE" k="42" /> +<hkern g1="ordmasculine" g2="oe" k="96" /> +<hkern g1="ordmasculine" g2="endash" k="169" /> +<hkern g1="ordmasculine" g2="emdash" k="169" /> +<hkern g1="ordmasculine" g2="quotesinglbase" k="213" /> +<hkern g1="ordmasculine" g2="quotedblbase" k="213" /> +<hkern g1="ordmasculine" g2="bullet" k="169" /> +<hkern g1="ordmasculine" g2="guilsinglleft" k="169" /> +<hkern g1="ordmasculine" g2="guilsinglright" k="169" /> +<hkern g1="guillemotright" g2="quotedbl" k="169" /> +<hkern g1="guillemotright" g2="ampersand" k="67" /> +<hkern g1="guillemotright" g2="quotesingle" k="169" /> +<hkern g1="guillemotright" g2="asterisk" k="169" /> +<hkern g1="guillemotright" g2="comma" k="132" /> +<hkern g1="guillemotright" g2="period" k="132" /> +<hkern g1="guillemotright" g2="slash" k="67" /> +<hkern g1="guillemotright" g2="A" k="67" /> +<hkern g1="guillemotright" g2="T" k="180" /> +<hkern g1="guillemotright" g2="V" k="116" /> +<hkern g1="guillemotright" g2="W" k="36" /> +<hkern g1="guillemotright" g2="X" k="66" /> +<hkern g1="guillemotright" g2="Y" k="160" /> +<hkern g1="guillemotright" g2="Z" k="48" /> +<hkern g1="guillemotright" g2="backslash" k="116" /> +<hkern g1="guillemotright" g2="ordfeminine" k="169" /> +<hkern g1="guillemotright" g2="degree" k="169" /> +<hkern g1="guillemotright" g2="ordmasculine" k="169" /> +<hkern g1="guillemotright" g2="Agrave" k="67" /> +<hkern g1="guillemotright" g2="Aacute" k="67" /> +<hkern g1="guillemotright" g2="Acircumflex" k="67" /> +<hkern g1="guillemotright" g2="Atilde" k="67" /> +<hkern g1="guillemotright" g2="Adieresis" k="67" /> +<hkern g1="guillemotright" g2="Aring" k="67" /> +<hkern g1="guillemotright" g2="AE" k="67" /> +<hkern g1="guillemotright" g2="Yacute" k="160" /> +<hkern g1="guillemotright" g2="quoteleft" k="169" /> +<hkern g1="guillemotright" g2="quoteright" k="169" /> +<hkern g1="guillemotright" g2="quotesinglbase" k="132" /> +<hkern g1="guillemotright" g2="quotedblleft" k="169" /> +<hkern g1="guillemotright" g2="quotedblright" k="169" /> +<hkern g1="guillemotright" g2="quotedblbase" k="132" /> +<hkern g1="Agrave" g2="quotedbl" k="191" /> +<hkern g1="Agrave" g2="quotesingle" k="191" /> +<hkern g1="Agrave" g2="asterisk" k="191" /> +<hkern g1="Agrave" g2="hyphen" k="67" /> +<hkern g1="Agrave" g2="question" k="63" /> +<hkern g1="Agrave" g2="at" k="51" /> +<hkern g1="Agrave" g2="C" k="51" /> +<hkern g1="Agrave" g2="G" k="51" /> +<hkern g1="Agrave" g2="J" k="-56" /> +<hkern g1="Agrave" g2="O" k="51" /> +<hkern g1="Agrave" g2="Q" k="51" /> +<hkern g1="Agrave" g2="T" k="147" /> +<hkern g1="Agrave" g2="U" k="52" /> +<hkern g1="Agrave" g2="V" k="169" /> +<hkern g1="Agrave" g2="W" k="102" /> +<hkern g1="Agrave" g2="Y" k="182" /> +<hkern g1="Agrave" g2="backslash" k="169" /> +<hkern g1="Agrave" g2="v" k="91" /> +<hkern g1="Agrave" g2="y" k="91" /> +<hkern g1="Agrave" g2="copyright" k="51" /> +<hkern g1="Agrave" g2="ordfeminine" k="191" /> +<hkern g1="Agrave" g2="guillemotleft" k="67" /> +<hkern g1="Agrave" g2="uni00AD" k="67" /> +<hkern g1="Agrave" g2="registered" k="51" /> +<hkern g1="Agrave" g2="degree" k="191" /> +<hkern g1="Agrave" g2="twosuperior" k="202" /> +<hkern g1="Agrave" g2="threesuperior" k="202" /> +<hkern g1="Agrave" g2="middot" k="67" /> +<hkern g1="Agrave" g2="onesuperior" k="202" /> +<hkern g1="Agrave" g2="ordmasculine" k="191" /> +<hkern g1="Agrave" g2="guillemotright" k="67" /> +<hkern g1="Agrave" g2="Ccedilla" k="51" /> +<hkern g1="Agrave" g2="Ograve" k="51" /> +<hkern g1="Agrave" g2="Oacute" k="51" /> +<hkern g1="Agrave" g2="Ocircumflex" k="51" /> +<hkern g1="Agrave" g2="Otilde" k="51" /> +<hkern g1="Agrave" g2="Odieresis" k="51" /> +<hkern g1="Agrave" g2="Oslash" k="51" /> +<hkern g1="Agrave" g2="Ugrave" k="52" /> +<hkern g1="Agrave" g2="Uacute" k="52" /> +<hkern g1="Agrave" g2="Ucircumflex" k="52" /> +<hkern g1="Agrave" g2="Udieresis" k="52" /> +<hkern g1="Agrave" g2="Yacute" k="182" /> +<hkern g1="Agrave" g2="yacute" k="91" /> +<hkern g1="Agrave" g2="ydieresis" k="91" /> +<hkern g1="Agrave" g2="OE" k="51" /> +<hkern g1="Agrave" g2="endash" k="67" /> +<hkern g1="Agrave" g2="emdash" k="67" /> +<hkern g1="Agrave" g2="quoteleft" k="191" /> +<hkern g1="Agrave" g2="quoteright" k="191" /> +<hkern g1="Agrave" g2="quotedblleft" k="191" /> +<hkern g1="Agrave" g2="quotedblright" k="191" /> +<hkern g1="Agrave" g2="bullet" k="67" /> +<hkern g1="Agrave" g2="guilsinglleft" k="67" /> +<hkern g1="Agrave" g2="guilsinglright" k="67" /> +<hkern g1="Aacute" g2="quotedbl" k="191" /> +<hkern g1="Aacute" g2="quotesingle" k="191" /> +<hkern g1="Aacute" g2="asterisk" k="191" /> +<hkern g1="Aacute" g2="hyphen" k="67" /> +<hkern g1="Aacute" g2="question" k="63" /> +<hkern g1="Aacute" g2="at" k="51" /> +<hkern g1="Aacute" g2="C" k="51" /> +<hkern g1="Aacute" g2="G" k="51" /> +<hkern g1="Aacute" g2="J" k="-56" /> +<hkern g1="Aacute" g2="O" k="51" /> +<hkern g1="Aacute" g2="Q" k="51" /> +<hkern g1="Aacute" g2="T" k="147" /> +<hkern g1="Aacute" g2="U" k="52" /> +<hkern g1="Aacute" g2="V" k="169" /> +<hkern g1="Aacute" g2="W" k="102" /> +<hkern g1="Aacute" g2="Y" k="182" /> +<hkern g1="Aacute" g2="backslash" k="169" /> +<hkern g1="Aacute" g2="v" k="91" /> +<hkern g1="Aacute" g2="y" k="91" /> +<hkern g1="Aacute" g2="copyright" k="51" /> +<hkern g1="Aacute" g2="ordfeminine" k="191" /> +<hkern g1="Aacute" g2="guillemotleft" k="67" /> +<hkern g1="Aacute" g2="uni00AD" k="67" /> +<hkern g1="Aacute" g2="registered" k="51" /> +<hkern g1="Aacute" g2="degree" k="191" /> +<hkern g1="Aacute" g2="twosuperior" k="202" /> +<hkern g1="Aacute" g2="threesuperior" k="202" /> +<hkern g1="Aacute" g2="middot" k="67" /> +<hkern g1="Aacute" g2="onesuperior" k="202" /> +<hkern g1="Aacute" g2="ordmasculine" k="191" /> +<hkern g1="Aacute" g2="guillemotright" k="67" /> +<hkern g1="Aacute" g2="Ccedilla" k="51" /> +<hkern g1="Aacute" g2="Ograve" k="51" /> +<hkern g1="Aacute" g2="Oacute" k="51" /> +<hkern g1="Aacute" g2="Ocircumflex" k="51" /> +<hkern g1="Aacute" g2="Otilde" k="51" /> +<hkern g1="Aacute" g2="Odieresis" k="51" /> +<hkern g1="Aacute" g2="Oslash" k="51" /> +<hkern g1="Aacute" g2="Ugrave" k="52" /> +<hkern g1="Aacute" g2="Uacute" k="52" /> +<hkern g1="Aacute" g2="Ucircumflex" k="52" /> +<hkern g1="Aacute" g2="Udieresis" k="52" /> +<hkern g1="Aacute" g2="Yacute" k="182" /> +<hkern g1="Aacute" g2="yacute" k="91" /> +<hkern g1="Aacute" g2="ydieresis" k="91" /> +<hkern g1="Aacute" g2="OE" k="51" /> +<hkern g1="Aacute" g2="endash" k="67" /> +<hkern g1="Aacute" g2="emdash" k="67" /> +<hkern g1="Aacute" g2="quoteleft" k="191" /> +<hkern g1="Aacute" g2="quoteright" k="191" /> +<hkern g1="Aacute" g2="quotedblleft" k="191" /> +<hkern g1="Aacute" g2="quotedblright" k="191" /> +<hkern g1="Aacute" g2="bullet" k="67" /> +<hkern g1="Aacute" g2="guilsinglleft" k="67" /> +<hkern g1="Aacute" g2="guilsinglright" k="67" /> +<hkern g1="Acircumflex" g2="quotedbl" k="191" /> +<hkern g1="Acircumflex" g2="quotesingle" k="191" /> +<hkern g1="Acircumflex" g2="asterisk" k="191" /> +<hkern g1="Acircumflex" g2="hyphen" k="67" /> +<hkern g1="Acircumflex" g2="question" k="63" /> +<hkern g1="Acircumflex" g2="at" k="51" /> +<hkern g1="Acircumflex" g2="C" k="51" /> +<hkern g1="Acircumflex" g2="G" k="51" /> +<hkern g1="Acircumflex" g2="J" k="-56" /> +<hkern g1="Acircumflex" g2="O" k="51" /> +<hkern g1="Acircumflex" g2="Q" k="51" /> +<hkern g1="Acircumflex" g2="T" k="147" /> +<hkern g1="Acircumflex" g2="U" k="52" /> +<hkern g1="Acircumflex" g2="V" k="169" /> +<hkern g1="Acircumflex" g2="W" k="102" /> +<hkern g1="Acircumflex" g2="Y" k="182" /> +<hkern g1="Acircumflex" g2="backslash" k="169" /> +<hkern g1="Acircumflex" g2="v" k="91" /> +<hkern g1="Acircumflex" g2="y" k="91" /> +<hkern g1="Acircumflex" g2="copyright" k="51" /> +<hkern g1="Acircumflex" g2="ordfeminine" k="191" /> +<hkern g1="Acircumflex" g2="guillemotleft" k="67" /> +<hkern g1="Acircumflex" g2="uni00AD" k="67" /> +<hkern g1="Acircumflex" g2="registered" k="51" /> +<hkern g1="Acircumflex" g2="degree" k="191" /> +<hkern g1="Acircumflex" g2="twosuperior" k="202" /> +<hkern g1="Acircumflex" g2="threesuperior" k="202" /> +<hkern g1="Acircumflex" g2="middot" k="67" /> +<hkern g1="Acircumflex" g2="onesuperior" k="202" /> +<hkern g1="Acircumflex" g2="ordmasculine" k="191" /> +<hkern g1="Acircumflex" g2="guillemotright" k="67" /> +<hkern g1="Acircumflex" g2="Ccedilla" k="51" /> +<hkern g1="Acircumflex" g2="Ograve" k="51" /> +<hkern g1="Acircumflex" g2="Oacute" k="51" /> +<hkern g1="Acircumflex" g2="Ocircumflex" k="51" /> +<hkern g1="Acircumflex" g2="Otilde" k="51" /> +<hkern g1="Acircumflex" g2="Odieresis" k="51" /> +<hkern g1="Acircumflex" g2="Oslash" k="51" /> +<hkern g1="Acircumflex" g2="Ugrave" k="52" /> +<hkern g1="Acircumflex" g2="Uacute" k="52" /> +<hkern g1="Acircumflex" g2="Ucircumflex" k="52" /> +<hkern g1="Acircumflex" g2="Udieresis" k="52" /> +<hkern g1="Acircumflex" g2="Yacute" k="182" /> +<hkern g1="Acircumflex" g2="yacute" k="91" /> +<hkern g1="Acircumflex" g2="ydieresis" k="91" /> +<hkern g1="Acircumflex" g2="OE" k="51" /> +<hkern g1="Acircumflex" g2="endash" k="67" /> +<hkern g1="Acircumflex" g2="emdash" k="67" /> +<hkern g1="Acircumflex" g2="quoteleft" k="191" /> +<hkern g1="Acircumflex" g2="quoteright" k="191" /> +<hkern g1="Acircumflex" g2="quotedblleft" k="191" /> +<hkern g1="Acircumflex" g2="quotedblright" k="191" /> +<hkern g1="Acircumflex" g2="bullet" k="67" /> +<hkern g1="Acircumflex" g2="guilsinglleft" k="67" /> +<hkern g1="Acircumflex" g2="guilsinglright" k="67" /> +<hkern g1="Atilde" g2="quotedbl" k="191" /> +<hkern g1="Atilde" g2="quotesingle" k="191" /> +<hkern g1="Atilde" g2="asterisk" k="191" /> +<hkern g1="Atilde" g2="hyphen" k="67" /> +<hkern g1="Atilde" g2="question" k="63" /> +<hkern g1="Atilde" g2="at" k="51" /> +<hkern g1="Atilde" g2="C" k="51" /> +<hkern g1="Atilde" g2="G" k="51" /> +<hkern g1="Atilde" g2="J" k="-56" /> +<hkern g1="Atilde" g2="O" k="51" /> +<hkern g1="Atilde" g2="Q" k="51" /> +<hkern g1="Atilde" g2="T" k="147" /> +<hkern g1="Atilde" g2="U" k="52" /> +<hkern g1="Atilde" g2="V" k="169" /> +<hkern g1="Atilde" g2="W" k="102" /> +<hkern g1="Atilde" g2="Y" k="182" /> +<hkern g1="Atilde" g2="backslash" k="169" /> +<hkern g1="Atilde" g2="v" k="91" /> +<hkern g1="Atilde" g2="y" k="91" /> +<hkern g1="Atilde" g2="copyright" k="51" /> +<hkern g1="Atilde" g2="ordfeminine" k="191" /> +<hkern g1="Atilde" g2="guillemotleft" k="67" /> +<hkern g1="Atilde" g2="uni00AD" k="67" /> +<hkern g1="Atilde" g2="registered" k="51" /> +<hkern g1="Atilde" g2="degree" k="191" /> +<hkern g1="Atilde" g2="twosuperior" k="202" /> +<hkern g1="Atilde" g2="threesuperior" k="202" /> +<hkern g1="Atilde" g2="middot" k="67" /> +<hkern g1="Atilde" g2="onesuperior" k="202" /> +<hkern g1="Atilde" g2="ordmasculine" k="191" /> +<hkern g1="Atilde" g2="guillemotright" k="67" /> +<hkern g1="Atilde" g2="Ccedilla" k="51" /> +<hkern g1="Atilde" g2="Ograve" k="51" /> +<hkern g1="Atilde" g2="Oacute" k="51" /> +<hkern g1="Atilde" g2="Ocircumflex" k="51" /> +<hkern g1="Atilde" g2="Otilde" k="51" /> +<hkern g1="Atilde" g2="Odieresis" k="51" /> +<hkern g1="Atilde" g2="Oslash" k="51" /> +<hkern g1="Atilde" g2="Ugrave" k="52" /> +<hkern g1="Atilde" g2="Uacute" k="52" /> +<hkern g1="Atilde" g2="Ucircumflex" k="52" /> +<hkern g1="Atilde" g2="Udieresis" k="52" /> +<hkern g1="Atilde" g2="Yacute" k="182" /> +<hkern g1="Atilde" g2="yacute" k="91" /> +<hkern g1="Atilde" g2="ydieresis" k="91" /> +<hkern g1="Atilde" g2="OE" k="51" /> +<hkern g1="Atilde" g2="endash" k="67" /> +<hkern g1="Atilde" g2="emdash" k="67" /> +<hkern g1="Atilde" g2="quoteleft" k="191" /> +<hkern g1="Atilde" g2="quoteright" k="191" /> +<hkern g1="Atilde" g2="quotedblleft" k="191" /> +<hkern g1="Atilde" g2="quotedblright" k="191" /> +<hkern g1="Atilde" g2="bullet" k="67" /> +<hkern g1="Atilde" g2="guilsinglleft" k="67" /> +<hkern g1="Atilde" g2="guilsinglright" k="67" /> +<hkern g1="Adieresis" g2="quotedbl" k="191" /> +<hkern g1="Adieresis" g2="quotesingle" k="191" /> +<hkern g1="Adieresis" g2="asterisk" k="191" /> +<hkern g1="Adieresis" g2="hyphen" k="67" /> +<hkern g1="Adieresis" g2="question" k="63" /> +<hkern g1="Adieresis" g2="at" k="51" /> +<hkern g1="Adieresis" g2="C" k="51" /> +<hkern g1="Adieresis" g2="G" k="51" /> +<hkern g1="Adieresis" g2="J" k="-56" /> +<hkern g1="Adieresis" g2="O" k="51" /> +<hkern g1="Adieresis" g2="Q" k="51" /> +<hkern g1="Adieresis" g2="T" k="147" /> +<hkern g1="Adieresis" g2="U" k="52" /> +<hkern g1="Adieresis" g2="V" k="169" /> +<hkern g1="Adieresis" g2="W" k="102" /> +<hkern g1="Adieresis" g2="Y" k="182" /> +<hkern g1="Adieresis" g2="backslash" k="169" /> +<hkern g1="Adieresis" g2="v" k="91" /> +<hkern g1="Adieresis" g2="y" k="91" /> +<hkern g1="Adieresis" g2="copyright" k="51" /> +<hkern g1="Adieresis" g2="ordfeminine" k="191" /> +<hkern g1="Adieresis" g2="guillemotleft" k="67" /> +<hkern g1="Adieresis" g2="uni00AD" k="67" /> +<hkern g1="Adieresis" g2="registered" k="51" /> +<hkern g1="Adieresis" g2="degree" k="191" /> +<hkern g1="Adieresis" g2="twosuperior" k="202" /> +<hkern g1="Adieresis" g2="threesuperior" k="202" /> +<hkern g1="Adieresis" g2="middot" k="67" /> +<hkern g1="Adieresis" g2="onesuperior" k="202" /> +<hkern g1="Adieresis" g2="ordmasculine" k="191" /> +<hkern g1="Adieresis" g2="guillemotright" k="67" /> +<hkern g1="Adieresis" g2="Ccedilla" k="51" /> +<hkern g1="Adieresis" g2="Ograve" k="51" /> +<hkern g1="Adieresis" g2="Oacute" k="51" /> +<hkern g1="Adieresis" g2="Ocircumflex" k="51" /> +<hkern g1="Adieresis" g2="Otilde" k="51" /> +<hkern g1="Adieresis" g2="Odieresis" k="51" /> +<hkern g1="Adieresis" g2="Oslash" k="51" /> +<hkern g1="Adieresis" g2="Ugrave" k="52" /> +<hkern g1="Adieresis" g2="Uacute" k="52" /> +<hkern g1="Adieresis" g2="Ucircumflex" k="52" /> +<hkern g1="Adieresis" g2="Udieresis" k="52" /> +<hkern g1="Adieresis" g2="Yacute" k="182" /> +<hkern g1="Adieresis" g2="yacute" k="91" /> +<hkern g1="Adieresis" g2="ydieresis" k="91" /> +<hkern g1="Adieresis" g2="OE" k="51" /> +<hkern g1="Adieresis" g2="endash" k="67" /> +<hkern g1="Adieresis" g2="emdash" k="67" /> +<hkern g1="Adieresis" g2="quoteleft" k="191" /> +<hkern g1="Adieresis" g2="quoteright" k="191" /> +<hkern g1="Adieresis" g2="quotedblleft" k="191" /> +<hkern g1="Adieresis" g2="quotedblright" k="191" /> +<hkern g1="Adieresis" g2="bullet" k="67" /> +<hkern g1="Adieresis" g2="guilsinglleft" k="67" /> +<hkern g1="Adieresis" g2="guilsinglright" k="67" /> +<hkern g1="Aring" g2="quotedbl" k="191" /> +<hkern g1="Aring" g2="quotesingle" k="191" /> +<hkern g1="Aring" g2="asterisk" k="191" /> +<hkern g1="Aring" g2="hyphen" k="67" /> +<hkern g1="Aring" g2="question" k="63" /> +<hkern g1="Aring" g2="at" k="51" /> +<hkern g1="Aring" g2="C" k="51" /> +<hkern g1="Aring" g2="G" k="51" /> +<hkern g1="Aring" g2="J" k="-56" /> +<hkern g1="Aring" g2="O" k="51" /> +<hkern g1="Aring" g2="Q" k="51" /> +<hkern g1="Aring" g2="T" k="147" /> +<hkern g1="Aring" g2="U" k="52" /> +<hkern g1="Aring" g2="V" k="169" /> +<hkern g1="Aring" g2="W" k="102" /> +<hkern g1="Aring" g2="Y" k="182" /> +<hkern g1="Aring" g2="backslash" k="169" /> +<hkern g1="Aring" g2="v" k="91" /> +<hkern g1="Aring" g2="y" k="91" /> +<hkern g1="Aring" g2="copyright" k="51" /> +<hkern g1="Aring" g2="ordfeminine" k="191" /> +<hkern g1="Aring" g2="guillemotleft" k="67" /> +<hkern g1="Aring" g2="uni00AD" k="67" /> +<hkern g1="Aring" g2="registered" k="51" /> +<hkern g1="Aring" g2="degree" k="191" /> +<hkern g1="Aring" g2="twosuperior" k="202" /> +<hkern g1="Aring" g2="threesuperior" k="202" /> +<hkern g1="Aring" g2="middot" k="67" /> +<hkern g1="Aring" g2="onesuperior" k="202" /> +<hkern g1="Aring" g2="ordmasculine" k="191" /> +<hkern g1="Aring" g2="guillemotright" k="67" /> +<hkern g1="Aring" g2="Ccedilla" k="51" /> +<hkern g1="Aring" g2="Ograve" k="51" /> +<hkern g1="Aring" g2="Oacute" k="51" /> +<hkern g1="Aring" g2="Ocircumflex" k="51" /> +<hkern g1="Aring" g2="Otilde" k="51" /> +<hkern g1="Aring" g2="Odieresis" k="51" /> +<hkern g1="Aring" g2="Oslash" k="51" /> +<hkern g1="Aring" g2="Ugrave" k="52" /> +<hkern g1="Aring" g2="Uacute" k="52" /> +<hkern g1="Aring" g2="Ucircumflex" k="52" /> +<hkern g1="Aring" g2="Udieresis" k="52" /> +<hkern g1="Aring" g2="Yacute" k="182" /> +<hkern g1="Aring" g2="yacute" k="91" /> +<hkern g1="Aring" g2="ydieresis" k="91" /> +<hkern g1="Aring" g2="OE" k="51" /> +<hkern g1="Aring" g2="endash" k="67" /> +<hkern g1="Aring" g2="emdash" k="67" /> +<hkern g1="Aring" g2="quoteleft" k="191" /> +<hkern g1="Aring" g2="quoteright" k="191" /> +<hkern g1="Aring" g2="quotedblleft" k="191" /> +<hkern g1="Aring" g2="quotedblright" k="191" /> +<hkern g1="Aring" g2="bullet" k="67" /> +<hkern g1="Aring" g2="guilsinglleft" k="67" /> +<hkern g1="Aring" g2="guilsinglright" k="67" /> +<hkern g1="Ccedilla" g2="hyphen" k="144" /> +<hkern g1="Ccedilla" g2="guillemotleft" k="144" /> +<hkern g1="Ccedilla" g2="uni00AD" k="144" /> +<hkern g1="Ccedilla" g2="middot" k="144" /> +<hkern g1="Ccedilla" g2="guillemotright" k="144" /> +<hkern g1="Ccedilla" g2="endash" k="144" /> +<hkern g1="Ccedilla" g2="emdash" k="144" /> +<hkern g1="Ccedilla" g2="bullet" k="144" /> +<hkern g1="Ccedilla" g2="guilsinglleft" k="144" /> +<hkern g1="Ccedilla" g2="guilsinglright" k="144" /> +<hkern g1="Eth" g2="quotedbl" k="42" /> +<hkern g1="Eth" g2="ampersand" k="51" /> +<hkern g1="Eth" g2="quotesingle" k="42" /> +<hkern g1="Eth" g2="parenright" k="40" /> +<hkern g1="Eth" g2="asterisk" k="42" /> +<hkern g1="Eth" g2="comma" k="52" /> +<hkern g1="Eth" g2="period" k="52" /> +<hkern g1="Eth" g2="slash" k="51" /> +<hkern g1="Eth" g2="A" k="51" /> +<hkern g1="Eth" g2="T" k="78" /> +<hkern g1="Eth" g2="V" k="56" /> +<hkern g1="Eth" g2="X" k="30" /> +<hkern g1="Eth" g2="Y" k="80" /> +<hkern g1="Eth" g2="Z" k="64" /> +<hkern g1="Eth" g2="backslash" k="56" /> +<hkern g1="Eth" g2="bracketright" k="40" /> +<hkern g1="Eth" g2="braceright" k="40" /> +<hkern g1="Eth" g2="ordfeminine" k="42" /> +<hkern g1="Eth" g2="degree" k="42" /> +<hkern g1="Eth" g2="ordmasculine" k="42" /> +<hkern g1="Eth" g2="Agrave" k="51" /> +<hkern g1="Eth" g2="Aacute" k="51" /> +<hkern g1="Eth" g2="Acircumflex" k="51" /> +<hkern g1="Eth" g2="Atilde" k="51" /> +<hkern g1="Eth" g2="Adieresis" k="51" /> +<hkern g1="Eth" g2="Aring" k="51" /> +<hkern g1="Eth" g2="AE" k="51" /> +<hkern g1="Eth" g2="Yacute" k="80" /> +<hkern g1="Eth" g2="quoteleft" k="42" /> +<hkern g1="Eth" g2="quoteright" k="42" /> +<hkern g1="Eth" g2="quotesinglbase" k="52" /> +<hkern g1="Eth" g2="quotedblleft" k="42" /> +<hkern g1="Eth" g2="quotedblright" k="42" /> +<hkern g1="Eth" g2="quotedblbase" k="52" /> +<hkern g1="Ograve" g2="quotedbl" k="42" /> +<hkern g1="Ograve" g2="ampersand" k="51" /> +<hkern g1="Ograve" g2="quotesingle" k="42" /> +<hkern g1="Ograve" g2="parenright" k="40" /> +<hkern g1="Ograve" g2="asterisk" k="42" /> +<hkern g1="Ograve" g2="comma" k="52" /> +<hkern g1="Ograve" g2="period" k="52" /> +<hkern g1="Ograve" g2="slash" k="51" /> +<hkern g1="Ograve" g2="A" k="51" /> +<hkern g1="Ograve" g2="T" k="78" /> +<hkern g1="Ograve" g2="V" k="56" /> +<hkern g1="Ograve" g2="X" k="30" /> +<hkern g1="Ograve" g2="Y" k="80" /> +<hkern g1="Ograve" g2="Z" k="64" /> +<hkern g1="Ograve" g2="backslash" k="56" /> +<hkern g1="Ograve" g2="bracketright" k="40" /> +<hkern g1="Ograve" g2="braceright" k="40" /> +<hkern g1="Ograve" g2="ordfeminine" k="42" /> +<hkern g1="Ograve" g2="degree" k="42" /> +<hkern g1="Ograve" g2="ordmasculine" k="42" /> +<hkern g1="Ograve" g2="Agrave" k="51" /> +<hkern g1="Ograve" g2="Aacute" k="51" /> +<hkern g1="Ograve" g2="Acircumflex" k="51" /> +<hkern g1="Ograve" g2="Atilde" k="51" /> +<hkern g1="Ograve" g2="Adieresis" k="51" /> +<hkern g1="Ograve" g2="Aring" k="51" /> +<hkern g1="Ograve" g2="AE" k="51" /> +<hkern g1="Ograve" g2="Yacute" k="80" /> +<hkern g1="Ograve" g2="quoteleft" k="42" /> +<hkern g1="Ograve" g2="quoteright" k="42" /> +<hkern g1="Ograve" g2="quotesinglbase" k="52" /> +<hkern g1="Ograve" g2="quotedblleft" k="42" /> +<hkern g1="Ograve" g2="quotedblright" k="42" /> +<hkern g1="Ograve" g2="quotedblbase" k="52" /> +<hkern g1="Oacute" g2="quotedbl" k="42" /> +<hkern g1="Oacute" g2="ampersand" k="51" /> +<hkern g1="Oacute" g2="quotesingle" k="42" /> +<hkern g1="Oacute" g2="parenright" k="40" /> +<hkern g1="Oacute" g2="asterisk" k="42" /> +<hkern g1="Oacute" g2="comma" k="52" /> +<hkern g1="Oacute" g2="period" k="52" /> +<hkern g1="Oacute" g2="slash" k="51" /> +<hkern g1="Oacute" g2="A" k="51" /> +<hkern g1="Oacute" g2="T" k="78" /> +<hkern g1="Oacute" g2="V" k="56" /> +<hkern g1="Oacute" g2="X" k="30" /> +<hkern g1="Oacute" g2="Y" k="80" /> +<hkern g1="Oacute" g2="Z" k="64" /> +<hkern g1="Oacute" g2="backslash" k="56" /> +<hkern g1="Oacute" g2="bracketright" k="40" /> +<hkern g1="Oacute" g2="braceright" k="40" /> +<hkern g1="Oacute" g2="ordfeminine" k="42" /> +<hkern g1="Oacute" g2="degree" k="42" /> +<hkern g1="Oacute" g2="ordmasculine" k="42" /> +<hkern g1="Oacute" g2="Agrave" k="51" /> +<hkern g1="Oacute" g2="Aacute" k="51" /> +<hkern g1="Oacute" g2="Acircumflex" k="51" /> +<hkern g1="Oacute" g2="Atilde" k="51" /> +<hkern g1="Oacute" g2="Adieresis" k="51" /> +<hkern g1="Oacute" g2="Aring" k="51" /> +<hkern g1="Oacute" g2="AE" k="51" /> +<hkern g1="Oacute" g2="Yacute" k="80" /> +<hkern g1="Oacute" g2="quoteleft" k="42" /> +<hkern g1="Oacute" g2="quoteright" k="42" /> +<hkern g1="Oacute" g2="quotesinglbase" k="52" /> +<hkern g1="Oacute" g2="quotedblleft" k="42" /> +<hkern g1="Oacute" g2="quotedblright" k="42" /> +<hkern g1="Oacute" g2="quotedblbase" k="52" /> +<hkern g1="Ocircumflex" g2="quotedbl" k="42" /> +<hkern g1="Ocircumflex" g2="ampersand" k="51" /> +<hkern g1="Ocircumflex" g2="quotesingle" k="42" /> +<hkern g1="Ocircumflex" g2="parenright" k="40" /> +<hkern g1="Ocircumflex" g2="asterisk" k="42" /> +<hkern g1="Ocircumflex" g2="comma" k="52" /> +<hkern g1="Ocircumflex" g2="period" k="52" /> +<hkern g1="Ocircumflex" g2="slash" k="51" /> +<hkern g1="Ocircumflex" g2="A" k="51" /> +<hkern g1="Ocircumflex" g2="T" k="78" /> +<hkern g1="Ocircumflex" g2="V" k="56" /> +<hkern g1="Ocircumflex" g2="X" k="30" /> +<hkern g1="Ocircumflex" g2="Y" k="80" /> +<hkern g1="Ocircumflex" g2="Z" k="64" /> +<hkern g1="Ocircumflex" g2="backslash" k="56" /> +<hkern g1="Ocircumflex" g2="bracketright" k="40" /> +<hkern g1="Ocircumflex" g2="braceright" k="40" /> +<hkern g1="Ocircumflex" g2="ordfeminine" k="42" /> +<hkern g1="Ocircumflex" g2="degree" k="42" /> +<hkern g1="Ocircumflex" g2="ordmasculine" k="42" /> +<hkern g1="Ocircumflex" g2="Agrave" k="51" /> +<hkern g1="Ocircumflex" g2="Aacute" k="51" /> +<hkern g1="Ocircumflex" g2="Acircumflex" k="51" /> +<hkern g1="Ocircumflex" g2="Atilde" k="51" /> +<hkern g1="Ocircumflex" g2="Adieresis" k="51" /> +<hkern g1="Ocircumflex" g2="Aring" k="51" /> +<hkern g1="Ocircumflex" g2="AE" k="51" /> +<hkern g1="Ocircumflex" g2="Yacute" k="80" /> +<hkern g1="Ocircumflex" g2="quoteleft" k="42" /> +<hkern g1="Ocircumflex" g2="quoteright" k="42" /> +<hkern g1="Ocircumflex" g2="quotesinglbase" k="52" /> +<hkern g1="Ocircumflex" g2="quotedblleft" k="42" /> +<hkern g1="Ocircumflex" g2="quotedblright" k="42" /> +<hkern g1="Ocircumflex" g2="quotedblbase" k="52" /> +<hkern g1="Otilde" g2="quotedbl" k="42" /> +<hkern g1="Otilde" g2="ampersand" k="51" /> +<hkern g1="Otilde" g2="quotesingle" k="42" /> +<hkern g1="Otilde" g2="parenright" k="40" /> +<hkern g1="Otilde" g2="asterisk" k="42" /> +<hkern g1="Otilde" g2="comma" k="52" /> +<hkern g1="Otilde" g2="period" k="52" /> +<hkern g1="Otilde" g2="slash" k="51" /> +<hkern g1="Otilde" g2="A" k="51" /> +<hkern g1="Otilde" g2="T" k="78" /> +<hkern g1="Otilde" g2="V" k="56" /> +<hkern g1="Otilde" g2="X" k="30" /> +<hkern g1="Otilde" g2="Y" k="80" /> +<hkern g1="Otilde" g2="Z" k="64" /> +<hkern g1="Otilde" g2="backslash" k="56" /> +<hkern g1="Otilde" g2="bracketright" k="40" /> +<hkern g1="Otilde" g2="braceright" k="40" /> +<hkern g1="Otilde" g2="ordfeminine" k="42" /> +<hkern g1="Otilde" g2="degree" k="42" /> +<hkern g1="Otilde" g2="ordmasculine" k="42" /> +<hkern g1="Otilde" g2="Agrave" k="51" /> +<hkern g1="Otilde" g2="Aacute" k="51" /> +<hkern g1="Otilde" g2="Acircumflex" k="51" /> +<hkern g1="Otilde" g2="Atilde" k="51" /> +<hkern g1="Otilde" g2="Adieresis" k="51" /> +<hkern g1="Otilde" g2="Aring" k="51" /> +<hkern g1="Otilde" g2="AE" k="51" /> +<hkern g1="Otilde" g2="Yacute" k="80" /> +<hkern g1="Otilde" g2="quoteleft" k="42" /> +<hkern g1="Otilde" g2="quoteright" k="42" /> +<hkern g1="Otilde" g2="quotesinglbase" k="52" /> +<hkern g1="Otilde" g2="quotedblleft" k="42" /> +<hkern g1="Otilde" g2="quotedblright" k="42" /> +<hkern g1="Otilde" g2="quotedblbase" k="52" /> +<hkern g1="Odieresis" g2="quotedbl" k="42" /> +<hkern g1="Odieresis" g2="ampersand" k="51" /> +<hkern g1="Odieresis" g2="quotesingle" k="42" /> +<hkern g1="Odieresis" g2="parenright" k="40" /> +<hkern g1="Odieresis" g2="asterisk" k="42" /> +<hkern g1="Odieresis" g2="comma" k="52" /> +<hkern g1="Odieresis" g2="period" k="52" /> +<hkern g1="Odieresis" g2="slash" k="51" /> +<hkern g1="Odieresis" g2="A" k="51" /> +<hkern g1="Odieresis" g2="T" k="78" /> +<hkern g1="Odieresis" g2="V" k="56" /> +<hkern g1="Odieresis" g2="X" k="30" /> +<hkern g1="Odieresis" g2="Y" k="80" /> +<hkern g1="Odieresis" g2="Z" k="64" /> +<hkern g1="Odieresis" g2="backslash" k="56" /> +<hkern g1="Odieresis" g2="bracketright" k="40" /> +<hkern g1="Odieresis" g2="braceright" k="40" /> +<hkern g1="Odieresis" g2="ordfeminine" k="42" /> +<hkern g1="Odieresis" g2="degree" k="42" /> +<hkern g1="Odieresis" g2="ordmasculine" k="42" /> +<hkern g1="Odieresis" g2="Agrave" k="51" /> +<hkern g1="Odieresis" g2="Aacute" k="51" /> +<hkern g1="Odieresis" g2="Acircumflex" k="51" /> +<hkern g1="Odieresis" g2="Atilde" k="51" /> +<hkern g1="Odieresis" g2="Adieresis" k="51" /> +<hkern g1="Odieresis" g2="Aring" k="51" /> +<hkern g1="Odieresis" g2="AE" k="51" /> +<hkern g1="Odieresis" g2="Yacute" k="80" /> +<hkern g1="Odieresis" g2="quoteleft" k="42" /> +<hkern g1="Odieresis" g2="quoteright" k="42" /> +<hkern g1="Odieresis" g2="quotesinglbase" k="52" /> +<hkern g1="Odieresis" g2="quotedblleft" k="42" /> +<hkern g1="Odieresis" g2="quotedblright" k="42" /> +<hkern g1="Odieresis" g2="quotedblbase" k="52" /> +<hkern g1="Oslash" g2="quotedbl" k="42" /> +<hkern g1="Oslash" g2="ampersand" k="51" /> +<hkern g1="Oslash" g2="quotesingle" k="42" /> +<hkern g1="Oslash" g2="parenright" k="40" /> +<hkern g1="Oslash" g2="asterisk" k="42" /> +<hkern g1="Oslash" g2="comma" k="52" /> +<hkern g1="Oslash" g2="period" k="52" /> +<hkern g1="Oslash" g2="slash" k="51" /> +<hkern g1="Oslash" g2="A" k="51" /> +<hkern g1="Oslash" g2="T" k="78" /> +<hkern g1="Oslash" g2="V" k="56" /> +<hkern g1="Oslash" g2="X" k="30" /> +<hkern g1="Oslash" g2="Y" k="80" /> +<hkern g1="Oslash" g2="Z" k="64" /> +<hkern g1="Oslash" g2="backslash" k="56" /> +<hkern g1="Oslash" g2="bracketright" k="40" /> +<hkern g1="Oslash" g2="braceright" k="40" /> +<hkern g1="Oslash" g2="ordfeminine" k="42" /> +<hkern g1="Oslash" g2="degree" k="42" /> +<hkern g1="Oslash" g2="ordmasculine" k="42" /> +<hkern g1="Oslash" g2="Agrave" k="51" /> +<hkern g1="Oslash" g2="Aacute" k="51" /> +<hkern g1="Oslash" g2="Acircumflex" k="51" /> +<hkern g1="Oslash" g2="Atilde" k="51" /> +<hkern g1="Oslash" g2="Adieresis" k="51" /> +<hkern g1="Oslash" g2="Aring" k="51" /> +<hkern g1="Oslash" g2="AE" k="51" /> +<hkern g1="Oslash" g2="Yacute" k="80" /> +<hkern g1="Oslash" g2="quoteleft" k="42" /> +<hkern g1="Oslash" g2="quoteright" k="42" /> +<hkern g1="Oslash" g2="quotesinglbase" k="52" /> +<hkern g1="Oslash" g2="quotedblleft" k="42" /> +<hkern g1="Oslash" g2="quotedblright" k="42" /> +<hkern g1="Oslash" g2="quotedblbase" k="52" /> +<hkern g1="Ugrave" g2="ampersand" k="52" /> +<hkern g1="Ugrave" g2="comma" k="50" /> +<hkern g1="Ugrave" g2="period" k="50" /> +<hkern g1="Ugrave" g2="slash" k="52" /> +<hkern g1="Ugrave" g2="A" k="52" /> +<hkern g1="Ugrave" g2="Agrave" k="52" /> +<hkern g1="Ugrave" g2="Aacute" k="52" /> +<hkern g1="Ugrave" g2="Acircumflex" k="52" /> +<hkern g1="Ugrave" g2="Atilde" k="52" /> +<hkern g1="Ugrave" g2="Adieresis" k="52" /> +<hkern g1="Ugrave" g2="Aring" k="52" /> +<hkern g1="Ugrave" g2="AE" k="52" /> +<hkern g1="Ugrave" g2="quotesinglbase" k="50" /> +<hkern g1="Ugrave" g2="quotedblbase" k="50" /> +<hkern g1="Uacute" g2="ampersand" k="52" /> +<hkern g1="Uacute" g2="comma" k="50" /> +<hkern g1="Uacute" g2="period" k="50" /> +<hkern g1="Uacute" g2="slash" k="52" /> +<hkern g1="Uacute" g2="A" k="52" /> +<hkern g1="Uacute" g2="Agrave" k="52" /> +<hkern g1="Uacute" g2="Aacute" k="52" /> +<hkern g1="Uacute" g2="Acircumflex" k="52" /> +<hkern g1="Uacute" g2="Atilde" k="52" /> +<hkern g1="Uacute" g2="Adieresis" k="52" /> +<hkern g1="Uacute" g2="Aring" k="52" /> +<hkern g1="Uacute" g2="AE" k="52" /> +<hkern g1="Uacute" g2="quotesinglbase" k="50" /> +<hkern g1="Uacute" g2="quotedblbase" k="50" /> +<hkern g1="Ucircumflex" g2="ampersand" k="52" /> +<hkern g1="Ucircumflex" g2="comma" k="50" /> +<hkern g1="Ucircumflex" g2="period" k="50" /> +<hkern g1="Ucircumflex" g2="slash" k="52" /> +<hkern g1="Ucircumflex" g2="A" k="52" /> +<hkern g1="Ucircumflex" g2="Agrave" k="52" /> +<hkern g1="Ucircumflex" g2="Aacute" k="52" /> +<hkern g1="Ucircumflex" g2="Acircumflex" k="52" /> +<hkern g1="Ucircumflex" g2="Atilde" k="52" /> +<hkern g1="Ucircumflex" g2="Adieresis" k="52" /> +<hkern g1="Ucircumflex" g2="Aring" k="52" /> +<hkern g1="Ucircumflex" g2="AE" k="52" /> +<hkern g1="Ucircumflex" g2="quotesinglbase" k="50" /> +<hkern g1="Ucircumflex" g2="quotedblbase" k="50" /> +<hkern g1="Udieresis" g2="ampersand" k="52" /> +<hkern g1="Udieresis" g2="comma" k="50" /> +<hkern g1="Udieresis" g2="period" k="50" /> +<hkern g1="Udieresis" g2="slash" k="52" /> +<hkern g1="Udieresis" g2="A" k="52" /> +<hkern g1="Udieresis" g2="Agrave" k="52" /> +<hkern g1="Udieresis" g2="Aacute" k="52" /> +<hkern g1="Udieresis" g2="Acircumflex" k="52" /> +<hkern g1="Udieresis" g2="Atilde" k="52" /> +<hkern g1="Udieresis" g2="Adieresis" k="52" /> +<hkern g1="Udieresis" g2="Aring" k="52" /> +<hkern g1="Udieresis" g2="AE" k="52" /> +<hkern g1="Udieresis" g2="quotesinglbase" k="50" /> +<hkern g1="Udieresis" g2="quotedblbase" k="50" /> +<hkern g1="Yacute" g2="quotedbl" k="-36" /> +<hkern g1="Yacute" g2="ampersand" k="182" /> +<hkern g1="Yacute" g2="quotesingle" k="-36" /> +<hkern g1="Yacute" g2="asterisk" k="-36" /> +<hkern g1="Yacute" g2="comma" k="167" /> +<hkern g1="Yacute" g2="hyphen" k="160" /> +<hkern g1="Yacute" g2="period" k="167" /> +<hkern g1="Yacute" g2="slash" k="182" /> +<hkern g1="Yacute" g2="colon" k="131" /> +<hkern g1="Yacute" g2="semicolon" k="131" /> +<hkern g1="Yacute" g2="question" k="-32" /> +<hkern g1="Yacute" g2="at" k="80" /> +<hkern g1="Yacute" g2="A" k="182" /> +<hkern g1="Yacute" g2="C" k="80" /> +<hkern g1="Yacute" g2="G" k="80" /> +<hkern g1="Yacute" g2="J" k="200" /> +<hkern g1="Yacute" g2="O" k="80" /> +<hkern g1="Yacute" g2="Q" k="80" /> +<hkern g1="Yacute" g2="a" k="145" /> +<hkern g1="Yacute" g2="c" k="160" /> +<hkern g1="Yacute" g2="d" k="160" /> +<hkern g1="Yacute" g2="e" k="160" /> +<hkern g1="Yacute" g2="g" k="176" /> +<hkern g1="Yacute" g2="m" k="131" /> +<hkern g1="Yacute" g2="n" k="131" /> +<hkern g1="Yacute" g2="o" k="160" /> +<hkern g1="Yacute" g2="p" k="131" /> +<hkern g1="Yacute" g2="q" k="160" /> +<hkern g1="Yacute" g2="r" k="131" /> +<hkern g1="Yacute" g2="s" k="139" /> +<hkern g1="Yacute" g2="u" k="131" /> +<hkern g1="Yacute" g2="v" k="100" /> +<hkern g1="Yacute" g2="w" k="96" /> +<hkern g1="Yacute" g2="x" k="136" /> +<hkern g1="Yacute" g2="y" k="100" /> +<hkern g1="Yacute" g2="copyright" k="80" /> +<hkern g1="Yacute" g2="ordfeminine" k="-36" /> +<hkern g1="Yacute" g2="guillemotleft" k="160" /> +<hkern g1="Yacute" g2="uni00AD" k="160" /> +<hkern g1="Yacute" g2="registered" k="80" /> +<hkern g1="Yacute" g2="degree" k="-36" /> +<hkern g1="Yacute" g2="twosuperior" k="-56" /> +<hkern g1="Yacute" g2="threesuperior" k="-56" /> +<hkern g1="Yacute" g2="mu" k="131" /> +<hkern g1="Yacute" g2="middot" k="160" /> +<hkern g1="Yacute" g2="onesuperior" k="-56" /> +<hkern g1="Yacute" g2="ordmasculine" k="-36" /> +<hkern g1="Yacute" g2="guillemotright" k="160" /> +<hkern g1="Yacute" g2="Agrave" k="182" /> +<hkern g1="Yacute" g2="Aacute" k="182" /> +<hkern g1="Yacute" g2="Acircumflex" k="182" /> +<hkern g1="Yacute" g2="Atilde" k="182" /> +<hkern g1="Yacute" g2="Adieresis" k="182" /> +<hkern g1="Yacute" g2="Aring" k="182" /> +<hkern g1="Yacute" g2="AE" k="182" /> +<hkern g1="Yacute" g2="Ccedilla" k="80" /> +<hkern g1="Yacute" g2="Ograve" k="80" /> +<hkern g1="Yacute" g2="Oacute" k="80" /> +<hkern g1="Yacute" g2="Ocircumflex" k="80" /> +<hkern g1="Yacute" g2="Otilde" k="80" /> +<hkern g1="Yacute" g2="Odieresis" k="80" /> +<hkern g1="Yacute" g2="Oslash" k="80" /> +<hkern g1="Yacute" g2="agrave" k="145" /> +<hkern g1="Yacute" g2="aacute" k="145" /> +<hkern g1="Yacute" g2="acircumflex" k="145" /> +<hkern g1="Yacute" g2="atilde" k="145" /> +<hkern g1="Yacute" g2="adieresis" k="145" /> +<hkern g1="Yacute" g2="aring" k="145" /> +<hkern g1="Yacute" g2="ae" k="145" /> +<hkern g1="Yacute" g2="ccedilla" k="160" /> +<hkern g1="Yacute" g2="egrave" k="160" /> +<hkern g1="Yacute" g2="eacute" k="160" /> +<hkern g1="Yacute" g2="ecircumflex" k="160" /> +<hkern g1="Yacute" g2="edieresis" k="160" /> +<hkern g1="Yacute" g2="eth" k="160" /> +<hkern g1="Yacute" g2="ntilde" k="131" /> +<hkern g1="Yacute" g2="ograve" k="160" /> +<hkern g1="Yacute" g2="oacute" k="160" /> +<hkern g1="Yacute" g2="ocircumflex" k="160" /> +<hkern g1="Yacute" g2="otilde" k="160" /> +<hkern g1="Yacute" g2="odieresis" k="160" /> +<hkern g1="Yacute" g2="oslash" k="160" /> +<hkern g1="Yacute" g2="ugrave" k="131" /> +<hkern g1="Yacute" g2="uacute" k="131" /> +<hkern g1="Yacute" g2="ucircumflex" k="131" /> +<hkern g1="Yacute" g2="udieresis" k="131" /> +<hkern g1="Yacute" g2="yacute" k="100" /> +<hkern g1="Yacute" g2="ydieresis" k="100" /> +<hkern g1="Yacute" g2="dotlessi" k="131" /> +<hkern g1="Yacute" g2="OE" k="80" /> +<hkern g1="Yacute" g2="oe" k="160" /> +<hkern g1="Yacute" g2="endash" k="160" /> +<hkern g1="Yacute" g2="emdash" k="160" /> +<hkern g1="Yacute" g2="quoteleft" k="-36" /> +<hkern g1="Yacute" g2="quoteright" k="-36" /> +<hkern g1="Yacute" g2="quotesinglbase" k="167" /> +<hkern g1="Yacute" g2="quotedblleft" k="-36" /> +<hkern g1="Yacute" g2="quotedblright" k="-36" /> +<hkern g1="Yacute" g2="quotedblbase" k="167" /> +<hkern g1="Yacute" g2="bullet" k="160" /> +<hkern g1="Yacute" g2="guilsinglleft" k="160" /> +<hkern g1="Yacute" g2="guilsinglright" k="160" /> +<hkern g1="Thorn" g2="quotedbl" k="42" /> +<hkern g1="Thorn" g2="ampersand" k="51" /> +<hkern g1="Thorn" g2="quotesingle" k="42" /> +<hkern g1="Thorn" g2="parenright" k="40" /> +<hkern g1="Thorn" g2="asterisk" k="42" /> +<hkern g1="Thorn" g2="comma" k="52" /> +<hkern g1="Thorn" g2="period" k="52" /> +<hkern g1="Thorn" g2="slash" k="51" /> +<hkern g1="Thorn" g2="A" k="51" /> +<hkern g1="Thorn" g2="T" k="78" /> +<hkern g1="Thorn" g2="V" k="56" /> +<hkern g1="Thorn" g2="X" k="30" /> +<hkern g1="Thorn" g2="Y" k="80" /> +<hkern g1="Thorn" g2="Z" k="64" /> +<hkern g1="Thorn" g2="backslash" k="56" /> +<hkern g1="Thorn" g2="bracketright" k="40" /> +<hkern g1="Thorn" g2="braceright" k="40" /> +<hkern g1="Thorn" g2="ordfeminine" k="42" /> +<hkern g1="Thorn" g2="degree" k="42" /> +<hkern g1="Thorn" g2="ordmasculine" k="42" /> +<hkern g1="Thorn" g2="Agrave" k="51" /> +<hkern g1="Thorn" g2="Aacute" k="51" /> +<hkern g1="Thorn" g2="Acircumflex" k="51" /> +<hkern g1="Thorn" g2="Atilde" k="51" /> +<hkern g1="Thorn" g2="Adieresis" k="51" /> +<hkern g1="Thorn" g2="Aring" k="51" /> +<hkern g1="Thorn" g2="AE" k="51" /> +<hkern g1="Thorn" g2="Yacute" k="80" /> +<hkern g1="Thorn" g2="quoteleft" k="42" /> +<hkern g1="Thorn" g2="quoteright" k="42" /> +<hkern g1="Thorn" g2="quotesinglbase" k="52" /> +<hkern g1="Thorn" g2="quotedblleft" k="42" /> +<hkern g1="Thorn" g2="quotedblright" k="42" /> +<hkern g1="Thorn" g2="quotedblbase" k="52" /> +<hkern g1="agrave" g2="quotedbl" k="76" /> +<hkern g1="agrave" g2="quotesingle" k="76" /> +<hkern g1="agrave" g2="asterisk" k="76" /> +<hkern g1="agrave" g2="v" k="36" /> +<hkern g1="agrave" g2="w" k="18" /> +<hkern g1="agrave" g2="y" k="36" /> +<hkern g1="agrave" g2="ordfeminine" k="76" /> +<hkern g1="agrave" g2="degree" k="76" /> +<hkern g1="agrave" g2="twosuperior" k="76" /> +<hkern g1="agrave" g2="threesuperior" k="76" /> +<hkern g1="agrave" g2="onesuperior" k="76" /> +<hkern g1="agrave" g2="ordmasculine" k="76" /> +<hkern g1="agrave" g2="yacute" k="36" /> +<hkern g1="agrave" g2="ydieresis" k="36" /> +<hkern g1="agrave" g2="quoteleft" k="76" /> +<hkern g1="agrave" g2="quoteright" k="76" /> +<hkern g1="agrave" g2="quotedblleft" k="76" /> +<hkern g1="agrave" g2="quotedblright" k="76" /> +<hkern g1="aacute" g2="quotedbl" k="76" /> +<hkern g1="aacute" g2="quotesingle" k="76" /> +<hkern g1="aacute" g2="asterisk" k="76" /> +<hkern g1="aacute" g2="v" k="36" /> +<hkern g1="aacute" g2="w" k="18" /> +<hkern g1="aacute" g2="y" k="36" /> +<hkern g1="aacute" g2="ordfeminine" k="76" /> +<hkern g1="aacute" g2="degree" k="76" /> +<hkern g1="aacute" g2="twosuperior" k="76" /> +<hkern g1="aacute" g2="threesuperior" k="76" /> +<hkern g1="aacute" g2="onesuperior" k="76" /> +<hkern g1="aacute" g2="ordmasculine" k="76" /> +<hkern g1="aacute" g2="yacute" k="36" /> +<hkern g1="aacute" g2="ydieresis" k="36" /> +<hkern g1="aacute" g2="quoteleft" k="76" /> +<hkern g1="aacute" g2="quoteright" k="76" /> +<hkern g1="aacute" g2="quotedblleft" k="76" /> +<hkern g1="aacute" g2="quotedblright" k="76" /> +<hkern g1="acircumflex" g2="quotedbl" k="76" /> +<hkern g1="acircumflex" g2="quotesingle" k="76" /> +<hkern g1="acircumflex" g2="asterisk" k="76" /> +<hkern g1="acircumflex" g2="v" k="36" /> +<hkern g1="acircumflex" g2="w" k="18" /> +<hkern g1="acircumflex" g2="y" k="36" /> +<hkern g1="acircumflex" g2="ordfeminine" k="76" /> +<hkern g1="acircumflex" g2="degree" k="76" /> +<hkern g1="acircumflex" g2="twosuperior" k="76" /> +<hkern g1="acircumflex" g2="threesuperior" k="76" /> +<hkern g1="acircumflex" g2="onesuperior" k="76" /> +<hkern g1="acircumflex" g2="ordmasculine" k="76" /> +<hkern g1="acircumflex" g2="yacute" k="36" /> +<hkern g1="acircumflex" g2="ydieresis" k="36" /> +<hkern g1="acircumflex" g2="quoteleft" k="76" /> +<hkern g1="acircumflex" g2="quoteright" k="76" /> +<hkern g1="acircumflex" g2="quotedblleft" k="76" /> +<hkern g1="acircumflex" g2="quotedblright" k="76" /> +<hkern g1="atilde" g2="quotedbl" k="76" /> +<hkern g1="atilde" g2="quotesingle" k="76" /> +<hkern g1="atilde" g2="asterisk" k="76" /> +<hkern g1="atilde" g2="v" k="36" /> +<hkern g1="atilde" g2="w" k="18" /> +<hkern g1="atilde" g2="y" k="36" /> +<hkern g1="atilde" g2="ordfeminine" k="76" /> +<hkern g1="atilde" g2="degree" k="76" /> +<hkern g1="atilde" g2="twosuperior" k="76" /> +<hkern g1="atilde" g2="threesuperior" k="76" /> +<hkern g1="atilde" g2="onesuperior" k="76" /> +<hkern g1="atilde" g2="ordmasculine" k="76" /> +<hkern g1="atilde" g2="yacute" k="36" /> +<hkern g1="atilde" g2="ydieresis" k="36" /> +<hkern g1="atilde" g2="quoteleft" k="76" /> +<hkern g1="atilde" g2="quoteright" k="76" /> +<hkern g1="atilde" g2="quotedblleft" k="76" /> +<hkern g1="atilde" g2="quotedblright" k="76" /> +<hkern g1="adieresis" g2="quotedbl" k="76" /> +<hkern g1="adieresis" g2="quotesingle" k="76" /> +<hkern g1="adieresis" g2="asterisk" k="76" /> +<hkern g1="adieresis" g2="v" k="36" /> +<hkern g1="adieresis" g2="w" k="18" /> +<hkern g1="adieresis" g2="y" k="36" /> +<hkern g1="adieresis" g2="ordfeminine" k="76" /> +<hkern g1="adieresis" g2="degree" k="76" /> +<hkern g1="adieresis" g2="twosuperior" k="76" /> +<hkern g1="adieresis" g2="threesuperior" k="76" /> +<hkern g1="adieresis" g2="onesuperior" k="76" /> +<hkern g1="adieresis" g2="ordmasculine" k="76" /> +<hkern g1="adieresis" g2="yacute" k="36" /> +<hkern g1="adieresis" g2="ydieresis" k="36" /> +<hkern g1="adieresis" g2="quoteleft" k="76" /> +<hkern g1="adieresis" g2="quoteright" k="76" /> +<hkern g1="adieresis" g2="quotedblleft" k="76" /> +<hkern g1="adieresis" g2="quotedblright" k="76" /> +<hkern g1="aring" g2="quotedbl" k="76" /> +<hkern g1="aring" g2="quotesingle" k="76" /> +<hkern g1="aring" g2="asterisk" k="76" /> +<hkern g1="aring" g2="v" k="36" /> +<hkern g1="aring" g2="w" k="18" /> +<hkern g1="aring" g2="y" k="36" /> +<hkern g1="aring" g2="ordfeminine" k="76" /> +<hkern g1="aring" g2="degree" k="76" /> +<hkern g1="aring" g2="twosuperior" k="76" /> +<hkern g1="aring" g2="threesuperior" k="76" /> +<hkern g1="aring" g2="onesuperior" k="76" /> +<hkern g1="aring" g2="ordmasculine" k="76" /> +<hkern g1="aring" g2="yacute" k="36" /> +<hkern g1="aring" g2="ydieresis" k="36" /> +<hkern g1="aring" g2="quoteleft" k="76" /> +<hkern g1="aring" g2="quoteright" k="76" /> +<hkern g1="aring" g2="quotedblleft" k="76" /> +<hkern g1="aring" g2="quotedblright" k="76" /> +<hkern g1="ae" g2="quotedbl" k="96" /> +<hkern g1="ae" g2="quotesingle" k="96" /> +<hkern g1="ae" g2="parenright" k="36" /> +<hkern g1="ae" g2="asterisk" k="96" /> +<hkern g1="ae" g2="V" k="123" /> +<hkern g1="ae" g2="W" k="41" /> +<hkern g1="ae" g2="backslash" k="123" /> +<hkern g1="ae" g2="bracketright" k="36" /> +<hkern g1="ae" g2="v" k="33" /> +<hkern g1="ae" g2="x" k="60" /> +<hkern g1="ae" g2="y" k="33" /> +<hkern g1="ae" g2="braceright" k="36" /> +<hkern g1="ae" g2="ordfeminine" k="96" /> +<hkern g1="ae" g2="degree" k="96" /> +<hkern g1="ae" g2="ordmasculine" k="96" /> +<hkern g1="ae" g2="yacute" k="33" /> +<hkern g1="ae" g2="ydieresis" k="33" /> +<hkern g1="ae" g2="quoteleft" k="96" /> +<hkern g1="ae" g2="quoteright" k="96" /> +<hkern g1="ae" g2="quotedblleft" k="96" /> +<hkern g1="ae" g2="quotedblright" k="96" /> +<hkern g1="egrave" g2="quotedbl" k="96" /> +<hkern g1="egrave" g2="quotesingle" k="96" /> +<hkern g1="egrave" g2="parenright" k="36" /> +<hkern g1="egrave" g2="asterisk" k="96" /> +<hkern g1="egrave" g2="V" k="123" /> +<hkern g1="egrave" g2="W" k="41" /> +<hkern g1="egrave" g2="backslash" k="123" /> +<hkern g1="egrave" g2="bracketright" k="36" /> +<hkern g1="egrave" g2="v" k="33" /> +<hkern g1="egrave" g2="x" k="60" /> +<hkern g1="egrave" g2="y" k="33" /> +<hkern g1="egrave" g2="braceright" k="36" /> +<hkern g1="egrave" g2="ordfeminine" k="96" /> +<hkern g1="egrave" g2="degree" k="96" /> +<hkern g1="egrave" g2="ordmasculine" k="96" /> +<hkern g1="egrave" g2="yacute" k="33" /> +<hkern g1="egrave" g2="ydieresis" k="33" /> +<hkern g1="egrave" g2="quoteleft" k="96" /> +<hkern g1="egrave" g2="quoteright" k="96" /> +<hkern g1="egrave" g2="quotedblleft" k="96" /> +<hkern g1="egrave" g2="quotedblright" k="96" /> +<hkern g1="eacute" g2="quotedbl" k="96" /> +<hkern g1="eacute" g2="quotesingle" k="96" /> +<hkern g1="eacute" g2="parenright" k="36" /> +<hkern g1="eacute" g2="asterisk" k="96" /> +<hkern g1="eacute" g2="V" k="123" /> +<hkern g1="eacute" g2="W" k="41" /> +<hkern g1="eacute" g2="backslash" k="123" /> +<hkern g1="eacute" g2="bracketright" k="36" /> +<hkern g1="eacute" g2="v" k="33" /> +<hkern g1="eacute" g2="x" k="60" /> +<hkern g1="eacute" g2="y" k="33" /> +<hkern g1="eacute" g2="braceright" k="36" /> +<hkern g1="eacute" g2="ordfeminine" k="96" /> +<hkern g1="eacute" g2="degree" k="96" /> +<hkern g1="eacute" g2="ordmasculine" k="96" /> +<hkern g1="eacute" g2="yacute" k="33" /> +<hkern g1="eacute" g2="ydieresis" k="33" /> +<hkern g1="eacute" g2="quoteleft" k="96" /> +<hkern g1="eacute" g2="quoteright" k="96" /> +<hkern g1="eacute" g2="quotedblleft" k="96" /> +<hkern g1="eacute" g2="quotedblright" k="96" /> +<hkern g1="ecircumflex" g2="quotedbl" k="96" /> +<hkern g1="ecircumflex" g2="quotesingle" k="96" /> +<hkern g1="ecircumflex" g2="parenright" k="36" /> +<hkern g1="ecircumflex" g2="asterisk" k="96" /> +<hkern g1="ecircumflex" g2="V" k="123" /> +<hkern g1="ecircumflex" g2="W" k="41" /> +<hkern g1="ecircumflex" g2="backslash" k="123" /> +<hkern g1="ecircumflex" g2="bracketright" k="36" /> +<hkern g1="ecircumflex" g2="v" k="33" /> +<hkern g1="ecircumflex" g2="x" k="60" /> +<hkern g1="ecircumflex" g2="y" k="33" /> +<hkern g1="ecircumflex" g2="braceright" k="36" /> +<hkern g1="ecircumflex" g2="ordfeminine" k="96" /> +<hkern g1="ecircumflex" g2="degree" k="96" /> +<hkern g1="ecircumflex" g2="ordmasculine" k="96" /> +<hkern g1="ecircumflex" g2="yacute" k="33" /> +<hkern g1="ecircumflex" g2="ydieresis" k="33" /> +<hkern g1="ecircumflex" g2="quoteleft" k="96" /> +<hkern g1="ecircumflex" g2="quoteright" k="96" /> +<hkern g1="ecircumflex" g2="quotedblleft" k="96" /> +<hkern g1="ecircumflex" g2="quotedblright" k="96" /> +<hkern g1="edieresis" g2="quotedbl" k="96" /> +<hkern g1="edieresis" g2="quotesingle" k="96" /> +<hkern g1="edieresis" g2="parenright" k="36" /> +<hkern g1="edieresis" g2="asterisk" k="96" /> +<hkern g1="edieresis" g2="V" k="123" /> +<hkern g1="edieresis" g2="W" k="41" /> +<hkern g1="edieresis" g2="backslash" k="123" /> +<hkern g1="edieresis" g2="bracketright" k="36" /> +<hkern g1="edieresis" g2="v" k="33" /> +<hkern g1="edieresis" g2="x" k="60" /> +<hkern g1="edieresis" g2="y" k="33" /> +<hkern g1="edieresis" g2="braceright" k="36" /> +<hkern g1="edieresis" g2="ordfeminine" k="96" /> +<hkern g1="edieresis" g2="degree" k="96" /> +<hkern g1="edieresis" g2="ordmasculine" k="96" /> +<hkern g1="edieresis" g2="yacute" k="33" /> +<hkern g1="edieresis" g2="ydieresis" k="33" /> +<hkern g1="edieresis" g2="quoteleft" k="96" /> +<hkern g1="edieresis" g2="quoteright" k="96" /> +<hkern g1="edieresis" g2="quotedblleft" k="96" /> +<hkern g1="edieresis" g2="quotedblright" k="96" /> +<hkern g1="ntilde" g2="quotedbl" k="76" /> +<hkern g1="ntilde" g2="quotesingle" k="76" /> +<hkern g1="ntilde" g2="asterisk" k="76" /> +<hkern g1="ntilde" g2="v" k="36" /> +<hkern g1="ntilde" g2="w" k="18" /> +<hkern g1="ntilde" g2="y" k="36" /> +<hkern g1="ntilde" g2="ordfeminine" k="76" /> +<hkern g1="ntilde" g2="degree" k="76" /> +<hkern g1="ntilde" g2="twosuperior" k="76" /> +<hkern g1="ntilde" g2="threesuperior" k="76" /> +<hkern g1="ntilde" g2="onesuperior" k="76" /> +<hkern g1="ntilde" g2="ordmasculine" k="76" /> +<hkern g1="ntilde" g2="yacute" k="36" /> +<hkern g1="ntilde" g2="ydieresis" k="36" /> +<hkern g1="ntilde" g2="quoteleft" k="76" /> +<hkern g1="ntilde" g2="quoteright" k="76" /> +<hkern g1="ntilde" g2="quotedblleft" k="76" /> +<hkern g1="ntilde" g2="quotedblright" k="76" /> +<hkern g1="ograve" g2="quotedbl" k="96" /> +<hkern g1="ograve" g2="quotesingle" k="96" /> +<hkern g1="ograve" g2="parenright" k="36" /> +<hkern g1="ograve" g2="asterisk" k="96" /> +<hkern g1="ograve" g2="V" k="123" /> +<hkern g1="ograve" g2="W" k="41" /> +<hkern g1="ograve" g2="backslash" k="123" /> +<hkern g1="ograve" g2="bracketright" k="36" /> +<hkern g1="ograve" g2="v" k="33" /> +<hkern g1="ograve" g2="x" k="60" /> +<hkern g1="ograve" g2="y" k="33" /> +<hkern g1="ograve" g2="braceright" k="36" /> +<hkern g1="ograve" g2="ordfeminine" k="96" /> +<hkern g1="ograve" g2="degree" k="96" /> +<hkern g1="ograve" g2="ordmasculine" k="96" /> +<hkern g1="ograve" g2="yacute" k="33" /> +<hkern g1="ograve" g2="ydieresis" k="33" /> +<hkern g1="ograve" g2="quoteleft" k="96" /> +<hkern g1="ograve" g2="quoteright" k="96" /> +<hkern g1="ograve" g2="quotedblleft" k="96" /> +<hkern g1="ograve" g2="quotedblright" k="96" /> +<hkern g1="oacute" g2="quotedbl" k="96" /> +<hkern g1="oacute" g2="quotesingle" k="96" /> +<hkern g1="oacute" g2="parenright" k="36" /> +<hkern g1="oacute" g2="asterisk" k="96" /> +<hkern g1="oacute" g2="V" k="123" /> +<hkern g1="oacute" g2="W" k="41" /> +<hkern g1="oacute" g2="backslash" k="123" /> +<hkern g1="oacute" g2="bracketright" k="36" /> +<hkern g1="oacute" g2="v" k="33" /> +<hkern g1="oacute" g2="x" k="60" /> +<hkern g1="oacute" g2="y" k="33" /> +<hkern g1="oacute" g2="braceright" k="36" /> +<hkern g1="oacute" g2="ordfeminine" k="96" /> +<hkern g1="oacute" g2="degree" k="96" /> +<hkern g1="oacute" g2="ordmasculine" k="96" /> +<hkern g1="oacute" g2="yacute" k="33" /> +<hkern g1="oacute" g2="ydieresis" k="33" /> +<hkern g1="oacute" g2="quoteleft" k="96" /> +<hkern g1="oacute" g2="quoteright" k="96" /> +<hkern g1="oacute" g2="quotedblleft" k="96" /> +<hkern g1="oacute" g2="quotedblright" k="96" /> +<hkern g1="ocircumflex" g2="quotedbl" k="96" /> +<hkern g1="ocircumflex" g2="quotesingle" k="96" /> +<hkern g1="ocircumflex" g2="parenright" k="36" /> +<hkern g1="ocircumflex" g2="asterisk" k="96" /> +<hkern g1="ocircumflex" g2="V" k="123" /> +<hkern g1="ocircumflex" g2="W" k="41" /> +<hkern g1="ocircumflex" g2="backslash" k="123" /> +<hkern g1="ocircumflex" g2="bracketright" k="36" /> +<hkern g1="ocircumflex" g2="v" k="33" /> +<hkern g1="ocircumflex" g2="x" k="60" /> +<hkern g1="ocircumflex" g2="y" k="33" /> +<hkern g1="ocircumflex" g2="braceright" k="36" /> +<hkern g1="ocircumflex" g2="ordfeminine" k="96" /> +<hkern g1="ocircumflex" g2="degree" k="96" /> +<hkern g1="ocircumflex" g2="ordmasculine" k="96" /> +<hkern g1="ocircumflex" g2="yacute" k="33" /> +<hkern g1="ocircumflex" g2="ydieresis" k="33" /> +<hkern g1="ocircumflex" g2="quoteleft" k="96" /> +<hkern g1="ocircumflex" g2="quoteright" k="96" /> +<hkern g1="ocircumflex" g2="quotedblleft" k="96" /> +<hkern g1="ocircumflex" g2="quotedblright" k="96" /> +<hkern g1="otilde" g2="quotedbl" k="96" /> +<hkern g1="otilde" g2="quotesingle" k="96" /> +<hkern g1="otilde" g2="parenright" k="36" /> +<hkern g1="otilde" g2="asterisk" k="96" /> +<hkern g1="otilde" g2="V" k="123" /> +<hkern g1="otilde" g2="W" k="41" /> +<hkern g1="otilde" g2="backslash" k="123" /> +<hkern g1="otilde" g2="bracketright" k="36" /> +<hkern g1="otilde" g2="v" k="33" /> +<hkern g1="otilde" g2="x" k="60" /> +<hkern g1="otilde" g2="y" k="33" /> +<hkern g1="otilde" g2="braceright" k="36" /> +<hkern g1="otilde" g2="ordfeminine" k="96" /> +<hkern g1="otilde" g2="degree" k="96" /> +<hkern g1="otilde" g2="ordmasculine" k="96" /> +<hkern g1="otilde" g2="yacute" k="33" /> +<hkern g1="otilde" g2="ydieresis" k="33" /> +<hkern g1="otilde" g2="quoteleft" k="96" /> +<hkern g1="otilde" g2="quoteright" k="96" /> +<hkern g1="otilde" g2="quotedblleft" k="96" /> +<hkern g1="otilde" g2="quotedblright" k="96" /> +<hkern g1="odieresis" g2="quotedbl" k="96" /> +<hkern g1="odieresis" g2="quotesingle" k="96" /> +<hkern g1="odieresis" g2="parenright" k="36" /> +<hkern g1="odieresis" g2="asterisk" k="96" /> +<hkern g1="odieresis" g2="V" k="123" /> +<hkern g1="odieresis" g2="W" k="41" /> +<hkern g1="odieresis" g2="backslash" k="123" /> +<hkern g1="odieresis" g2="bracketright" k="36" /> +<hkern g1="odieresis" g2="v" k="33" /> +<hkern g1="odieresis" g2="x" k="60" /> +<hkern g1="odieresis" g2="y" k="33" /> +<hkern g1="odieresis" g2="braceright" k="36" /> +<hkern g1="odieresis" g2="ordfeminine" k="96" /> +<hkern g1="odieresis" g2="degree" k="96" /> +<hkern g1="odieresis" g2="ordmasculine" k="96" /> +<hkern g1="odieresis" g2="yacute" k="33" /> +<hkern g1="odieresis" g2="ydieresis" k="33" /> +<hkern g1="odieresis" g2="quoteleft" k="96" /> +<hkern g1="odieresis" g2="quoteright" k="96" /> +<hkern g1="odieresis" g2="quotedblleft" k="96" /> +<hkern g1="odieresis" g2="quotedblright" k="96" /> +<hkern g1="oslash" g2="quotedbl" k="96" /> +<hkern g1="oslash" g2="quotesingle" k="96" /> +<hkern g1="oslash" g2="parenright" k="36" /> +<hkern g1="oslash" g2="asterisk" k="96" /> +<hkern g1="oslash" g2="V" k="123" /> +<hkern g1="oslash" g2="W" k="41" /> +<hkern g1="oslash" g2="backslash" k="123" /> +<hkern g1="oslash" g2="bracketright" k="36" /> +<hkern g1="oslash" g2="v" k="33" /> +<hkern g1="oslash" g2="x" k="60" /> +<hkern g1="oslash" g2="y" k="33" /> +<hkern g1="oslash" g2="braceright" k="36" /> +<hkern g1="oslash" g2="ordfeminine" k="96" /> +<hkern g1="oslash" g2="degree" k="96" /> +<hkern g1="oslash" g2="ordmasculine" k="96" /> +<hkern g1="oslash" g2="yacute" k="33" /> +<hkern g1="oslash" g2="ydieresis" k="33" /> +<hkern g1="oslash" g2="quoteleft" k="96" /> +<hkern g1="oslash" g2="quoteright" k="96" /> +<hkern g1="oslash" g2="quotedblleft" k="96" /> +<hkern g1="oslash" g2="quotedblright" k="96" /> +<hkern g1="yacute" g2="ampersand" k="91" /> +<hkern g1="yacute" g2="comma" k="136" /> +<hkern g1="yacute" g2="period" k="136" /> +<hkern g1="yacute" g2="slash" k="91" /> +<hkern g1="yacute" g2="A" k="91" /> +<hkern g1="yacute" g2="c" k="33" /> +<hkern g1="yacute" g2="d" k="33" /> +<hkern g1="yacute" g2="e" k="33" /> +<hkern g1="yacute" g2="o" k="33" /> +<hkern g1="yacute" g2="q" k="33" /> +<hkern g1="yacute" g2="Agrave" k="91" /> +<hkern g1="yacute" g2="Aacute" k="91" /> +<hkern g1="yacute" g2="Acircumflex" k="91" /> +<hkern g1="yacute" g2="Atilde" k="91" /> +<hkern g1="yacute" g2="Adieresis" k="91" /> +<hkern g1="yacute" g2="Aring" k="91" /> +<hkern g1="yacute" g2="AE" k="91" /> +<hkern g1="yacute" g2="ccedilla" k="33" /> +<hkern g1="yacute" g2="egrave" k="33" /> +<hkern g1="yacute" g2="eacute" k="33" /> +<hkern g1="yacute" g2="ecircumflex" k="33" /> +<hkern g1="yacute" g2="edieresis" k="33" /> +<hkern g1="yacute" g2="eth" k="33" /> +<hkern g1="yacute" g2="ograve" k="33" /> +<hkern g1="yacute" g2="oacute" k="33" /> +<hkern g1="yacute" g2="ocircumflex" k="33" /> +<hkern g1="yacute" g2="otilde" k="33" /> +<hkern g1="yacute" g2="odieresis" k="33" /> +<hkern g1="yacute" g2="oslash" k="33" /> +<hkern g1="yacute" g2="oe" k="33" /> +<hkern g1="yacute" g2="quotesinglbase" k="136" /> +<hkern g1="yacute" g2="quotedblbase" k="136" /> +<hkern g1="thorn" g2="quotedbl" k="96" /> +<hkern g1="thorn" g2="quotesingle" k="96" /> +<hkern g1="thorn" g2="parenright" k="36" /> +<hkern g1="thorn" g2="asterisk" k="96" /> +<hkern g1="thorn" g2="V" k="123" /> +<hkern g1="thorn" g2="W" k="41" /> +<hkern g1="thorn" g2="backslash" k="123" /> +<hkern g1="thorn" g2="bracketright" k="36" /> +<hkern g1="thorn" g2="v" k="33" /> +<hkern g1="thorn" g2="x" k="60" /> +<hkern g1="thorn" g2="y" k="33" /> +<hkern g1="thorn" g2="braceright" k="36" /> +<hkern g1="thorn" g2="ordfeminine" k="96" /> +<hkern g1="thorn" g2="degree" k="96" /> +<hkern g1="thorn" g2="ordmasculine" k="96" /> +<hkern g1="thorn" g2="yacute" k="33" /> +<hkern g1="thorn" g2="ydieresis" k="33" /> +<hkern g1="thorn" g2="quoteleft" k="96" /> +<hkern g1="thorn" g2="quoteright" k="96" /> +<hkern g1="thorn" g2="quotedblleft" k="96" /> +<hkern g1="thorn" g2="quotedblright" k="96" /> +<hkern g1="ydieresis" g2="ampersand" k="91" /> +<hkern g1="ydieresis" g2="comma" k="136" /> +<hkern g1="ydieresis" g2="period" k="136" /> +<hkern g1="ydieresis" g2="slash" k="91" /> +<hkern g1="ydieresis" g2="A" k="91" /> +<hkern g1="ydieresis" g2="c" k="33" /> +<hkern g1="ydieresis" g2="d" k="33" /> +<hkern g1="ydieresis" g2="e" k="33" /> +<hkern g1="ydieresis" g2="o" k="33" /> +<hkern g1="ydieresis" g2="q" k="33" /> +<hkern g1="ydieresis" g2="Agrave" k="91" /> +<hkern g1="ydieresis" g2="Aacute" k="91" /> +<hkern g1="ydieresis" g2="Acircumflex" k="91" /> +<hkern g1="ydieresis" g2="Atilde" k="91" /> +<hkern g1="ydieresis" g2="Adieresis" k="91" /> +<hkern g1="ydieresis" g2="Aring" k="91" /> +<hkern g1="ydieresis" g2="AE" k="91" /> +<hkern g1="ydieresis" g2="ccedilla" k="33" /> +<hkern g1="ydieresis" g2="egrave" k="33" /> +<hkern g1="ydieresis" g2="eacute" k="33" /> +<hkern g1="ydieresis" g2="ecircumflex" k="33" /> +<hkern g1="ydieresis" g2="edieresis" k="33" /> +<hkern g1="ydieresis" g2="eth" k="33" /> +<hkern g1="ydieresis" g2="ograve" k="33" /> +<hkern g1="ydieresis" g2="oacute" k="33" /> +<hkern g1="ydieresis" g2="ocircumflex" k="33" /> +<hkern g1="ydieresis" g2="otilde" k="33" /> +<hkern g1="ydieresis" g2="odieresis" k="33" /> +<hkern g1="ydieresis" g2="oslash" k="33" /> +<hkern g1="ydieresis" g2="oe" k="33" /> +<hkern g1="ydieresis" g2="quotesinglbase" k="136" /> +<hkern g1="ydieresis" g2="quotedblbase" k="136" /> +<hkern g1="oe" g2="quotedbl" k="96" /> +<hkern g1="oe" g2="quotesingle" k="96" /> +<hkern g1="oe" g2="parenright" k="36" /> +<hkern g1="oe" g2="asterisk" k="96" /> +<hkern g1="oe" g2="V" k="123" /> +<hkern g1="oe" g2="W" k="41" /> +<hkern g1="oe" g2="backslash" k="123" /> +<hkern g1="oe" g2="bracketright" k="36" /> +<hkern g1="oe" g2="v" k="33" /> +<hkern g1="oe" g2="x" k="60" /> +<hkern g1="oe" g2="y" k="33" /> +<hkern g1="oe" g2="braceright" k="36" /> +<hkern g1="oe" g2="ordfeminine" k="96" /> +<hkern g1="oe" g2="degree" k="96" /> +<hkern g1="oe" g2="ordmasculine" k="96" /> +<hkern g1="oe" g2="yacute" k="33" /> +<hkern g1="oe" g2="ydieresis" k="33" /> +<hkern g1="oe" g2="quoteleft" k="96" /> +<hkern g1="oe" g2="quoteright" k="96" /> +<hkern g1="oe" g2="quotedblleft" k="96" /> +<hkern g1="oe" g2="quotedblright" k="96" /> +<hkern g1="endash" g2="quotedbl" k="169" /> +<hkern g1="endash" g2="ampersand" k="67" /> +<hkern g1="endash" g2="quotesingle" k="169" /> +<hkern g1="endash" g2="asterisk" k="169" /> +<hkern g1="endash" g2="comma" k="132" /> +<hkern g1="endash" g2="period" k="132" /> +<hkern g1="endash" g2="slash" k="67" /> +<hkern g1="endash" g2="A" k="67" /> +<hkern g1="endash" g2="T" k="180" /> +<hkern g1="endash" g2="V" k="116" /> +<hkern g1="endash" g2="W" k="36" /> +<hkern g1="endash" g2="X" k="66" /> +<hkern g1="endash" g2="Y" k="160" /> +<hkern g1="endash" g2="Z" k="48" /> +<hkern g1="endash" g2="backslash" k="116" /> +<hkern g1="endash" g2="ordfeminine" k="169" /> +<hkern g1="endash" g2="degree" k="169" /> +<hkern g1="endash" g2="ordmasculine" k="169" /> +<hkern g1="endash" g2="Agrave" k="67" /> +<hkern g1="endash" g2="Aacute" k="67" /> +<hkern g1="endash" g2="Acircumflex" k="67" /> +<hkern g1="endash" g2="Atilde" k="67" /> +<hkern g1="endash" g2="Adieresis" k="67" /> +<hkern g1="endash" g2="Aring" k="67" /> +<hkern g1="endash" g2="AE" k="67" /> +<hkern g1="endash" g2="Yacute" k="160" /> +<hkern g1="endash" g2="quoteleft" k="169" /> +<hkern g1="endash" g2="quoteright" k="169" /> +<hkern g1="endash" g2="quotesinglbase" k="132" /> +<hkern g1="endash" g2="quotedblleft" k="169" /> +<hkern g1="endash" g2="quotedblright" k="169" /> +<hkern g1="endash" g2="quotedblbase" k="132" /> +<hkern g1="emdash" g2="quotedbl" k="169" /> +<hkern g1="emdash" g2="ampersand" k="67" /> +<hkern g1="emdash" g2="quotesingle" k="169" /> +<hkern g1="emdash" g2="asterisk" k="169" /> +<hkern g1="emdash" g2="comma" k="132" /> +<hkern g1="emdash" g2="period" k="132" /> +<hkern g1="emdash" g2="slash" k="67" /> +<hkern g1="emdash" g2="A" k="67" /> +<hkern g1="emdash" g2="T" k="180" /> +<hkern g1="emdash" g2="V" k="116" /> +<hkern g1="emdash" g2="W" k="36" /> +<hkern g1="emdash" g2="X" k="66" /> +<hkern g1="emdash" g2="Y" k="160" /> +<hkern g1="emdash" g2="Z" k="48" /> +<hkern g1="emdash" g2="backslash" k="116" /> +<hkern g1="emdash" g2="ordfeminine" k="169" /> +<hkern g1="emdash" g2="degree" k="169" /> +<hkern g1="emdash" g2="ordmasculine" k="169" /> +<hkern g1="emdash" g2="Agrave" k="67" /> +<hkern g1="emdash" g2="Aacute" k="67" /> +<hkern g1="emdash" g2="Acircumflex" k="67" /> +<hkern g1="emdash" g2="Atilde" k="67" /> +<hkern g1="emdash" g2="Adieresis" k="67" /> +<hkern g1="emdash" g2="Aring" k="67" /> +<hkern g1="emdash" g2="AE" k="67" /> +<hkern g1="emdash" g2="Yacute" k="160" /> +<hkern g1="emdash" g2="quoteleft" k="169" /> +<hkern g1="emdash" g2="quoteright" k="169" /> +<hkern g1="emdash" g2="quotesinglbase" k="132" /> +<hkern g1="emdash" g2="quotedblleft" k="169" /> +<hkern g1="emdash" g2="quotedblright" k="169" /> +<hkern g1="emdash" g2="quotedblbase" k="132" /> +<hkern g1="quoteleft" g2="ampersand" k="191" /> +<hkern g1="quoteleft" g2="comma" k="213" /> +<hkern g1="quoteleft" g2="hyphen" k="169" /> +<hkern g1="quoteleft" g2="period" k="213" /> +<hkern g1="quoteleft" g2="slash" k="191" /> +<hkern g1="quoteleft" g2="at" k="42" /> +<hkern g1="quoteleft" g2="A" k="191" /> +<hkern g1="quoteleft" g2="C" k="42" /> +<hkern g1="quoteleft" g2="G" k="42" /> +<hkern g1="quoteleft" g2="O" k="42" /> +<hkern g1="quoteleft" g2="Q" k="42" /> +<hkern g1="quoteleft" g2="V" k="-44" /> +<hkern g1="quoteleft" g2="W" k="-44" /> +<hkern g1="quoteleft" g2="Y" k="-36" /> +<hkern g1="quoteleft" g2="backslash" k="-44" /> +<hkern g1="quoteleft" g2="a" k="66" /> +<hkern g1="quoteleft" g2="c" k="96" /> +<hkern g1="quoteleft" g2="d" k="96" /> +<hkern g1="quoteleft" g2="e" k="96" /> +<hkern g1="quoteleft" g2="o" k="96" /> +<hkern g1="quoteleft" g2="q" k="96" /> +<hkern g1="quoteleft" g2="copyright" k="42" /> +<hkern g1="quoteleft" g2="guillemotleft" k="169" /> +<hkern g1="quoteleft" g2="uni00AD" k="169" /> +<hkern g1="quoteleft" g2="registered" k="42" /> +<hkern g1="quoteleft" g2="middot" k="169" /> +<hkern g1="quoteleft" g2="guillemotright" k="169" /> +<hkern g1="quoteleft" g2="Agrave" k="191" /> +<hkern g1="quoteleft" g2="Aacute" k="191" /> +<hkern g1="quoteleft" g2="Acircumflex" k="191" /> +<hkern g1="quoteleft" g2="Atilde" k="191" /> +<hkern g1="quoteleft" g2="Adieresis" k="191" /> +<hkern g1="quoteleft" g2="Aring" k="191" /> +<hkern g1="quoteleft" g2="AE" k="191" /> +<hkern g1="quoteleft" g2="Ccedilla" k="42" /> +<hkern g1="quoteleft" g2="Ograve" k="42" /> +<hkern g1="quoteleft" g2="Oacute" k="42" /> +<hkern g1="quoteleft" g2="Ocircumflex" k="42" /> +<hkern g1="quoteleft" g2="Otilde" k="42" /> +<hkern g1="quoteleft" g2="Odieresis" k="42" /> +<hkern g1="quoteleft" g2="Oslash" k="42" /> +<hkern g1="quoteleft" g2="Yacute" k="-36" /> +<hkern g1="quoteleft" g2="agrave" k="66" /> +<hkern g1="quoteleft" g2="aacute" k="66" /> +<hkern g1="quoteleft" g2="acircumflex" k="66" /> +<hkern g1="quoteleft" g2="atilde" k="66" /> +<hkern g1="quoteleft" g2="adieresis" k="66" /> +<hkern g1="quoteleft" g2="aring" k="66" /> +<hkern g1="quoteleft" g2="ae" k="66" /> +<hkern g1="quoteleft" g2="ccedilla" k="96" /> +<hkern g1="quoteleft" g2="egrave" k="96" /> +<hkern g1="quoteleft" g2="eacute" k="96" /> +<hkern g1="quoteleft" g2="ecircumflex" k="96" /> +<hkern g1="quoteleft" g2="edieresis" k="96" /> +<hkern g1="quoteleft" g2="eth" k="96" /> +<hkern g1="quoteleft" g2="ograve" k="96" /> +<hkern g1="quoteleft" g2="oacute" k="96" /> +<hkern g1="quoteleft" g2="ocircumflex" k="96" /> +<hkern g1="quoteleft" g2="otilde" k="96" /> +<hkern g1="quoteleft" g2="odieresis" k="96" /> +<hkern g1="quoteleft" g2="oslash" k="96" /> +<hkern g1="quoteleft" g2="OE" k="42" /> +<hkern g1="quoteleft" g2="oe" k="96" /> +<hkern g1="quoteleft" g2="endash" k="169" /> +<hkern g1="quoteleft" g2="emdash" k="169" /> +<hkern g1="quoteleft" g2="quotesinglbase" k="213" /> +<hkern g1="quoteleft" g2="quotedblbase" k="213" /> +<hkern g1="quoteleft" g2="bullet" k="169" /> +<hkern g1="quoteleft" g2="guilsinglleft" k="169" /> +<hkern g1="quoteleft" g2="guilsinglright" k="169" /> +<hkern g1="quoteright" g2="ampersand" k="191" /> +<hkern g1="quoteright" g2="comma" k="213" /> +<hkern g1="quoteright" g2="hyphen" k="169" /> +<hkern g1="quoteright" g2="period" k="213" /> +<hkern g1="quoteright" g2="slash" k="191" /> +<hkern g1="quoteright" g2="at" k="42" /> +<hkern g1="quoteright" g2="A" k="191" /> +<hkern g1="quoteright" g2="C" k="42" /> +<hkern g1="quoteright" g2="G" k="42" /> +<hkern g1="quoteright" g2="O" k="42" /> +<hkern g1="quoteright" g2="Q" k="42" /> +<hkern g1="quoteright" g2="V" k="-44" /> +<hkern g1="quoteright" g2="W" k="-44" /> +<hkern g1="quoteright" g2="Y" k="-36" /> +<hkern g1="quoteright" g2="backslash" k="-44" /> +<hkern g1="quoteright" g2="a" k="66" /> +<hkern g1="quoteright" g2="c" k="96" /> +<hkern g1="quoteright" g2="d" k="96" /> +<hkern g1="quoteright" g2="e" k="96" /> +<hkern g1="quoteright" g2="o" k="96" /> +<hkern g1="quoteright" g2="q" k="96" /> +<hkern g1="quoteright" g2="copyright" k="42" /> +<hkern g1="quoteright" g2="guillemotleft" k="169" /> +<hkern g1="quoteright" g2="uni00AD" k="169" /> +<hkern g1="quoteright" g2="registered" k="42" /> +<hkern g1="quoteright" g2="middot" k="169" /> +<hkern g1="quoteright" g2="guillemotright" k="169" /> +<hkern g1="quoteright" g2="Agrave" k="191" /> +<hkern g1="quoteright" g2="Aacute" k="191" /> +<hkern g1="quoteright" g2="Acircumflex" k="191" /> +<hkern g1="quoteright" g2="Atilde" k="191" /> +<hkern g1="quoteright" g2="Adieresis" k="191" /> +<hkern g1="quoteright" g2="Aring" k="191" /> +<hkern g1="quoteright" g2="AE" k="191" /> +<hkern g1="quoteright" g2="Ccedilla" k="42" /> +<hkern g1="quoteright" g2="Ograve" k="42" /> +<hkern g1="quoteright" g2="Oacute" k="42" /> +<hkern g1="quoteright" g2="Ocircumflex" k="42" /> +<hkern g1="quoteright" g2="Otilde" k="42" /> +<hkern g1="quoteright" g2="Odieresis" k="42" /> +<hkern g1="quoteright" g2="Oslash" k="42" /> +<hkern g1="quoteright" g2="Yacute" k="-36" /> +<hkern g1="quoteright" g2="agrave" k="66" /> +<hkern g1="quoteright" g2="aacute" k="66" /> +<hkern g1="quoteright" g2="acircumflex" k="66" /> +<hkern g1="quoteright" g2="atilde" k="66" /> +<hkern g1="quoteright" g2="adieresis" k="66" /> +<hkern g1="quoteright" g2="aring" k="66" /> +<hkern g1="quoteright" g2="ae" k="66" /> +<hkern g1="quoteright" g2="ccedilla" k="96" /> +<hkern g1="quoteright" g2="egrave" k="96" /> +<hkern g1="quoteright" g2="eacute" k="96" /> +<hkern g1="quoteright" g2="ecircumflex" k="96" /> +<hkern g1="quoteright" g2="edieresis" k="96" /> +<hkern g1="quoteright" g2="eth" k="96" /> +<hkern g1="quoteright" g2="ograve" k="96" /> +<hkern g1="quoteright" g2="oacute" k="96" /> +<hkern g1="quoteright" g2="ocircumflex" k="96" /> +<hkern g1="quoteright" g2="otilde" k="96" /> +<hkern g1="quoteright" g2="odieresis" k="96" /> +<hkern g1="quoteright" g2="oslash" k="96" /> +<hkern g1="quoteright" g2="OE" k="42" /> +<hkern g1="quoteright" g2="oe" k="96" /> +<hkern g1="quoteright" g2="endash" k="169" /> +<hkern g1="quoteright" g2="emdash" k="169" /> +<hkern g1="quoteright" g2="quotesinglbase" k="213" /> +<hkern g1="quoteright" g2="quotedblbase" k="213" /> +<hkern g1="quoteright" g2="bullet" k="169" /> +<hkern g1="quoteright" g2="guilsinglleft" k="169" /> +<hkern g1="quoteright" g2="guilsinglright" k="169" /> +<hkern g1="quotesinglbase" g2="quotedbl" k="213" /> +<hkern g1="quotesinglbase" g2="quotesingle" k="213" /> +<hkern g1="quotesinglbase" g2="asterisk" k="213" /> +<hkern g1="quotesinglbase" g2="hyphen" k="132" /> +<hkern g1="quotesinglbase" g2="at" k="52" /> +<hkern g1="quotesinglbase" g2="C" k="52" /> +<hkern g1="quotesinglbase" g2="G" k="52" /> +<hkern g1="quotesinglbase" g2="O" k="52" /> +<hkern g1="quotesinglbase" g2="Q" k="52" /> +<hkern g1="quotesinglbase" g2="T" k="180" /> +<hkern g1="quotesinglbase" g2="V" k="180" /> +<hkern g1="quotesinglbase" g2="W" k="131" /> +<hkern g1="quotesinglbase" g2="Y" k="167" /> +<hkern g1="quotesinglbase" g2="backslash" k="180" /> +<hkern g1="quotesinglbase" g2="v" k="136" /> +<hkern g1="quotesinglbase" g2="w" k="71" /> +<hkern g1="quotesinglbase" g2="y" k="136" /> +<hkern g1="quotesinglbase" g2="copyright" k="52" /> +<hkern g1="quotesinglbase" g2="ordfeminine" k="213" /> +<hkern g1="quotesinglbase" g2="guillemotleft" k="132" /> +<hkern g1="quotesinglbase" g2="uni00AD" k="132" /> +<hkern g1="quotesinglbase" g2="registered" k="52" /> +<hkern g1="quotesinglbase" g2="degree" k="213" /> +<hkern g1="quotesinglbase" g2="middot" k="132" /> +<hkern g1="quotesinglbase" g2="ordmasculine" k="213" /> +<hkern g1="quotesinglbase" g2="guillemotright" k="132" /> +<hkern g1="quotesinglbase" g2="Ccedilla" k="52" /> +<hkern g1="quotesinglbase" g2="Ograve" k="52" /> +<hkern g1="quotesinglbase" g2="Oacute" k="52" /> +<hkern g1="quotesinglbase" g2="Ocircumflex" k="52" /> +<hkern g1="quotesinglbase" g2="Otilde" k="52" /> +<hkern g1="quotesinglbase" g2="Odieresis" k="52" /> +<hkern g1="quotesinglbase" g2="Oslash" k="52" /> +<hkern g1="quotesinglbase" g2="Yacute" k="167" /> +<hkern g1="quotesinglbase" g2="yacute" k="136" /> +<hkern g1="quotesinglbase" g2="ydieresis" k="136" /> +<hkern g1="quotesinglbase" g2="OE" k="52" /> +<hkern g1="quotesinglbase" g2="endash" k="132" /> +<hkern g1="quotesinglbase" g2="emdash" k="132" /> +<hkern g1="quotesinglbase" g2="quoteleft" k="213" /> +<hkern g1="quotesinglbase" g2="quoteright" k="213" /> +<hkern g1="quotesinglbase" g2="quotedblleft" k="213" /> +<hkern g1="quotesinglbase" g2="quotedblright" k="213" /> +<hkern g1="quotesinglbase" g2="bullet" k="132" /> +<hkern g1="quotesinglbase" g2="guilsinglleft" k="132" /> +<hkern g1="quotesinglbase" g2="guilsinglright" k="132" /> +<hkern g1="quotedblleft" g2="ampersand" k="191" /> +<hkern g1="quotedblleft" g2="comma" k="213" /> +<hkern g1="quotedblleft" g2="hyphen" k="169" /> +<hkern g1="quotedblleft" g2="period" k="213" /> +<hkern g1="quotedblleft" g2="slash" k="191" /> +<hkern g1="quotedblleft" g2="at" k="42" /> +<hkern g1="quotedblleft" g2="A" k="191" /> +<hkern g1="quotedblleft" g2="C" k="42" /> +<hkern g1="quotedblleft" g2="G" k="42" /> +<hkern g1="quotedblleft" g2="O" k="42" /> +<hkern g1="quotedblleft" g2="Q" k="42" /> +<hkern g1="quotedblleft" g2="V" k="-44" /> +<hkern g1="quotedblleft" g2="W" k="-44" /> +<hkern g1="quotedblleft" g2="Y" k="-36" /> +<hkern g1="quotedblleft" g2="backslash" k="-44" /> +<hkern g1="quotedblleft" g2="a" k="66" /> +<hkern g1="quotedblleft" g2="c" k="96" /> +<hkern g1="quotedblleft" g2="d" k="96" /> +<hkern g1="quotedblleft" g2="e" k="96" /> +<hkern g1="quotedblleft" g2="o" k="96" /> +<hkern g1="quotedblleft" g2="q" k="96" /> +<hkern g1="quotedblleft" g2="copyright" k="42" /> +<hkern g1="quotedblleft" g2="guillemotleft" k="169" /> +<hkern g1="quotedblleft" g2="uni00AD" k="169" /> +<hkern g1="quotedblleft" g2="registered" k="42" /> +<hkern g1="quotedblleft" g2="middot" k="169" /> +<hkern g1="quotedblleft" g2="guillemotright" k="169" /> +<hkern g1="quotedblleft" g2="Agrave" k="191" /> +<hkern g1="quotedblleft" g2="Aacute" k="191" /> +<hkern g1="quotedblleft" g2="Acircumflex" k="191" /> +<hkern g1="quotedblleft" g2="Atilde" k="191" /> +<hkern g1="quotedblleft" g2="Adieresis" k="191" /> +<hkern g1="quotedblleft" g2="Aring" k="191" /> +<hkern g1="quotedblleft" g2="AE" k="191" /> +<hkern g1="quotedblleft" g2="Ccedilla" k="42" /> +<hkern g1="quotedblleft" g2="Ograve" k="42" /> +<hkern g1="quotedblleft" g2="Oacute" k="42" /> +<hkern g1="quotedblleft" g2="Ocircumflex" k="42" /> +<hkern g1="quotedblleft" g2="Otilde" k="42" /> +<hkern g1="quotedblleft" g2="Odieresis" k="42" /> +<hkern g1="quotedblleft" g2="Oslash" k="42" /> +<hkern g1="quotedblleft" g2="Yacute" k="-36" /> +<hkern g1="quotedblleft" g2="agrave" k="66" /> +<hkern g1="quotedblleft" g2="aacute" k="66" /> +<hkern g1="quotedblleft" g2="acircumflex" k="66" /> +<hkern g1="quotedblleft" g2="atilde" k="66" /> +<hkern g1="quotedblleft" g2="adieresis" k="66" /> +<hkern g1="quotedblleft" g2="aring" k="66" /> +<hkern g1="quotedblleft" g2="ae" k="66" /> +<hkern g1="quotedblleft" g2="ccedilla" k="96" /> +<hkern g1="quotedblleft" g2="egrave" k="96" /> +<hkern g1="quotedblleft" g2="eacute" k="96" /> +<hkern g1="quotedblleft" g2="ecircumflex" k="96" /> +<hkern g1="quotedblleft" g2="edieresis" k="96" /> +<hkern g1="quotedblleft" g2="eth" k="96" /> +<hkern g1="quotedblleft" g2="ograve" k="96" /> +<hkern g1="quotedblleft" g2="oacute" k="96" /> +<hkern g1="quotedblleft" g2="ocircumflex" k="96" /> +<hkern g1="quotedblleft" g2="otilde" k="96" /> +<hkern g1="quotedblleft" g2="odieresis" k="96" /> +<hkern g1="quotedblleft" g2="oslash" k="96" /> +<hkern g1="quotedblleft" g2="OE" k="42" /> +<hkern g1="quotedblleft" g2="oe" k="96" /> +<hkern g1="quotedblleft" g2="endash" k="169" /> +<hkern g1="quotedblleft" g2="emdash" k="169" /> +<hkern g1="quotedblleft" g2="quotesinglbase" k="213" /> +<hkern g1="quotedblleft" g2="quotedblbase" k="213" /> +<hkern g1="quotedblleft" g2="bullet" k="169" /> +<hkern g1="quotedblleft" g2="guilsinglleft" k="169" /> +<hkern g1="quotedblleft" g2="guilsinglright" k="169" /> +<hkern g1="quotedblright" g2="ampersand" k="191" /> +<hkern g1="quotedblright" g2="comma" k="213" /> +<hkern g1="quotedblright" g2="hyphen" k="169" /> +<hkern g1="quotedblright" g2="period" k="213" /> +<hkern g1="quotedblright" g2="slash" k="191" /> +<hkern g1="quotedblright" g2="at" k="42" /> +<hkern g1="quotedblright" g2="A" k="191" /> +<hkern g1="quotedblright" g2="C" k="42" /> +<hkern g1="quotedblright" g2="G" k="42" /> +<hkern g1="quotedblright" g2="O" k="42" /> +<hkern g1="quotedblright" g2="Q" k="42" /> +<hkern g1="quotedblright" g2="V" k="-44" /> +<hkern g1="quotedblright" g2="W" k="-44" /> +<hkern g1="quotedblright" g2="Y" k="-36" /> +<hkern g1="quotedblright" g2="backslash" k="-44" /> +<hkern g1="quotedblright" g2="a" k="66" /> +<hkern g1="quotedblright" g2="c" k="96" /> +<hkern g1="quotedblright" g2="d" k="96" /> +<hkern g1="quotedblright" g2="e" k="96" /> +<hkern g1="quotedblright" g2="o" k="96" /> +<hkern g1="quotedblright" g2="q" k="96" /> +<hkern g1="quotedblright" g2="copyright" k="42" /> +<hkern g1="quotedblright" g2="guillemotleft" k="169" /> +<hkern g1="quotedblright" g2="uni00AD" k="169" /> +<hkern g1="quotedblright" g2="registered" k="42" /> +<hkern g1="quotedblright" g2="middot" k="169" /> +<hkern g1="quotedblright" g2="guillemotright" k="169" /> +<hkern g1="quotedblright" g2="Agrave" k="191" /> +<hkern g1="quotedblright" g2="Aacute" k="191" /> +<hkern g1="quotedblright" g2="Acircumflex" k="191" /> +<hkern g1="quotedblright" g2="Atilde" k="191" /> +<hkern g1="quotedblright" g2="Adieresis" k="191" /> +<hkern g1="quotedblright" g2="Aring" k="191" /> +<hkern g1="quotedblright" g2="AE" k="191" /> +<hkern g1="quotedblright" g2="Ccedilla" k="42" /> +<hkern g1="quotedblright" g2="Ograve" k="42" /> +<hkern g1="quotedblright" g2="Oacute" k="42" /> +<hkern g1="quotedblright" g2="Ocircumflex" k="42" /> +<hkern g1="quotedblright" g2="Otilde" k="42" /> +<hkern g1="quotedblright" g2="Odieresis" k="42" /> +<hkern g1="quotedblright" g2="Oslash" k="42" /> +<hkern g1="quotedblright" g2="Yacute" k="-36" /> +<hkern g1="quotedblright" g2="agrave" k="66" /> +<hkern g1="quotedblright" g2="aacute" k="66" /> +<hkern g1="quotedblright" g2="acircumflex" k="66" /> +<hkern g1="quotedblright" g2="atilde" k="66" /> +<hkern g1="quotedblright" g2="adieresis" k="66" /> +<hkern g1="quotedblright" g2="aring" k="66" /> +<hkern g1="quotedblright" g2="ae" k="66" /> +<hkern g1="quotedblright" g2="ccedilla" k="96" /> +<hkern g1="quotedblright" g2="egrave" k="96" /> +<hkern g1="quotedblright" g2="eacute" k="96" /> +<hkern g1="quotedblright" g2="ecircumflex" k="96" /> +<hkern g1="quotedblright" g2="edieresis" k="96" /> +<hkern g1="quotedblright" g2="eth" k="96" /> +<hkern g1="quotedblright" g2="ograve" k="96" /> +<hkern g1="quotedblright" g2="oacute" k="96" /> +<hkern g1="quotedblright" g2="ocircumflex" k="96" /> +<hkern g1="quotedblright" g2="otilde" k="96" /> +<hkern g1="quotedblright" g2="odieresis" k="96" /> +<hkern g1="quotedblright" g2="oslash" k="96" /> +<hkern g1="quotedblright" g2="OE" k="42" /> +<hkern g1="quotedblright" g2="oe" k="96" /> +<hkern g1="quotedblright" g2="endash" k="169" /> +<hkern g1="quotedblright" g2="emdash" k="169" /> +<hkern g1="quotedblright" g2="quotesinglbase" k="213" /> +<hkern g1="quotedblright" g2="quotedblbase" k="213" /> +<hkern g1="quotedblright" g2="bullet" k="169" /> +<hkern g1="quotedblright" g2="guilsinglleft" k="169" /> +<hkern g1="quotedblright" g2="guilsinglright" k="169" /> +<hkern g1="quotedblbase" g2="quotedbl" k="213" /> +<hkern g1="quotedblbase" g2="quotesingle" k="213" /> +<hkern g1="quotedblbase" g2="asterisk" k="213" /> +<hkern g1="quotedblbase" g2="hyphen" k="132" /> +<hkern g1="quotedblbase" g2="at" k="52" /> +<hkern g1="quotedblbase" g2="C" k="52" /> +<hkern g1="quotedblbase" g2="G" k="52" /> +<hkern g1="quotedblbase" g2="O" k="52" /> +<hkern g1="quotedblbase" g2="Q" k="52" /> +<hkern g1="quotedblbase" g2="T" k="180" /> +<hkern g1="quotedblbase" g2="V" k="180" /> +<hkern g1="quotedblbase" g2="W" k="131" /> +<hkern g1="quotedblbase" g2="Y" k="167" /> +<hkern g1="quotedblbase" g2="backslash" k="180" /> +<hkern g1="quotedblbase" g2="v" k="136" /> +<hkern g1="quotedblbase" g2="w" k="71" /> +<hkern g1="quotedblbase" g2="y" k="136" /> +<hkern g1="quotedblbase" g2="copyright" k="52" /> +<hkern g1="quotedblbase" g2="ordfeminine" k="213" /> +<hkern g1="quotedblbase" g2="guillemotleft" k="132" /> +<hkern g1="quotedblbase" g2="uni00AD" k="132" /> +<hkern g1="quotedblbase" g2="registered" k="52" /> +<hkern g1="quotedblbase" g2="degree" k="213" /> +<hkern g1="quotedblbase" g2="middot" k="132" /> +<hkern g1="quotedblbase" g2="ordmasculine" k="213" /> +<hkern g1="quotedblbase" g2="guillemotright" k="132" /> +<hkern g1="quotedblbase" g2="Ccedilla" k="52" /> +<hkern g1="quotedblbase" g2="Ograve" k="52" /> +<hkern g1="quotedblbase" g2="Oacute" k="52" /> +<hkern g1="quotedblbase" g2="Ocircumflex" k="52" /> +<hkern g1="quotedblbase" g2="Otilde" k="52" /> +<hkern g1="quotedblbase" g2="Odieresis" k="52" /> +<hkern g1="quotedblbase" g2="Oslash" k="52" /> +<hkern g1="quotedblbase" g2="Yacute" k="167" /> +<hkern g1="quotedblbase" g2="yacute" k="136" /> +<hkern g1="quotedblbase" g2="ydieresis" k="136" /> +<hkern g1="quotedblbase" g2="OE" k="52" /> +<hkern g1="quotedblbase" g2="endash" k="132" /> +<hkern g1="quotedblbase" g2="emdash" k="132" /> +<hkern g1="quotedblbase" g2="quoteleft" k="213" /> +<hkern g1="quotedblbase" g2="quoteright" k="213" /> +<hkern g1="quotedblbase" g2="quotedblleft" k="213" /> +<hkern g1="quotedblbase" g2="quotedblright" k="213" /> +<hkern g1="quotedblbase" g2="bullet" k="132" /> +<hkern g1="quotedblbase" g2="guilsinglleft" k="132" /> +<hkern g1="quotedblbase" g2="guilsinglright" k="132" /> +<hkern g1="bullet" g2="quotedbl" k="169" /> +<hkern g1="bullet" g2="ampersand" k="67" /> +<hkern g1="bullet" g2="quotesingle" k="169" /> +<hkern g1="bullet" g2="asterisk" k="169" /> +<hkern g1="bullet" g2="comma" k="132" /> +<hkern g1="bullet" g2="period" k="132" /> +<hkern g1="bullet" g2="slash" k="67" /> +<hkern g1="bullet" g2="A" k="67" /> +<hkern g1="bullet" g2="T" k="180" /> +<hkern g1="bullet" g2="V" k="116" /> +<hkern g1="bullet" g2="W" k="36" /> +<hkern g1="bullet" g2="X" k="66" /> +<hkern g1="bullet" g2="Y" k="160" /> +<hkern g1="bullet" g2="Z" k="48" /> +<hkern g1="bullet" g2="backslash" k="116" /> +<hkern g1="bullet" g2="ordfeminine" k="169" /> +<hkern g1="bullet" g2="degree" k="169" /> +<hkern g1="bullet" g2="ordmasculine" k="169" /> +<hkern g1="bullet" g2="Agrave" k="67" /> +<hkern g1="bullet" g2="Aacute" k="67" /> +<hkern g1="bullet" g2="Acircumflex" k="67" /> +<hkern g1="bullet" g2="Atilde" k="67" /> +<hkern g1="bullet" g2="Adieresis" k="67" /> +<hkern g1="bullet" g2="Aring" k="67" /> +<hkern g1="bullet" g2="AE" k="67" /> +<hkern g1="bullet" g2="Yacute" k="160" /> +<hkern g1="bullet" g2="quoteleft" k="169" /> +<hkern g1="bullet" g2="quoteright" k="169" /> +<hkern g1="bullet" g2="quotesinglbase" k="132" /> +<hkern g1="bullet" g2="quotedblleft" k="169" /> +<hkern g1="bullet" g2="quotedblright" k="169" /> +<hkern g1="bullet" g2="quotedblbase" k="132" /> +<hkern g1="guilsinglleft" g2="quotedbl" k="169" /> +<hkern g1="guilsinglleft" g2="ampersand" k="67" /> +<hkern g1="guilsinglleft" g2="quotesingle" k="169" /> +<hkern g1="guilsinglleft" g2="asterisk" k="169" /> +<hkern g1="guilsinglleft" g2="comma" k="132" /> +<hkern g1="guilsinglleft" g2="period" k="132" /> +<hkern g1="guilsinglleft" g2="slash" k="67" /> +<hkern g1="guilsinglleft" g2="A" k="67" /> +<hkern g1="guilsinglleft" g2="T" k="180" /> +<hkern g1="guilsinglleft" g2="V" k="116" /> +<hkern g1="guilsinglleft" g2="W" k="36" /> +<hkern g1="guilsinglleft" g2="X" k="66" /> +<hkern g1="guilsinglleft" g2="Y" k="160" /> +<hkern g1="guilsinglleft" g2="Z" k="48" /> +<hkern g1="guilsinglleft" g2="backslash" k="116" /> +<hkern g1="guilsinglleft" g2="ordfeminine" k="169" /> +<hkern g1="guilsinglleft" g2="degree" k="169" /> +<hkern g1="guilsinglleft" g2="ordmasculine" k="169" /> +<hkern g1="guilsinglleft" g2="Agrave" k="67" /> +<hkern g1="guilsinglleft" g2="Aacute" k="67" /> +<hkern g1="guilsinglleft" g2="Acircumflex" k="67" /> +<hkern g1="guilsinglleft" g2="Atilde" k="67" /> +<hkern g1="guilsinglleft" g2="Adieresis" k="67" /> +<hkern g1="guilsinglleft" g2="Aring" k="67" /> +<hkern g1="guilsinglleft" g2="AE" k="67" /> +<hkern g1="guilsinglleft" g2="Yacute" k="160" /> +<hkern g1="guilsinglleft" g2="quoteleft" k="169" /> +<hkern g1="guilsinglleft" g2="quoteright" k="169" /> +<hkern g1="guilsinglleft" g2="quotesinglbase" k="132" /> +<hkern g1="guilsinglleft" g2="quotedblleft" k="169" /> +<hkern g1="guilsinglleft" g2="quotedblright" k="169" /> +<hkern g1="guilsinglleft" g2="quotedblbase" k="132" /> +<hkern g1="guilsinglright" g2="quotedbl" k="169" /> +<hkern g1="guilsinglright" g2="ampersand" k="67" /> +<hkern g1="guilsinglright" g2="quotesingle" k="169" /> +<hkern g1="guilsinglright" g2="asterisk" k="169" /> +<hkern g1="guilsinglright" g2="comma" k="132" /> +<hkern g1="guilsinglright" g2="period" k="132" /> +<hkern g1="guilsinglright" g2="slash" k="67" /> +<hkern g1="guilsinglright" g2="A" k="67" /> +<hkern g1="guilsinglright" g2="T" k="180" /> +<hkern g1="guilsinglright" g2="V" k="116" /> +<hkern g1="guilsinglright" g2="W" k="36" /> +<hkern g1="guilsinglright" g2="X" k="66" /> +<hkern g1="guilsinglright" g2="Y" k="160" /> +<hkern g1="guilsinglright" g2="Z" k="48" /> +<hkern g1="guilsinglright" g2="backslash" k="116" /> +<hkern g1="guilsinglright" g2="ordfeminine" k="169" /> +<hkern g1="guilsinglright" g2="degree" k="169" /> +<hkern g1="guilsinglright" g2="ordmasculine" k="169" /> +<hkern g1="guilsinglright" g2="Agrave" k="67" /> +<hkern g1="guilsinglright" g2="Aacute" k="67" /> +<hkern g1="guilsinglright" g2="Acircumflex" k="67" /> +<hkern g1="guilsinglright" g2="Atilde" k="67" /> +<hkern g1="guilsinglright" g2="Adieresis" k="67" /> +<hkern g1="guilsinglright" g2="Aring" k="67" /> +<hkern g1="guilsinglright" g2="AE" k="67" /> +<hkern g1="guilsinglright" g2="Yacute" k="160" /> +<hkern g1="guilsinglright" g2="quoteleft" k="169" /> +<hkern g1="guilsinglright" g2="quoteright" k="169" /> +<hkern g1="guilsinglright" g2="quotesinglbase" k="132" /> +<hkern g1="guilsinglright" g2="quotedblleft" k="169" /> +<hkern g1="guilsinglright" g2="quotedblright" k="169" /> +<hkern g1="guilsinglright" g2="quotedblbase" k="132" /> +</font> +</defs> +</svg> diff --git a/client/css/fonts/Lato-700/Lato-700.ttf b/client/css/fonts/Lato-700/Lato-700.ttf new file mode 100755 index 00000000..e8b9bf6a Binary files /dev/null and b/client/css/fonts/Lato-700/Lato-700.ttf differ diff --git a/client/css/fonts/Lato-700/Lato-700.woff b/client/css/fonts/Lato-700/Lato-700.woff new file mode 100755 index 00000000..66c8242c Binary files /dev/null and b/client/css/fonts/Lato-700/Lato-700.woff differ diff --git a/client/css/fonts/Lato-700/Lato-700.woff2 b/client/css/fonts/Lato-700/Lato-700.woff2 new file mode 100755 index 00000000..a9ffeae9 Binary files /dev/null and b/client/css/fonts/Lato-700/Lato-700.woff2 differ diff --git a/client/css/fonts/Lato-regular/LICENSE.txt b/client/css/fonts/Lato-regular/LICENSE.txt new file mode 100755 index 00000000..98383e3d --- /dev/null +++ b/client/css/fonts/Lato-regular/LICENSE.txt @@ -0,0 +1,93 @@ +Copyright (c) 2010-2014 by tyPoland Lukasz Dziedzic (team@latofonts.com) with Reserved Font Name "Lato" + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/client/css/fonts/Lato-regular/Lato-regular.eot b/client/css/fonts/Lato-regular/Lato-regular.eot new file mode 100755 index 00000000..28343da0 Binary files /dev/null and b/client/css/fonts/Lato-regular/Lato-regular.eot differ diff --git a/client/css/fonts/Lato-regular/Lato-regular.svg b/client/css/fonts/Lato-regular/Lato-regular.svg new file mode 100755 index 00000000..f7678d37 --- /dev/null +++ b/client/css/fonts/Lato-regular/Lato-regular.svg @@ -0,0 +1,4148 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg xmlns="http://www.w3.org/2000/svg"> +<defs > +<font id="Lato" horiz-adv-x="1042" ><font-face + font-family="Lato" + units-per-em="2000" + panose-1="2 15 5 2 2 2 4 3 2 3" + ascent="1974" + descent="-426" + alphabetic="0" /> +<glyph unicode=" " glyph-name="space" horiz-adv-x="386" /> +<glyph unicode="!" glyph-name="exclam" horiz-adv-x="686" d="M430 1433V861Q430 816 429 773T424 687T417 598T406 500H285Q279 552 275 597T267 686T263 773T261 861V1433H430ZM218 110Q218 136 227 159T253 199T293 226T342 236Q368 236 391 226T431 199T457 +159T467 110Q467 83 458 61T431 21T391 -5T342 -15Q316 -15 293 -6T254 21T228 60T218 110Z" /> +<glyph unicode=""" glyph-name="quotedbl" horiz-adv-x="794" d="M307 1433V1143L291 988Q288 956 274 939T229 921Q203 921 189 938T168 988L152 1143V1433H307ZM640 1433V1143L624 988Q621 956 607 939T562 921Q536 921 522 938T501 988L485 1143V1433H640Z" /> +<glyph unicode="#" glyph-name="numbersign" horiz-adv-x="1160" d="M790 423L706 0H625Q602 0 586 17T570 61Q570 65 570 68T572 77L643 423H396L325 68Q317 31 295 16T243 0H164L249 423H103Q80 423 67 434T54 474Q54 479 54 485T56 497L64 554H268L333 880H101L114 +954Q119 983 137 997T194 1011H352L424 1369Q430 1399 451 1416T503 1433H583L499 1011H746L830 1433H909Q934 1433 950 1418T967 1379Q967 1371 966 1366L893 1011H1105L1092 936Q1087 907 1069 894T1012 880H874L809 554H988Q1012 554 1025 543T1038 502Q1038 +497 1038 492T1036 480L1027 423H790ZM415 554H662L727 880H480L415 554Z" /> +<glyph unicode="$" glyph-name="dollar" horiz-adv-x="1160" d="M498 -12Q377 -1 278 47T106 171L159 253Q166 264 179 271T206 278Q225 278 249 259T308 216T391 168T508 137L545 668Q475 689 408 715T287 784T201 891T168 1053Q168 1126 196 1195T279 1319T414 +1407T598 1446L608 1590Q610 1609 623 1624T658 1639H724L710 1441Q815 1428 891 1387T1027 1288L984 1222Q964 1192 938 1192Q924 1192 904 1204T854 1233T787 1266T700 1290L667 806Q739 784 809 758T935 691T1025 589T1060 435Q1060 345 1030 266T943 127T802 +30T611 -14L599 -190Q597 -209 584 -223T549 -238H483L498 -12ZM891 407Q891 457 873 493T822 555T747 600T655 635L621 137Q686 143 736 165T821 223T873 304T891 407ZM336 1071Q336 1023 353 988T400 925T470 878T557 842L587 1293Q522 1287 475 1267T397 1217T351 +1150T336 1071Z" /> +<glyph unicode="%" glyph-name="percent" horiz-adv-x="1572" d="M707 1087Q707 1003 681 937T612 825T510 755T389 731Q321 731 264 755T163 824T96 936T72 1087Q72 1173 96 1240T163 1353T263 1423T389 1447Q456 1447 514 1423T615 1353T682 1240T707 1087ZM568 +1087Q568 1153 554 1199T516 1274T459 1317T389 1330Q352 1330 320 1317T263 1275T226 1199T212 1087Q212 1022 225 977T263 903T319 862T389 849Q426 849 458 861T515 902T554 976T568 1087ZM1208 1397Q1221 1414 1235 1423T1274 1433H1402L355 29Q345 16 331 +8T298 0H166L1208 1397ZM1499 338Q1499 254 1473 188T1404 77T1303 7T1182 -17Q1114 -17 1057 7T956 76T889 188T865 338Q865 424 889 491T956 605T1056 675T1182 699Q1249 699 1307 675T1408 605T1475 492T1499 338ZM1361 338Q1361 404 1347 450T1309 526T1252 +568T1182 581Q1145 581 1113 568T1056 526T1019 451T1005 338Q1005 273 1018 228T1056 155T1112 114T1182 101Q1219 101 1251 113T1308 154T1347 228T1361 338Z" /> +<glyph unicode="&" glyph-name="ampersand" horiz-adv-x="1406" d="M660 1449Q739 1449 804 1424T916 1356T991 1259T1023 1143L912 1121Q907 1120 903 1120Q890 1120 879 1127T862 1152Q855 1178 840 1206T800 1257T741 1295T660 1310Q610 1310 570 1294T502 +1250T458 1183T442 1099Q442 1064 450 1032T476 968T520 901T585 828L997 409Q1035 476 1057 549T1088 697Q1090 716 1100 727T1128 738H1238Q1236 623 1201 512T1100 304L1400 0H1228Q1199 0 1181 7T1141 36L997 181Q903 90 781 37T511 -16Q431 -16 354 11T217 +89T119 215T82 382Q82 452 105 514T170 630T269 725T394 797Q333 874 304 947T275 1098Q275 1171 301 1235T378 1346T499 1421T660 1449ZM263 396Q263 331 287 282T350 198T439 147T541 129Q653 129 742 170T899 279L476 706Q370 649 317 570T263 396Z" /> +<glyph unicode="'" glyph-name="quotesingle" horiz-adv-x="460" d="M307 1433V1143L291 988Q288 956 274 939T229 921Q203 921 189 938T168 988L152 1143V1433H307Z" /> +<glyph unicode="(" glyph-name="parenleft" horiz-adv-x="600" d="M289 629Q289 415 344 214T503 -171Q509 -182 511 -190T513 -206Q513 -220 506 -229T488 -245L409 -293Q334 -178 282 -65T197 162T149 391T134 629Q134 750 149 866T196 1095T281 1322T409 1551L488 +1502Q499 1495 506 1486T513 1463Q513 1448 503 1429Q398 1247 344 1045T289 629Z" /> +<glyph unicode=")" glyph-name="parenright" horiz-adv-x="600" d="M298 629Q298 843 244 1045T84 1429Q74 1448 74 1463Q74 1477 81 1486T99 1502L178 1551Q253 1435 305 1322T390 1096T438 866T453 629Q453 507 438 392T391 162T306 -65T178 -293L99 -245Q88 +-238 81 -229T74 -206Q74 -198 76 -190T84 -171Q188 12 243 213T298 629Z" /> +<glyph unicode="*" glyph-name="asterisk" horiz-adv-x="800" d="M354 863V1060Q354 1079 356 1096T366 1129Q346 1104 313 1084L141 985L97 1060L269 1160Q305 1181 342 1184Q322 1186 305 1191T269 1209L96 1310L140 1385L313 1285Q348 1265 370 1233Q361 1251 +358 1269T354 1308V1506H442V1309Q442 1268 428 1237Q439 1252 452 1263T483 1285L655 1384L699 1309L527 1209Q510 1198 494 1192T459 1184Q477 1182 493 1177T527 1160L700 1059L656 984L483 1084Q465 1095 451 1106T426 1133Q442 1100 442 1061V863H354Z" /> +<glyph unicode="+" glyph-name="plus" horiz-adv-x="1160" d="M651 1166V739H1058V604H651V174H505V604H100V739H505V1166H651Z" /> +<glyph unicode="," glyph-name="comma" horiz-adv-x="424" d="M94 123Q94 146 102 166T126 202T164 227T212 236Q242 236 265 225T304 195T328 150T336 94Q336 49 323 1T286 -95T227 -188T146 -271L116 -242Q103 -230 103 -214Q103 -201 117 -187Q127 -176 142 +-158T174 -115T203 -62T223 0H210Q184 0 163 9T127 34T103 73T94 123Z" /> +<glyph unicode="-" glyph-name="hyphen" horiz-adv-x="694" d="M100 675H594V524H100V675Z" /> +<glyph unicode="." glyph-name="period" horiz-adv-x="424" d="M88 110Q88 136 97 159T123 199T163 226T212 236Q238 236 261 226T301 199T327 159T337 110Q337 83 328 61T301 21T261 -5T212 -15Q186 -15 163 -6T124 21T98 60T88 110Z" /> +<glyph unicode="/" glyph-name="slash" horiz-adv-x="746" d="M161 -21Q147 -56 120 -73T63 -90H-12L589 1407Q602 1439 626 1456T683 1473H758L161 -21Z" /> +<glyph unicode="0" glyph-name="zero" horiz-adv-x="1160" d="M1100 716Q1100 528 1060 391T949 163T784 29T579 -15Q469 -15 375 29T210 163T100 390T60 716Q60 904 100 1042T210 1270T374 1405T579 1449Q688 1449 783 1405T949 1271T1059 1042T1100 716ZM915 +716Q915 880 888 991T814 1171T706 1268T579 1298Q513 1298 452 1269T345 1171T272 992T244 716Q244 552 271 441T345 262T452 165T579 135Q645 135 706 164T813 262T887 441T915 716Z" /> +<glyph unicode="1" glyph-name="one" horiz-adv-x="1160" d="M287 136H595V1113Q595 1157 598 1202L342 983Q332 975 322 972T303 968Q288 968 276 974T258 990L202 1067L628 1436H773V136H1055V0H287V136Z" /> +<glyph unicode="2" glyph-name="two" horiz-adv-x="1160" d="M601 1449Q692 1449 771 1422T907 1344T998 1218T1031 1050Q1031 970 1007 902T942 772T848 651T734 531L357 145Q397 156 438 162T517 169H997Q1026 169 1043 152T1060 108V0H104V61Q104 80 111 100T136 +137L595 598Q652 656 699 709T779 817T831 926T849 1045Q849 1108 829 1155T774 1234T692 1280T591 1296Q537 1296 491 1280T410 1236T350 1168T315 1082Q307 1053 291 1040T249 1027Q244 1027 239 1027T226 1029L133 1045Q147 1143 187 1218T288 1345T429 1422T601 +1449Z" /> +<glyph unicode="3" glyph-name="three" horiz-adv-x="1160" d="M620 1449Q711 1449 788 1423T920 1349T1007 1233T1038 1082Q1038 1014 1021 961T971 867T892 798T789 753Q929 716 999 629T1070 411Q1070 312 1033 233T930 99T779 14T593 -16Q479 -16 398 12T261 +91T169 209T108 358L184 390Q205 399 226 399Q246 399 261 391T285 364Q287 360 289 356T293 346Q307 317 327 281T381 212T465 158T591 136Q666 136 722 160T816 224T873 311T892 406Q892 464 877 512T821 595T709 650T525 670V799Q616 800 680 819T786 871T845 +950T864 1052Q864 1114 845 1160T791 1236T711 1281T610 1296Q556 1296 510 1280T429 1236T369 1168T333 1082Q325 1053 309 1040T268 1027Q263 1027 258 1027T245 1029L152 1045Q166 1143 206 1218T307 1345T448 1422T620 1449Z" /> +<glyph unicode="4" glyph-name="four" horiz-adv-x="1160" d="M903 517H1120V415Q1120 399 1111 388T1081 377H903V0H746V377H111Q91 377 77 388T58 417L40 508L737 1433H903V517ZM746 1108Q746 1134 747 1164T754 1226L233 517H746V1108Z" /> +<glyph unicode="5" glyph-name="five" horiz-adv-x="1160" d="M978 1355Q978 1317 954 1293T873 1268H423L357 892Q469 916 564 916Q676 916 761 883T905 792T992 655T1022 483Q1022 369 982 277T873 120T709 19T506 -16Q443 -16 385 -4T277 30T184 78T108 135L162 +211Q180 237 210 237Q229 237 254 222T316 187T400 153T516 137Q591 137 651 161T753 229T819 336T842 475Q842 542 823 596T764 688T665 747T527 768Q473 768 415 759T295 730L183 763L299 1433H978V1355Z" /> +<glyph unicode="6" glyph-name="six" horiz-adv-x="1160" d="M650 878Q736 878 813 850T948 767T1040 633T1074 451Q1074 352 1038 267T938 119T782 20T582 -16Q474 -16 387 18T237 116T142 270T108 473Q108 567 150 673T283 901L646 1390Q660 1408 685 1420T742 +1433H900L403 804Q454 839 516 858T650 878ZM280 442Q280 373 300 316T358 218T452 155T579 132Q651 132 709 155T808 219T872 316T895 438Q895 508 873 564T811 660T715 721T592 742Q520 742 462 718T364 652T302 556T280 442Z" /> +<glyph unicode="7" glyph-name="seven" horiz-adv-x="1160" d="M1084 1433V1353Q1084 1319 1077 1297T1061 1260L468 63Q455 37 432 19T370 0H243L845 1182Q858 1207 871 1228T902 1268H154Q137 1268 124 1281T110 1312V1433H1084Z" /> +<glyph unicode="8" glyph-name="eight" horiz-adv-x="1160" d="M579 -16Q472 -16 383 12T230 94T131 222T96 392Q96 530 168 619T374 747Q261 789 204 872T146 1072Q146 1151 177 1220T265 1340T401 1420T579 1449Q676 1449 756 1420T893 1340T981 1220T1012 1072Q1012 +956 954 873T784 747Q918 709 990 620T1062 392Q1062 298 1027 223T928 94T775 13T579 -16ZM579 126Q649 126 704 145T798 200T857 285T878 395Q878 469 854 521T788 607T692 655T579 671Q520 671 466 656T371 607T305 522T280 395Q280 335 300 286T359 201T453 +146T579 126ZM579 814Q649 814 698 835T779 892T824 974T838 1069Q838 1119 822 1163T773 1240T692 1292T579 1311Q515 1311 467 1292T386 1240T337 1163T320 1069Q320 1020 334 974T379 893T459 836T579 814Z" /> +<glyph unicode="9" glyph-name="nine" horiz-adv-x="1160" d="M549 588Q468 588 396 615T268 694T181 823T148 999Q148 1093 183 1175T281 1318T431 1414T622 1449Q725 1449 809 1415T953 1320T1045 1174T1078 986Q1078 924 1067 869T1033 760T981 655T911 546L562 +42Q549 23 525 12T470 0H306L742 571Q764 600 783 626T819 678Q764 634 695 611T549 588ZM907 1007Q907 1074 886 1128T826 1221T736 1279T620 1300Q554 1300 500 1279T407 1219T347 1128T326 1012Q326 944 345 891T401 800T490 744T608 725Q680 725 735 748T829 +811T887 901T907 1007Z" /> +<glyph unicode=":" glyph-name="colon" horiz-adv-x="504" d="M128 110Q128 136 137 159T163 199T203 226T252 236Q278 236 301 226T341 199T367 159T377 110Q377 83 368 61T341 21T301 -5T252 -15Q226 -15 203 -6T164 21T138 60T128 110ZM128 860Q128 886 137 +909T163 949T203 976T252 986Q278 986 301 976T341 949T367 909T377 860Q377 833 368 811T341 771T301 745T252 735Q226 735 203 744T164 771T138 810T128 860Z" /> +<glyph unicode=";" glyph-name="semicolon" horiz-adv-x="504" d="M134 123Q134 146 142 166T166 202T204 227T252 236Q282 236 305 225T344 195T368 150T376 94Q376 49 363 1T326 -95T267 -188T186 -271L156 -242Q143 -230 143 -214Q143 -201 157 -187Q167 -176 +182 -158T214 -115T243 -62T263 0H250Q224 0 203 9T167 34T143 73T134 123ZM128 860Q128 886 137 909T163 949T203 976T252 986Q278 986 301 976T341 949T367 909T377 860Q377 833 368 811T341 771T301 745T252 735Q226 735 203 744T164 771T138 810T128 860Z" +/> +<glyph unicode="<" glyph-name="less" horiz-adv-x="1160" d="M148 710L922 1111V984Q922 967 914 955T886 932L437 704Q417 693 395 686T347 672Q372 667 394 659T437 641L886 414Q906 404 914 391T922 362V234L148 636V710Z" /> +<glyph unicode="=" glyph-name="equal" horiz-adv-x="1160" d="M150 574H1009V439H150V574ZM150 909H1009V774H150V909Z" /> +<glyph unicode=">" glyph-name="greater" horiz-adv-x="1160" d="M238 234V362Q238 378 246 391T274 414L723 641Q743 651 764 659T811 672Q786 678 765 685T723 704L274 932Q254 942 246 954T238 984V1111L1011 710V636L238 234Z" /> +<glyph unicode="?" glyph-name="question" horiz-adv-x="796" d="M34 1305Q65 1334 102 1360T184 1406T280 1437T392 1449Q471 1449 538 1426T655 1361T732 1259T760 1124Q760 1048 738 993T681 897T605 825T529 767T468 713T438 653L420 500H298L286 666V677Q286 +719 308 751T365 812T439 869T513 932T570 1011T593 1115Q593 1158 576 1193T530 1252T462 1290T377 1303Q316 1303 273 1288T199 1255T151 1222T120 1207Q95 1207 81 1230L34 1305ZM230 110Q230 136 239 159T265 199T305 226T354 236Q380 236 403 226T443 199T469 +159T479 110Q479 83 470 61T443 21T403 -5T354 -15Q328 -15 305 -6T266 21T240 60T230 110Z" /> +<glyph unicode="@" glyph-name="at" horiz-adv-x="1644" d="M1167 186Q1089 186 1040 223T978 339Q920 258 852 223T706 188Q646 188 602 208T529 265T485 352T470 460Q470 545 502 631T599 787T758 901T979 945Q1046 945 1096 935T1192 904L1099 543Q1080 468 +1080 419Q1080 383 1089 360T1113 323T1149 304T1193 299Q1242 299 1286 327T1363 406T1416 528T1436 687Q1436 825 1392 929T1270 1102T1087 1206T859 1241Q725 1241 608 1190T404 1049T267 836T217 568Q217 398 270 270T416 54T633 -77T901 -121Q1053 -121 1169 +-88T1371 -4Q1386 5 1398 5Q1419 5 1429 -19L1454 -85Q1347 -157 1211 -198T901 -239Q728 -239 579 -184T321 -26T149 228T86 568Q86 677 113 778T191 966T311 1126T467 1250T652 1330T859 1359Q951 1359 1039 1339T1205 1280T1350 1184T1463 1052T1537 886T1564 +687Q1564 579 1534 488T1450 329T1324 224T1167 186ZM741 306Q772 306 803 316T864 351T918 419T960 527L1036 822Q997 831 951 831Q876 831 814 800T706 717T636 600T610 465Q610 393 643 350T741 306Z" /> +<glyph unicode="A" glyph-name="A" horiz-adv-x="1360" d="M1353 0H1203Q1177 0 1161 13T1137 46L1003 392H360L226 46Q219 28 202 14T160 0H10L583 1433H780L1353 0ZM414 532H949L724 1115Q702 1169 681 1250Q670 1209 660 1175T639 1114L414 532Z" /> +<glyph unicode="B" glyph-name="B" horiz-adv-x="1294" d="M174 0V1433H631Q763 1433 858 1407T1015 1333T1106 1216T1136 1059Q1136 1006 1120 957T1070 866T986 791T867 737Q1024 706 1104 624T1184 408Q1184 317 1151 242T1053 113T895 30T681 0H174ZM368 653V154H678Q761 +154 820 173T918 226T975 308T993 413Q993 524 915 588T677 653H368ZM368 791H624Q706 791 766 809T865 859T924 936T943 1036Q943 1162 867 1221T631 1280H368V791Z" /> +<glyph unicode="C" glyph-name="C" horiz-adv-x="1370" d="M1184 296Q1200 296 1213 283L1289 200Q1201 98 1076 41T773 -16Q618 -16 492 37T277 187T139 419T90 716Q90 878 142 1013T290 1245T517 1395T810 1449Q968 1449 1082 1400T1286 1267L1223 1178Q1216 +1168 1207 1162T1181 1155Q1168 1155 1154 1164T1119 1188T1072 1218T1008 1248T922 1271T809 1281Q694 1281 599 1242T434 1129T327 951T288 716Q288 582 326 477T431 300T589 189T785 151Q849 151 900 158T994 182T1075 222T1151 281Q1168 296 1184 296Z" /> +<glyph unicode="D" glyph-name="D" horiz-adv-x="1506" d="M1416 716Q1416 555 1365 423T1221 197T998 52T710 0H174V1433H710Q868 1433 998 1382T1221 1236T1365 1009T1416 716ZM1217 716Q1217 848 1181 952T1079 1128T919 1238T710 1276H369V157H710Q825 157 +919 195T1079 304T1181 480T1217 716Z" /> +<glyph unicode="E" glyph-name="E" horiz-adv-x="1162" d="M1057 1433V1275H369V799H926V647H369V158H1057V0H174V1433H1057Z" /> +<glyph unicode="F" glyph-name="F" horiz-adv-x="1132" d="M1057 1433V1275H369V774H957V616H369V0H174V1433H1057Z" /> +<glyph unicode="G" glyph-name="G" horiz-adv-x="1468" d="M813 141Q871 141 919 146T1011 163T1092 189T1168 225V541H946Q927 541 916 552T904 579V689H1344V139Q1290 100 1232 71T1107 23T964 -6T799 -16Q643 -16 513 37T289 187T143 419T90 716Q90 880 141 +1015T288 1246T519 1396T823 1449Q908 1449 981 1437T1116 1401T1232 1344T1331 1268L1276 1180Q1259 1153 1232 1153Q1216 1153 1197 1164Q1172 1178 1141 1198T1066 1236T961 1268T817 1281Q696 1281 598 1242T431 1129T325 951T288 716Q288 580 326 474T435 +293T601 180T813 141Z" /> +<glyph unicode="H" glyph-name="H" horiz-adv-x="1512" d="M1336 0H1141V652H369V0H174V1433H369V794H1141V1433H1336V0Z" /> +<glyph unicode="I" glyph-name="I" horiz-adv-x="614" d="M404 0H210V1433H404V0Z" /> +<glyph unicode="J" glyph-name="J" horiz-adv-x="888" d="M713 495Q713 375 684 280T597 120T455 19T262 -16Q165 -16 60 12Q62 41 65 69T71 126Q73 143 83 153T115 164Q133 164 163 155T243 146Q309 146 360 166T447 228T501 335T520 491V1433H713V495Z" /> +<glyph unicode="K" glyph-name="K" horiz-adv-x="1362" d="M387 805H460Q498 805 520 814T563 847L1040 1387Q1062 1412 1082 1422T1135 1433H1300L754 816Q733 793 715 777T675 751Q703 742 724 724T768 679L1338 0H1170Q1151 0 1138 3T1116 11T1098 24T1082 +41L587 610Q576 622 567 630T545 645T516 653T475 656H387V0H194V1433H387V805Z" /> +<glyph unicode="L" glyph-name="L" horiz-adv-x="1028" d="M368 163H988V0H174V1433H368V163Z" /> +<glyph unicode="M" glyph-name="M" horiz-adv-x="1840" d="M879 518Q893 494 903 468T924 414Q934 442 945 467T970 519L1455 1400Q1468 1423 1482 1428T1522 1433H1665V0H1495V1053Q1495 1074 1496 1098T1499 1147L1008 251Q983 206 938 206H910Q865 206 840 +251L338 1150Q341 1124 342 1099T344 1053V0H174V1433H317Q343 1433 357 1428T384 1400L879 518V518Z" /> +<glyph unicode="N" glyph-name="N" horiz-adv-x="1512" d="M274 1433Q300 1433 312 1427T341 1400L1171 320Q1168 346 1167 370T1166 418V1433H1336V0H1238Q1215 0 1200 8T1169 35L340 1114Q342 1089 343 1065T344 1021V0H174V1433H274V1433Z" /> +<glyph unicode="O" glyph-name="O" horiz-adv-x="1596" d="M1505 716Q1505 555 1454 421T1310 189T1087 39T798 -15Q640 -15 510 38T287 189T143 420T92 716Q92 877 143 1011T287 1243T510 1395T798 1449Q956 1449 1086 1395T1310 1244T1454 1012T1505 716ZM1306 +716Q1306 848 1270 953T1168 1130T1008 1242T798 1281Q683 1281 589 1242T429 1131T326 953T290 716Q290 584 326 480T428 303T589 192T798 153Q914 153 1008 191T1168 302T1270 479T1306 716Z" /> +<glyph unicode="P" glyph-name="P" horiz-adv-x="1222" d="M387 536V0H194V1433H617Q753 1433 853 1402T1020 1312T1118 1172T1151 989Q1151 889 1116 806T1014 663T846 570T617 536H387ZM387 690H617Q700 690 763 712T870 773T935 868T957 989Q957 1126 873 1203T617 +1280H387V690Z" /> +<glyph unicode="Q" glyph-name="Q" horiz-adv-x="1596" d="M1505 716Q1505 615 1485 524T1425 355T1330 212T1204 101L1572 -296H1412Q1376 -296 1348 -286T1297 -251L1045 23Q988 5 927 -5T798 -15Q640 -15 510 38T287 189T143 420T92 716Q92 877 143 1011T287 +1243T510 1395T798 1449Q956 1449 1086 1395T1310 1244T1454 1012T1505 716ZM1306 716Q1306 848 1270 953T1168 1130T1008 1242T798 1281Q683 1281 589 1242T429 1131T326 953T290 716Q290 584 326 480T428 303T589 192T798 153Q914 153 1008 191T1168 302T1270 +479T1306 716Z" /> +<glyph unicode="R" glyph-name="R" horiz-adv-x="1288" d="M387 598V0H194V1433H599Q735 1433 834 1406T997 1326T1093 1201T1124 1036Q1124 960 1100 894T1031 776T920 686T771 630Q807 609 835 569L1253 0H1081Q1028 0 1003 41L631 553Q614 577 594 587T534 +598H387ZM387 739H590Q675 739 739 759T847 817T913 907T935 1022Q935 1150 851 1215T599 1280H387V739Z" /> +<glyph unicode="S" glyph-name="S" horiz-adv-x="1060" d="M908 1209Q899 1194 889 1187T863 1179Q846 1179 824 1196T767 1233T684 1271T566 1288Q501 1288 451 1271T368 1223T317 1153T300 1065Q300 1005 329 966T407 898T517 850T643 807T769 758T879 688T957 +585T987 435Q987 341 955 259T862 115T711 19T507 -16Q368 -16 254 34T58 171L114 263Q122 274 133 281T159 289Q180 289 207 267T274 217T372 168T513 145Q582 145 636 164T727 217T785 300T805 407Q805 472 776 513T698 583T589 630T463 670T337 718T227 788T150 +895T120 1055Q120 1131 149 1202T235 1328T373 1416T563 1449Q683 1449 782 1411T955 1301L908 1209Z" /> +<glyph unicode="T" glyph-name="T" horiz-adv-x="1180" d="M1150 1433V1270H687V0H493V1270H28V1433H1150Z" /> +<glyph unicode="U" glyph-name="U" horiz-adv-x="1460" d="M731 154Q820 154 890 184T1008 268T1082 397T1108 562V1433H1301V562Q1301 438 1262 332T1149 149T969 27T731 -17Q599 -17 493 27T313 148T200 332T160 562V1433H353V563Q353 473 378 398T452 269T571 +185T731 154Z" /> +<glyph unicode="V" glyph-name="V" horiz-adv-x="1360" d="M8 1433H163Q189 1433 205 1420T229 1387L634 376Q648 342 659 302T682 219Q691 262 701 302T726 376L1129 1387Q1136 1404 1153 1418T1195 1433H1351L767 0H592L8 1433Z" /> +<glyph unicode="W" glyph-name="W" horiz-adv-x="2038" d="M14 1433H175Q201 1433 218 1420T241 1387L537 391Q545 364 551 333T564 268Q571 302 578 333T594 391L931 1387Q937 1404 954 1418T997 1433H1053Q1079 1433 1095 1420T1119 1387L1454 391Q1472 339 +1486 272Q1492 305 1497 335T1510 391L1807 1387Q1812 1405 1829 1419T1872 1433H2023L1576 0H1402L1039 1093Q1028 1124 1019 1165Q1014 1145 1010 1127T1000 1093L635 0H461L14 1433Z" /> +<glyph unicode="X" glyph-name="X" horiz-adv-x="1286" d="M507 736L34 1433H227Q248 1433 258 1426T276 1406L650 832Q657 853 671 878L1024 1402Q1033 1416 1043 1424T1069 1433H1254L779 745L1270 0H1078Q1056 0 1044 11T1023 37L639 638Q632 617 621 598L247 +37Q238 23 227 12T194 0H14L507 736Z" /> +<glyph unicode="Y" glyph-name="Y" horiz-adv-x="1258" d="M726 570V0H533V570L8 1433H178Q204 1433 219 1420T245 1388L573 831Q593 796 606 765T631 704Q642 735 655 766T688 831L1015 1388Q1024 1404 1039 1418T1080 1433H1252L726 570Z" /> +<glyph unicode="Z" glyph-name="Z" horiz-adv-x="1248" d="M1172 1433V1361Q1172 1327 1151 1297L340 158H1158V0H86V76Q86 106 105 133L917 1275H124V1433H1172Z" /> +<glyph unicode="[" glyph-name="bracketleft" horiz-adv-x="600" d="M142 -289V1533H510V1463Q510 1441 497 1429T461 1416H292V-171H461Q483 -171 496 -183T510 -219V-289H142Z" /> +<glyph unicode="\" glyph-name="backslash" horiz-adv-x="750" d="M-20 1473H56Q89 1473 113 1456T150 1407L751 -90H676Q647 -90 619 -73T578 -21L-20 1473Z" /> +<glyph unicode="]" glyph-name="bracketright" horiz-adv-x="600" d="M90 -219Q90 -199 103 -185T139 -171H308V1416H139Q117 1416 104 1429T90 1463V1533H458V-289H90V-219Z" /> +<glyph unicode="^" glyph-name="asciicircum" horiz-adv-x="1160" d="M516 1433H631L989 787H860Q843 787 831 797T811 821L615 1173Q602 1196 593 1217T576 1260Q562 1216 539 1173L345 821Q337 807 326 797T294 787H158L516 1433Z" /> +<glyph unicode="_" glyph-name="underscore" horiz-adv-x="788" d="M788 -165V-285H0V-165H788Z" /> +<glyph unicode="`" glyph-name="grave" horiz-adv-x="614" d="M207 1449Q240 1449 256 1439T286 1405L435 1163H333Q312 1163 299 1169T272 1191L38 1449H207Z" /> +<glyph unicode="a" glyph-name="a" horiz-adv-x="1014" d="M890 0H811Q785 0 769 8T748 42L728 136Q688 100 650 72T570 24T481 -6T375 -16Q316 -16 265 0T175 50T115 133T92 253Q92 313 125 368T231 467T424 537T715 569V648Q715 766 665 826T515 887Q450 887 +406 871T329 834T273 797T226 780Q208 780 195 789T173 813L141 870Q225 951 322 991T537 1031Q622 1031 688 1003T799 925T867 804T890 648V0ZM428 109Q475 109 514 118T587 145T653 188T715 245V456Q592 452 506 437T366 396T288 337T263 261Q263 221 276 192T311 +145T363 118T428 109Z" /> +<glyph unicode="b" glyph-name="b" horiz-adv-x="1118" d="M152 0V1473H331V867Q394 940 475 984T662 1029Q750 1029 821 996T942 898T1019 736T1046 513Q1046 401 1016 305T930 138T792 27T608 -14Q510 -14 442 24T322 130L313 38Q305 0 267 0H152ZM604 887Q517 +887 452 847T331 734V244Q379 178 437 151T568 124Q710 124 786 225T862 513Q862 612 845 683T794 799T713 866T604 887Z" /> +<glyph unicode="c" glyph-name="c" horiz-adv-x="934" d="M837 833Q829 822 821 816T798 810Q783 810 766 822T721 850T656 877T561 890Q487 890 430 864T335 787T277 666T257 507Q257 415 278 344T337 224T429 150T552 124Q617 124 659 139T729 174T775 208T811 +224Q834 224 845 207L895 142Q829 61 730 24T521 -14Q426 -14 345 21T203 122T109 286T74 507Q74 620 105 716T197 881T347 990T551 1029Q657 1029 739 995T884 897L837 833Z" /> +<glyph unicode="d" glyph-name="d" horiz-adv-x="1118" d="M859 0Q821 0 811 37L795 160Q730 81 647 34T455 -14Q368 -14 297 19T176 118T99 280T72 503Q72 615 102 711T188 879T326 990T510 1031Q603 1031 669 1000T787 911V1473H965V0H859ZM514 130Q601 130 +666 170T787 283V773Q738 839 680 865T550 892Q408 892 332 791T256 503Q256 404 273 334T323 218T404 151T514 130Z" /> +<glyph unicode="e" glyph-name="e" horiz-adv-x="1048" d="M547 1029Q638 1029 715 999T848 911T935 769T967 576Q967 534 958 520T924 506H250Q252 410 276 339T342 221T442 150T572 126Q639 126 687 141T771 175T829 208T870 224Q892 224 904 207L954 142Q921 +102 875 73T777 24T668 -4T557 -14Q452 -14 364 21T211 125T110 295T74 527Q74 633 106 725T200 884T349 990T547 1029ZM551 898Q422 898 348 824T256 617H807Q807 679 790 730T740 819T660 877T551 898Z" /> +<glyph unicode="f" glyph-name="f" horiz-adv-x="674" d="M186 0V861L74 874Q53 879 40 889T26 920V993H186V1091Q186 1178 210 1245T280 1359T390 1430T534 1454Q602 1454 660 1434L656 1345Q655 1325 639 1321T594 1317H563Q517 1317 480 1305T415 1266T374 +1195T359 1086V993H652V864H365V0H186Z" /> +<glyph unicode="g" glyph-name="g" horiz-adv-x="1022" d="M487 1030Q553 1030 610 1016T715 973H990V907Q990 874 948 865L833 849Q867 784 867 704Q867 630 839 570T760 466T640 400T487 377Q416 377 353 394Q321 374 305 351T288 306Q288 270 317 252T394 225T503 +215T627 209T752 193T861 157T938 88T967 -26Q967 -91 935 -152T841 -260T692 -336T493 -365Q382 -365 299 -343T160 -284T78 -199T50 -97Q50 -22 97 30T228 114Q185 134 160 167T134 257Q134 279 142 302T166 349T207 393T263 430Q188 472 146 541T103 704Q103 +778 131 838T211 941T332 1007T487 1030ZM803 -55Q803 -17 782 6T725 41T642 60T543 68T437 74T334 85Q277 58 242 19T206 -74Q206 -108 223 -137T277 -188T367 -222T496 -235Q568 -235 625 -222T721 -185T782 -128T803 -55ZM487 495Q541 495 582 510T652 552T694 +616T708 699Q708 792 652 847T487 902Q380 902 324 847T267 699Q267 654 281 617T324 552T393 510T487 495Z" /> +<glyph unicode="h" glyph-name="h" horiz-adv-x="1112" d="M146 0V1473H324V877Q389 946 468 987T650 1029Q733 1029 796 1002T902 924T967 802T989 645V0H811V645Q811 760 759 823T598 887Q519 887 451 849T324 746V0H146Z" /> +<glyph unicode="i" glyph-name="i" horiz-adv-x="512" d="M344 1013V0H166V1013H344ZM384 1331Q384 1305 374 1283T346 1243T305 1215T256 1205Q230 1205 208 1215T168 1242T140 1282T130 1331Q130 1357 140 1380T167 1421T207 1449T256 1459Q282 1459 305 1449T345 +1422T373 1381T384 1331Z" /> +<glyph unicode="j" glyph-name="j" horiz-adv-x="508" d="M344 1013V-75Q344 -136 328 -188T278 -280T189 -341T58 -364Q25 -364 -2 -359T-56 -344L-48 -248Q-46 -235 -39 -232T-17 -228Q-9 -228 0 -228T22 -229Q100 -229 133 -193T166 -75V1013H344ZM384 1331Q384 +1305 374 1283T346 1243T305 1215T256 1205Q230 1205 208 1215T168 1242T140 1282T130 1331Q130 1357 140 1380T167 1421T207 1449T256 1459Q282 1459 305 1449T345 1422T373 1381T384 1331Z" /> +<glyph unicode="k" glyph-name="k" horiz-adv-x="1048" d="M331 1473V606H377Q397 606 410 611T439 634L759 977Q774 993 789 1003T829 1013H991L618 616Q604 599 591 586T560 563Q578 551 592 536T620 500L1016 0H856Q834 0 819 8T789 35L456 450Q441 471 426 +477T381 484H331V0H152V1473H331Z" /> +<glyph unicode="l" glyph-name="l" horiz-adv-x="512" d="M344 1473V0H166V1473H344Z" /> +<glyph unicode="m" glyph-name="m" horiz-adv-x="1642" d="M146 0V1013H252Q290 1013 300 976L313 872Q369 941 438 985T600 1029Q703 1029 766 972T858 818Q879 873 913 913T991 979T1082 1017T1181 1029Q1261 1029 1323 1004T1429 929T1496 809T1519 645V0H1341V645Q1341 +764 1289 825T1138 887Q1094 887 1055 872T985 826T938 751T920 645V0H742V645Q742 767 693 827T550 887Q484 887 428 852T324 755V0H146Z" /> +<glyph unicode="n" glyph-name="n" horiz-adv-x="1112" d="M146 0V1013H252Q290 1013 300 976L314 866Q380 939 461 984T650 1029Q733 1029 796 1002T902 924T967 802T989 645V0H811V645Q811 760 759 823T598 887Q519 887 451 849T324 746V0H146Z" /> +<glyph unicode="o" glyph-name="o" horiz-adv-x="1112" d="M556 1029Q667 1029 756 992T908 887T1004 723T1038 507Q1038 387 1005 291T909 127T757 23T556 -14Q445 -14 356 22T203 127T106 291T72 507Q72 626 106 722T203 887T355 992T556 1029ZM556 125Q706 +125 780 225T854 506Q854 687 780 788T556 889Q480 889 424 863T331 788T275 668T256 506Q256 416 274 345T330 226T424 151T556 125Z" /> +<glyph unicode="p" glyph-name="p" horiz-adv-x="1104" d="M146 -343V1013H252Q290 1013 300 976L315 856Q380 935 463 983T656 1031Q743 1031 814 998T935 899T1012 736T1039 513Q1039 401 1009 305T923 138T786 27T602 -14Q508 -14 442 17T324 105V-343H146ZM597 +887Q510 887 445 847T324 734V244Q373 178 431 151T562 124Q703 124 779 225T855 513Q855 612 838 683T787 799T706 866T597 887Z" /> +<glyph unicode="q" glyph-name="q" horiz-adv-x="1118" d="M965 1013V-343H787V150Q723 76 642 31T455 -14Q368 -14 297 19T176 118T99 280T72 503Q72 615 102 711T188 879T326 990T510 1031Q608 1031 676 996T799 897L811 976Q821 1013 859 1013H965ZM514 130Q601 +130 666 170T787 283V773Q739 837 680 864T550 892Q408 892 332 791T256 503Q256 404 273 334T323 218T404 151T514 130Z" /> +<glyph unicode="r" glyph-name="r" horiz-adv-x="806" d="M146 0V1013H248Q277 1013 288 1002T303 964L315 806Q367 912 443 971T623 1031Q665 1031 699 1022T762 995L739 862Q732 837 708 837Q694 837 665 846T584 856Q491 856 429 802T324 645V0H146Z" /> +<glyph unicode="s" glyph-name="s" horiz-adv-x="868" d="M726 846Q714 824 689 824Q674 824 655 835T609 859T543 884T453 896Q408 896 372 885T311 853T272 807T258 749Q258 710 280 684T340 639T424 606T520 575T617 538T701 488T760 415T783 310Q783 240 758 +181T684 78T564 9T400 -16Q294 -16 208 18T62 107L104 175Q112 188 123 195T152 202Q170 202 190 188T238 157T307 126T409 112Q461 112 500 125T565 162T603 215T616 279Q616 321 594 348T534 395T450 429T353 460T256 496T171 548T112 624T89 735Q89 793 113 +846T183 940T296 1005T449 1029Q549 1029 628 998T766 911L726 846Z" /> +<glyph unicode="t" glyph-name="t" horiz-adv-x="746" d="M453 -16Q333 -16 269 51T204 244V864H82Q66 864 55 873T44 903V974L210 995L251 1308Q253 1323 264 1332T292 1342H382V993H672V864H382V256Q382 192 413 161T493 130Q521 130 541 137T577 154T602 170T621 +178Q635 178 646 161L698 76Q652 33 587 9T453 -16Z" /> +<glyph unicode="u" glyph-name="u" horiz-adv-x="1112" d="M300 1013V367Q300 252 353 189T513 126Q591 126 660 163T787 266V1013H965V0H859Q821 0 811 37L797 146Q731 73 649 29T461 -16Q378 -16 315 11T208 89T144 210T122 367V1013H300Z" /> +<glyph unicode="v" glyph-name="v" horiz-adv-x="1024" d="M18 1013H164Q185 1013 199 1002T219 976L476 324Q490 288 498 252T513 181Q521 216 530 252T553 324L813 976Q819 992 832 1002T866 1013H1005L592 0H431L18 1013Z" /> +<glyph unicode="w" glyph-name="w" horiz-adv-x="1532" d="M14 1013H154Q176 1013 190 1002T209 976L403 324Q411 288 418 255T430 187Q438 221 448 254T469 324L683 980Q688 995 700 1005T732 1015H809Q829 1015 842 1005T860 980L1069 324Q1080 289 1088 255T1105 +188Q1110 221 1118 257T1135 324L1333 976Q1338 992 1352 1002T1385 1013H1519L1191 0H1050Q1024 0 1014 34L790 721Q782 744 777 767T767 814Q762 791 757 767T744 720L517 34Q506 0 476 0H342L14 1013Z" /> +<glyph unicode="x" glyph-name="x" horiz-adv-x="1008" d="M383 519L42 1013H213Q235 1013 245 1006T263 986L511 606Q520 634 537 662L755 982Q765 996 775 1004T800 1013H964L623 529L978 0H807Q785 0 773 11T752 37L497 434Q490 405 476 382L240 37Q230 23 +219 12T187 0H28L383 519Z" /> +<glyph unicode="y" glyph-name="y" horiz-adv-x="1024" d="M443 -299Q434 -319 421 -331T379 -343H247L432 59L14 1013H168Q191 1013 204 1002T223 976L494 338Q503 316 509 294T521 249Q528 272 535 294T551 339L814 976Q820 992 834 1002T866 1013H1008L443 -299Z" /> +<glyph unicode="z" glyph-name="z" horiz-adv-x="924" d="M853 937Q853 918 846 901T828 869L280 139H833V0H70V74Q70 87 76 104T95 138L646 873H101V1013H853V937Z" /> +<glyph unicode="{" glyph-name="braceleft" horiz-adv-x="600" d="M181 425Q181 488 146 528T44 569V676Q111 676 146 716T181 820Q181 870 173 919T156 1017T138 1116T130 1218Q130 1287 150 1345T212 1445T315 1510T459 1533H512V1454Q512 1434 498 1425T472 +1416H452Q375 1416 331 1366T286 1229Q286 1173 293 1121T309 1020T325 921T332 822Q332 784 321 752T290 694T242 650T181 622Q214 613 241 595T289 550T321 492T332 423Q332 373 325 324T309 226T293 124T286 16Q286 -71 330 -121T452 -171H472Q484 -171 498 +-180T512 -209V-289H459Q377 -289 316 -266T213 -200T151 -100T130 27Q130 79 138 128T155 227T173 326T181 425Z" /> +<glyph unicode="|" glyph-name="bar" horiz-adv-x="600" d="M230 1533H368V-343H230V1533Z" /> +<glyph unicode="}" glyph-name="braceright" horiz-adv-x="600" d="M419 425Q419 375 427 326T444 228T462 129T470 27Q470 -42 449 -100T387 -200T285 -265T141 -289H88V-209Q88 -189 102 -180T128 -171H148Q225 -171 269 -121T314 16Q314 72 307 124T291 225T275 +324T268 423Q268 460 279 492T310 550T358 594T419 622Q386 631 359 649T311 693T279 751T268 822Q268 872 275 921T291 1019T307 1121T314 1229Q314 1315 270 1365T148 1416H128Q116 1416 102 1425T88 1454V1533H141Q223 1533 284 1510T387 1445T449 1345T470 +1218Q470 1166 462 1116T445 1017T427 919T419 820Q419 756 454 716T556 676V569Q489 569 454 529T419 425Z" /> +<glyph unicode="~" glyph-name="asciitilde" horiz-adv-x="1160" d="M759 613Q824 613 860 655T898 768H1042Q1042 701 1024 645T971 549T885 487T770 465Q718 465 667 481T569 516T478 552T399 569Q334 569 298 527T260 414H116Q116 481 134 537T187 633T272 +695T388 718Q440 718 491 702T589 666T680 630T759 613Z" /> +<glyph unicode=" " glyph-name="uni00A0" horiz-adv-x="386" /> +<glyph unicode="¡" glyph-name="exclamdown" horiz-adv-x="686" d="M262 -343V198Q262 243 263 285T268 371T275 461T286 559H407Q413 507 417 461T425 372T429 286T431 198V-343H262ZM218 904Q218 931 227 953T254 993T293 1019T343 1029Q369 1029 391 1020T431 +993T458 954T468 904Q468 878 458 855T431 815T392 788T343 778Q316 778 294 788T254 815T228 855T218 904Z" /> +<glyph unicode="¢" glyph-name="cent" horiz-adv-x="1160" d="M561 -11Q469 -1 392 38T258 144T170 301T138 506Q138 617 171 710T267 873T422 982T633 1026L645 1205Q647 1225 660 1239T695 1254H761L745 1021Q827 1009 893 978T1013 897L967 835Q959 824 +952 819T930 813Q918 813 902 821T863 842T809 866T735 885L683 123Q746 127 788 142T860 175T909 206T944 220Q955 220 964 216T978 204L1026 141Q966 69 874 32T674 -12L662 -187Q660 -206 647 -220T612 -235H546L561 -11ZM315 506Q315 344 382 248T571 129L623 +889Q547 883 490 855T393 777T335 659T315 506Z" /> +<glyph unicode="£" glyph-name="sterling" horiz-adv-x="1160" d="M52 672Q52 698 68 716T113 734H247V995Q247 1089 274 1171T356 1315T493 1412T685 1448Q763 1448 823 1429T931 1375T1012 1296T1071 1199L999 1153Q989 1147 979 1145T958 1142Q944 1142 +932 1147T908 1167Q888 1192 868 1215T822 1256T763 1284T685 1295Q622 1295 574 1274T494 1214T446 1120T430 997V734H871V662Q871 644 856 629T819 614H430V371Q430 296 402 242T323 142Q352 147 380 150T439 154H1115V78Q1115 64 1110 51T1094 26T1070 7T1038 +0H74V115Q108 125 139 142T194 184T232 244T247 325V614H52V672Z" /> +<glyph unicode="¤" glyph-name="currency" horiz-adv-x="1160" d="M223 672Q223 729 239 779T285 874L132 1027L223 1117L374 965Q418 996 470 1013T580 1030Q637 1030 688 1014T782 967L935 1120L1024 1029L873 877Q904 833 921 782T938 672Q938 615 922 +564T876 470L1028 319L937 227L785 379Q741 349 689 332T580 315Q523 315 473 331T378 377L225 224L136 315L287 467Q257 511 240 562T223 672ZM355 672Q355 626 372 586T421 515T492 466T580 448Q627 448 668 466T740 514T789 585T807 672Q807 719 789 760T741 +832T669 880T580 898Q533 898 493 881T421 832T373 760T355 672Z" /> +<glyph unicode="¥" glyph-name="yen" horiz-adv-x="1160" d="M146 625H452L44 1433H193Q219 1433 234 1421T260 1388L536 822Q550 787 560 758T577 700Q584 729 593 758T616 822L891 1388Q899 1405 915 1419T957 1433H1107L698 625H1005V523H665V418H1005V315H665V0H486V315H146V418H486V523H146V625Z" +/> +<glyph unicode="¦" glyph-name="brokenbar" horiz-adv-x="600" d="M230 1533H368V739H230V1533ZM230 452H368V-343H230V452Z" /> +<glyph unicode="§" glyph-name="section" horiz-adv-x="1006" d="M817 1265Q805 1243 780 1243Q765 1243 746 1254T700 1278T634 1303T544 1315Q496 1315 458 1303T393 1269T352 1220T338 1161Q338 1123 362 1095T426 1043T517 998T620 953T724 903T814 840T878 +758T903 651Q903 570 864 507T741 405Q790 368 821 319T852 201Q852 131 827 72T754 -31T634 -100T470 -125Q364 -125 278 -91T132 -2L173 66Q181 79 192 86T221 93Q239 93 259 79T308 48T379 16T485 2Q535 2 574 14T641 49T682 103T696 172Q696 217 671 250T605 +308T512 355T405 398T298 445T205 506T139 587T114 698Q114 776 157 838T293 936Q243 974 212 1026T180 1154Q180 1212 204 1265T274 1359T387 1423T540 1447Q640 1447 719 1416T857 1330L817 1265ZM272 726Q272 675 307 640T396 576T517 521T645 463Q699 489 723 +526T747 611Q747 647 732 675T691 726T630 768T556 804T474 839T392 877Q326 847 299 811T272 726Z" /> +<glyph unicode="¨" glyph-name="dieresis" horiz-adv-x="614" d="M239 1289Q239 1266 230 1246T205 1211T169 1187T125 1178Q103 1178 83 1187T48 1211T23 1246T14 1289Q14 1312 23 1333T47 1369T83 1394T125 1403Q148 1403 168 1394T205 1370T230 1333T239 +1289ZM598 1289Q598 1266 589 1246T565 1211T529 1187T485 1178Q462 1178 442 1187T406 1211T382 1246T373 1289Q373 1312 382 1333T406 1369T441 1394T485 1403Q508 1403 528 1394T564 1370T589 1333T598 1289Z" /> +<glyph unicode="©" glyph-name="copyright" horiz-adv-x="1596" d="M1030 463Q1038 468 1043 471T1055 475Q1066 475 1070 472T1080 463L1141 399Q1084 333 1001 297T802 260Q704 260 624 294T486 389T397 534T365 718Q365 819 399 903T495 1048T639 1142T821 +1176Q929 1176 1005 1142T1138 1053L1092 988Q1087 982 1079 976T1059 970Q1045 970 1030 981T989 1005T926 1030T829 1042Q759 1042 703 1020T607 955T546 853T524 718Q524 641 545 581T605 479T696 417T811 395Q859 395 892 401T949 417T991 439T1030 463ZM68 +716Q68 817 94 910T167 1085T282 1233T430 1348T604 1422T798 1448Q899 1448 992 1422T1167 1348T1315 1234T1429 1086T1503 911T1529 716Q1529 616 1503 523T1430 348T1315 201T1167 86T993 12T798 -14Q697 -14 604 12T430 86T282 200T168 348T94 522T68 716ZM168 +716Q168 627 190 545T253 392T351 262T478 163T629 99T798 76Q930 76 1045 126T1246 262T1381 465T1431 716Q1431 805 1409 888T1345 1042T1247 1173T1119 1273T968 1338T798 1361Q666 1361 551 1311T351 1173T217 968T168 716Z" /> +<glyph unicode="ª" glyph-name="ordfeminine" horiz-adv-x="684" d="M596 840H536Q518 840 509 845T492 869L480 918Q456 897 433 881T385 854T332 837T270 831Q232 831 200 841T143 871T106 922T92 993Q92 1027 111 1060T174 1120T290 1164T470 1184V1221Q470 +1284 441 1314T355 1344Q317 1344 292 1335T249 1316T216 1297T185 1288Q171 1288 161 1295T146 1313L124 1355Q176 1404 236 1427T370 1450Q424 1450 466 1433T537 1386T581 1314T596 1221V840ZM309 923Q360 923 397 942T470 996V1101Q400 1099 352 1091T273 1069T230 +1038T217 999Q217 957 243 940T309 923Z" /> +<glyph unicode="«" glyph-name="guillemotleft" horiz-adv-x="926" d="M138 518V541L387 930L445 902Q459 895 466 884T473 860Q473 843 463 827L304 566Q290 542 276 529Q291 515 304 493L463 232Q468 224 470 215T473 198Q473 170 445 157L387 129L138 +518ZM434 518V541L683 930L741 902Q755 895 762 884T769 860Q769 843 759 827L600 566Q586 542 572 529Q587 515 600 493L759 232Q764 224 766 215T769 198Q769 170 741 157L683 129L434 518Z" /> +<glyph unicode="¬" glyph-name="logicalnot" horiz-adv-x="1160" d="M148 739H1008V315H857V604H148V739Z" /> +<glyph unicode="­" glyph-name="uni00AD" horiz-adv-x="694" d="M100 675H594V524H100V675Z" /> +<glyph unicode="®" glyph-name="registered" horiz-adv-x="1596" d="M68 716Q68 817 94 910T167 1085T282 1233T430 1348T604 1422T798 1448Q899 1448 992 1422T1167 1348T1315 1234T1429 1086T1503 911T1529 716Q1529 616 1503 523T1430 348T1315 201T1167 +86T993 12T798 -14Q697 -14 604 12T430 86T282 200T168 348T94 522T68 716ZM168 716Q168 627 190 545T253 392T351 262T478 163T629 99T798 76Q930 76 1045 126T1246 262T1381 465T1431 716Q1431 805 1409 888T1345 1042T1247 1173T1119 1273T968 1338T798 1361Q666 +1361 551 1311T351 1173T217 968T168 716ZM654 626V272H498V1164H786Q958 1164 1041 1102T1124 917Q1124 823 1071 757T911 666Q928 656 940 641T964 606L1192 272H1044Q1011 272 995 297L794 599Q785 612 773 619T734 626H654ZM654 740H770Q825 740 863 750T925 +781T959 830T970 897Q970 934 961 962T930 1008T873 1035T786 1044H654V740Z" /> +<glyph unicode="¯" glyph-name="overscore" horiz-adv-x="614" d="M20 1348H594V1231H20V1348Z" /> +<glyph unicode="°" glyph-name="degree" horiz-adv-x="794" d="M70 1128Q70 1195 95 1254T164 1356T267 1425T396 1450Q465 1450 524 1425T628 1357T697 1254T722 1128Q722 1062 697 1004T628 902T525 833T396 807Q327 807 268 832T164 901T95 1003T70 1128ZM197 +1127Q197 1085 212 1049T254 985T317 943T396 927Q438 927 474 942T537 985T579 1048T594 1127Q594 1169 579 1206T537 1270T474 1313T396 1329Q354 1329 318 1314T254 1271T212 1206T197 1127Z" /> +<glyph unicode="±" glyph-name="plusminus" horiz-adv-x="1160" d="M651 1202V826H1058V690H651V322H505V690H100V826H505V1202H651ZM100 215H1058V80H100V215Z" /> +<glyph unicode="²" glyph-name="twosuperior" horiz-adv-x="664" d="M346 1637Q398 1637 440 1622T513 1580T559 1515T576 1429Q576 1389 564 1355T530 1289T482 1229T425 1170L263 1005Q286 1011 309 1015T354 1019H549Q570 1019 581 1008T593 977V900H82V943Q82 +956 87 970T104 996L325 1215Q350 1240 372 1266T410 1318T435 1371T445 1425Q445 1476 415 1503T340 1531Q294 1531 266 1507T223 1441Q215 1427 206 1419T179 1411Q175 1411 171 1411T161 1413L90 1425Q105 1531 174 1584T346 1637Z" /> +<glyph unicode="³" glyph-name="threesuperior" horiz-adv-x="664" d="M354 1637Q405 1637 446 1623T516 1583T562 1523T578 1449Q578 1321 459 1276Q525 1257 559 1218T594 1117Q594 1062 573 1020T518 950T438 907T344 892Q287 892 245 904T173 941T121 +1002T84 1085L139 1109Q154 1115 168 1115Q197 1115 208 1092Q214 1079 223 1063T247 1033T283 1010T337 1000Q368 1000 391 1010T431 1035T455 1071T463 1112Q463 1142 455 1163T427 1199T375 1220T295 1227V1314Q382 1315 417 1345T453 1427Q453 1477 424 1503T347 +1529Q299 1529 271 1506T230 1442Q222 1426 214 1419T190 1411Q186 1411 182 1411T172 1413L105 1425Q112 1478 134 1517T188 1583T263 1623T354 1637Z" /> +<glyph unicode="´" glyph-name="acute" horiz-adv-x="614" d="M597 1449L364 1191Q350 1176 337 1170T302 1163H196L344 1405Q358 1428 374 1438T423 1449H597Z" /> +<glyph unicode="µ" glyph-name="mu" horiz-adv-x="1112" d="M300 1013V355Q300 246 354 186T513 126Q591 126 660 163T787 266V1013H965V0H859Q821 0 811 37L797 146Q730 74 660 40T502 6Q428 6 372 31T277 103Q284 61 287 18T290 -64V-343H201Q163 -343 +143 -323T122 -267V1013H300Z" /> +<glyph unicode="¶" glyph-name="paragraph" horiz-adv-x="1338" d="M1302 1433V1280H1083V-201H926V1280H649V-201H492V660Q388 660 305 690T164 773T74 897T42 1049Q42 1135 73 1205T163 1326T305 1405T492 1433H1302Z" /> +<glyph unicode="·" glyph-name="middot" horiz-adv-x="546" d="M124 593Q124 624 135 652T167 700T215 732T272 744Q303 744 331 732T379 700T411 652T423 593Q423 563 411 536T379 489T331 457T272 445Q242 445 215 456T168 488T136 536T124 593Z" /> +<glyph unicode="¸" glyph-name="cedilla" horiz-adv-x="614" d="M172 -247Q178 -247 186 -250T205 -258T232 -266T269 -270Q311 -270 332 -254T354 -211Q354 -192 343 -179T312 -157T261 -142T193 -131L236 10H348L324 -70Q414 -90 454 -124T495 -213Q495 +-245 479 -270T435 -314T366 -341T278 -351Q237 -351 200 -343T132 -320L149 -265Q155 -247 172 -247Z" /> +<glyph unicode="¹" glyph-name="onesuperior" horiz-adv-x="664" d="M173 985H320V1425L324 1468L217 1380Q205 1371 191 1371Q168 1371 159 1385L120 1441L342 1631H450V985H580V900H173V985Z" /> +<glyph unicode="º" glyph-name="ordmasculine" horiz-adv-x="762" d="M382 1449Q452 1449 508 1428T605 1366T667 1269T689 1140Q689 1068 667 1010T605 912T509 850T382 828Q311 828 254 849T157 911T94 1010T72 1140Q72 1211 94 1268T156 1366T254 1427T382 +1449ZM382 934Q466 934 507 986T549 1139Q549 1239 508 1291T382 1343Q295 1343 254 1291T212 1139Q212 1039 253 987T382 934Z" /> +<glyph unicode="»" glyph-name="guillemotright" horiz-adv-x="926" d="M236 129L178 157Q150 170 150 198Q150 215 160 232L319 493Q332 517 346 529Q334 540 319 566L160 827Q150 844 150 861Q150 889 178 902L236 930L485 541V518L236 129ZM781 541V518L532 +129L474 157Q446 170 446 198Q446 215 456 232L615 493Q628 517 642 529Q630 540 615 566L456 827Q446 844 446 861Q446 889 474 902L532 930L781 541Z" /> +<glyph unicode="¼" glyph-name="onequarter" horiz-adv-x="1424" d="M1295 267H1404V202Q1404 191 1397 184T1377 176H1295V0H1186V176H880Q862 176 852 184T839 204L829 261L1171 729H1295V267ZM155 788H302V1228L306 1271L199 1183Q187 1174 173 1174Q150 +1174 141 1188L102 1244L324 1434H432V788H562V703H155V788ZM1186 508Q1186 527 1187 549T1191 594L950 267H1186V508ZM434 53Q415 22 393 11T342 0H266L1084 1372Q1102 1401 1125 1417T1180 1433H1257L434 53Z" /> +<glyph unicode="½" glyph-name="onehalf" horiz-adv-x="1424" d="M1126 737Q1178 737 1220 722T1293 680T1339 615T1356 529Q1356 489 1344 455T1310 389T1262 329T1205 270L1043 105Q1066 111 1089 115T1134 119H1329Q1350 119 1361 108T1373 77V0H862V43Q862 +56 867 70T884 96L1105 315Q1130 340 1152 366T1190 418T1215 471T1225 525Q1225 576 1195 603T1120 631Q1074 631 1046 607T1003 541Q995 527 986 519T959 511Q955 511 951 511T941 513L870 525Q885 631 954 684T1126 737ZM155 788H302V1228L306 1271L199 1183Q187 +1174 173 1174Q150 1174 141 1188L102 1244L324 1434H432V788H562V703H155V788ZM390 53Q371 22 349 11T298 0H222L1040 1372Q1058 1401 1081 1417T1136 1433H1213L390 53Z" /> +<glyph unicode="¾" glyph-name="threequarters" horiz-adv-x="1426" d="M1296 267H1405V202Q1405 191 1398 184T1378 176H1296V0H1187V176H881Q863 176 853 184T840 204L830 261L1172 729H1296V267ZM338 1440Q389 1440 430 1426T500 1386T546 1326T562 1252Q562 +1124 443 1079Q509 1060 543 1021T578 920Q578 865 557 823T502 753T422 710T328 695Q271 695 229 707T157 744T105 805T68 888L123 912Q138 918 152 918Q181 918 192 895Q198 882 207 866T231 836T267 813T321 803Q352 803 375 813T415 838T439 874T447 915Q447 +945 439 966T411 1002T359 1023T279 1030V1117Q366 1118 401 1148T437 1230Q437 1280 408 1306T331 1332Q283 1332 255 1309T214 1245Q206 1229 198 1222T174 1214Q170 1214 166 1214T156 1216L89 1228Q96 1281 118 1320T172 1386T247 1426T338 1440ZM1187 508Q1187 +527 1188 549T1192 594L951 267H1187V508ZM439 53Q420 22 398 11T347 0H271L1089 1372Q1107 1401 1130 1417T1185 1433H1262L439 53Z" /> +<glyph unicode="¿" glyph-name="questiondown" horiz-adv-x="796" d="M770 -212Q739 -241 702 -267T620 -313T524 -344T412 -356Q333 -356 266 -334T149 -271T72 -171T44 -37Q44 39 66 92T123 183T199 248T275 299T336 347T366 405L384 559H506L518 392V380Q518 +336 496 305T439 249T365 201T291 147T234 77T211 -22Q211 -66 228 -100T274 -159T342 -197T427 -210Q488 -210 531 -195T605 -162T654 -129T685 -114Q699 -114 707 -120T723 -137L770 -212ZM324 903Q324 929 333 952T359 992T399 1019T448 1029Q474 1029 497 1019T537 +992T563 952T573 903Q573 876 564 854T537 814T497 788T448 778Q422 778 399 787T360 814T334 853T324 903Z" /> +<glyph unicode="À" glyph-name="Agrave" horiz-adv-x="1360" d="M1353 0H1203Q1177 0 1161 13T1137 46L1003 392H360L226 46Q219 28 202 14T160 0H10L583 1433H780L1353 0ZM414 532H949L724 1115Q702 1169 681 1250Q670 1209 660 1175T639 1114L414 532ZM520 +1782Q552 1782 568 1776T604 1749L815 1546H676Q655 1546 643 1549T614 1565L319 1782H520Z" /> +<glyph unicode="Á" glyph-name="Aacute" horiz-adv-x="1360" d="M1353 0H1203Q1177 0 1161 13T1137 46L1003 392H360L226 46Q219 28 202 14T160 0H10L583 1433H780L1353 0ZM414 532H949L724 1115Q702 1169 681 1250Q670 1209 660 1175T639 1114L414 532ZM1021 +1782L727 1566Q710 1554 697 1550T663 1546H525L736 1749Q746 1759 754 1765T772 1775T792 1780T820 1782H1021Z" /> +<glyph unicode="Â" glyph-name="Acircumflex" horiz-adv-x="1360" d="M1353 0H1203Q1177 0 1161 13T1137 46L1003 392H360L226 46Q219 28 202 14T160 0H10L583 1433H780L1353 0ZM414 532H949L724 1115Q702 1169 681 1250Q670 1209 660 1175T639 1114L414 +532ZM1006 1546H871Q859 1546 845 1549T822 1559L692 1654Q684 1658 680 1662Q672 1656 668 1654L538 1559Q529 1553 515 1550T489 1546H354L592 1756H768L1006 1546Z" /> +<glyph unicode="Ã" glyph-name="Atilde" horiz-adv-x="1360" d="M1353 0H1203Q1177 0 1161 13T1137 46L1003 392H360L226 46Q219 28 202 14T160 0H10L583 1433H780L1353 0ZM414 532H949L724 1115Q702 1169 681 1250Q670 1209 660 1175T639 1114L414 532ZM801 +1663Q836 1663 854 1683T874 1741H972Q972 1698 961 1662T929 1600T877 1559T806 1544Q771 1544 739 1557T678 1585T622 1614T572 1627Q538 1627 520 1606T500 1548H400Q400 1591 411 1627T444 1690T497 1731T568 1746Q603 1746 635 1733T696 1705T751 1676T801 +1663Z" /> +<glyph unicode="Ä" glyph-name="Adieresis" horiz-adv-x="1360" d="M1353 0H1203Q1177 0 1161 13T1137 46L1003 392H360L226 46Q219 28 202 14T160 0H10L583 1433H780L1353 0ZM414 532H949L724 1115Q702 1169 681 1250Q670 1209 660 1175T639 1114L414 532ZM578 +1666Q578 1644 569 1625T545 1590T510 1567T466 1558Q445 1558 426 1566T391 1590T367 1624T358 1666Q358 1689 367 1709T391 1745T425 1769T466 1778Q489 1778 509 1769T545 1745T569 1710T578 1666ZM1004 1666Q1004 1644 995 1625T971 1590T936 1567T894 1558Q871 +1558 851 1566T816 1590T793 1624T784 1666Q784 1689 792 1709T816 1745T851 1769T894 1778Q916 1778 936 1769T971 1745T995 1710T1004 1666Z" /> +<glyph unicode="Å" glyph-name="Aring" horiz-adv-x="1360" d="M1353 0H1203Q1177 0 1161 13T1137 46L1003 392H360L226 46Q219 28 202 14T160 0H10L583 1433H780L1353 0ZM414 532H949L724 1115Q702 1169 681 1250Q670 1209 660 1175T639 1114L414 532ZM489 +1659Q489 1698 504 1731T545 1787T605 1824T677 1837Q716 1837 750 1824T811 1788T853 1731T868 1659Q868 1621 853 1589T812 1534T751 1498T677 1485Q639 1485 605 1498T546 1534T505 1589T489 1659ZM578 1659Q578 1616 605 1588T679 1559Q724 1559 751 1587T779 +1659Q779 1704 752 1732T679 1760Q632 1760 605 1732T578 1659Z" /> +<glyph unicode="Æ" glyph-name="AE" horiz-adv-x="1858" d="M733 1433H1754V1275H1005L1065 799H1624V647H1084L1145 158H1754V0H982L933 392H377L198 45Q187 25 169 13T124 0H-24L733 1433ZM450 532H915L821 1285Q809 1244 795 1210T766 1144L450 532Z" /> +<glyph unicode="Ç" glyph-name="Ccedilla" horiz-adv-x="1370" d="M643 -247Q649 -247 657 -250T676 -258T703 -266T740 -270Q782 -270 803 -254T825 -211Q825 -192 814 -179T783 -157T732 -142T664 -131L700 -13Q561 -1 448 57T256 211T133 435T90 716Q90 +878 142 1013T290 1245T517 1395T810 1449Q968 1449 1082 1400T1286 1267L1223 1178Q1216 1168 1207 1162T1181 1155Q1168 1155 1154 1164T1119 1188T1072 1218T1008 1248T922 1271T809 1281Q694 1281 599 1242T434 1129T327 951T288 716Q288 582 326 477T431 300T589 +189T785 151Q849 151 900 158T994 182T1075 222T1151 281Q1168 296 1184 296Q1200 296 1213 283L1289 200Q1206 103 1090 47T811 -15L795 -70Q885 -90 925 -124T966 -213Q966 -245 950 -270T906 -314T837 -341T749 -351Q708 -351 671 -343T603 -320L620 -265Q626 +-247 643 -247Z" /> +<glyph unicode="È" glyph-name="Egrave" horiz-adv-x="1162" d="M1057 1433V1275H369V799H926V647H369V158H1057V0H174V1433H1057ZM468 1782Q500 1782 516 1776T552 1749L763 1546H624Q603 1546 591 1549T562 1565L267 1782H468Z" /> +<glyph unicode="É" glyph-name="Eacute" horiz-adv-x="1162" d="M1057 1433V1275H369V799H926V647H369V158H1057V0H174V1433H1057ZM969 1782L675 1566Q658 1554 645 1550T611 1546H473L684 1749Q694 1759 702 1765T720 1775T740 1780T768 1782H969Z" /> +<glyph unicode="Ê" glyph-name="Ecircumflex" horiz-adv-x="1162" d="M1057 1433V1275H369V799H926V647H369V158H1057V0H174V1433H1057ZM954 1546H819Q807 1546 793 1549T770 1559L640 1654Q632 1658 628 1662Q620 1656 616 1654L486 1559Q477 1553 463 1550T437 +1546H302L540 1756H716L954 1546Z" /> +<glyph unicode="Ë" glyph-name="Edieresis" horiz-adv-x="1162" d="M1057 1433V1275H369V799H926V647H369V158H1057V0H174V1433H1057ZM526 1666Q526 1644 517 1625T493 1590T458 1567T414 1558Q393 1558 374 1566T339 1590T315 1624T306 1666Q306 1689 315 +1709T339 1745T373 1769T414 1778Q437 1778 457 1769T493 1745T517 1710T526 1666ZM952 1666Q952 1644 943 1625T919 1590T884 1567T842 1558Q819 1558 799 1566T764 1590T741 1624T732 1666Q732 1689 740 1709T764 1745T799 1769T842 1778Q864 1778 884 1769T919 +1745T943 1710T952 1666Z" /> +<glyph unicode="Ì" glyph-name="Igrave" horiz-adv-x="614" d="M404 0H210V1433H404V0ZM405 1782Q437 1782 453 1776T489 1749L700 1546H561Q540 1546 528 1549T499 1565L204 1782H405Z" /> +<glyph unicode="Í" glyph-name="Iacute" horiz-adv-x="614" d="M404 0H210V1433H404V0ZM906 1782L612 1566Q595 1554 582 1550T548 1546H410L621 1749Q631 1759 639 1765T657 1775T677 1780T705 1782H906Z" /> +<glyph unicode="Î" glyph-name="Icircumflex" horiz-adv-x="614" d="M404 0H210V1433H404V0ZM635 1546H500Q488 1546 474 1549T451 1559L321 1654Q313 1658 309 1662Q301 1656 297 1654L167 1559Q158 1553 144 1550T118 1546H-17L221 1756H397L635 1546Z" /> +<glyph unicode="Ï" glyph-name="Idieresis" horiz-adv-x="614" d="M404 0H210V1433H404V0ZM206 1666Q206 1644 197 1625T173 1590T138 1567T94 1558Q73 1558 54 1566T19 1590T-5 1624T-14 1666Q-14 1689 -5 1709T19 1745T53 1769T94 1778Q117 1778 137 1769T173 +1745T197 1710T206 1666ZM632 1666Q632 1644 623 1625T599 1590T564 1567T522 1558Q499 1558 479 1566T444 1590T421 1624T412 1666Q412 1689 420 1709T444 1745T479 1769T522 1778Q544 1778 564 1769T599 1745T623 1710T632 1666Z" /> +<glyph unicode="Ð" glyph-name="Eth" horiz-adv-x="1578" d="M50 780H247V1433H782Q940 1433 1070 1382T1294 1236T1438 1009T1489 716Q1489 555 1438 423T1294 197T1071 52T782 0H247V666H50V780ZM1290 716Q1290 848 1254 952T1152 1128T992 1238T782 1276H441V780H822V666H441V157H782Q898 +157 992 195T1152 304T1254 480T1290 716Z" /> +<glyph unicode="Ñ" glyph-name="Ntilde" horiz-adv-x="1512" d="M274 1433Q300 1433 312 1427T341 1400L1171 320Q1168 346 1167 370T1166 418V1433H1336V0H1238Q1215 0 1200 8T1169 35L340 1114Q342 1089 343 1065T344 1021V0H174V1433H274V1433ZM901 1663Q936 +1663 954 1683T974 1741H1072Q1072 1698 1061 1662T1029 1600T977 1559T906 1544Q871 1544 839 1557T778 1585T722 1614T672 1627Q638 1627 620 1606T600 1548H500Q500 1591 511 1627T544 1690T597 1731T668 1746Q703 1746 735 1733T796 1705T851 1676T901 1663Z" +/> +<glyph unicode="Ò" glyph-name="Ograve" horiz-adv-x="1596" d="M1505 716Q1505 555 1454 421T1310 189T1087 39T798 -15Q640 -15 510 38T287 189T143 420T92 716Q92 877 143 1011T287 1243T510 1395T798 1449Q956 1449 1086 1395T1310 1244T1454 1012T1505 +716ZM1306 716Q1306 848 1270 953T1168 1130T1008 1242T798 1281Q683 1281 589 1242T429 1131T326 953T290 716Q290 584 326 480T428 303T589 192T798 153Q914 153 1008 191T1168 302T1270 479T1306 716ZM640 1782Q672 1782 688 1776T724 1749L935 1546H796Q775 +1546 763 1549T734 1565L439 1782H640Z" /> +<glyph unicode="Ó" glyph-name="Oacute" horiz-adv-x="1596" d="M1505 716Q1505 555 1454 421T1310 189T1087 39T798 -15Q640 -15 510 38T287 189T143 420T92 716Q92 877 143 1011T287 1243T510 1395T798 1449Q956 1449 1086 1395T1310 1244T1454 1012T1505 +716ZM1306 716Q1306 848 1270 953T1168 1130T1008 1242T798 1281Q683 1281 589 1242T429 1131T326 953T290 716Q290 584 326 480T428 303T589 192T798 153Q914 153 1008 191T1168 302T1270 479T1306 716ZM1141 1782L847 1566Q830 1554 817 1550T783 1546H645L856 +1749Q866 1759 874 1765T892 1775T912 1780T940 1782H1141Z" /> +<glyph unicode="Ô" glyph-name="Ocircumflex" horiz-adv-x="1596" d="M1505 716Q1505 555 1454 421T1310 189T1087 39T798 -15Q640 -15 510 38T287 189T143 420T92 716Q92 877 143 1011T287 1243T510 1395T798 1449Q956 1449 1086 1395T1310 1244T1454 1012T1505 +716ZM1306 716Q1306 848 1270 953T1168 1130T1008 1242T798 1281Q683 1281 589 1242T429 1131T326 953T290 716Q290 584 326 480T428 303T589 192T798 153Q914 153 1008 191T1168 302T1270 479T1306 716ZM1126 1546H991Q979 1546 965 1549T942 1559L812 1654Q804 +1658 800 1662Q792 1656 788 1654L658 1559Q649 1553 635 1550T609 1546H474L712 1756H888L1126 1546Z" /> +<glyph unicode="Õ" glyph-name="Otilde" horiz-adv-x="1596" d="M1505 716Q1505 555 1454 421T1310 189T1087 39T798 -15Q640 -15 510 38T287 189T143 420T92 716Q92 877 143 1011T287 1243T510 1395T798 1449Q956 1449 1086 1395T1310 1244T1454 1012T1505 +716ZM1306 716Q1306 848 1270 953T1168 1130T1008 1242T798 1281Q683 1281 589 1242T429 1131T326 953T290 716Q290 584 326 480T428 303T589 192T798 153Q914 153 1008 191T1168 302T1270 479T1306 716ZM921 1663Q956 1663 974 1683T994 1741H1092Q1092 1698 1081 +1662T1049 1600T997 1559T926 1544Q891 1544 859 1557T798 1585T742 1614T692 1627Q658 1627 640 1606T620 1548H520Q520 1591 531 1627T564 1690T617 1731T688 1746Q723 1746 755 1733T816 1705T871 1676T921 1663Z" /> +<glyph unicode="Ö" glyph-name="Odieresis" horiz-adv-x="1596" d="M1505 716Q1505 555 1454 421T1310 189T1087 39T798 -15Q640 -15 510 38T287 189T143 420T92 716Q92 877 143 1011T287 1243T510 1395T798 1449Q956 1449 1086 1395T1310 1244T1454 1012T1505 +716ZM1306 716Q1306 848 1270 953T1168 1130T1008 1242T798 1281Q683 1281 589 1242T429 1131T326 953T290 716Q290 584 326 480T428 303T589 192T798 153Q914 153 1008 191T1168 302T1270 479T1306 716ZM698 1666Q698 1644 689 1625T665 1590T630 1567T586 1558Q565 +1558 546 1566T511 1590T487 1624T478 1666Q478 1689 487 1709T511 1745T545 1769T586 1778Q609 1778 629 1769T665 1745T689 1710T698 1666ZM1124 1666Q1124 1644 1115 1625T1091 1590T1056 1567T1014 1558Q991 1558 971 1566T936 1590T913 1624T904 1666Q904 +1689 912 1709T936 1745T971 1769T1014 1778Q1036 1778 1056 1769T1091 1745T1115 1710T1124 1666Z" /> +<glyph unicode="×" glyph-name="multiply" horiz-adv-x="1160" d="M1017 1014L673 670L1027 317L932 221L578 575L221 219L126 315L482 671L137 1016L232 1112L577 766L921 1110L1017 1014Z" /> +<glyph unicode="Ø" glyph-name="Oslash" horiz-adv-x="1596" d="M1505 716Q1505 555 1454 421T1310 189T1087 39T798 -15Q690 -15 596 9T423 82L323 -54Q301 -83 272 -96T214 -109H136L327 151Q215 249 154 393T92 716Q92 877 143 1011T287 1243T510 1395T798 +1449Q913 1449 1013 1420T1196 1337L1278 1448Q1298 1475 1314 1486T1362 1498H1462L1290 1263Q1393 1165 1449 1026T1505 716ZM290 716Q290 581 327 476T434 297L1093 1196Q1033 1238 959 1259T798 1281Q683 1281 589 1242T429 1131T326 953T290 716ZM1306 716Q1306 +842 1274 942T1181 1115L526 223Q642 153 798 153Q914 153 1008 191T1168 302T1270 479T1306 716Z" /> +<glyph unicode="Ù" glyph-name="Ugrave" horiz-adv-x="1460" d="M731 154Q820 154 890 184T1008 268T1082 397T1108 562V1433H1301V562Q1301 438 1262 332T1149 149T969 27T731 -17Q599 -17 493 27T313 148T200 332T160 562V1433H353V563Q353 473 378 398T452 +269T571 185T731 154ZM570 1782Q602 1782 618 1776T654 1749L865 1546H726Q705 1546 693 1549T664 1565L369 1782H570Z" /> +<glyph unicode="Ú" glyph-name="Uacute" horiz-adv-x="1460" d="M731 154Q820 154 890 184T1008 268T1082 397T1108 562V1433H1301V562Q1301 438 1262 332T1149 149T969 27T731 -17Q599 -17 493 27T313 148T200 332T160 562V1433H353V563Q353 473 378 398T452 +269T571 185T731 154ZM1071 1782L777 1566Q760 1554 747 1550T713 1546H575L786 1749Q796 1759 804 1765T822 1775T842 1780T870 1782H1071Z" /> +<glyph unicode="Û" glyph-name="Ucircumflex" horiz-adv-x="1460" d="M731 154Q820 154 890 184T1008 268T1082 397T1108 562V1433H1301V562Q1301 438 1262 332T1149 149T969 27T731 -17Q599 -17 493 27T313 148T200 332T160 562V1433H353V563Q353 473 378 +398T452 269T571 185T731 154ZM1056 1546H921Q909 1546 895 1549T872 1559L742 1654Q734 1658 730 1662Q722 1656 718 1654L588 1559Q579 1553 565 1550T539 1546H404L642 1756H818L1056 1546Z" /> +<glyph unicode="Ü" glyph-name="Udieresis" horiz-adv-x="1460" d="M731 154Q820 154 890 184T1008 268T1082 397T1108 562V1433H1301V562Q1301 438 1262 332T1149 149T969 27T731 -17Q599 -17 493 27T313 148T200 332T160 562V1433H353V563Q353 473 378 +398T452 269T571 185T731 154ZM628 1666Q628 1644 619 1625T595 1590T560 1567T516 1558Q495 1558 476 1566T441 1590T417 1624T408 1666Q408 1689 417 1709T441 1745T475 1769T516 1778Q539 1778 559 1769T595 1745T619 1710T628 1666ZM1054 1666Q1054 1644 1045 +1625T1021 1590T986 1567T944 1558Q921 1558 901 1566T866 1590T843 1624T834 1666Q834 1689 842 1709T866 1745T901 1769T944 1778Q966 1778 986 1769T1021 1745T1045 1710T1054 1666Z" /> +<glyph unicode="Ý" glyph-name="Yacute" horiz-adv-x="1258" d="M726 570V0H533V570L8 1433H178Q204 1433 219 1420T245 1388L573 831Q593 796 606 765T631 704Q642 735 655 766T688 831L1015 1388Q1024 1404 1039 1418T1080 1433H1252L726 570ZM971 1782L677 +1566Q660 1554 647 1550T613 1546H475L686 1749Q696 1759 704 1765T722 1775T742 1780T770 1782H971Z" /> +<glyph unicode="Þ" glyph-name="Thorn" horiz-adv-x="1222" d="M387 272V0H194V1433H387V1169H617Q753 1169 853 1138T1020 1048T1118 908T1151 725Q1151 625 1116 542T1014 399T846 306T617 272H387ZM387 426H617Q700 426 763 448T870 509T935 604T957 725Q957 +862 873 939T617 1016H387V426Z" /> +<glyph unicode="ß" glyph-name="germandbls" horiz-adv-x="1218" d="M673 1454Q776 1454 851 1424T976 1348T1048 1246T1072 1140Q1072 1080 1051 1037T997 961T928 903T858 854T805 805T783 747Q783 708 809 682T876 634T962 588T1049 529T1115 443T1142 +314Q1142 236 1114 175T1035 72T918 7T771 -16Q674 -16 595 18T456 107L497 175Q505 188 516 195T545 202Q563 202 583 188T630 157T695 126T786 112Q830 112 865 125T924 162T962 217T975 286Q975 342 947 377T877 437T786 484T695 534T625 604T597 712Q597 765 +619 804T675 875T748 934T820 991T876 1056T899 1140Q899 1172 887 1204T846 1263T774 1305T666 1322Q598 1322 543 1301T448 1238T387 1133T365 986V0H186V992Q186 1096 220 1181T319 1327T473 1421T673 1454Z" /> +<glyph unicode="à" glyph-name="agrave" horiz-adv-x="1014" d="M890 0H811Q785 0 769 8T748 42L728 136Q688 100 650 72T570 24T481 -6T375 -16Q316 -16 265 0T175 50T115 133T92 253Q92 313 125 368T231 467T424 537T715 569V648Q715 766 665 826T515 887Q450 +887 406 871T329 834T273 797T226 780Q208 780 195 789T173 813L141 870Q225 951 322 991T537 1031Q622 1031 688 1003T799 925T867 804T890 648V0ZM428 109Q475 109 514 118T587 145T653 188T715 245V456Q592 452 506 437T366 396T288 337T263 261Q263 221 276 +192T311 145T363 118T428 109ZM428 1449Q461 1449 477 1439T507 1405L656 1163H554Q533 1163 520 1169T493 1191L259 1449H428Z" /> +<glyph unicode="á" glyph-name="aacute" horiz-adv-x="1014" d="M890 0H811Q785 0 769 8T748 42L728 136Q688 100 650 72T570 24T481 -6T375 -16Q316 -16 265 0T175 50T115 133T92 253Q92 313 125 368T231 467T424 537T715 569V648Q715 766 665 826T515 887Q450 +887 406 871T329 834T273 797T226 780Q208 780 195 789T173 813L141 870Q225 951 322 991T537 1031Q622 1031 688 1003T799 925T867 804T890 648V0ZM428 109Q475 109 514 118T587 145T653 188T715 245V456Q592 452 506 437T366 396T288 337T263 261Q263 221 276 +192T311 145T363 118T428 109ZM818 1449L585 1191Q571 1176 558 1170T523 1163H417L565 1405Q579 1428 595 1438T644 1449H818Z" /> +<glyph unicode="â" glyph-name="acircumflex" horiz-adv-x="1014" d="M890 0H811Q785 0 769 8T748 42L728 136Q688 100 650 72T570 24T481 -6T375 -16Q316 -16 265 0T175 50T115 133T92 253Q92 313 125 368T231 467T424 537T715 569V648Q715 766 665 826T515 +887Q450 887 406 871T329 834T273 797T226 780Q208 780 195 789T173 813L141 870Q225 951 322 991T537 1031Q622 1031 688 1003T799 925T867 804T890 648V0ZM428 109Q475 109 514 118T587 145T653 188T715 245V456Q592 452 506 437T366 396T288 337T263 261Q263 +221 276 192T311 145T363 118T428 109ZM833 1169H714Q693 1169 674 1183L546 1309L529 1326L513 1309L384 1183Q378 1178 367 1174T344 1169H221L444 1433H610L833 1169Z" /> +<glyph unicode="ã" glyph-name="atilde" horiz-adv-x="1014" d="M890 0H811Q785 0 769 8T748 42L728 136Q688 100 650 72T570 24T481 -6T375 -16Q316 -16 265 0T175 50T115 133T92 253Q92 313 125 368T231 467T424 537T715 569V648Q715 766 665 826T515 887Q450 +887 406 871T329 834T273 797T226 780Q208 780 195 789T173 813L141 870Q225 951 322 991T537 1031Q622 1031 688 1003T799 925T867 804T890 648V0ZM428 109Q475 109 514 118T587 145T653 188T715 245V456Q592 452 506 437T366 396T288 337T263 261Q263 221 276 +192T311 145T363 118T428 109ZM638 1325Q674 1325 693 1346T714 1411H822Q822 1364 810 1325T774 1257T718 1214T645 1198Q610 1198 580 1212T522 1244T471 1275T424 1290Q352 1290 350 1202H239Q239 1250 252 1289T289 1357T346 1401T418 1417Q453 1417 483 1403T541 +1371T591 1340T638 1325Z" /> +<glyph unicode="ä" glyph-name="adieresis" horiz-adv-x="1014" d="M890 0H811Q785 0 769 8T748 42L728 136Q688 100 650 72T570 24T481 -6T375 -16Q316 -16 265 0T175 50T115 133T92 253Q92 313 125 368T231 467T424 537T715 569V648Q715 766 665 826T515 +887Q450 887 406 871T329 834T273 797T226 780Q208 780 195 789T173 813L141 870Q225 951 322 991T537 1031Q622 1031 688 1003T799 925T867 804T890 648V0ZM428 109Q475 109 514 118T587 145T653 188T715 245V456Q592 452 506 437T366 396T288 337T263 261Q263 +221 276 192T311 145T363 118T428 109ZM460 1289Q460 1266 451 1246T426 1211T390 1187T346 1178Q324 1178 304 1187T269 1211T244 1246T235 1289Q235 1312 244 1333T268 1369T304 1394T346 1403Q369 1403 389 1394T426 1370T451 1333T460 1289ZM819 1289Q819 1266 +810 1246T786 1211T750 1187T706 1178Q683 1178 663 1187T627 1211T603 1246T594 1289Q594 1312 603 1333T627 1369T662 1394T706 1403Q729 1403 749 1394T785 1370T810 1333T819 1289Z" /> +<glyph unicode="å" glyph-name="aring" horiz-adv-x="1014" d="M890 0H811Q785 0 769 8T748 42L728 136Q688 100 650 72T570 24T481 -6T375 -16Q316 -16 265 0T175 50T115 133T92 253Q92 313 125 368T231 467T424 537T715 569V648Q715 766 665 826T515 887Q450 +887 406 871T329 834T273 797T226 780Q208 780 195 789T173 813L141 870Q225 951 322 991T537 1031Q622 1031 688 1003T799 925T867 804T890 648V0ZM428 109Q475 109 514 118T587 145T653 188T715 245V456Q592 452 506 437T366 396T288 337T263 261Q263 221 276 +192T311 145T363 118T428 109ZM328 1315Q328 1357 344 1391T387 1450T451 1488T527 1502Q568 1502 604 1489T669 1450T713 1391T729 1315Q729 1274 713 1240T669 1182T605 1145T527 1131Q487 1131 451 1144T388 1182T344 1240T328 1315ZM428 1315Q428 1271 455 +1243T529 1215Q574 1215 601 1243T629 1315Q629 1360 602 1388T529 1416Q482 1416 455 1388T428 1315Z" /> +<glyph unicode="æ" glyph-name="ae" horiz-adv-x="1632" d="M1166 1029Q1248 1029 1318 997T1440 904T1521 756T1551 556Q1551 515 1543 501T1510 486H883Q887 395 910 328T971 215T1062 148T1180 126Q1249 126 1295 140T1371 173T1421 205T1456 220Q1470 +220 1479 216T1494 203L1541 142Q1508 102 1465 73T1372 24T1269 -4T1164 -14Q1047 -14 952 42T801 215Q774 153 731 109T634 37T522 -3T403 -16Q334 -16 277 1T179 54T115 142T92 267Q92 327 125 385T231 489T424 564T715 598V648Q715 766 665 829T515 892Q450 +892 406 875T329 836T273 798T226 780Q208 780 195 789T173 813L141 870Q225 951 315 991T519 1031Q639 1031 712 980T818 838Q872 926 958 977T1166 1029ZM715 486Q592 481 506 464T366 418T288 354T263 276Q263 189 313 149T444 109Q501 109 550 127T636 182T694 +274T715 403V486ZM1159 898Q1098 898 1050 878T968 818T913 723T885 597H1393Q1393 662 1378 717T1332 813T1259 875T1159 898Z" /> +<glyph unicode="ç" glyph-name="ccedilla" horiz-adv-x="934" d="M400 -247Q406 -247 414 -250T433 -258T460 -266T497 -270Q539 -270 560 -254T582 -211Q582 -192 571 -179T540 -157T489 -142T421 -131L458 -10Q375 1 305 40T183 146T103 303T74 507Q74 +620 105 716T197 881T347 990T551 1029Q657 1029 739 995T884 897L837 833Q829 822 821 816T798 810Q783 810 766 822T721 850T656 877T561 890Q487 890 430 864T335 787T277 666T257 507Q257 415 278 344T337 224T429 150T552 124Q617 124 659 139T729 174T775 +208T811 224Q822 224 830 220T845 207L895 142Q836 70 751 33T569 -12L552 -70Q642 -90 682 -124T723 -213Q723 -245 707 -270T663 -314T594 -341T506 -351Q465 -351 428 -343T360 -320L377 -265Q383 -247 400 -247Z" /> +<glyph unicode="è" glyph-name="egrave" horiz-adv-x="1048" d="M547 1029Q638 1029 715 999T848 911T935 769T967 576Q967 534 958 520T924 506H250Q252 410 276 339T342 221T442 150T572 126Q639 126 687 141T771 175T829 208T870 224Q892 224 904 207L954 +142Q921 102 875 73T777 24T668 -4T557 -14Q452 -14 364 21T211 125T110 295T74 527Q74 633 106 725T200 884T349 990T547 1029ZM551 898Q422 898 348 824T256 617H807Q807 679 790 730T740 819T660 877T551 898ZM451 1449Q484 1449 500 1439T530 1405L679 1163H577Q556 +1163 543 1169T516 1191L282 1449H451Z" /> +<glyph unicode="é" glyph-name="eacute" horiz-adv-x="1048" d="M547 1029Q638 1029 715 999T848 911T935 769T967 576Q967 534 958 520T924 506H250Q252 410 276 339T342 221T442 150T572 126Q639 126 687 141T771 175T829 208T870 224Q892 224 904 207L954 +142Q921 102 875 73T777 24T668 -4T557 -14Q452 -14 364 21T211 125T110 295T74 527Q74 633 106 725T200 884T349 990T547 1029ZM551 898Q422 898 348 824T256 617H807Q807 679 790 730T740 819T660 877T551 898ZM841 1449L608 1191Q594 1176 581 1170T546 1163H440L588 +1405Q602 1428 618 1438T667 1449H841Z" /> +<glyph unicode="ê" glyph-name="ecircumflex" horiz-adv-x="1048" d="M547 1029Q638 1029 715 999T848 911T935 769T967 576Q967 534 958 520T924 506H250Q252 410 276 339T342 221T442 150T572 126Q639 126 687 141T771 175T829 208T870 224Q892 224 904 +207L954 142Q921 102 875 73T777 24T668 -4T557 -14Q452 -14 364 21T211 125T110 295T74 527Q74 633 106 725T200 884T349 990T547 1029ZM551 898Q422 898 348 824T256 617H807Q807 679 790 730T740 819T660 877T551 898ZM856 1169H737Q716 1169 697 1183L569 1309L552 +1326L536 1309L407 1183Q401 1178 390 1174T367 1169H244L467 1433H633L856 1169Z" /> +<glyph unicode="ë" glyph-name="edieresis" horiz-adv-x="1048" d="M547 1029Q638 1029 715 999T848 911T935 769T967 576Q967 534 958 520T924 506H250Q252 410 276 339T342 221T442 150T572 126Q639 126 687 141T771 175T829 208T870 224Q892 224 904 207L954 +142Q921 102 875 73T777 24T668 -4T557 -14Q452 -14 364 21T211 125T110 295T74 527Q74 633 106 725T200 884T349 990T547 1029ZM551 898Q422 898 348 824T256 617H807Q807 679 790 730T740 819T660 877T551 898ZM483 1289Q483 1266 474 1246T449 1211T413 1187T369 +1178Q347 1178 327 1187T292 1211T267 1246T258 1289Q258 1312 267 1333T291 1369T327 1394T369 1403Q392 1403 412 1394T449 1370T474 1333T483 1289ZM842 1289Q842 1266 833 1246T809 1211T773 1187T729 1178Q706 1178 686 1187T650 1211T626 1246T617 1289Q617 +1312 626 1333T650 1369T685 1394T729 1403Q752 1403 772 1394T808 1370T833 1333T842 1289Z" /> +<glyph unicode="ì" glyph-name="igrave" horiz-adv-x="512" d="M344 1013V0H166V1013H344ZM418 1449Q451 1449 467 1439T497 1405L646 1163H544Q523 1163 510 1169T483 1191L249 1449H418Z" /> +<glyph unicode="í" glyph-name="iacute" horiz-adv-x="512" d="M344 1013V0H166V1013H344ZM808 1449L575 1191Q561 1176 548 1170T513 1163H407L555 1405Q569 1428 585 1438T634 1449H808Z" /> +<glyph unicode="î" glyph-name="icircumflex" horiz-adv-x="512" d="M344 1013V0H166V1013H344ZM822 1169H703Q682 1169 663 1183L535 1309L518 1326L502 1309L373 1183Q367 1178 356 1174T333 1169H210L433 1433H599L822 1169Z" /> +<glyph unicode="ï" glyph-name="idieresis" horiz-adv-x="512" d="M344 1013V0H166V1013H344ZM450 1289Q450 1266 441 1246T416 1211T380 1187T336 1178Q314 1178 294 1187T259 1211T234 1246T225 1289Q225 1312 234 1333T258 1369T294 1394T336 1403Q359 +1403 379 1394T416 1370T441 1333T450 1289ZM809 1289Q809 1266 800 1246T776 1211T740 1187T696 1178Q673 1178 653 1187T617 1211T593 1246T584 1289Q584 1312 593 1333T617 1369T652 1394T696 1403Q719 1403 739 1394T775 1370T800 1333T809 1289Z" /> +<glyph unicode="ð" glyph-name="eth" horiz-adv-x="1106" d="M417 1065Q413 1072 411 1078T408 1091Q408 1113 431 1128L534 1200Q489 1220 439 1237T331 1268Q313 1273 301 1286T288 1323Q288 1338 293 1352L313 1414Q409 1398 499 1368T670 1290L837 1412L872 +1355Q880 1342 880 1331Q880 1310 858 1294L761 1227Q821 1178 870 1116T955 977T1009 807T1029 604Q1029 461 998 347T906 153T753 30T541 -13Q443 -13 358 20T211 114T112 265T76 466Q76 560 107 643T196 790T336 890T523 927Q623 927 711 884T865 754Q845 890 +787 985T634 1144L450 1009L417 1065ZM545 125Q616 125 673 152T771 233T835 370T861 564Q845 607 819 647T756 719T669 769T557 788Q482 788 426 763T331 695T274 592T254 464Q254 383 277 320T340 213T432 148T545 125Z" /> +<glyph unicode="ñ" glyph-name="ntilde" horiz-adv-x="1112" d="M146 0V1013H252Q290 1013 300 976L314 866Q380 939 461 984T650 1029Q733 1029 796 1002T902 924T967 802T989 645V0H811V645Q811 760 759 823T598 887Q519 887 451 849T324 746V0H146ZM675 +1325Q711 1325 730 1346T751 1411H859Q859 1364 847 1325T811 1257T755 1214T682 1198Q647 1198 617 1212T559 1244T508 1275T461 1290Q389 1290 387 1202H276Q276 1250 289 1289T326 1357T383 1401T455 1417Q490 1417 520 1403T578 1371T628 1340T675 1325Z" /> +<glyph unicode="ò" glyph-name="ograve" horiz-adv-x="1112" d="M556 1029Q667 1029 756 992T908 887T1004 723T1038 507Q1038 387 1005 291T909 127T757 23T556 -14Q445 -14 356 22T203 127T106 291T72 507Q72 626 106 722T203 887T355 992T556 1029ZM556 +125Q706 125 780 225T854 506Q854 687 780 788T556 889Q480 889 424 863T331 788T275 668T256 506Q256 416 274 345T330 226T424 151T556 125ZM458 1449Q491 1449 507 1439T537 1405L686 1163H584Q563 1163 550 1169T523 1191L289 1449H458Z" /> +<glyph unicode="ó" glyph-name="oacute" horiz-adv-x="1112" d="M556 1029Q667 1029 756 992T908 887T1004 723T1038 507Q1038 387 1005 291T909 127T757 23T556 -14Q445 -14 356 22T203 127T106 291T72 507Q72 626 106 722T203 887T355 992T556 1029ZM556 +125Q706 125 780 225T854 506Q854 687 780 788T556 889Q480 889 424 863T331 788T275 668T256 506Q256 416 274 345T330 226T424 151T556 125ZM848 1449L615 1191Q601 1176 588 1170T553 1163H447L595 1405Q609 1428 625 1438T674 1449H848Z" /> +<glyph unicode="ô" glyph-name="ocircumflex" horiz-adv-x="1112" d="M556 1029Q667 1029 756 992T908 887T1004 723T1038 507Q1038 387 1005 291T909 127T757 23T556 -14Q445 -14 356 22T203 127T106 291T72 507Q72 626 106 722T203 887T355 992T556 1029ZM556 +125Q706 125 780 225T854 506Q854 687 780 788T556 889Q480 889 424 863T331 788T275 668T256 506Q256 416 274 345T330 226T424 151T556 125ZM863 1169H744Q723 1169 704 1183L576 1309L559 1326L543 1309L414 1183Q408 1178 397 1174T374 1169H251L474 1433H640L863 +1169Z" /> +<glyph unicode="õ" glyph-name="otilde" horiz-adv-x="1112" d="M556 1029Q667 1029 756 992T908 887T1004 723T1038 507Q1038 387 1005 291T909 127T757 23T556 -14Q445 -14 356 22T203 127T106 291T72 507Q72 626 106 722T203 887T355 992T556 1029ZM556 +125Q706 125 780 225T854 506Q854 687 780 788T556 889Q480 889 424 863T331 788T275 668T256 506Q256 416 274 345T330 226T424 151T556 125ZM668 1325Q704 1325 723 1346T744 1411H852Q852 1364 840 1325T804 1257T748 1214T675 1198Q640 1198 610 1212T552 1244T501 +1275T454 1290Q382 1290 380 1202H269Q269 1250 282 1289T319 1357T376 1401T448 1417Q483 1417 513 1403T571 1371T621 1340T668 1325Z" /> +<glyph unicode="ö" glyph-name="odieresis" horiz-adv-x="1112" d="M556 1029Q667 1029 756 992T908 887T1004 723T1038 507Q1038 387 1005 291T909 127T757 23T556 -14Q445 -14 356 22T203 127T106 291T72 507Q72 626 106 722T203 887T355 992T556 1029ZM556 +125Q706 125 780 225T854 506Q854 687 780 788T556 889Q480 889 424 863T331 788T275 668T256 506Q256 416 274 345T330 226T424 151T556 125ZM490 1289Q490 1266 481 1246T456 1211T420 1187T376 1178Q354 1178 334 1187T299 1211T274 1246T265 1289Q265 1312 +274 1333T298 1369T334 1394T376 1403Q399 1403 419 1394T456 1370T481 1333T490 1289ZM849 1289Q849 1266 840 1246T816 1211T780 1187T736 1178Q713 1178 693 1187T657 1211T633 1246T624 1289Q624 1312 633 1333T657 1369T692 1394T736 1403Q759 1403 779 1394T815 +1370T840 1333T849 1289Z" /> +<glyph unicode="÷" glyph-name="divide" horiz-adv-x="1160" d="M100 739H1058V604H100V739ZM454 1026Q454 1052 463 1075T489 1115T528 1142T578 1152Q604 1152 626 1142T666 1115T693 1075T703 1026Q703 999 693 977T666 937T627 911T578 901Q551 901 529 +910T490 937T464 976T454 1026ZM454 314Q454 340 463 363T489 403T528 430T578 440Q604 440 626 430T666 403T693 363T703 314Q703 287 693 265T666 225T627 199T578 189Q551 189 529 198T490 225T464 264T454 314Z" /> +<glyph unicode="ø" glyph-name="oslash" horiz-adv-x="1112" d="M912 884Q973 816 1006 721T1039 507Q1039 387 1006 291T910 127T758 23T557 -14Q481 -14 416 3T296 52L241 -22Q219 -51 190 -63T131 -76H64L209 120Q143 189 108 286T73 507Q73 626 107 722T204 +887T356 992T557 1029Q636 1029 703 1010T827 956L895 1047Q915 1074 931 1085T979 1097H1069L912 884ZM246 506Q246 346 305 249L741 839Q668 895 557 895Q481 895 423 868T326 791T266 669T246 506ZM557 120Q632 120 689 146T786 223T846 344T866 506Q866 657 +814 753L381 168Q451 120 557 120Z" /> +<glyph unicode="ù" glyph-name="ugrave" horiz-adv-x="1112" d="M300 1013V367Q300 252 353 189T513 126Q591 126 660 163T787 266V1013H965V0H859Q821 0 811 37L797 146Q731 73 649 29T461 -16Q378 -16 315 11T208 89T144 210T122 367V1013H300ZM452 1449Q485 +1449 501 1439T531 1405L680 1163H578Q557 1163 544 1169T517 1191L283 1449H452Z" /> +<glyph unicode="ú" glyph-name="uacute" horiz-adv-x="1112" d="M300 1013V367Q300 252 353 189T513 126Q591 126 660 163T787 266V1013H965V0H859Q821 0 811 37L797 146Q731 73 649 29T461 -16Q378 -16 315 11T208 89T144 210T122 367V1013H300ZM842 1449L609 +1191Q595 1176 582 1170T547 1163H441L589 1405Q603 1428 619 1438T668 1449H842Z" /> +<glyph unicode="û" glyph-name="ucircumflex" horiz-adv-x="1112" d="M300 1013V367Q300 252 353 189T513 126Q591 126 660 163T787 266V1013H965V0H859Q821 0 811 37L797 146Q731 73 649 29T461 -16Q378 -16 315 11T208 89T144 210T122 367V1013H300ZM857 +1169H738Q717 1169 698 1183L570 1309L553 1326L537 1309L408 1183Q402 1178 391 1174T368 1169H245L468 1433H634L857 1169Z" /> +<glyph unicode="ü" glyph-name="udieresis" horiz-adv-x="1112" d="M300 1013V367Q300 252 353 189T513 126Q591 126 660 163T787 266V1013H965V0H859Q821 0 811 37L797 146Q731 73 649 29T461 -16Q378 -16 315 11T208 89T144 210T122 367V1013H300ZM484 +1289Q484 1266 475 1246T450 1211T414 1187T370 1178Q348 1178 328 1187T293 1211T268 1246T259 1289Q259 1312 268 1333T292 1369T328 1394T370 1403Q393 1403 413 1394T450 1370T475 1333T484 1289ZM843 1289Q843 1266 834 1246T810 1211T774 1187T730 1178Q707 +1178 687 1187T651 1211T627 1246T618 1289Q618 1312 627 1333T651 1369T686 1394T730 1403Q753 1403 773 1394T809 1370T834 1333T843 1289Z" /> +<glyph unicode="ý" glyph-name="yacute" horiz-adv-x="1024" d="M443 -299Q434 -319 421 -331T379 -343H247L432 59L14 1013H168Q191 1013 204 1002T223 976L494 338Q503 316 509 294T521 249Q528 272 535 294T551 339L814 976Q820 992 834 1002T866 1013H1008L443 +-299ZM825 1449L592 1191Q578 1176 565 1170T530 1163H424L572 1405Q586 1428 602 1438T651 1449H825Z" /> +<glyph unicode="þ" glyph-name="thorn" horiz-adv-x="1104" d="M146 -343V1473H324V866Q387 940 469 984T656 1029Q743 1029 814 996T935 898T1012 736T1039 513Q1039 401 1009 305T923 138T786 27T602 -14Q507 -14 441 20T324 118V-343H146ZM597 887Q510 +887 445 847T324 734V244Q373 178 431 151T562 124Q703 124 779 225T855 513Q855 612 838 683T787 799T706 866T597 887Z" /> +<glyph unicode="ÿ" glyph-name="ydieresis" horiz-adv-x="1024" d="M443 -299Q434 -319 421 -331T379 -343H247L432 59L14 1013H168Q191 1013 204 1002T223 976L494 338Q503 316 509 294T521 249Q528 272 535 294T551 339L814 976Q820 992 834 1002T866 1013H1008L443 +-299ZM467 1289Q467 1266 458 1246T433 1211T397 1187T353 1178Q331 1178 311 1187T276 1211T251 1246T242 1289Q242 1312 251 1333T275 1369T311 1394T353 1403Q376 1403 396 1394T433 1370T458 1333T467 1289ZM826 1289Q826 1266 817 1246T793 1211T757 1187T713 +1178Q690 1178 670 1187T634 1211T610 1246T601 1289Q601 1312 610 1333T634 1369T669 1394T713 1403Q736 1403 756 1394T792 1370T817 1333T826 1289Z" /> +<glyph unicode="–" glyph-name="endash" horiz-adv-x="1112" d="M156 655H956V525H156V655Z" /> +<glyph unicode="—" glyph-name="emdash" horiz-adv-x="1642" d="M156 655H1486V525H156V655Z" /> +<glyph unicode="‘" glyph-name="quoteleft" horiz-adv-x="424" d="M114 1012Q85 1060 72 1108T58 1205Q58 1295 102 1377T227 1529L282 1495Q290 1490 292 1484T295 1472Q295 1458 285 1448Q269 1428 254 1406T227 1360T208 1308T201 1251Q201 1219 210 +1185T243 1113Q250 1102 250 1090Q250 1066 223 1056L114 1012Z" /> +<glyph unicode="’" glyph-name="quoteright" horiz-adv-x="424" d="M271 1508Q300 1460 313 1412T326 1316Q326 1225 282 1143T158 991L103 1025Q95 1030 93 1036T90 1048Q90 1062 100 1072Q116 1091 131 1113T158 1160T177 1212T184 1269Q184 1301 175 +1335T142 1407Q135 1418 135 1429Q135 1453 162 1464L271 1508Z" /> +<glyph unicode="‚" glyph-name="quotesinglbase" horiz-adv-x="424" d="M271 241Q300 193 313 145T326 49Q326 -42 282 -124T158 -276L103 -242Q95 -237 93 -231T90 -219Q90 -205 100 -195Q116 -176 131 -154T158 -107T177 -55T184 2Q184 34 175 68T142 +140Q135 151 135 162Q135 186 162 197L271 241Z" /> +<glyph unicode="“" glyph-name="quotedblleft" horiz-adv-x="728" d="M114 1012Q85 1060 72 1108T58 1205Q58 1295 102 1377T227 1529L282 1495Q290 1490 292 1484T295 1472Q295 1458 285 1448Q269 1428 254 1406T227 1360T208 1308T201 1251Q201 1219 +210 1185T243 1113Q250 1102 250 1090Q250 1066 223 1056L114 1012ZM418 1012Q389 1060 376 1108T362 1205Q362 1295 406 1377T531 1529L586 1495Q594 1490 596 1484T599 1472Q599 1458 589 1448Q573 1428 558 1406T531 1360T512 1308T505 1251Q505 1219 514 1185T547 +1113Q554 1102 554 1090Q554 1066 527 1056L418 1012Z" /> +<glyph unicode="”" glyph-name="quotedblright" horiz-adv-x="728" d="M271 1508Q300 1460 313 1412T326 1316Q326 1225 282 1143T158 991L103 1025Q95 1030 93 1036T90 1048Q90 1062 100 1072Q116 1091 131 1113T158 1160T177 1212T184 1269Q184 1301 +175 1335T142 1407Q135 1418 135 1429Q135 1453 162 1464L271 1508ZM575 1508Q604 1460 617 1412T630 1316Q630 1225 586 1143T462 991L407 1025Q399 1030 397 1036T394 1048Q394 1062 404 1072Q420 1091 435 1113T462 1160T481 1212T488 1269Q488 1301 479 1335T446 +1407Q439 1418 439 1429Q439 1453 466 1464L575 1508Z" /> +<glyph unicode="„" glyph-name="quotedblbase" horiz-adv-x="728" d="M271 241Q300 193 313 145T326 49Q326 -42 282 -124T158 -276L103 -242Q95 -237 93 -231T90 -219Q90 -205 100 -195Q116 -176 131 -154T158 -107T177 -55T184 2Q184 34 175 68T142 140Q135 +151 135 162Q135 186 162 197L271 241ZM575 241Q604 193 617 145T630 49Q630 -42 586 -124T462 -276L407 -242Q399 -237 397 -231T394 -219Q394 -205 404 -195Q420 -176 435 -154T462 -107T481 -55T488 2Q488 34 479 68T446 140Q439 151 439 162Q439 186 466 197L575 +241Z" /> +<glyph unicode="•" glyph-name="bullet" horiz-adv-x="1160" d="M208 595Q208 672 237 740T317 858T434 938T578 968Q655 968 723 939T841 859T921 740T951 595Q951 518 922 451T842 333T723 254T578 224Q502 224 435 253T317 333T238 450T208 595Z" /> +<glyph unicode="‹" glyph-name="guilsinglleft" horiz-adv-x="632" d="M138 518V541L387 930L445 902Q459 895 466 884T473 860Q473 843 463 827L304 566Q290 542 276 529Q291 515 304 493L463 232Q468 224 470 215T473 198Q473 170 445 157L387 129L138 518Z" /> +<glyph unicode="›" glyph-name="guilsinglright" horiz-adv-x="632" d="M485 541V518L236 129L178 157Q150 170 150 198Q150 215 160 232L319 493Q332 517 346 529Q334 540 319 566L160 827Q150 844 150 861Q150 889 178 902L236 930L485 541Z" /> +<hkern g1="quotedbl" g2="ampersand" k="182" /> +<hkern g1="quotedbl" g2="comma" k="228" /> +<hkern g1="quotedbl" g2="hyphen" k="178" /> +<hkern g1="quotedbl" g2="period" k="228" /> +<hkern g1="quotedbl" g2="slash" k="182" /> +<hkern g1="quotedbl" g2="at" k="46" /> +<hkern g1="quotedbl" g2="A" k="182" /> +<hkern g1="quotedbl" g2="C" k="46" /> +<hkern g1="quotedbl" g2="G" k="46" /> +<hkern g1="quotedbl" g2="O" k="46" /> +<hkern g1="quotedbl" g2="Q" k="46" /> +<hkern g1="quotedbl" g2="V" k="-48" /> +<hkern g1="quotedbl" g2="W" k="-48" /> +<hkern g1="quotedbl" g2="Y" k="-30" /> +<hkern g1="quotedbl" g2="backslash" k="-48" /> +<hkern g1="quotedbl" g2="a" k="64" /> +<hkern g1="quotedbl" g2="c" k="92" /> +<hkern g1="quotedbl" g2="d" k="92" /> +<hkern g1="quotedbl" g2="e" k="92" /> +<hkern g1="quotedbl" g2="o" k="92" /> +<hkern g1="quotedbl" g2="q" k="92" /> +<hkern g1="quotedbl" g2="guillemotleft" k="178" /> +<hkern g1="quotedbl" g2="uni00AD" k="178" /> +<hkern g1="quotedbl" g2="middot" k="178" /> +<hkern g1="quotedbl" g2="guillemotright" k="178" /> +<hkern g1="quotedbl" g2="Agrave" k="182" /> +<hkern g1="quotedbl" g2="Aacute" k="182" /> +<hkern g1="quotedbl" g2="Acircumflex" k="182" /> +<hkern g1="quotedbl" g2="Atilde" k="182" /> +<hkern g1="quotedbl" g2="Adieresis" k="182" /> +<hkern g1="quotedbl" g2="Aring" k="182" /> +<hkern g1="quotedbl" g2="AE" k="182" /> +<hkern g1="quotedbl" g2="Ccedilla" k="46" /> +<hkern g1="quotedbl" g2="Ograve" k="46" /> +<hkern g1="quotedbl" g2="Oacute" k="46" /> +<hkern g1="quotedbl" g2="Ocircumflex" k="46" /> +<hkern g1="quotedbl" g2="Otilde" k="46" /> +<hkern g1="quotedbl" g2="Odieresis" k="46" /> +<hkern g1="quotedbl" g2="Oslash" k="46" /> +<hkern g1="quotedbl" g2="Yacute" k="-30" /> +<hkern g1="quotedbl" g2="agrave" k="64" /> +<hkern g1="quotedbl" g2="aacute" k="64" /> +<hkern g1="quotedbl" g2="acircumflex" k="64" /> +<hkern g1="quotedbl" g2="atilde" k="64" /> +<hkern g1="quotedbl" g2="adieresis" k="64" /> +<hkern g1="quotedbl" g2="aring" k="64" /> +<hkern g1="quotedbl" g2="ae" k="64" /> +<hkern g1="quotedbl" g2="ccedilla" k="92" /> +<hkern g1="quotedbl" g2="egrave" k="92" /> +<hkern g1="quotedbl" g2="eacute" k="92" /> +<hkern g1="quotedbl" g2="ecircumflex" k="92" /> +<hkern g1="quotedbl" g2="edieresis" k="92" /> +<hkern g1="quotedbl" g2="eth" k="92" /> +<hkern g1="quotedbl" g2="ograve" k="92" /> +<hkern g1="quotedbl" g2="oacute" k="92" /> +<hkern g1="quotedbl" g2="ocircumflex" k="92" /> +<hkern g1="quotedbl" g2="otilde" k="92" /> +<hkern g1="quotedbl" g2="odieresis" k="92" /> +<hkern g1="quotedbl" g2="oslash" k="92" /> +<hkern g1="quotedbl" g2="OE" k="46" /> +<hkern g1="quotedbl" g2="oe" k="92" /> +<hkern g1="quotedbl" g2="endash" k="178" /> +<hkern g1="quotedbl" g2="emdash" k="178" /> +<hkern g1="quotedbl" g2="quotesinglbase" k="228" /> +<hkern g1="quotedbl" g2="quotedblbase" k="228" /> +<hkern g1="quotedbl" g2="bullet" k="178" /> +<hkern g1="quotedbl" g2="guilsinglleft" k="178" /> +<hkern g1="quotedbl" g2="guilsinglright" k="178" /> +<hkern g1="quotesingle" g2="ampersand" k="182" /> +<hkern g1="quotesingle" g2="comma" k="228" /> +<hkern g1="quotesingle" g2="hyphen" k="178" /> +<hkern g1="quotesingle" g2="period" k="228" /> +<hkern g1="quotesingle" g2="slash" k="182" /> +<hkern g1="quotesingle" g2="at" k="46" /> +<hkern g1="quotesingle" g2="A" k="182" /> +<hkern g1="quotesingle" g2="C" k="46" /> +<hkern g1="quotesingle" g2="G" k="46" /> +<hkern g1="quotesingle" g2="O" k="46" /> +<hkern g1="quotesingle" g2="Q" k="46" /> +<hkern g1="quotesingle" g2="V" k="-48" /> +<hkern g1="quotesingle" g2="W" k="-48" /> +<hkern g1="quotesingle" g2="Y" k="-30" /> +<hkern g1="quotesingle" g2="backslash" k="-48" /> +<hkern g1="quotesingle" g2="a" k="64" /> +<hkern g1="quotesingle" g2="c" k="92" /> +<hkern g1="quotesingle" g2="d" k="92" /> +<hkern g1="quotesingle" g2="e" k="92" /> +<hkern g1="quotesingle" g2="o" k="92" /> +<hkern g1="quotesingle" g2="q" k="92" /> +<hkern g1="quotesingle" g2="guillemotleft" k="178" /> +<hkern g1="quotesingle" g2="uni00AD" k="178" /> +<hkern g1="quotesingle" g2="middot" k="178" /> +<hkern g1="quotesingle" g2="guillemotright" k="178" /> +<hkern g1="quotesingle" g2="Agrave" k="182" /> +<hkern g1="quotesingle" g2="Aacute" k="182" /> +<hkern g1="quotesingle" g2="Acircumflex" k="182" /> +<hkern g1="quotesingle" g2="Atilde" k="182" /> +<hkern g1="quotesingle" g2="Adieresis" k="182" /> +<hkern g1="quotesingle" g2="Aring" k="182" /> +<hkern g1="quotesingle" g2="AE" k="182" /> +<hkern g1="quotesingle" g2="Ccedilla" k="46" /> +<hkern g1="quotesingle" g2="Ograve" k="46" /> +<hkern g1="quotesingle" g2="Oacute" k="46" /> +<hkern g1="quotesingle" g2="Ocircumflex" k="46" /> +<hkern g1="quotesingle" g2="Otilde" k="46" /> +<hkern g1="quotesingle" g2="Odieresis" k="46" /> +<hkern g1="quotesingle" g2="Oslash" k="46" /> +<hkern g1="quotesingle" g2="Yacute" k="-30" /> +<hkern g1="quotesingle" g2="agrave" k="64" /> +<hkern g1="quotesingle" g2="aacute" k="64" /> +<hkern g1="quotesingle" g2="acircumflex" k="64" /> +<hkern g1="quotesingle" g2="atilde" k="64" /> +<hkern g1="quotesingle" g2="adieresis" k="64" /> +<hkern g1="quotesingle" g2="aring" k="64" /> +<hkern g1="quotesingle" g2="ae" k="64" /> +<hkern g1="quotesingle" g2="ccedilla" k="92" /> +<hkern g1="quotesingle" g2="egrave" k="92" /> +<hkern g1="quotesingle" g2="eacute" k="92" /> +<hkern g1="quotesingle" g2="ecircumflex" k="92" /> +<hkern g1="quotesingle" g2="edieresis" k="92" /> +<hkern g1="quotesingle" g2="eth" k="92" /> +<hkern g1="quotesingle" g2="ograve" k="92" /> +<hkern g1="quotesingle" g2="oacute" k="92" /> +<hkern g1="quotesingle" g2="ocircumflex" k="92" /> +<hkern g1="quotesingle" g2="otilde" k="92" /> +<hkern g1="quotesingle" g2="odieresis" k="92" /> +<hkern g1="quotesingle" g2="oslash" k="92" /> +<hkern g1="quotesingle" g2="OE" k="46" /> +<hkern g1="quotesingle" g2="oe" k="92" /> +<hkern g1="quotesingle" g2="endash" k="178" /> +<hkern g1="quotesingle" g2="emdash" k="178" /> +<hkern g1="quotesingle" g2="quotesinglbase" k="228" /> +<hkern g1="quotesingle" g2="quotedblbase" k="228" /> +<hkern g1="quotesingle" g2="bullet" k="178" /> +<hkern g1="quotesingle" g2="guilsinglleft" k="178" /> +<hkern g1="quotesingle" g2="guilsinglright" k="178" /> +<hkern g1="parenleft" g2="at" k="40" /> +<hkern g1="parenleft" g2="C" k="40" /> +<hkern g1="parenleft" g2="G" k="40" /> +<hkern g1="parenleft" g2="O" k="40" /> +<hkern g1="parenleft" g2="Q" k="40" /> +<hkern g1="parenleft" g2="c" k="32" /> +<hkern g1="parenleft" g2="d" k="32" /> +<hkern g1="parenleft" g2="e" k="32" /> +<hkern g1="parenleft" g2="o" k="32" /> +<hkern g1="parenleft" g2="q" k="32" /> +<hkern g1="parenleft" g2="Ccedilla" k="40" /> +<hkern g1="parenleft" g2="Ograve" k="40" /> +<hkern g1="parenleft" g2="Oacute" k="40" /> +<hkern g1="parenleft" g2="Ocircumflex" k="40" /> +<hkern g1="parenleft" g2="Otilde" k="40" /> +<hkern g1="parenleft" g2="Odieresis" k="40" /> +<hkern g1="parenleft" g2="Oslash" k="40" /> +<hkern g1="parenleft" g2="ccedilla" k="32" /> +<hkern g1="parenleft" g2="egrave" k="32" /> +<hkern g1="parenleft" g2="eacute" k="32" /> +<hkern g1="parenleft" g2="ecircumflex" k="32" /> +<hkern g1="parenleft" g2="edieresis" k="32" /> +<hkern g1="parenleft" g2="eth" k="32" /> +<hkern g1="parenleft" g2="ograve" k="32" /> +<hkern g1="parenleft" g2="oacute" k="32" /> +<hkern g1="parenleft" g2="ocircumflex" k="32" /> +<hkern g1="parenleft" g2="otilde" k="32" /> +<hkern g1="parenleft" g2="odieresis" k="32" /> +<hkern g1="parenleft" g2="oslash" k="32" /> +<hkern g1="parenleft" g2="OE" k="40" /> +<hkern g1="parenleft" g2="oe" k="32" /> +<hkern g1="asterisk" g2="ampersand" k="182" /> +<hkern g1="asterisk" g2="comma" k="228" /> +<hkern g1="asterisk" g2="hyphen" k="178" /> +<hkern g1="asterisk" g2="period" k="228" /> +<hkern g1="asterisk" g2="slash" k="182" /> +<hkern g1="asterisk" g2="at" k="46" /> +<hkern g1="asterisk" g2="A" k="182" /> +<hkern g1="asterisk" g2="C" k="46" /> +<hkern g1="asterisk" g2="G" k="46" /> +<hkern g1="asterisk" g2="O" k="46" /> +<hkern g1="asterisk" g2="Q" k="46" /> +<hkern g1="asterisk" g2="V" k="-48" /> +<hkern g1="asterisk" g2="W" k="-48" /> +<hkern g1="asterisk" g2="Y" k="-30" /> +<hkern g1="asterisk" g2="backslash" k="-48" /> +<hkern g1="asterisk" g2="a" k="64" /> +<hkern g1="asterisk" g2="c" k="92" /> +<hkern g1="asterisk" g2="d" k="92" /> +<hkern g1="asterisk" g2="e" k="92" /> +<hkern g1="asterisk" g2="o" k="92" /> +<hkern g1="asterisk" g2="q" k="92" /> +<hkern g1="asterisk" g2="guillemotleft" k="178" /> +<hkern g1="asterisk" g2="uni00AD" k="178" /> +<hkern g1="asterisk" g2="middot" k="178" /> +<hkern g1="asterisk" g2="guillemotright" k="178" /> +<hkern g1="asterisk" g2="Agrave" k="182" /> +<hkern g1="asterisk" g2="Aacute" k="182" /> +<hkern g1="asterisk" g2="Acircumflex" k="182" /> +<hkern g1="asterisk" g2="Atilde" k="182" /> +<hkern g1="asterisk" g2="Adieresis" k="182" /> +<hkern g1="asterisk" g2="Aring" k="182" /> +<hkern g1="asterisk" g2="AE" k="182" /> +<hkern g1="asterisk" g2="Ccedilla" k="46" /> +<hkern g1="asterisk" g2="Ograve" k="46" /> +<hkern g1="asterisk" g2="Oacute" k="46" /> +<hkern g1="asterisk" g2="Ocircumflex" k="46" /> +<hkern g1="asterisk" g2="Otilde" k="46" /> +<hkern g1="asterisk" g2="Odieresis" k="46" /> +<hkern g1="asterisk" g2="Oslash" k="46" /> +<hkern g1="asterisk" g2="Yacute" k="-30" /> +<hkern g1="asterisk" g2="agrave" k="64" /> +<hkern g1="asterisk" g2="aacute" k="64" /> +<hkern g1="asterisk" g2="acircumflex" k="64" /> +<hkern g1="asterisk" g2="atilde" k="64" /> +<hkern g1="asterisk" g2="adieresis" k="64" /> +<hkern g1="asterisk" g2="aring" k="64" /> +<hkern g1="asterisk" g2="ae" k="64" /> +<hkern g1="asterisk" g2="ccedilla" k="92" /> +<hkern g1="asterisk" g2="egrave" k="92" /> +<hkern g1="asterisk" g2="eacute" k="92" /> +<hkern g1="asterisk" g2="ecircumflex" k="92" /> +<hkern g1="asterisk" g2="edieresis" k="92" /> +<hkern g1="asterisk" g2="eth" k="92" /> +<hkern g1="asterisk" g2="ograve" k="92" /> +<hkern g1="asterisk" g2="oacute" k="92" /> +<hkern g1="asterisk" g2="ocircumflex" k="92" /> +<hkern g1="asterisk" g2="otilde" k="92" /> +<hkern g1="asterisk" g2="odieresis" k="92" /> +<hkern g1="asterisk" g2="oslash" k="92" /> +<hkern g1="asterisk" g2="OE" k="46" /> +<hkern g1="asterisk" g2="oe" k="92" /> +<hkern g1="asterisk" g2="endash" k="178" /> +<hkern g1="asterisk" g2="emdash" k="178" /> +<hkern g1="asterisk" g2="quotesinglbase" k="228" /> +<hkern g1="asterisk" g2="quotedblbase" k="228" /> +<hkern g1="asterisk" g2="bullet" k="178" /> +<hkern g1="asterisk" g2="guilsinglleft" k="178" /> +<hkern g1="asterisk" g2="guilsinglright" k="178" /> +<hkern g1="comma" g2="quotedbl" k="228" /> +<hkern g1="comma" g2="quotesingle" k="228" /> +<hkern g1="comma" g2="asterisk" k="228" /> +<hkern g1="comma" g2="hyphen" k="136" /> +<hkern g1="comma" g2="at" k="56" /> +<hkern g1="comma" g2="C" k="56" /> +<hkern g1="comma" g2="G" k="56" /> +<hkern g1="comma" g2="O" k="56" /> +<hkern g1="comma" g2="Q" k="56" /> +<hkern g1="comma" g2="T" k="180" /> +<hkern g1="comma" g2="V" k="180" /> +<hkern g1="comma" g2="W" k="122" /> +<hkern g1="comma" g2="Y" k="152" /> +<hkern g1="comma" g2="backslash" k="180" /> +<hkern g1="comma" g2="v" k="132" /> +<hkern g1="comma" g2="w" k="62" /> +<hkern g1="comma" g2="y" k="132" /> +<hkern g1="comma" g2="ordfeminine" k="228" /> +<hkern g1="comma" g2="guillemotleft" k="136" /> +<hkern g1="comma" g2="uni00AD" k="136" /> +<hkern g1="comma" g2="degree" k="228" /> +<hkern g1="comma" g2="middot" k="136" /> +<hkern g1="comma" g2="ordmasculine" k="228" /> +<hkern g1="comma" g2="guillemotright" k="136" /> +<hkern g1="comma" g2="Ccedilla" k="56" /> +<hkern g1="comma" g2="Ograve" k="56" /> +<hkern g1="comma" g2="Oacute" k="56" /> +<hkern g1="comma" g2="Ocircumflex" k="56" /> +<hkern g1="comma" g2="Otilde" k="56" /> +<hkern g1="comma" g2="Odieresis" k="56" /> +<hkern g1="comma" g2="Oslash" k="56" /> +<hkern g1="comma" g2="Yacute" k="152" /> +<hkern g1="comma" g2="OE" k="56" /> +<hkern g1="comma" g2="endash" k="136" /> +<hkern g1="comma" g2="emdash" k="136" /> +<hkern g1="comma" g2="quoteleft" k="228" /> +<hkern g1="comma" g2="quoteright" k="228" /> +<hkern g1="comma" g2="quotedblleft" k="228" /> +<hkern g1="comma" g2="quotedblright" k="228" /> +<hkern g1="comma" g2="bullet" k="136" /> +<hkern g1="comma" g2="guilsinglleft" k="136" /> +<hkern g1="comma" g2="guilsinglright" k="136" /> +<hkern g1="hyphen" g2="quotedbl" k="178" /> +<hkern g1="hyphen" g2="ampersand" k="52" /> +<hkern g1="hyphen" g2="quotesingle" k="178" /> +<hkern g1="hyphen" g2="asterisk" k="178" /> +<hkern g1="hyphen" g2="comma" k="136" /> +<hkern g1="hyphen" g2="period" k="136" /> +<hkern g1="hyphen" g2="slash" k="52" /> +<hkern g1="hyphen" g2="A" k="52" /> +<hkern g1="hyphen" g2="T" k="180" /> +<hkern g1="hyphen" g2="V" k="112" /> +<hkern g1="hyphen" g2="W" k="32" /> +<hkern g1="hyphen" g2="X" k="62" /> +<hkern g1="hyphen" g2="Y" k="160" /> +<hkern g1="hyphen" g2="Z" k="46" /> +<hkern g1="hyphen" g2="backslash" k="112" /> +<hkern g1="hyphen" g2="ordfeminine" k="178" /> +<hkern g1="hyphen" g2="degree" k="178" /> +<hkern g1="hyphen" g2="ordmasculine" k="178" /> +<hkern g1="hyphen" g2="Agrave" k="52" /> +<hkern g1="hyphen" g2="Aacute" k="52" /> +<hkern g1="hyphen" g2="Acircumflex" k="52" /> +<hkern g1="hyphen" g2="Atilde" k="52" /> +<hkern g1="hyphen" g2="Adieresis" k="52" /> +<hkern g1="hyphen" g2="Aring" k="52" /> +<hkern g1="hyphen" g2="AE" k="52" /> +<hkern g1="hyphen" g2="Yacute" k="160" /> +<hkern g1="hyphen" g2="quoteleft" k="178" /> +<hkern g1="hyphen" g2="quoteright" k="178" /> +<hkern g1="hyphen" g2="quotesinglbase" k="136" /> +<hkern g1="hyphen" g2="quotedblleft" k="178" /> +<hkern g1="hyphen" g2="quotedblright" k="178" /> +<hkern g1="hyphen" g2="quotedblbase" k="136" /> +<hkern g1="period" g2="quotedbl" k="228" /> +<hkern g1="period" g2="quotesingle" k="228" /> +<hkern g1="period" g2="asterisk" k="228" /> +<hkern g1="period" g2="hyphen" k="136" /> +<hkern g1="period" g2="at" k="56" /> +<hkern g1="period" g2="C" k="56" /> +<hkern g1="period" g2="G" k="56" /> +<hkern g1="period" g2="O" k="56" /> +<hkern g1="period" g2="Q" k="56" /> +<hkern g1="period" g2="T" k="180" /> +<hkern g1="period" g2="V" k="180" /> +<hkern g1="period" g2="W" k="122" /> +<hkern g1="period" g2="Y" k="152" /> +<hkern g1="period" g2="backslash" k="180" /> +<hkern g1="period" g2="v" k="132" /> +<hkern g1="period" g2="w" k="62" /> +<hkern g1="period" g2="y" k="132" /> +<hkern g1="period" g2="ordfeminine" k="228" /> +<hkern g1="period" g2="guillemotleft" k="136" /> +<hkern g1="period" g2="uni00AD" k="136" /> +<hkern g1="period" g2="degree" k="228" /> +<hkern g1="period" g2="middot" k="136" /> +<hkern g1="period" g2="ordmasculine" k="228" /> +<hkern g1="period" g2="guillemotright" k="136" /> +<hkern g1="period" g2="Ccedilla" k="56" /> +<hkern g1="period" g2="Ograve" k="56" /> +<hkern g1="period" g2="Oacute" k="56" /> +<hkern g1="period" g2="Ocircumflex" k="56" /> +<hkern g1="period" g2="Otilde" k="56" /> +<hkern g1="period" g2="Odieresis" k="56" /> +<hkern g1="period" g2="Oslash" k="56" /> +<hkern g1="period" g2="Yacute" k="152" /> +<hkern g1="period" g2="OE" k="56" /> +<hkern g1="period" g2="endash" k="136" /> +<hkern g1="period" g2="emdash" k="136" /> +<hkern g1="period" g2="quoteleft" k="228" /> +<hkern g1="period" g2="quoteright" k="228" /> +<hkern g1="period" g2="quotedblleft" k="228" /> +<hkern g1="period" g2="quotedblright" k="228" /> +<hkern g1="period" g2="bullet" k="136" /> +<hkern g1="period" g2="guilsinglleft" k="136" /> +<hkern g1="period" g2="guilsinglright" k="136" /> +<hkern g1="slash" g2="quotedbl" k="-48" /> +<hkern g1="slash" g2="ampersand" k="136" /> +<hkern g1="slash" g2="quotesingle" k="-48" /> +<hkern g1="slash" g2="asterisk" k="-48" /> +<hkern g1="slash" g2="comma" k="192" /> +<hkern g1="slash" g2="hyphen" k="112" /> +<hkern g1="slash" g2="period" k="192" /> +<hkern g1="slash" g2="slash" k="136" /> +<hkern g1="slash" g2="colon" k="88" /> +<hkern g1="slash" g2="semicolon" k="88" /> +<hkern g1="slash" g2="question" k="-48" /> +<hkern g1="slash" g2="at" k="52" /> +<hkern g1="slash" g2="A" k="136" /> +<hkern g1="slash" g2="C" k="52" /> +<hkern g1="slash" g2="G" k="52" /> +<hkern g1="slash" g2="J" k="152" /> +<hkern g1="slash" g2="O" k="52" /> +<hkern g1="slash" g2="Q" k="52" /> +<hkern g1="slash" g2="a" k="116" /> +<hkern g1="slash" g2="c" k="116" /> +<hkern g1="slash" g2="d" k="116" /> +<hkern g1="slash" g2="e" k="116" /> +<hkern g1="slash" g2="f" k="30" /> +<hkern g1="slash" g2="g" k="136" /> +<hkern g1="slash" g2="m" k="88" /> +<hkern g1="slash" g2="n" k="88" /> +<hkern g1="slash" g2="o" k="116" /> +<hkern g1="slash" g2="p" k="88" /> +<hkern g1="slash" g2="q" k="116" /> +<hkern g1="slash" g2="r" k="88" /> +<hkern g1="slash" g2="s" k="106" /> +<hkern g1="slash" g2="t" k="42" /> +<hkern g1="slash" g2="u" k="88" /> +<hkern g1="slash" g2="v" k="48" /> +<hkern g1="slash" g2="x" k="52" /> +<hkern g1="slash" g2="y" k="48" /> +<hkern g1="slash" g2="z" k="82" /> +<hkern g1="slash" g2="ordfeminine" k="-48" /> +<hkern g1="slash" g2="guillemotleft" k="112" /> +<hkern g1="slash" g2="uni00AD" k="112" /> +<hkern g1="slash" g2="degree" k="-48" /> +<hkern g1="slash" g2="twosuperior" k="-58" /> +<hkern g1="slash" g2="threesuperior" k="-58" /> +<hkern g1="slash" g2="mu" k="88" /> +<hkern g1="slash" g2="middot" k="112" /> +<hkern g1="slash" g2="onesuperior" k="-58" /> +<hkern g1="slash" g2="ordmasculine" k="-48" /> +<hkern g1="slash" g2="guillemotright" k="112" /> +<hkern g1="slash" g2="Agrave" k="136" /> +<hkern g1="slash" g2="Aacute" k="136" /> +<hkern g1="slash" g2="Acircumflex" k="136" /> +<hkern g1="slash" g2="Atilde" k="136" /> +<hkern g1="slash" g2="Adieresis" k="136" /> +<hkern g1="slash" g2="Aring" k="136" /> +<hkern g1="slash" g2="AE" k="136" /> +<hkern g1="slash" g2="Ccedilla" k="52" /> +<hkern g1="slash" g2="Ograve" k="52" /> +<hkern g1="slash" g2="Oacute" k="52" /> +<hkern g1="slash" g2="Ocircumflex" k="52" /> +<hkern g1="slash" g2="Otilde" k="52" /> +<hkern g1="slash" g2="Odieresis" k="52" /> +<hkern g1="slash" g2="Oslash" k="52" /> +<hkern g1="slash" g2="agrave" k="116" /> +<hkern g1="slash" g2="aacute" k="116" /> +<hkern g1="slash" g2="acircumflex" k="116" /> +<hkern g1="slash" g2="atilde" k="116" /> +<hkern g1="slash" g2="adieresis" k="116" /> +<hkern g1="slash" g2="aring" k="116" /> +<hkern g1="slash" g2="ae" k="116" /> +<hkern g1="slash" g2="ccedilla" k="116" /> +<hkern g1="slash" g2="egrave" k="116" /> +<hkern g1="slash" g2="eacute" k="116" /> +<hkern g1="slash" g2="ecircumflex" k="116" /> +<hkern g1="slash" g2="edieresis" k="116" /> +<hkern g1="slash" g2="eth" k="116" /> +<hkern g1="slash" g2="ntilde" k="88" /> +<hkern g1="slash" g2="ograve" k="116" /> +<hkern g1="slash" g2="oacute" k="116" /> +<hkern g1="slash" g2="ocircumflex" k="116" /> +<hkern g1="slash" g2="otilde" k="116" /> +<hkern g1="slash" g2="odieresis" k="116" /> +<hkern g1="slash" g2="oslash" k="116" /> +<hkern g1="slash" g2="ugrave" k="88" /> +<hkern g1="slash" g2="uacute" k="88" /> +<hkern g1="slash" g2="ucircumflex" k="88" /> +<hkern g1="slash" g2="udieresis" k="88" /> +<hkern g1="slash" g2="OE" k="52" /> +<hkern g1="slash" g2="oe" k="116" /> +<hkern g1="slash" g2="endash" k="112" /> +<hkern g1="slash" g2="emdash" k="112" /> +<hkern g1="slash" g2="quoteleft" k="-48" /> +<hkern g1="slash" g2="quoteright" k="-48" /> +<hkern g1="slash" g2="quotesinglbase" k="192" /> +<hkern g1="slash" g2="quotedblleft" k="-48" /> +<hkern g1="slash" g2="quotedblright" k="-48" /> +<hkern g1="slash" g2="quotedblbase" k="192" /> +<hkern g1="slash" g2="bullet" k="112" /> +<hkern g1="slash" g2="guilsinglleft" k="112" /> +<hkern g1="slash" g2="guilsinglright" k="112" /> +<hkern g1="at" g2="quotedbl" k="46" /> +<hkern g1="at" g2="ampersand" k="42" /> +<hkern g1="at" g2="quotesingle" k="46" /> +<hkern g1="at" g2="parenright" k="40" /> +<hkern g1="at" g2="asterisk" k="46" /> +<hkern g1="at" g2="comma" k="56" /> +<hkern g1="at" g2="period" k="56" /> +<hkern g1="at" g2="slash" k="42" /> +<hkern g1="at" g2="A" k="42" /> +<hkern g1="at" g2="T" k="98" /> +<hkern g1="at" g2="V" k="52" /> +<hkern g1="at" g2="X" k="30" /> +<hkern g1="at" g2="Y" k="80" /> +<hkern g1="at" g2="Z" k="70" /> +<hkern g1="at" g2="backslash" k="52" /> +<hkern g1="at" g2="bracketright" k="40" /> +<hkern g1="at" g2="braceright" k="40" /> +<hkern g1="at" g2="ordfeminine" k="46" /> +<hkern g1="at" g2="degree" k="46" /> +<hkern g1="at" g2="ordmasculine" k="46" /> +<hkern g1="at" g2="Agrave" k="42" /> +<hkern g1="at" g2="Aacute" k="42" /> +<hkern g1="at" g2="Acircumflex" k="42" /> +<hkern g1="at" g2="Atilde" k="42" /> +<hkern g1="at" g2="Adieresis" k="42" /> +<hkern g1="at" g2="Aring" k="42" /> +<hkern g1="at" g2="AE" k="42" /> +<hkern g1="at" g2="Yacute" k="80" /> +<hkern g1="at" g2="quoteleft" k="46" /> +<hkern g1="at" g2="quoteright" k="46" /> +<hkern g1="at" g2="quotesinglbase" k="56" /> +<hkern g1="at" g2="quotedblleft" k="46" /> +<hkern g1="at" g2="quotedblright" k="46" /> +<hkern g1="at" g2="quotedblbase" k="56" /> +<hkern g1="A" g2="quotedbl" k="182" /> +<hkern g1="A" g2="quotesingle" k="182" /> +<hkern g1="A" g2="asterisk" k="182" /> +<hkern g1="A" g2="hyphen" k="52" /> +<hkern g1="A" g2="question" k="56" /> +<hkern g1="A" g2="at" k="42" /> +<hkern g1="A" g2="C" k="42" /> +<hkern g1="A" g2="G" k="42" /> +<hkern g1="A" g2="J" k="-50" /> +<hkern g1="A" g2="O" k="42" /> +<hkern g1="A" g2="Q" k="42" /> +<hkern g1="A" g2="T" k="132" /> +<hkern g1="A" g2="U" k="56" /> +<hkern g1="A" g2="V" k="136" /> +<hkern g1="A" g2="W" k="84" /> +<hkern g1="A" g2="Y" k="164" /> +<hkern g1="A" g2="backslash" k="136" /> +<hkern g1="A" g2="v" k="82" /> +<hkern g1="A" g2="y" k="82" /> +<hkern g1="A" g2="ordfeminine" k="182" /> +<hkern g1="A" g2="guillemotleft" k="52" /> +<hkern g1="A" g2="uni00AD" k="52" /> +<hkern g1="A" g2="degree" k="182" /> +<hkern g1="A" g2="twosuperior" k="184" /> +<hkern g1="A" g2="threesuperior" k="184" /> +<hkern g1="A" g2="middot" k="52" /> +<hkern g1="A" g2="onesuperior" k="184" /> +<hkern g1="A" g2="ordmasculine" k="182" /> +<hkern g1="A" g2="guillemotright" k="52" /> +<hkern g1="A" g2="Ccedilla" k="42" /> +<hkern g1="A" g2="Ograve" k="42" /> +<hkern g1="A" g2="Oacute" k="42" /> +<hkern g1="A" g2="Ocircumflex" k="42" /> +<hkern g1="A" g2="Otilde" k="42" /> +<hkern g1="A" g2="Odieresis" k="42" /> +<hkern g1="A" g2="Oslash" k="42" /> +<hkern g1="A" g2="Ugrave" k="56" /> +<hkern g1="A" g2="Uacute" k="56" /> +<hkern g1="A" g2="Ucircumflex" k="56" /> +<hkern g1="A" g2="Udieresis" k="56" /> +<hkern g1="A" g2="Yacute" k="164" /> +<hkern g1="A" g2="OE" k="42" /> +<hkern g1="A" g2="endash" k="52" /> +<hkern g1="A" g2="emdash" k="52" /> +<hkern g1="A" g2="quoteleft" k="182" /> +<hkern g1="A" g2="quoteright" k="182" /> +<hkern g1="A" g2="quotedblleft" k="182" /> +<hkern g1="A" g2="quotedblright" k="182" /> +<hkern g1="A" g2="bullet" k="52" /> +<hkern g1="A" g2="guilsinglleft" k="52" /> +<hkern g1="A" g2="guilsinglright" k="52" /> +<hkern g1="C" g2="hyphen" k="150" /> +<hkern g1="C" g2="guillemotleft" k="150" /> +<hkern g1="C" g2="uni00AD" k="150" /> +<hkern g1="C" g2="middot" k="150" /> +<hkern g1="C" g2="guillemotright" k="150" /> +<hkern g1="C" g2="endash" k="150" /> +<hkern g1="C" g2="emdash" k="150" /> +<hkern g1="C" g2="bullet" k="150" /> +<hkern g1="C" g2="guilsinglleft" k="150" /> +<hkern g1="C" g2="guilsinglright" k="150" /> +<hkern g1="D" g2="quotedbl" k="46" /> +<hkern g1="D" g2="ampersand" k="42" /> +<hkern g1="D" g2="quotesingle" k="46" /> +<hkern g1="D" g2="parenright" k="40" /> +<hkern g1="D" g2="asterisk" k="46" /> +<hkern g1="D" g2="comma" k="56" /> +<hkern g1="D" g2="period" k="56" /> +<hkern g1="D" g2="slash" k="42" /> +<hkern g1="D" g2="A" k="42" /> +<hkern g1="D" g2="T" k="98" /> +<hkern g1="D" g2="V" k="52" /> +<hkern g1="D" g2="X" k="30" /> +<hkern g1="D" g2="Y" k="80" /> +<hkern g1="D" g2="Z" k="70" /> +<hkern g1="D" g2="backslash" k="52" /> +<hkern g1="D" g2="bracketright" k="40" /> +<hkern g1="D" g2="braceright" k="40" /> +<hkern g1="D" g2="ordfeminine" k="46" /> +<hkern g1="D" g2="degree" k="46" /> +<hkern g1="D" g2="ordmasculine" k="46" /> +<hkern g1="D" g2="Agrave" k="42" /> +<hkern g1="D" g2="Aacute" k="42" /> +<hkern g1="D" g2="Acircumflex" k="42" /> +<hkern g1="D" g2="Atilde" k="42" /> +<hkern g1="D" g2="Adieresis" k="42" /> +<hkern g1="D" g2="Aring" k="42" /> +<hkern g1="D" g2="AE" k="42" /> +<hkern g1="D" g2="Yacute" k="80" /> +<hkern g1="D" g2="quoteleft" k="46" /> +<hkern g1="D" g2="quoteright" k="46" /> +<hkern g1="D" g2="quotesinglbase" k="56" /> +<hkern g1="D" g2="quotedblleft" k="46" /> +<hkern g1="D" g2="quotedblright" k="46" /> +<hkern g1="D" g2="quotedblbase" k="56" /> +<hkern g1="F" g2="ampersand" k="132" /> +<hkern g1="F" g2="comma" k="180" /> +<hkern g1="F" g2="period" k="180" /> +<hkern g1="F" g2="slash" k="132" /> +<hkern g1="F" g2="colon" k="60" /> +<hkern g1="F" g2="semicolon" k="60" /> +<hkern g1="F" g2="question" k="-30" /> +<hkern g1="F" g2="A" k="132" /> +<hkern g1="F" g2="J" k="198" /> +<hkern g1="F" g2="c" k="70" /> +<hkern g1="F" g2="d" k="70" /> +<hkern g1="F" g2="e" k="70" /> +<hkern g1="F" g2="m" k="60" /> +<hkern g1="F" g2="n" k="60" /> +<hkern g1="F" g2="o" k="70" /> +<hkern g1="F" g2="p" k="60" /> +<hkern g1="F" g2="q" k="70" /> +<hkern g1="F" g2="r" k="60" /> +<hkern g1="F" g2="u" k="60" /> +<hkern g1="F" g2="mu" k="60" /> +<hkern g1="F" g2="Agrave" k="132" /> +<hkern g1="F" g2="Aacute" k="132" /> +<hkern g1="F" g2="Acircumflex" k="132" /> +<hkern g1="F" g2="Atilde" k="132" /> +<hkern g1="F" g2="Adieresis" k="132" /> +<hkern g1="F" g2="Aring" k="132" /> +<hkern g1="F" g2="AE" k="132" /> +<hkern g1="F" g2="ccedilla" k="70" /> +<hkern g1="F" g2="egrave" k="70" /> +<hkern g1="F" g2="eacute" k="70" /> +<hkern g1="F" g2="ecircumflex" k="70" /> +<hkern g1="F" g2="edieresis" k="70" /> +<hkern g1="F" g2="eth" k="70" /> +<hkern g1="F" g2="ntilde" k="60" /> +<hkern g1="F" g2="ograve" k="70" /> +<hkern g1="F" g2="oacute" k="70" /> +<hkern g1="F" g2="ocircumflex" k="70" /> +<hkern g1="F" g2="otilde" k="70" /> +<hkern g1="F" g2="odieresis" k="70" /> +<hkern g1="F" g2="oslash" k="70" /> +<hkern g1="F" g2="ugrave" k="60" /> +<hkern g1="F" g2="uacute" k="60" /> +<hkern g1="F" g2="ucircumflex" k="60" /> +<hkern g1="F" g2="udieresis" k="60" /> +<hkern g1="F" g2="oe" k="70" /> +<hkern g1="F" g2="quotesinglbase" k="180" /> +<hkern g1="F" g2="quotedblbase" k="180" /> +<hkern g1="J" g2="ampersand" k="56" /> +<hkern g1="J" g2="comma" k="50" /> +<hkern g1="J" g2="period" k="50" /> +<hkern g1="J" g2="slash" k="56" /> +<hkern g1="J" g2="A" k="56" /> +<hkern g1="J" g2="Agrave" k="56" /> +<hkern g1="J" g2="Aacute" k="56" /> +<hkern g1="J" g2="Acircumflex" k="56" /> +<hkern g1="J" g2="Atilde" k="56" /> +<hkern g1="J" g2="Adieresis" k="56" /> +<hkern g1="J" g2="Aring" k="56" /> +<hkern g1="J" g2="AE" k="56" /> +<hkern g1="J" g2="quotesinglbase" k="50" /> +<hkern g1="J" g2="quotedblbase" k="50" /> +<hkern g1="K" g2="hyphen" k="62" /> +<hkern g1="K" g2="at" k="30" /> +<hkern g1="K" g2="C" k="30" /> +<hkern g1="K" g2="G" k="30" /> +<hkern g1="K" g2="O" k="30" /> +<hkern g1="K" g2="Q" k="30" /> +<hkern g1="K" g2="c" k="36" /> +<hkern g1="K" g2="d" k="36" /> +<hkern g1="K" g2="e" k="36" /> +<hkern g1="K" g2="f" k="52" /> +<hkern g1="K" g2="o" k="36" /> +<hkern g1="K" g2="q" k="36" /> +<hkern g1="K" g2="t" k="82" /> +<hkern g1="K" g2="v" k="66" /> +<hkern g1="K" g2="w" k="56" /> +<hkern g1="K" g2="y" k="66" /> +<hkern g1="K" g2="guillemotleft" k="62" /> +<hkern g1="K" g2="uni00AD" k="62" /> +<hkern g1="K" g2="middot" k="62" /> +<hkern g1="K" g2="guillemotright" k="62" /> +<hkern g1="K" g2="Ccedilla" k="30" /> +<hkern g1="K" g2="Ograve" k="30" /> +<hkern g1="K" g2="Oacute" k="30" /> +<hkern g1="K" g2="Ocircumflex" k="30" /> +<hkern g1="K" g2="Otilde" k="30" /> +<hkern g1="K" g2="Odieresis" k="30" /> +<hkern g1="K" g2="Oslash" k="30" /> +<hkern g1="K" g2="ccedilla" k="36" /> +<hkern g1="K" g2="egrave" k="36" /> +<hkern g1="K" g2="eacute" k="36" /> +<hkern g1="K" g2="ecircumflex" k="36" /> +<hkern g1="K" g2="edieresis" k="36" /> +<hkern g1="K" g2="eth" k="36" /> +<hkern g1="K" g2="ograve" k="36" /> +<hkern g1="K" g2="oacute" k="36" /> +<hkern g1="K" g2="ocircumflex" k="36" /> +<hkern g1="K" g2="otilde" k="36" /> +<hkern g1="K" g2="odieresis" k="36" /> +<hkern g1="K" g2="oslash" k="36" /> +<hkern g1="K" g2="OE" k="30" /> +<hkern g1="K" g2="oe" k="36" /> +<hkern g1="K" g2="endash" k="62" /> +<hkern g1="K" g2="emdash" k="62" /> +<hkern g1="K" g2="bullet" k="62" /> +<hkern g1="K" g2="guilsinglleft" k="62" /> +<hkern g1="K" g2="guilsinglright" k="62" /> +<hkern g1="L" g2="quotedbl" k="290" /> +<hkern g1="L" g2="quotesingle" k="290" /> +<hkern g1="L" g2="asterisk" k="290" /> +<hkern g1="L" g2="comma" k="-54" /> +<hkern g1="L" g2="hyphen" k="198" /> +<hkern g1="L" g2="period" k="-54" /> +<hkern g1="L" g2="question" k="50" /> +<hkern g1="L" g2="at" k="80" /> +<hkern g1="L" g2="C" k="80" /> +<hkern g1="L" g2="G" k="80" /> +<hkern g1="L" g2="O" k="80" /> +<hkern g1="L" g2="Q" k="80" /> +<hkern g1="L" g2="T" k="172" /> +<hkern g1="L" g2="V" k="182" /> +<hkern g1="L" g2="W" k="152" /> +<hkern g1="L" g2="Y" k="212" /> +<hkern g1="L" g2="backslash" k="182" /> +<hkern g1="L" g2="c" k="36" /> +<hkern g1="L" g2="d" k="36" /> +<hkern g1="L" g2="e" k="36" /> +<hkern g1="L" g2="o" k="36" /> +<hkern g1="L" g2="q" k="36" /> +<hkern g1="L" g2="v" k="108" /> +<hkern g1="L" g2="w" k="80" /> +<hkern g1="L" g2="y" k="108" /> +<hkern g1="L" g2="ordfeminine" k="290" /> +<hkern g1="L" g2="guillemotleft" k="198" /> +<hkern g1="L" g2="uni00AD" k="198" /> +<hkern g1="L" g2="degree" k="290" /> +<hkern g1="L" g2="twosuperior" k="202" /> +<hkern g1="L" g2="threesuperior" k="202" /> +<hkern g1="L" g2="middot" k="198" /> +<hkern g1="L" g2="onesuperior" k="202" /> +<hkern g1="L" g2="ordmasculine" k="290" /> +<hkern g1="L" g2="guillemotright" k="198" /> +<hkern g1="L" g2="Ccedilla" k="80" /> +<hkern g1="L" g2="Ograve" k="80" /> +<hkern g1="L" g2="Oacute" k="80" /> +<hkern g1="L" g2="Ocircumflex" k="80" /> +<hkern g1="L" g2="Otilde" k="80" /> +<hkern g1="L" g2="Odieresis" k="80" /> +<hkern g1="L" g2="Oslash" k="80" /> +<hkern g1="L" g2="Yacute" k="212" /> +<hkern g1="L" g2="ccedilla" k="36" /> +<hkern g1="L" g2="egrave" k="36" /> +<hkern g1="L" g2="eacute" k="36" /> +<hkern g1="L" g2="ecircumflex" k="36" /> +<hkern g1="L" g2="edieresis" k="36" /> +<hkern g1="L" g2="eth" k="36" /> +<hkern g1="L" g2="ograve" k="36" /> +<hkern g1="L" g2="oacute" k="36" /> +<hkern g1="L" g2="ocircumflex" k="36" /> +<hkern g1="L" g2="otilde" k="36" /> +<hkern g1="L" g2="odieresis" k="36" /> +<hkern g1="L" g2="oslash" k="36" /> +<hkern g1="L" g2="OE" k="80" /> +<hkern g1="L" g2="oe" k="36" /> +<hkern g1="L" g2="endash" k="198" /> +<hkern g1="L" g2="emdash" k="198" /> +<hkern g1="L" g2="quoteleft" k="290" /> +<hkern g1="L" g2="quoteright" k="290" /> +<hkern g1="L" g2="quotesinglbase" k="-54" /> +<hkern g1="L" g2="quotedblleft" k="290" /> +<hkern g1="L" g2="quotedblright" k="290" /> +<hkern g1="L" g2="quotedblbase" k="-54" /> +<hkern g1="L" g2="bullet" k="198" /> +<hkern g1="L" g2="guilsinglleft" k="198" /> +<hkern g1="L" g2="guilsinglright" k="198" /> +<hkern g1="O" g2="quotedbl" k="46" /> +<hkern g1="O" g2="ampersand" k="42" /> +<hkern g1="O" g2="quotesingle" k="46" /> +<hkern g1="O" g2="parenright" k="40" /> +<hkern g1="O" g2="asterisk" k="46" /> +<hkern g1="O" g2="comma" k="56" /> +<hkern g1="O" g2="period" k="56" /> +<hkern g1="O" g2="slash" k="42" /> +<hkern g1="O" g2="A" k="42" /> +<hkern g1="O" g2="T" k="98" /> +<hkern g1="O" g2="V" k="52" /> +<hkern g1="O" g2="X" k="30" /> +<hkern g1="O" g2="Y" k="80" /> +<hkern g1="O" g2="Z" k="70" /> +<hkern g1="O" g2="backslash" k="52" /> +<hkern g1="O" g2="bracketright" k="40" /> +<hkern g1="O" g2="braceright" k="40" /> +<hkern g1="O" g2="ordfeminine" k="46" /> +<hkern g1="O" g2="degree" k="46" /> +<hkern g1="O" g2="ordmasculine" k="46" /> +<hkern g1="O" g2="Agrave" k="42" /> +<hkern g1="O" g2="Aacute" k="42" /> +<hkern g1="O" g2="Acircumflex" k="42" /> +<hkern g1="O" g2="Atilde" k="42" /> +<hkern g1="O" g2="Adieresis" k="42" /> +<hkern g1="O" g2="Aring" k="42" /> +<hkern g1="O" g2="AE" k="42" /> +<hkern g1="O" g2="Yacute" k="80" /> +<hkern g1="O" g2="quoteleft" k="46" /> +<hkern g1="O" g2="quoteright" k="46" /> +<hkern g1="O" g2="quotesinglbase" k="56" /> +<hkern g1="O" g2="quotedblleft" k="46" /> +<hkern g1="O" g2="quotedblright" k="46" /> +<hkern g1="O" g2="quotedblbase" k="56" /> +<hkern g1="P" g2="ampersand" k="138" /> +<hkern g1="P" g2="comma" k="248" /> +<hkern g1="P" g2="period" k="248" /> +<hkern g1="P" g2="slash" k="138" /> +<hkern g1="P" g2="A" k="138" /> +<hkern g1="P" g2="J" k="182" /> +<hkern g1="P" g2="a" k="50" /> +<hkern g1="P" g2="c" k="30" /> +<hkern g1="P" g2="d" k="30" /> +<hkern g1="P" g2="e" k="30" /> +<hkern g1="P" g2="o" k="30" /> +<hkern g1="P" g2="q" k="30" /> +<hkern g1="P" g2="Agrave" k="138" /> +<hkern g1="P" g2="Aacute" k="138" /> +<hkern g1="P" g2="Acircumflex" k="138" /> +<hkern g1="P" g2="Atilde" k="138" /> +<hkern g1="P" g2="Adieresis" k="138" /> +<hkern g1="P" g2="Aring" k="138" /> +<hkern g1="P" g2="AE" k="138" /> +<hkern g1="P" g2="agrave" k="50" /> +<hkern g1="P" g2="aacute" k="50" /> +<hkern g1="P" g2="acircumflex" k="50" /> +<hkern g1="P" g2="atilde" k="50" /> +<hkern g1="P" g2="adieresis" k="50" /> +<hkern g1="P" g2="aring" k="50" /> +<hkern g1="P" g2="ae" k="50" /> +<hkern g1="P" g2="ccedilla" k="30" /> +<hkern g1="P" g2="egrave" k="30" /> +<hkern g1="P" g2="eacute" k="30" /> +<hkern g1="P" g2="ecircumflex" k="30" /> +<hkern g1="P" g2="edieresis" k="30" /> +<hkern g1="P" g2="eth" k="30" /> +<hkern g1="P" g2="ograve" k="30" /> +<hkern g1="P" g2="oacute" k="30" /> +<hkern g1="P" g2="ocircumflex" k="30" /> +<hkern g1="P" g2="otilde" k="30" /> +<hkern g1="P" g2="odieresis" k="30" /> +<hkern g1="P" g2="oslash" k="30" /> +<hkern g1="P" g2="oe" k="30" /> +<hkern g1="P" g2="quotesinglbase" k="248" /> +<hkern g1="P" g2="quotedblbase" k="248" /> +<hkern g1="Q" g2="quotedbl" k="46" /> +<hkern g1="Q" g2="ampersand" k="42" /> +<hkern g1="Q" g2="quotesingle" k="46" /> +<hkern g1="Q" g2="parenright" k="40" /> +<hkern g1="Q" g2="asterisk" k="46" /> +<hkern g1="Q" g2="comma" k="56" /> +<hkern g1="Q" g2="period" k="56" /> +<hkern g1="Q" g2="slash" k="42" /> +<hkern g1="Q" g2="A" k="42" /> +<hkern g1="Q" g2="T" k="98" /> +<hkern g1="Q" g2="V" k="52" /> +<hkern g1="Q" g2="X" k="30" /> +<hkern g1="Q" g2="Y" k="80" /> +<hkern g1="Q" g2="Z" k="70" /> +<hkern g1="Q" g2="backslash" k="52" /> +<hkern g1="Q" g2="bracketright" k="40" /> +<hkern g1="Q" g2="braceright" k="40" /> +<hkern g1="Q" g2="ordfeminine" k="46" /> +<hkern g1="Q" g2="degree" k="46" /> +<hkern g1="Q" g2="ordmasculine" k="46" /> +<hkern g1="Q" g2="Agrave" k="42" /> +<hkern g1="Q" g2="Aacute" k="42" /> +<hkern g1="Q" g2="Acircumflex" k="42" /> +<hkern g1="Q" g2="Atilde" k="42" /> +<hkern g1="Q" g2="Adieresis" k="42" /> +<hkern g1="Q" g2="Aring" k="42" /> +<hkern g1="Q" g2="AE" k="42" /> +<hkern g1="Q" g2="Yacute" k="80" /> +<hkern g1="Q" g2="quoteleft" k="46" /> +<hkern g1="Q" g2="quoteright" k="46" /> +<hkern g1="Q" g2="quotesinglbase" k="56" /> +<hkern g1="Q" g2="quotedblleft" k="46" /> +<hkern g1="Q" g2="quotedblright" k="46" /> +<hkern g1="Q" g2="quotedblbase" k="56" /> +<hkern g1="R" g2="at" k="46" /> +<hkern g1="R" g2="C" k="46" /> +<hkern g1="R" g2="G" k="46" /> +<hkern g1="R" g2="O" k="46" /> +<hkern g1="R" g2="Q" k="46" /> +<hkern g1="R" g2="T" k="52" /> +<hkern g1="R" g2="U" k="42" /> +<hkern g1="R" g2="Ccedilla" k="46" /> +<hkern g1="R" g2="Ograve" k="46" /> +<hkern g1="R" g2="Oacute" k="46" /> +<hkern g1="R" g2="Ocircumflex" k="46" /> +<hkern g1="R" g2="Otilde" k="46" /> +<hkern g1="R" g2="Odieresis" k="46" /> +<hkern g1="R" g2="Oslash" k="46" /> +<hkern g1="R" g2="Ugrave" k="42" /> +<hkern g1="R" g2="Uacute" k="42" /> +<hkern g1="R" g2="Ucircumflex" k="42" /> +<hkern g1="R" g2="Udieresis" k="42" /> +<hkern g1="R" g2="OE" k="46" /> +<hkern g1="T" g2="ampersand" k="132" /> +<hkern g1="T" g2="comma" k="180" /> +<hkern g1="T" g2="hyphen" k="180" /> +<hkern g1="T" g2="period" k="180" /> +<hkern g1="T" g2="slash" k="132" /> +<hkern g1="T" g2="colon" k="160" /> +<hkern g1="T" g2="semicolon" k="160" /> +<hkern g1="T" g2="at" k="98" /> +<hkern g1="T" g2="A" k="132" /> +<hkern g1="T" g2="C" k="98" /> +<hkern g1="T" g2="G" k="98" /> +<hkern g1="T" g2="J" k="200" /> +<hkern g1="T" g2="O" k="98" /> +<hkern g1="T" g2="Q" k="98" /> +<hkern g1="T" g2="a" k="250" /> +<hkern g1="T" g2="c" k="210" /> +<hkern g1="T" g2="d" k="210" /> +<hkern g1="T" g2="e" k="210" /> +<hkern g1="T" g2="g" k="188" /> +<hkern g1="T" g2="m" k="160" /> +<hkern g1="T" g2="n" k="160" /> +<hkern g1="T" g2="o" k="210" /> +<hkern g1="T" g2="p" k="160" /> +<hkern g1="T" g2="q" k="210" /> +<hkern g1="T" g2="r" k="160" /> +<hkern g1="T" g2="s" k="162" /> +<hkern g1="T" g2="u" k="160" /> +<hkern g1="T" g2="v" k="180" /> +<hkern g1="T" g2="w" k="140" /> +<hkern g1="T" g2="x" k="144" /> +<hkern g1="T" g2="y" k="180" /> +<hkern g1="T" g2="z" k="120" /> +<hkern g1="T" g2="guillemotleft" k="180" /> +<hkern g1="T" g2="uni00AD" k="180" /> +<hkern g1="T" g2="mu" k="160" /> +<hkern g1="T" g2="middot" k="180" /> +<hkern g1="T" g2="guillemotright" k="180" /> +<hkern g1="T" g2="Agrave" k="132" /> +<hkern g1="T" g2="Aacute" k="132" /> +<hkern g1="T" g2="Acircumflex" k="132" /> +<hkern g1="T" g2="Atilde" k="132" /> +<hkern g1="T" g2="Adieresis" k="132" /> +<hkern g1="T" g2="Aring" k="132" /> +<hkern g1="T" g2="AE" k="132" /> +<hkern g1="T" g2="Ccedilla" k="98" /> +<hkern g1="T" g2="Ograve" k="98" /> +<hkern g1="T" g2="Oacute" k="98" /> +<hkern g1="T" g2="Ocircumflex" k="98" /> +<hkern g1="T" g2="Otilde" k="98" /> +<hkern g1="T" g2="Odieresis" k="98" /> +<hkern g1="T" g2="Oslash" k="98" /> +<hkern g1="T" g2="agrave" k="250" /> +<hkern g1="T" g2="aacute" k="250" /> +<hkern g1="T" g2="acircumflex" k="250" /> +<hkern g1="T" g2="atilde" k="250" /> +<hkern g1="T" g2="adieresis" k="250" /> +<hkern g1="T" g2="aring" k="250" /> +<hkern g1="T" g2="ae" k="250" /> +<hkern g1="T" g2="ccedilla" k="210" /> +<hkern g1="T" g2="egrave" k="210" /> +<hkern g1="T" g2="eacute" k="210" /> +<hkern g1="T" g2="ecircumflex" k="210" /> +<hkern g1="T" g2="edieresis" k="210" /> +<hkern g1="T" g2="eth" k="210" /> +<hkern g1="T" g2="ntilde" k="160" /> +<hkern g1="T" g2="ograve" k="210" /> +<hkern g1="T" g2="oacute" k="210" /> +<hkern g1="T" g2="ocircumflex" k="210" /> +<hkern g1="T" g2="otilde" k="210" /> +<hkern g1="T" g2="odieresis" k="210" /> +<hkern g1="T" g2="oslash" k="210" /> +<hkern g1="T" g2="ugrave" k="160" /> +<hkern g1="T" g2="uacute" k="160" /> +<hkern g1="T" g2="ucircumflex" k="160" /> +<hkern g1="T" g2="udieresis" k="160" /> +<hkern g1="T" g2="OE" k="98" /> +<hkern g1="T" g2="oe" k="210" /> +<hkern g1="T" g2="endash" k="180" /> +<hkern g1="T" g2="emdash" k="180" /> +<hkern g1="T" g2="quotesinglbase" k="180" /> +<hkern g1="T" g2="quotedblbase" k="180" /> +<hkern g1="T" g2="bullet" k="180" /> +<hkern g1="T" g2="guilsinglleft" k="180" /> +<hkern g1="T" g2="guilsinglright" k="180" /> +<hkern g1="U" g2="ampersand" k="56" /> +<hkern g1="U" g2="comma" k="50" /> +<hkern g1="U" g2="period" k="50" /> +<hkern g1="U" g2="slash" k="56" /> +<hkern g1="U" g2="A" k="56" /> +<hkern g1="U" g2="Agrave" k="56" /> +<hkern g1="U" g2="Aacute" k="56" /> +<hkern g1="U" g2="Acircumflex" k="56" /> +<hkern g1="U" g2="Atilde" k="56" /> +<hkern g1="U" g2="Adieresis" k="56" /> +<hkern g1="U" g2="Aring" k="56" /> +<hkern g1="U" g2="AE" k="56" /> +<hkern g1="U" g2="quotesinglbase" k="50" /> +<hkern g1="U" g2="quotedblbase" k="50" /> +<hkern g1="V" g2="quotedbl" k="-48" /> +<hkern g1="V" g2="ampersand" k="136" /> +<hkern g1="V" g2="quotesingle" k="-48" /> +<hkern g1="V" g2="asterisk" k="-48" /> +<hkern g1="V" g2="comma" k="192" /> +<hkern g1="V" g2="hyphen" k="112" /> +<hkern g1="V" g2="period" k="192" /> +<hkern g1="V" g2="slash" k="136" /> +<hkern g1="V" g2="colon" k="88" /> +<hkern g1="V" g2="semicolon" k="88" /> +<hkern g1="V" g2="question" k="-48" /> +<hkern g1="V" g2="at" k="52" /> +<hkern g1="V" g2="A" k="136" /> +<hkern g1="V" g2="C" k="52" /> +<hkern g1="V" g2="G" k="52" /> +<hkern g1="V" g2="J" k="152" /> +<hkern g1="V" g2="O" k="52" /> +<hkern g1="V" g2="Q" k="52" /> +<hkern g1="V" g2="a" k="116" /> +<hkern g1="V" g2="c" k="116" /> +<hkern g1="V" g2="d" k="116" /> +<hkern g1="V" g2="e" k="116" /> +<hkern g1="V" g2="f" k="30" /> +<hkern g1="V" g2="g" k="136" /> +<hkern g1="V" g2="m" k="88" /> +<hkern g1="V" g2="n" k="88" /> +<hkern g1="V" g2="o" k="116" /> +<hkern g1="V" g2="p" k="88" /> +<hkern g1="V" g2="q" k="116" /> +<hkern g1="V" g2="r" k="88" /> +<hkern g1="V" g2="s" k="106" /> +<hkern g1="V" g2="t" k="42" /> +<hkern g1="V" g2="u" k="88" /> +<hkern g1="V" g2="v" k="48" /> +<hkern g1="V" g2="x" k="52" /> +<hkern g1="V" g2="y" k="48" /> +<hkern g1="V" g2="z" k="82" /> +<hkern g1="V" g2="ordfeminine" k="-48" /> +<hkern g1="V" g2="guillemotleft" k="112" /> +<hkern g1="V" g2="uni00AD" k="112" /> +<hkern g1="V" g2="degree" k="-48" /> +<hkern g1="V" g2="twosuperior" k="-58" /> +<hkern g1="V" g2="threesuperior" k="-58" /> +<hkern g1="V" g2="mu" k="88" /> +<hkern g1="V" g2="middot" k="112" /> +<hkern g1="V" g2="onesuperior" k="-58" /> +<hkern g1="V" g2="ordmasculine" k="-48" /> +<hkern g1="V" g2="guillemotright" k="112" /> +<hkern g1="V" g2="Agrave" k="136" /> +<hkern g1="V" g2="Aacute" k="136" /> +<hkern g1="V" g2="Acircumflex" k="136" /> +<hkern g1="V" g2="Atilde" k="136" /> +<hkern g1="V" g2="Adieresis" k="136" /> +<hkern g1="V" g2="Aring" k="136" /> +<hkern g1="V" g2="AE" k="136" /> +<hkern g1="V" g2="Ccedilla" k="52" /> +<hkern g1="V" g2="Ograve" k="52" /> +<hkern g1="V" g2="Oacute" k="52" /> +<hkern g1="V" g2="Ocircumflex" k="52" /> +<hkern g1="V" g2="Otilde" k="52" /> +<hkern g1="V" g2="Odieresis" k="52" /> +<hkern g1="V" g2="Oslash" k="52" /> +<hkern g1="V" g2="agrave" k="116" /> +<hkern g1="V" g2="aacute" k="116" /> +<hkern g1="V" g2="acircumflex" k="116" /> +<hkern g1="V" g2="atilde" k="116" /> +<hkern g1="V" g2="adieresis" k="116" /> +<hkern g1="V" g2="aring" k="116" /> +<hkern g1="V" g2="ae" k="116" /> +<hkern g1="V" g2="ccedilla" k="116" /> +<hkern g1="V" g2="egrave" k="116" /> +<hkern g1="V" g2="eacute" k="116" /> +<hkern g1="V" g2="ecircumflex" k="116" /> +<hkern g1="V" g2="edieresis" k="116" /> +<hkern g1="V" g2="eth" k="116" /> +<hkern g1="V" g2="ntilde" k="88" /> +<hkern g1="V" g2="ograve" k="116" /> +<hkern g1="V" g2="oacute" k="116" /> +<hkern g1="V" g2="ocircumflex" k="116" /> +<hkern g1="V" g2="otilde" k="116" /> +<hkern g1="V" g2="odieresis" k="116" /> +<hkern g1="V" g2="oslash" k="116" /> +<hkern g1="V" g2="ugrave" k="88" /> +<hkern g1="V" g2="uacute" k="88" /> +<hkern g1="V" g2="ucircumflex" k="88" /> +<hkern g1="V" g2="udieresis" k="88" /> +<hkern g1="V" g2="OE" k="52" /> +<hkern g1="V" g2="oe" k="116" /> +<hkern g1="V" g2="endash" k="112" /> +<hkern g1="V" g2="emdash" k="112" /> +<hkern g1="V" g2="quoteleft" k="-48" /> +<hkern g1="V" g2="quoteright" k="-48" /> +<hkern g1="V" g2="quotesinglbase" k="192" /> +<hkern g1="V" g2="quotedblleft" k="-48" /> +<hkern g1="V" g2="quotedblright" k="-48" /> +<hkern g1="V" g2="quotedblbase" k="192" /> +<hkern g1="V" g2="bullet" k="112" /> +<hkern g1="V" g2="guilsinglleft" k="112" /> +<hkern g1="V" g2="guilsinglright" k="112" /> +<hkern g1="W" g2="quotedbl" k="-48" /> +<hkern g1="W" g2="ampersand" k="94" /> +<hkern g1="W" g2="quotesingle" k="-48" /> +<hkern g1="W" g2="asterisk" k="-48" /> +<hkern g1="W" g2="comma" k="122" /> +<hkern g1="W" g2="hyphen" k="32" /> +<hkern g1="W" g2="period" k="122" /> +<hkern g1="W" g2="slash" k="94" /> +<hkern g1="W" g2="question" k="-34" /> +<hkern g1="W" g2="A" k="94" /> +<hkern g1="W" g2="J" k="102" /> +<hkern g1="W" g2="a" k="88" /> +<hkern g1="W" g2="c" k="32" /> +<hkern g1="W" g2="d" k="32" /> +<hkern g1="W" g2="e" k="32" /> +<hkern g1="W" g2="g" k="98" /> +<hkern g1="W" g2="o" k="32" /> +<hkern g1="W" g2="q" k="32" /> +<hkern g1="W" g2="s" k="46" /> +<hkern g1="W" g2="ordfeminine" k="-48" /> +<hkern g1="W" g2="guillemotleft" k="32" /> +<hkern g1="W" g2="uni00AD" k="32" /> +<hkern g1="W" g2="degree" k="-48" /> +<hkern g1="W" g2="twosuperior" k="-48" /> +<hkern g1="W" g2="threesuperior" k="-48" /> +<hkern g1="W" g2="middot" k="32" /> +<hkern g1="W" g2="onesuperior" k="-48" /> +<hkern g1="W" g2="ordmasculine" k="-48" /> +<hkern g1="W" g2="guillemotright" k="32" /> +<hkern g1="W" g2="Agrave" k="94" /> +<hkern g1="W" g2="Aacute" k="94" /> +<hkern g1="W" g2="Acircumflex" k="94" /> +<hkern g1="W" g2="Atilde" k="94" /> +<hkern g1="W" g2="Adieresis" k="94" /> +<hkern g1="W" g2="Aring" k="94" /> +<hkern g1="W" g2="AE" k="94" /> +<hkern g1="W" g2="agrave" k="88" /> +<hkern g1="W" g2="aacute" k="88" /> +<hkern g1="W" g2="acircumflex" k="88" /> +<hkern g1="W" g2="atilde" k="88" /> +<hkern g1="W" g2="adieresis" k="88" /> +<hkern g1="W" g2="aring" k="88" /> +<hkern g1="W" g2="ae" k="88" /> +<hkern g1="W" g2="ccedilla" k="32" /> +<hkern g1="W" g2="egrave" k="32" /> +<hkern g1="W" g2="eacute" k="32" /> +<hkern g1="W" g2="ecircumflex" k="32" /> +<hkern g1="W" g2="edieresis" k="32" /> +<hkern g1="W" g2="eth" k="32" /> +<hkern g1="W" g2="ograve" k="32" /> +<hkern g1="W" g2="oacute" k="32" /> +<hkern g1="W" g2="ocircumflex" k="32" /> +<hkern g1="W" g2="otilde" k="32" /> +<hkern g1="W" g2="odieresis" k="32" /> +<hkern g1="W" g2="oslash" k="32" /> +<hkern g1="W" g2="oe" k="32" /> +<hkern g1="W" g2="endash" k="32" /> +<hkern g1="W" g2="emdash" k="32" /> +<hkern g1="W" g2="quoteleft" k="-48" /> +<hkern g1="W" g2="quoteright" k="-48" /> +<hkern g1="W" g2="quotesinglbase" k="122" /> +<hkern g1="W" g2="quotedblleft" k="-48" /> +<hkern g1="W" g2="quotedblright" k="-48" /> +<hkern g1="W" g2="quotedblbase" k="122" /> +<hkern g1="W" g2="bullet" k="32" /> +<hkern g1="W" g2="guilsinglleft" k="32" /> +<hkern g1="W" g2="guilsinglright" k="32" /> +<hkern g1="X" g2="hyphen" k="62" /> +<hkern g1="X" g2="at" k="30" /> +<hkern g1="X" g2="C" k="30" /> +<hkern g1="X" g2="G" k="30" /> +<hkern g1="X" g2="O" k="30" /> +<hkern g1="X" g2="Q" k="30" /> +<hkern g1="X" g2="c" k="36" /> +<hkern g1="X" g2="d" k="36" /> +<hkern g1="X" g2="e" k="36" /> +<hkern g1="X" g2="f" k="52" /> +<hkern g1="X" g2="o" k="36" /> +<hkern g1="X" g2="q" k="36" /> +<hkern g1="X" g2="t" k="82" /> +<hkern g1="X" g2="v" k="66" /> +<hkern g1="X" g2="w" k="56" /> +<hkern g1="X" g2="y" k="66" /> +<hkern g1="X" g2="guillemotleft" k="62" /> +<hkern g1="X" g2="uni00AD" k="62" /> +<hkern g1="X" g2="middot" k="62" /> +<hkern g1="X" g2="guillemotright" k="62" /> +<hkern g1="X" g2="Ccedilla" k="30" /> +<hkern g1="X" g2="Ograve" k="30" /> +<hkern g1="X" g2="Oacute" k="30" /> +<hkern g1="X" g2="Ocircumflex" k="30" /> +<hkern g1="X" g2="Otilde" k="30" /> +<hkern g1="X" g2="Odieresis" k="30" /> +<hkern g1="X" g2="Oslash" k="30" /> +<hkern g1="X" g2="ccedilla" k="36" /> +<hkern g1="X" g2="egrave" k="36" /> +<hkern g1="X" g2="eacute" k="36" /> +<hkern g1="X" g2="ecircumflex" k="36" /> +<hkern g1="X" g2="edieresis" k="36" /> +<hkern g1="X" g2="eth" k="36" /> +<hkern g1="X" g2="ograve" k="36" /> +<hkern g1="X" g2="oacute" k="36" /> +<hkern g1="X" g2="ocircumflex" k="36" /> +<hkern g1="X" g2="otilde" k="36" /> +<hkern g1="X" g2="odieresis" k="36" /> +<hkern g1="X" g2="oslash" k="36" /> +<hkern g1="X" g2="OE" k="30" /> +<hkern g1="X" g2="oe" k="36" /> +<hkern g1="X" g2="endash" k="62" /> +<hkern g1="X" g2="emdash" k="62" /> +<hkern g1="X" g2="bullet" k="62" /> +<hkern g1="X" g2="guilsinglleft" k="62" /> +<hkern g1="X" g2="guilsinglright" k="62" /> +<hkern g1="Y" g2="quotedbl" k="-30" /> +<hkern g1="Y" g2="ampersand" k="164" /> +<hkern g1="Y" g2="quotesingle" k="-30" /> +<hkern g1="Y" g2="asterisk" k="-30" /> +<hkern g1="Y" g2="comma" k="152" /> +<hkern g1="Y" g2="hyphen" k="160" /> +<hkern g1="Y" g2="period" k="152" /> +<hkern g1="Y" g2="slash" k="164" /> +<hkern g1="Y" g2="colon" k="122" /> +<hkern g1="Y" g2="semicolon" k="122" /> +<hkern g1="Y" g2="question" k="-34" /> +<hkern g1="Y" g2="at" k="80" /> +<hkern g1="Y" g2="A" k="164" /> +<hkern g1="Y" g2="C" k="80" /> +<hkern g1="Y" g2="G" k="80" /> +<hkern g1="Y" g2="J" k="200" /> +<hkern g1="Y" g2="O" k="80" /> +<hkern g1="Y" g2="Q" k="80" /> +<hkern g1="Y" g2="a" k="128" /> +<hkern g1="Y" g2="c" k="160" /> +<hkern g1="Y" g2="d" k="160" /> +<hkern g1="Y" g2="e" k="160" /> +<hkern g1="Y" g2="g" k="172" /> +<hkern g1="Y" g2="m" k="122" /> +<hkern g1="Y" g2="n" k="122" /> +<hkern g1="Y" g2="o" k="160" /> +<hkern g1="Y" g2="p" k="122" /> +<hkern g1="Y" g2="q" k="160" /> +<hkern g1="Y" g2="r" k="122" /> +<hkern g1="Y" g2="s" k="128" /> +<hkern g1="Y" g2="u" k="122" /> +<hkern g1="Y" g2="v" k="100" /> +<hkern g1="Y" g2="w" k="92" /> +<hkern g1="Y" g2="x" k="132" /> +<hkern g1="Y" g2="y" k="100" /> +<hkern g1="Y" g2="ordfeminine" k="-30" /> +<hkern g1="Y" g2="guillemotleft" k="160" /> +<hkern g1="Y" g2="uni00AD" k="160" /> +<hkern g1="Y" g2="degree" k="-30" /> +<hkern g1="Y" g2="twosuperior" k="-50" /> +<hkern g1="Y" g2="threesuperior" k="-50" /> +<hkern g1="Y" g2="mu" k="122" /> +<hkern g1="Y" g2="middot" k="160" /> +<hkern g1="Y" g2="onesuperior" k="-50" /> +<hkern g1="Y" g2="ordmasculine" k="-30" /> +<hkern g1="Y" g2="guillemotright" k="160" /> +<hkern g1="Y" g2="Agrave" k="164" /> +<hkern g1="Y" g2="Aacute" k="164" /> +<hkern g1="Y" g2="Acircumflex" k="164" /> +<hkern g1="Y" g2="Atilde" k="164" /> +<hkern g1="Y" g2="Adieresis" k="164" /> +<hkern g1="Y" g2="Aring" k="164" /> +<hkern g1="Y" g2="AE" k="164" /> +<hkern g1="Y" g2="Ccedilla" k="80" /> +<hkern g1="Y" g2="Ograve" k="80" /> +<hkern g1="Y" g2="Oacute" k="80" /> +<hkern g1="Y" g2="Ocircumflex" k="80" /> +<hkern g1="Y" g2="Otilde" k="80" /> +<hkern g1="Y" g2="Odieresis" k="80" /> +<hkern g1="Y" g2="Oslash" k="80" /> +<hkern g1="Y" g2="agrave" k="128" /> +<hkern g1="Y" g2="aacute" k="128" /> +<hkern g1="Y" g2="acircumflex" k="128" /> +<hkern g1="Y" g2="atilde" k="128" /> +<hkern g1="Y" g2="adieresis" k="128" /> +<hkern g1="Y" g2="aring" k="128" /> +<hkern g1="Y" g2="ae" k="128" /> +<hkern g1="Y" g2="ccedilla" k="160" /> +<hkern g1="Y" g2="egrave" k="160" /> +<hkern g1="Y" g2="eacute" k="160" /> +<hkern g1="Y" g2="ecircumflex" k="160" /> +<hkern g1="Y" g2="edieresis" k="160" /> +<hkern g1="Y" g2="eth" k="160" /> +<hkern g1="Y" g2="ntilde" k="122" /> +<hkern g1="Y" g2="ograve" k="160" /> +<hkern g1="Y" g2="oacute" k="160" /> +<hkern g1="Y" g2="ocircumflex" k="160" /> +<hkern g1="Y" g2="otilde" k="160" /> +<hkern g1="Y" g2="odieresis" k="160" /> +<hkern g1="Y" g2="oslash" k="160" /> +<hkern g1="Y" g2="ugrave" k="122" /> +<hkern g1="Y" g2="uacute" k="122" /> +<hkern g1="Y" g2="ucircumflex" k="122" /> +<hkern g1="Y" g2="udieresis" k="122" /> +<hkern g1="Y" g2="OE" k="80" /> +<hkern g1="Y" g2="oe" k="160" /> +<hkern g1="Y" g2="endash" k="160" /> +<hkern g1="Y" g2="emdash" k="160" /> +<hkern g1="Y" g2="quoteleft" k="-30" /> +<hkern g1="Y" g2="quoteright" k="-30" /> +<hkern g1="Y" g2="quotesinglbase" k="152" /> +<hkern g1="Y" g2="quotedblleft" k="-30" /> +<hkern g1="Y" g2="quotedblright" k="-30" /> +<hkern g1="Y" g2="quotedblbase" k="152" /> +<hkern g1="Y" g2="bullet" k="160" /> +<hkern g1="Y" g2="guilsinglleft" k="160" /> +<hkern g1="Y" g2="guilsinglright" k="160" /> +<hkern g1="Z" g2="hyphen" k="70" /> +<hkern g1="Z" g2="question" k="-34" /> +<hkern g1="Z" g2="at" k="58" /> +<hkern g1="Z" g2="C" k="58" /> +<hkern g1="Z" g2="G" k="58" /> +<hkern g1="Z" g2="O" k="58" /> +<hkern g1="Z" g2="Q" k="58" /> +<hkern g1="Z" g2="c" k="38" /> +<hkern g1="Z" g2="d" k="38" /> +<hkern g1="Z" g2="e" k="38" /> +<hkern g1="Z" g2="o" k="38" /> +<hkern g1="Z" g2="q" k="38" /> +<hkern g1="Z" g2="s" k="28" /> +<hkern g1="Z" g2="v" k="40" /> +<hkern g1="Z" g2="y" k="40" /> +<hkern g1="Z" g2="guillemotleft" k="70" /> +<hkern g1="Z" g2="uni00AD" k="70" /> +<hkern g1="Z" g2="middot" k="70" /> +<hkern g1="Z" g2="guillemotright" k="70" /> +<hkern g1="Z" g2="Ccedilla" k="58" /> +<hkern g1="Z" g2="Ograve" k="58" /> +<hkern g1="Z" g2="Oacute" k="58" /> +<hkern g1="Z" g2="Ocircumflex" k="58" /> +<hkern g1="Z" g2="Otilde" k="58" /> +<hkern g1="Z" g2="Odieresis" k="58" /> +<hkern g1="Z" g2="Oslash" k="58" /> +<hkern g1="Z" g2="ccedilla" k="38" /> +<hkern g1="Z" g2="egrave" k="38" /> +<hkern g1="Z" g2="eacute" k="38" /> +<hkern g1="Z" g2="ecircumflex" k="38" /> +<hkern g1="Z" g2="edieresis" k="38" /> +<hkern g1="Z" g2="eth" k="38" /> +<hkern g1="Z" g2="ograve" k="38" /> +<hkern g1="Z" g2="oacute" k="38" /> +<hkern g1="Z" g2="ocircumflex" k="38" /> +<hkern g1="Z" g2="otilde" k="38" /> +<hkern g1="Z" g2="odieresis" k="38" /> +<hkern g1="Z" g2="oslash" k="38" /> +<hkern g1="Z" g2="OE" k="58" /> +<hkern g1="Z" g2="oe" k="38" /> +<hkern g1="Z" g2="endash" k="70" /> +<hkern g1="Z" g2="emdash" k="70" /> +<hkern g1="Z" g2="bullet" k="70" /> +<hkern g1="Z" g2="guilsinglleft" k="70" /> +<hkern g1="Z" g2="guilsinglright" k="70" /> +<hkern g1="bracketleft" g2="at" k="40" /> +<hkern g1="bracketleft" g2="C" k="40" /> +<hkern g1="bracketleft" g2="G" k="40" /> +<hkern g1="bracketleft" g2="O" k="40" /> +<hkern g1="bracketleft" g2="Q" k="40" /> +<hkern g1="bracketleft" g2="c" k="32" /> +<hkern g1="bracketleft" g2="d" k="32" /> +<hkern g1="bracketleft" g2="e" k="32" /> +<hkern g1="bracketleft" g2="o" k="32" /> +<hkern g1="bracketleft" g2="q" k="32" /> +<hkern g1="bracketleft" g2="Ccedilla" k="40" /> +<hkern g1="bracketleft" g2="Ograve" k="40" /> +<hkern g1="bracketleft" g2="Oacute" k="40" /> +<hkern g1="bracketleft" g2="Ocircumflex" k="40" /> +<hkern g1="bracketleft" g2="Otilde" k="40" /> +<hkern g1="bracketleft" g2="Odieresis" k="40" /> +<hkern g1="bracketleft" g2="Oslash" k="40" /> +<hkern g1="bracketleft" g2="ccedilla" k="32" /> +<hkern g1="bracketleft" g2="egrave" k="32" /> +<hkern g1="bracketleft" g2="eacute" k="32" /> +<hkern g1="bracketleft" g2="ecircumflex" k="32" /> +<hkern g1="bracketleft" g2="edieresis" k="32" /> +<hkern g1="bracketleft" g2="eth" k="32" /> +<hkern g1="bracketleft" g2="ograve" k="32" /> +<hkern g1="bracketleft" g2="oacute" k="32" /> +<hkern g1="bracketleft" g2="ocircumflex" k="32" /> +<hkern g1="bracketleft" g2="otilde" k="32" /> +<hkern g1="bracketleft" g2="odieresis" k="32" /> +<hkern g1="bracketleft" g2="oslash" k="32" /> +<hkern g1="bracketleft" g2="OE" k="40" /> +<hkern g1="bracketleft" g2="oe" k="32" /> +<hkern g1="backslash" g2="quotedbl" k="182" /> +<hkern g1="backslash" g2="quotesingle" k="182" /> +<hkern g1="backslash" g2="asterisk" k="182" /> +<hkern g1="backslash" g2="hyphen" k="52" /> +<hkern g1="backslash" g2="question" k="56" /> +<hkern g1="backslash" g2="at" k="42" /> +<hkern g1="backslash" g2="C" k="42" /> +<hkern g1="backslash" g2="G" k="42" /> +<hkern g1="backslash" g2="J" k="-50" /> +<hkern g1="backslash" g2="O" k="42" /> +<hkern g1="backslash" g2="Q" k="42" /> +<hkern g1="backslash" g2="T" k="132" /> +<hkern g1="backslash" g2="U" k="56" /> +<hkern g1="backslash" g2="V" k="136" /> +<hkern g1="backslash" g2="W" k="84" /> +<hkern g1="backslash" g2="Y" k="164" /> +<hkern g1="backslash" g2="backslash" k="136" /> +<hkern g1="backslash" g2="v" k="82" /> +<hkern g1="backslash" g2="y" k="82" /> +<hkern g1="backslash" g2="ordfeminine" k="182" /> +<hkern g1="backslash" g2="guillemotleft" k="52" /> +<hkern g1="backslash" g2="uni00AD" k="52" /> +<hkern g1="backslash" g2="degree" k="182" /> +<hkern g1="backslash" g2="twosuperior" k="184" /> +<hkern g1="backslash" g2="threesuperior" k="184" /> +<hkern g1="backslash" g2="middot" k="52" /> +<hkern g1="backslash" g2="onesuperior" k="184" /> +<hkern g1="backslash" g2="ordmasculine" k="182" /> +<hkern g1="backslash" g2="guillemotright" k="52" /> +<hkern g1="backslash" g2="Ccedilla" k="42" /> +<hkern g1="backslash" g2="Ograve" k="42" /> +<hkern g1="backslash" g2="Oacute" k="42" /> +<hkern g1="backslash" g2="Ocircumflex" k="42" /> +<hkern g1="backslash" g2="Otilde" k="42" /> +<hkern g1="backslash" g2="Odieresis" k="42" /> +<hkern g1="backslash" g2="Oslash" k="42" /> +<hkern g1="backslash" g2="Ugrave" k="56" /> +<hkern g1="backslash" g2="Uacute" k="56" /> +<hkern g1="backslash" g2="Ucircumflex" k="56" /> +<hkern g1="backslash" g2="Udieresis" k="56" /> +<hkern g1="backslash" g2="Yacute" k="164" /> +<hkern g1="backslash" g2="OE" k="42" /> +<hkern g1="backslash" g2="endash" k="52" /> +<hkern g1="backslash" g2="emdash" k="52" /> +<hkern g1="backslash" g2="quoteleft" k="182" /> +<hkern g1="backslash" g2="quoteright" k="182" /> +<hkern g1="backslash" g2="quotedblleft" k="182" /> +<hkern g1="backslash" g2="quotedblright" k="182" /> +<hkern g1="backslash" g2="bullet" k="52" /> +<hkern g1="backslash" g2="guilsinglleft" k="52" /> +<hkern g1="backslash" g2="guilsinglright" k="52" /> +<hkern g1="a" g2="quotedbl" k="72" /> +<hkern g1="a" g2="quotesingle" k="72" /> +<hkern g1="a" g2="asterisk" k="72" /> +<hkern g1="a" g2="v" k="32" /> +<hkern g1="a" g2="w" k="16" /> +<hkern g1="a" g2="y" k="32" /> +<hkern g1="a" g2="ordfeminine" k="72" /> +<hkern g1="a" g2="degree" k="72" /> +<hkern g1="a" g2="twosuperior" k="72" /> +<hkern g1="a" g2="threesuperior" k="72" /> +<hkern g1="a" g2="onesuperior" k="72" /> +<hkern g1="a" g2="ordmasculine" k="72" /> +<hkern g1="a" g2="quoteleft" k="72" /> +<hkern g1="a" g2="quoteright" k="72" /> +<hkern g1="a" g2="quotedblleft" k="72" /> +<hkern g1="a" g2="quotedblright" k="72" /> +<hkern g1="b" g2="quotedbl" k="92" /> +<hkern g1="b" g2="quotesingle" k="92" /> +<hkern g1="b" g2="parenright" k="32" /> +<hkern g1="b" g2="asterisk" k="92" /> +<hkern g1="b" g2="V" k="116" /> +<hkern g1="b" g2="W" k="32" /> +<hkern g1="b" g2="backslash" k="116" /> +<hkern g1="b" g2="bracketright" k="32" /> +<hkern g1="b" g2="v" k="26" /> +<hkern g1="b" g2="x" k="60" /> +<hkern g1="b" g2="y" k="26" /> +<hkern g1="b" g2="braceright" k="32" /> +<hkern g1="b" g2="ordfeminine" k="92" /> +<hkern g1="b" g2="degree" k="92" /> +<hkern g1="b" g2="ordmasculine" k="92" /> +<hkern g1="b" g2="quoteleft" k="92" /> +<hkern g1="b" g2="quoteright" k="92" /> +<hkern g1="b" g2="quotedblleft" k="92" /> +<hkern g1="b" g2="quotedblright" k="92" /> +<hkern g1="e" g2="quotedbl" k="92" /> +<hkern g1="e" g2="quotesingle" k="92" /> +<hkern g1="e" g2="parenright" k="32" /> +<hkern g1="e" g2="asterisk" k="92" /> +<hkern g1="e" g2="V" k="116" /> +<hkern g1="e" g2="W" k="32" /> +<hkern g1="e" g2="backslash" k="116" /> +<hkern g1="e" g2="bracketright" k="32" /> +<hkern g1="e" g2="v" k="26" /> +<hkern g1="e" g2="x" k="60" /> +<hkern g1="e" g2="y" k="26" /> +<hkern g1="e" g2="braceright" k="32" /> +<hkern g1="e" g2="ordfeminine" k="92" /> +<hkern g1="e" g2="degree" k="92" /> +<hkern g1="e" g2="ordmasculine" k="92" /> +<hkern g1="e" g2="quoteleft" k="92" /> +<hkern g1="e" g2="quoteright" k="92" /> +<hkern g1="e" g2="quotedblleft" k="92" /> +<hkern g1="e" g2="quotedblright" k="92" /> +<hkern g1="f" g2="quotedbl" k="-68" /> +<hkern g1="f" g2="quotesingle" k="-68" /> +<hkern g1="f" g2="asterisk" k="-68" /> +<hkern g1="f" g2="comma" k="130" /> +<hkern g1="f" g2="period" k="130" /> +<hkern g1="f" g2="ordfeminine" k="-68" /> +<hkern g1="f" g2="degree" k="-68" /> +<hkern g1="f" g2="twosuperior" k="-100" /> +<hkern g1="f" g2="threesuperior" k="-100" /> +<hkern g1="f" g2="onesuperior" k="-100" /> +<hkern g1="f" g2="ordmasculine" k="-68" /> +<hkern g1="f" g2="quoteleft" k="-68" /> +<hkern g1="f" g2="quoteright" k="-68" /> +<hkern g1="f" g2="quotesinglbase" k="130" /> +<hkern g1="f" g2="quotedblleft" k="-68" /> +<hkern g1="f" g2="quotedblright" k="-68" /> +<hkern g1="f" g2="quotedblbase" k="130" /> +<hkern g1="h" g2="quotedbl" k="72" /> +<hkern g1="h" g2="quotesingle" k="72" /> +<hkern g1="h" g2="asterisk" k="72" /> +<hkern g1="h" g2="v" k="32" /> +<hkern g1="h" g2="w" k="16" /> +<hkern g1="h" g2="y" k="32" /> +<hkern g1="h" g2="ordfeminine" k="72" /> +<hkern g1="h" g2="degree" k="72" /> +<hkern g1="h" g2="twosuperior" k="72" /> +<hkern g1="h" g2="threesuperior" k="72" /> +<hkern g1="h" g2="onesuperior" k="72" /> +<hkern g1="h" g2="ordmasculine" k="72" /> +<hkern g1="h" g2="quoteleft" k="72" /> +<hkern g1="h" g2="quoteright" k="72" /> +<hkern g1="h" g2="quotedblleft" k="72" /> +<hkern g1="h" g2="quotedblright" k="72" /> +<hkern g1="k" g2="c" k="60" /> +<hkern g1="k" g2="d" k="60" /> +<hkern g1="k" g2="e" k="60" /> +<hkern g1="k" g2="o" k="60" /> +<hkern g1="k" g2="q" k="60" /> +<hkern g1="k" g2="ccedilla" k="60" /> +<hkern g1="k" g2="egrave" k="60" /> +<hkern g1="k" g2="eacute" k="60" /> +<hkern g1="k" g2="ecircumflex" k="60" /> +<hkern g1="k" g2="edieresis" k="60" /> +<hkern g1="k" g2="eth" k="60" /> +<hkern g1="k" g2="ograve" k="60" /> +<hkern g1="k" g2="oacute" k="60" /> +<hkern g1="k" g2="ocircumflex" k="60" /> +<hkern g1="k" g2="otilde" k="60" /> +<hkern g1="k" g2="odieresis" k="60" /> +<hkern g1="k" g2="oslash" k="60" /> +<hkern g1="k" g2="oe" k="60" /> +<hkern g1="m" g2="quotedbl" k="72" /> +<hkern g1="m" g2="quotesingle" k="72" /> +<hkern g1="m" g2="asterisk" k="72" /> +<hkern g1="m" g2="v" k="32" /> +<hkern g1="m" g2="w" k="16" /> +<hkern g1="m" g2="y" k="32" /> +<hkern g1="m" g2="ordfeminine" k="72" /> +<hkern g1="m" g2="degree" k="72" /> +<hkern g1="m" g2="twosuperior" k="72" /> +<hkern g1="m" g2="threesuperior" k="72" /> +<hkern g1="m" g2="onesuperior" k="72" /> +<hkern g1="m" g2="ordmasculine" k="72" /> +<hkern g1="m" g2="quoteleft" k="72" /> +<hkern g1="m" g2="quoteright" k="72" /> +<hkern g1="m" g2="quotedblleft" k="72" /> +<hkern g1="m" g2="quotedblright" k="72" /> +<hkern g1="n" g2="quotedbl" k="72" /> +<hkern g1="n" g2="quotesingle" k="72" /> +<hkern g1="n" g2="asterisk" k="72" /> +<hkern g1="n" g2="v" k="32" /> +<hkern g1="n" g2="w" k="16" /> +<hkern g1="n" g2="y" k="32" /> +<hkern g1="n" g2="ordfeminine" k="72" /> +<hkern g1="n" g2="degree" k="72" /> +<hkern g1="n" g2="twosuperior" k="72" /> +<hkern g1="n" g2="threesuperior" k="72" /> +<hkern g1="n" g2="onesuperior" k="72" /> +<hkern g1="n" g2="ordmasculine" k="72" /> +<hkern g1="n" g2="quoteleft" k="72" /> +<hkern g1="n" g2="quoteright" k="72" /> +<hkern g1="n" g2="quotedblleft" k="72" /> +<hkern g1="n" g2="quotedblright" k="72" /> +<hkern g1="o" g2="quotedbl" k="92" /> +<hkern g1="o" g2="quotesingle" k="92" /> +<hkern g1="o" g2="parenright" k="32" /> +<hkern g1="o" g2="asterisk" k="92" /> +<hkern g1="o" g2="V" k="116" /> +<hkern g1="o" g2="W" k="32" /> +<hkern g1="o" g2="backslash" k="116" /> +<hkern g1="o" g2="bracketright" k="32" /> +<hkern g1="o" g2="v" k="26" /> +<hkern g1="o" g2="x" k="60" /> +<hkern g1="o" g2="y" k="26" /> +<hkern g1="o" g2="braceright" k="32" /> +<hkern g1="o" g2="ordfeminine" k="92" /> +<hkern g1="o" g2="degree" k="92" /> +<hkern g1="o" g2="ordmasculine" k="92" /> +<hkern g1="o" g2="quoteleft" k="92" /> +<hkern g1="o" g2="quoteright" k="92" /> +<hkern g1="o" g2="quotedblleft" k="92" /> +<hkern g1="o" g2="quotedblright" k="92" /> +<hkern g1="p" g2="quotedbl" k="92" /> +<hkern g1="p" g2="quotesingle" k="92" /> +<hkern g1="p" g2="parenright" k="32" /> +<hkern g1="p" g2="asterisk" k="92" /> +<hkern g1="p" g2="V" k="116" /> +<hkern g1="p" g2="W" k="32" /> +<hkern g1="p" g2="backslash" k="116" /> +<hkern g1="p" g2="bracketright" k="32" /> +<hkern g1="p" g2="v" k="26" /> +<hkern g1="p" g2="x" k="60" /> +<hkern g1="p" g2="y" k="26" /> +<hkern g1="p" g2="braceright" k="32" /> +<hkern g1="p" g2="ordfeminine" k="92" /> +<hkern g1="p" g2="degree" k="92" /> +<hkern g1="p" g2="ordmasculine" k="92" /> +<hkern g1="p" g2="quoteleft" k="92" /> +<hkern g1="p" g2="quoteright" k="92" /> +<hkern g1="p" g2="quotedblleft" k="92" /> +<hkern g1="p" g2="quotedblright" k="92" /> +<hkern g1="r" g2="comma" k="132" /> +<hkern g1="r" g2="period" k="132" /> +<hkern g1="r" g2="a" k="38" /> +<hkern g1="r" g2="agrave" k="38" /> +<hkern g1="r" g2="aacute" k="38" /> +<hkern g1="r" g2="acircumflex" k="38" /> +<hkern g1="r" g2="atilde" k="38" /> +<hkern g1="r" g2="adieresis" k="38" /> +<hkern g1="r" g2="aring" k="38" /> +<hkern g1="r" g2="ae" k="38" /> +<hkern g1="r" g2="quotesinglbase" k="132" /> +<hkern g1="r" g2="quotedblbase" k="132" /> +<hkern g1="v" g2="ampersand" k="82" /> +<hkern g1="v" g2="comma" k="132" /> +<hkern g1="v" g2="period" k="132" /> +<hkern g1="v" g2="slash" k="82" /> +<hkern g1="v" g2="A" k="82" /> +<hkern g1="v" g2="c" k="26" /> +<hkern g1="v" g2="d" k="26" /> +<hkern g1="v" g2="e" k="26" /> +<hkern g1="v" g2="o" k="26" /> +<hkern g1="v" g2="q" k="26" /> +<hkern g1="v" g2="Agrave" k="82" /> +<hkern g1="v" g2="Aacute" k="82" /> +<hkern g1="v" g2="Acircumflex" k="82" /> +<hkern g1="v" g2="Atilde" k="82" /> +<hkern g1="v" g2="Adieresis" k="82" /> +<hkern g1="v" g2="Aring" k="82" /> +<hkern g1="v" g2="AE" k="82" /> +<hkern g1="v" g2="ccedilla" k="26" /> +<hkern g1="v" g2="egrave" k="26" /> +<hkern g1="v" g2="eacute" k="26" /> +<hkern g1="v" g2="ecircumflex" k="26" /> +<hkern g1="v" g2="edieresis" k="26" /> +<hkern g1="v" g2="eth" k="26" /> +<hkern g1="v" g2="ograve" k="26" /> +<hkern g1="v" g2="oacute" k="26" /> +<hkern g1="v" g2="ocircumflex" k="26" /> +<hkern g1="v" g2="otilde" k="26" /> +<hkern g1="v" g2="odieresis" k="26" /> +<hkern g1="v" g2="oslash" k="26" /> +<hkern g1="v" g2="oe" k="26" /> +<hkern g1="v" g2="quotesinglbase" k="132" /> +<hkern g1="v" g2="quotedblbase" k="132" /> +<hkern g1="w" g2="comma" k="62" /> +<hkern g1="w" g2="period" k="62" /> +<hkern g1="w" g2="quotesinglbase" k="62" /> +<hkern g1="w" g2="quotedblbase" k="62" /> +<hkern g1="x" g2="c" k="60" /> +<hkern g1="x" g2="d" k="60" /> +<hkern g1="x" g2="e" k="60" /> +<hkern g1="x" g2="o" k="60" /> +<hkern g1="x" g2="q" k="60" /> +<hkern g1="x" g2="ccedilla" k="60" /> +<hkern g1="x" g2="egrave" k="60" /> +<hkern g1="x" g2="eacute" k="60" /> +<hkern g1="x" g2="ecircumflex" k="60" /> +<hkern g1="x" g2="edieresis" k="60" /> +<hkern g1="x" g2="eth" k="60" /> +<hkern g1="x" g2="ograve" k="60" /> +<hkern g1="x" g2="oacute" k="60" /> +<hkern g1="x" g2="ocircumflex" k="60" /> +<hkern g1="x" g2="otilde" k="60" /> +<hkern g1="x" g2="odieresis" k="60" /> +<hkern g1="x" g2="oslash" k="60" /> +<hkern g1="x" g2="oe" k="60" /> +<hkern g1="y" g2="ampersand" k="82" /> +<hkern g1="y" g2="comma" k="132" /> +<hkern g1="y" g2="period" k="132" /> +<hkern g1="y" g2="slash" k="82" /> +<hkern g1="y" g2="A" k="82" /> +<hkern g1="y" g2="c" k="26" /> +<hkern g1="y" g2="d" k="26" /> +<hkern g1="y" g2="e" k="26" /> +<hkern g1="y" g2="o" k="26" /> +<hkern g1="y" g2="q" k="26" /> +<hkern g1="y" g2="Agrave" k="82" /> +<hkern g1="y" g2="Aacute" k="82" /> +<hkern g1="y" g2="Acircumflex" k="82" /> +<hkern g1="y" g2="Atilde" k="82" /> +<hkern g1="y" g2="Adieresis" k="82" /> +<hkern g1="y" g2="Aring" k="82" /> +<hkern g1="y" g2="AE" k="82" /> +<hkern g1="y" g2="ccedilla" k="26" /> +<hkern g1="y" g2="egrave" k="26" /> +<hkern g1="y" g2="eacute" k="26" /> +<hkern g1="y" g2="ecircumflex" k="26" /> +<hkern g1="y" g2="edieresis" k="26" /> +<hkern g1="y" g2="eth" k="26" /> +<hkern g1="y" g2="ograve" k="26" /> +<hkern g1="y" g2="oacute" k="26" /> +<hkern g1="y" g2="ocircumflex" k="26" /> +<hkern g1="y" g2="otilde" k="26" /> +<hkern g1="y" g2="odieresis" k="26" /> +<hkern g1="y" g2="oslash" k="26" /> +<hkern g1="y" g2="oe" k="26" /> +<hkern g1="y" g2="quotesinglbase" k="132" /> +<hkern g1="y" g2="quotedblbase" k="132" /> +<hkern g1="braceleft" g2="at" k="40" /> +<hkern g1="braceleft" g2="C" k="40" /> +<hkern g1="braceleft" g2="G" k="40" /> +<hkern g1="braceleft" g2="O" k="40" /> +<hkern g1="braceleft" g2="Q" k="40" /> +<hkern g1="braceleft" g2="c" k="32" /> +<hkern g1="braceleft" g2="d" k="32" /> +<hkern g1="braceleft" g2="e" k="32" /> +<hkern g1="braceleft" g2="o" k="32" /> +<hkern g1="braceleft" g2="q" k="32" /> +<hkern g1="braceleft" g2="Ccedilla" k="40" /> +<hkern g1="braceleft" g2="Ograve" k="40" /> +<hkern g1="braceleft" g2="Oacute" k="40" /> +<hkern g1="braceleft" g2="Ocircumflex" k="40" /> +<hkern g1="braceleft" g2="Otilde" k="40" /> +<hkern g1="braceleft" g2="Odieresis" k="40" /> +<hkern g1="braceleft" g2="Oslash" k="40" /> +<hkern g1="braceleft" g2="ccedilla" k="32" /> +<hkern g1="braceleft" g2="egrave" k="32" /> +<hkern g1="braceleft" g2="eacute" k="32" /> +<hkern g1="braceleft" g2="ecircumflex" k="32" /> +<hkern g1="braceleft" g2="edieresis" k="32" /> +<hkern g1="braceleft" g2="eth" k="32" /> +<hkern g1="braceleft" g2="ograve" k="32" /> +<hkern g1="braceleft" g2="oacute" k="32" /> +<hkern g1="braceleft" g2="ocircumflex" k="32" /> +<hkern g1="braceleft" g2="otilde" k="32" /> +<hkern g1="braceleft" g2="odieresis" k="32" /> +<hkern g1="braceleft" g2="oslash" k="32" /> +<hkern g1="braceleft" g2="OE" k="40" /> +<hkern g1="braceleft" g2="oe" k="32" /> +<hkern g1="ordfeminine" g2="ampersand" k="182" /> +<hkern g1="ordfeminine" g2="comma" k="228" /> +<hkern g1="ordfeminine" g2="hyphen" k="178" /> +<hkern g1="ordfeminine" g2="period" k="228" /> +<hkern g1="ordfeminine" g2="slash" k="182" /> +<hkern g1="ordfeminine" g2="at" k="46" /> +<hkern g1="ordfeminine" g2="A" k="182" /> +<hkern g1="ordfeminine" g2="C" k="46" /> +<hkern g1="ordfeminine" g2="G" k="46" /> +<hkern g1="ordfeminine" g2="O" k="46" /> +<hkern g1="ordfeminine" g2="Q" k="46" /> +<hkern g1="ordfeminine" g2="V" k="-48" /> +<hkern g1="ordfeminine" g2="W" k="-48" /> +<hkern g1="ordfeminine" g2="Y" k="-30" /> +<hkern g1="ordfeminine" g2="backslash" k="-48" /> +<hkern g1="ordfeminine" g2="a" k="64" /> +<hkern g1="ordfeminine" g2="c" k="92" /> +<hkern g1="ordfeminine" g2="d" k="92" /> +<hkern g1="ordfeminine" g2="e" k="92" /> +<hkern g1="ordfeminine" g2="o" k="92" /> +<hkern g1="ordfeminine" g2="q" k="92" /> +<hkern g1="ordfeminine" g2="guillemotleft" k="178" /> +<hkern g1="ordfeminine" g2="uni00AD" k="178" /> +<hkern g1="ordfeminine" g2="middot" k="178" /> +<hkern g1="ordfeminine" g2="guillemotright" k="178" /> +<hkern g1="ordfeminine" g2="Agrave" k="182" /> +<hkern g1="ordfeminine" g2="Aacute" k="182" /> +<hkern g1="ordfeminine" g2="Acircumflex" k="182" /> +<hkern g1="ordfeminine" g2="Atilde" k="182" /> +<hkern g1="ordfeminine" g2="Adieresis" k="182" /> +<hkern g1="ordfeminine" g2="Aring" k="182" /> +<hkern g1="ordfeminine" g2="AE" k="182" /> +<hkern g1="ordfeminine" g2="Ccedilla" k="46" /> +<hkern g1="ordfeminine" g2="Ograve" k="46" /> +<hkern g1="ordfeminine" g2="Oacute" k="46" /> +<hkern g1="ordfeminine" g2="Ocircumflex" k="46" /> +<hkern g1="ordfeminine" g2="Otilde" k="46" /> +<hkern g1="ordfeminine" g2="Odieresis" k="46" /> +<hkern g1="ordfeminine" g2="Oslash" k="46" /> +<hkern g1="ordfeminine" g2="Yacute" k="-30" /> +<hkern g1="ordfeminine" g2="agrave" k="64" /> +<hkern g1="ordfeminine" g2="aacute" k="64" /> +<hkern g1="ordfeminine" g2="acircumflex" k="64" /> +<hkern g1="ordfeminine" g2="atilde" k="64" /> +<hkern g1="ordfeminine" g2="adieresis" k="64" /> +<hkern g1="ordfeminine" g2="aring" k="64" /> +<hkern g1="ordfeminine" g2="ae" k="64" /> +<hkern g1="ordfeminine" g2="ccedilla" k="92" /> +<hkern g1="ordfeminine" g2="egrave" k="92" /> +<hkern g1="ordfeminine" g2="eacute" k="92" /> +<hkern g1="ordfeminine" g2="ecircumflex" k="92" /> +<hkern g1="ordfeminine" g2="edieresis" k="92" /> +<hkern g1="ordfeminine" g2="eth" k="92" /> +<hkern g1="ordfeminine" g2="ograve" k="92" /> +<hkern g1="ordfeminine" g2="oacute" k="92" /> +<hkern g1="ordfeminine" g2="ocircumflex" k="92" /> +<hkern g1="ordfeminine" g2="otilde" k="92" /> +<hkern g1="ordfeminine" g2="odieresis" k="92" /> +<hkern g1="ordfeminine" g2="oslash" k="92" /> +<hkern g1="ordfeminine" g2="OE" k="46" /> +<hkern g1="ordfeminine" g2="oe" k="92" /> +<hkern g1="ordfeminine" g2="endash" k="178" /> +<hkern g1="ordfeminine" g2="emdash" k="178" /> +<hkern g1="ordfeminine" g2="quotesinglbase" k="228" /> +<hkern g1="ordfeminine" g2="quotedblbase" k="228" /> +<hkern g1="ordfeminine" g2="bullet" k="178" /> +<hkern g1="ordfeminine" g2="guilsinglleft" k="178" /> +<hkern g1="ordfeminine" g2="guilsinglright" k="178" /> +<hkern g1="guillemotleft" g2="quotedbl" k="178" /> +<hkern g1="guillemotleft" g2="ampersand" k="52" /> +<hkern g1="guillemotleft" g2="quotesingle" k="178" /> +<hkern g1="guillemotleft" g2="asterisk" k="178" /> +<hkern g1="guillemotleft" g2="comma" k="136" /> +<hkern g1="guillemotleft" g2="period" k="136" /> +<hkern g1="guillemotleft" g2="slash" k="52" /> +<hkern g1="guillemotleft" g2="A" k="52" /> +<hkern g1="guillemotleft" g2="T" k="180" /> +<hkern g1="guillemotleft" g2="V" k="112" /> +<hkern g1="guillemotleft" g2="W" k="32" /> +<hkern g1="guillemotleft" g2="X" k="62" /> +<hkern g1="guillemotleft" g2="Y" k="160" /> +<hkern g1="guillemotleft" g2="Z" k="46" /> +<hkern g1="guillemotleft" g2="backslash" k="112" /> +<hkern g1="guillemotleft" g2="ordfeminine" k="178" /> +<hkern g1="guillemotleft" g2="degree" k="178" /> +<hkern g1="guillemotleft" g2="ordmasculine" k="178" /> +<hkern g1="guillemotleft" g2="Agrave" k="52" /> +<hkern g1="guillemotleft" g2="Aacute" k="52" /> +<hkern g1="guillemotleft" g2="Acircumflex" k="52" /> +<hkern g1="guillemotleft" g2="Atilde" k="52" /> +<hkern g1="guillemotleft" g2="Adieresis" k="52" /> +<hkern g1="guillemotleft" g2="Aring" k="52" /> +<hkern g1="guillemotleft" g2="AE" k="52" /> +<hkern g1="guillemotleft" g2="Yacute" k="160" /> +<hkern g1="guillemotleft" g2="quoteleft" k="178" /> +<hkern g1="guillemotleft" g2="quoteright" k="178" /> +<hkern g1="guillemotleft" g2="quotesinglbase" k="136" /> +<hkern g1="guillemotleft" g2="quotedblleft" k="178" /> +<hkern g1="guillemotleft" g2="quotedblright" k="178" /> +<hkern g1="guillemotleft" g2="quotedblbase" k="136" /> +<hkern g1="uni00AD" g2="quotedbl" k="178" /> +<hkern g1="uni00AD" g2="ampersand" k="52" /> +<hkern g1="uni00AD" g2="quotesingle" k="178" /> +<hkern g1="uni00AD" g2="asterisk" k="178" /> +<hkern g1="uni00AD" g2="comma" k="136" /> +<hkern g1="uni00AD" g2="period" k="136" /> +<hkern g1="uni00AD" g2="slash" k="52" /> +<hkern g1="uni00AD" g2="A" k="52" /> +<hkern g1="uni00AD" g2="T" k="180" /> +<hkern g1="uni00AD" g2="V" k="112" /> +<hkern g1="uni00AD" g2="W" k="32" /> +<hkern g1="uni00AD" g2="X" k="62" /> +<hkern g1="uni00AD" g2="Y" k="160" /> +<hkern g1="uni00AD" g2="Z" k="46" /> +<hkern g1="uni00AD" g2="backslash" k="112" /> +<hkern g1="uni00AD" g2="ordfeminine" k="178" /> +<hkern g1="uni00AD" g2="degree" k="178" /> +<hkern g1="uni00AD" g2="ordmasculine" k="178" /> +<hkern g1="uni00AD" g2="Agrave" k="52" /> +<hkern g1="uni00AD" g2="Aacute" k="52" /> +<hkern g1="uni00AD" g2="Acircumflex" k="52" /> +<hkern g1="uni00AD" g2="Atilde" k="52" /> +<hkern g1="uni00AD" g2="Adieresis" k="52" /> +<hkern g1="uni00AD" g2="Aring" k="52" /> +<hkern g1="uni00AD" g2="AE" k="52" /> +<hkern g1="uni00AD" g2="Yacute" k="160" /> +<hkern g1="uni00AD" g2="quoteleft" k="178" /> +<hkern g1="uni00AD" g2="quoteright" k="178" /> +<hkern g1="uni00AD" g2="quotesinglbase" k="136" /> +<hkern g1="uni00AD" g2="quotedblleft" k="178" /> +<hkern g1="uni00AD" g2="quotedblright" k="178" /> +<hkern g1="uni00AD" g2="quotedblbase" k="136" /> +<hkern g1="registered" g2="quotedbl" k="46" /> +<hkern g1="registered" g2="ampersand" k="42" /> +<hkern g1="registered" g2="quotesingle" k="46" /> +<hkern g1="registered" g2="parenright" k="40" /> +<hkern g1="registered" g2="asterisk" k="46" /> +<hkern g1="registered" g2="comma" k="56" /> +<hkern g1="registered" g2="period" k="56" /> +<hkern g1="registered" g2="slash" k="42" /> +<hkern g1="registered" g2="A" k="42" /> +<hkern g1="registered" g2="T" k="98" /> +<hkern g1="registered" g2="V" k="52" /> +<hkern g1="registered" g2="X" k="30" /> +<hkern g1="registered" g2="Y" k="80" /> +<hkern g1="registered" g2="Z" k="70" /> +<hkern g1="registered" g2="backslash" k="52" /> +<hkern g1="registered" g2="bracketright" k="40" /> +<hkern g1="registered" g2="braceright" k="40" /> +<hkern g1="registered" g2="ordfeminine" k="46" /> +<hkern g1="registered" g2="degree" k="46" /> +<hkern g1="registered" g2="ordmasculine" k="46" /> +<hkern g1="registered" g2="Agrave" k="42" /> +<hkern g1="registered" g2="Aacute" k="42" /> +<hkern g1="registered" g2="Acircumflex" k="42" /> +<hkern g1="registered" g2="Atilde" k="42" /> +<hkern g1="registered" g2="Adieresis" k="42" /> +<hkern g1="registered" g2="Aring" k="42" /> +<hkern g1="registered" g2="AE" k="42" /> +<hkern g1="registered" g2="Yacute" k="80" /> +<hkern g1="registered" g2="quoteleft" k="46" /> +<hkern g1="registered" g2="quoteright" k="46" /> +<hkern g1="registered" g2="quotesinglbase" k="56" /> +<hkern g1="registered" g2="quotedblleft" k="46" /> +<hkern g1="registered" g2="quotedblright" k="46" /> +<hkern g1="registered" g2="quotedblbase" k="56" /> +<hkern g1="degree" g2="ampersand" k="182" /> +<hkern g1="degree" g2="comma" k="228" /> +<hkern g1="degree" g2="hyphen" k="178" /> +<hkern g1="degree" g2="period" k="228" /> +<hkern g1="degree" g2="slash" k="182" /> +<hkern g1="degree" g2="at" k="46" /> +<hkern g1="degree" g2="A" k="182" /> +<hkern g1="degree" g2="C" k="46" /> +<hkern g1="degree" g2="G" k="46" /> +<hkern g1="degree" g2="O" k="46" /> +<hkern g1="degree" g2="Q" k="46" /> +<hkern g1="degree" g2="V" k="-48" /> +<hkern g1="degree" g2="W" k="-48" /> +<hkern g1="degree" g2="Y" k="-30" /> +<hkern g1="degree" g2="backslash" k="-48" /> +<hkern g1="degree" g2="a" k="64" /> +<hkern g1="degree" g2="c" k="92" /> +<hkern g1="degree" g2="d" k="92" /> +<hkern g1="degree" g2="e" k="92" /> +<hkern g1="degree" g2="o" k="92" /> +<hkern g1="degree" g2="q" k="92" /> +<hkern g1="degree" g2="guillemotleft" k="178" /> +<hkern g1="degree" g2="uni00AD" k="178" /> +<hkern g1="degree" g2="middot" k="178" /> +<hkern g1="degree" g2="guillemotright" k="178" /> +<hkern g1="degree" g2="Agrave" k="182" /> +<hkern g1="degree" g2="Aacute" k="182" /> +<hkern g1="degree" g2="Acircumflex" k="182" /> +<hkern g1="degree" g2="Atilde" k="182" /> +<hkern g1="degree" g2="Adieresis" k="182" /> +<hkern g1="degree" g2="Aring" k="182" /> +<hkern g1="degree" g2="AE" k="182" /> +<hkern g1="degree" g2="Ccedilla" k="46" /> +<hkern g1="degree" g2="Ograve" k="46" /> +<hkern g1="degree" g2="Oacute" k="46" /> +<hkern g1="degree" g2="Ocircumflex" k="46" /> +<hkern g1="degree" g2="Otilde" k="46" /> +<hkern g1="degree" g2="Odieresis" k="46" /> +<hkern g1="degree" g2="Oslash" k="46" /> +<hkern g1="degree" g2="Yacute" k="-30" /> +<hkern g1="degree" g2="agrave" k="64" /> +<hkern g1="degree" g2="aacute" k="64" /> +<hkern g1="degree" g2="acircumflex" k="64" /> +<hkern g1="degree" g2="atilde" k="64" /> +<hkern g1="degree" g2="adieresis" k="64" /> +<hkern g1="degree" g2="aring" k="64" /> +<hkern g1="degree" g2="ae" k="64" /> +<hkern g1="degree" g2="ccedilla" k="92" /> +<hkern g1="degree" g2="egrave" k="92" /> +<hkern g1="degree" g2="eacute" k="92" /> +<hkern g1="degree" g2="ecircumflex" k="92" /> +<hkern g1="degree" g2="edieresis" k="92" /> +<hkern g1="degree" g2="eth" k="92" /> +<hkern g1="degree" g2="ograve" k="92" /> +<hkern g1="degree" g2="oacute" k="92" /> +<hkern g1="degree" g2="ocircumflex" k="92" /> +<hkern g1="degree" g2="otilde" k="92" /> +<hkern g1="degree" g2="odieresis" k="92" /> +<hkern g1="degree" g2="oslash" k="92" /> +<hkern g1="degree" g2="OE" k="46" /> +<hkern g1="degree" g2="oe" k="92" /> +<hkern g1="degree" g2="endash" k="178" /> +<hkern g1="degree" g2="emdash" k="178" /> +<hkern g1="degree" g2="quotesinglbase" k="228" /> +<hkern g1="degree" g2="quotedblbase" k="228" /> +<hkern g1="degree" g2="bullet" k="178" /> +<hkern g1="degree" g2="guilsinglleft" k="178" /> +<hkern g1="degree" g2="guilsinglright" k="178" /> +<hkern g1="twosuperior" g2="ampersand" k="184" /> +<hkern g1="twosuperior" g2="slash" k="184" /> +<hkern g1="twosuperior" g2="A" k="184" /> +<hkern g1="twosuperior" g2="V" k="-58" /> +<hkern g1="twosuperior" g2="W" k="-58" /> +<hkern g1="twosuperior" g2="Y" k="-40" /> +<hkern g1="twosuperior" g2="backslash" k="-58" /> +<hkern g1="twosuperior" g2="Agrave" k="184" /> +<hkern g1="twosuperior" g2="Aacute" k="184" /> +<hkern g1="twosuperior" g2="Acircumflex" k="184" /> +<hkern g1="twosuperior" g2="Atilde" k="184" /> +<hkern g1="twosuperior" g2="Adieresis" k="184" /> +<hkern g1="twosuperior" g2="Aring" k="184" /> +<hkern g1="twosuperior" g2="AE" k="184" /> +<hkern g1="twosuperior" g2="Yacute" k="-40" /> +<hkern g1="threesuperior" g2="ampersand" k="184" /> +<hkern g1="threesuperior" g2="slash" k="184" /> +<hkern g1="threesuperior" g2="A" k="184" /> +<hkern g1="threesuperior" g2="V" k="-58" /> +<hkern g1="threesuperior" g2="W" k="-58" /> +<hkern g1="threesuperior" g2="Y" k="-40" /> +<hkern g1="threesuperior" g2="backslash" k="-58" /> +<hkern g1="threesuperior" g2="Agrave" k="184" /> +<hkern g1="threesuperior" g2="Aacute" k="184" /> +<hkern g1="threesuperior" g2="Acircumflex" k="184" /> +<hkern g1="threesuperior" g2="Atilde" k="184" /> +<hkern g1="threesuperior" g2="Adieresis" k="184" /> +<hkern g1="threesuperior" g2="Aring" k="184" /> +<hkern g1="threesuperior" g2="AE" k="184" /> +<hkern g1="threesuperior" g2="Yacute" k="-40" /> +<hkern g1="middot" g2="quotedbl" k="178" /> +<hkern g1="middot" g2="ampersand" k="52" /> +<hkern g1="middot" g2="quotesingle" k="178" /> +<hkern g1="middot" g2="asterisk" k="178" /> +<hkern g1="middot" g2="comma" k="136" /> +<hkern g1="middot" g2="period" k="136" /> +<hkern g1="middot" g2="slash" k="52" /> +<hkern g1="middot" g2="A" k="52" /> +<hkern g1="middot" g2="T" k="180" /> +<hkern g1="middot" g2="V" k="112" /> +<hkern g1="middot" g2="W" k="32" /> +<hkern g1="middot" g2="X" k="62" /> +<hkern g1="middot" g2="Y" k="160" /> +<hkern g1="middot" g2="Z" k="46" /> +<hkern g1="middot" g2="backslash" k="112" /> +<hkern g1="middot" g2="ordfeminine" k="178" /> +<hkern g1="middot" g2="degree" k="178" /> +<hkern g1="middot" g2="ordmasculine" k="178" /> +<hkern g1="middot" g2="Agrave" k="52" /> +<hkern g1="middot" g2="Aacute" k="52" /> +<hkern g1="middot" g2="Acircumflex" k="52" /> +<hkern g1="middot" g2="Atilde" k="52" /> +<hkern g1="middot" g2="Adieresis" k="52" /> +<hkern g1="middot" g2="Aring" k="52" /> +<hkern g1="middot" g2="AE" k="52" /> +<hkern g1="middot" g2="Yacute" k="160" /> +<hkern g1="middot" g2="quoteleft" k="178" /> +<hkern g1="middot" g2="quoteright" k="178" /> +<hkern g1="middot" g2="quotesinglbase" k="136" /> +<hkern g1="middot" g2="quotedblleft" k="178" /> +<hkern g1="middot" g2="quotedblright" k="178" /> +<hkern g1="middot" g2="quotedblbase" k="136" /> +<hkern g1="onesuperior" g2="ampersand" k="184" /> +<hkern g1="onesuperior" g2="slash" k="184" /> +<hkern g1="onesuperior" g2="A" k="184" /> +<hkern g1="onesuperior" g2="V" k="-58" /> +<hkern g1="onesuperior" g2="W" k="-58" /> +<hkern g1="onesuperior" g2="Y" k="-40" /> +<hkern g1="onesuperior" g2="backslash" k="-58" /> +<hkern g1="onesuperior" g2="Agrave" k="184" /> +<hkern g1="onesuperior" g2="Aacute" k="184" /> +<hkern g1="onesuperior" g2="Acircumflex" k="184" /> +<hkern g1="onesuperior" g2="Atilde" k="184" /> +<hkern g1="onesuperior" g2="Adieresis" k="184" /> +<hkern g1="onesuperior" g2="Aring" k="184" /> +<hkern g1="onesuperior" g2="AE" k="184" /> +<hkern g1="onesuperior" g2="Yacute" k="-40" /> +<hkern g1="ordmasculine" g2="ampersand" k="182" /> +<hkern g1="ordmasculine" g2="comma" k="228" /> +<hkern g1="ordmasculine" g2="hyphen" k="178" /> +<hkern g1="ordmasculine" g2="period" k="228" /> +<hkern g1="ordmasculine" g2="slash" k="182" /> +<hkern g1="ordmasculine" g2="at" k="46" /> +<hkern g1="ordmasculine" g2="A" k="182" /> +<hkern g1="ordmasculine" g2="C" k="46" /> +<hkern g1="ordmasculine" g2="G" k="46" /> +<hkern g1="ordmasculine" g2="O" k="46" /> +<hkern g1="ordmasculine" g2="Q" k="46" /> +<hkern g1="ordmasculine" g2="V" k="-48" /> +<hkern g1="ordmasculine" g2="W" k="-48" /> +<hkern g1="ordmasculine" g2="Y" k="-30" /> +<hkern g1="ordmasculine" g2="backslash" k="-48" /> +<hkern g1="ordmasculine" g2="a" k="64" /> +<hkern g1="ordmasculine" g2="c" k="92" /> +<hkern g1="ordmasculine" g2="d" k="92" /> +<hkern g1="ordmasculine" g2="e" k="92" /> +<hkern g1="ordmasculine" g2="o" k="92" /> +<hkern g1="ordmasculine" g2="q" k="92" /> +<hkern g1="ordmasculine" g2="guillemotleft" k="178" /> +<hkern g1="ordmasculine" g2="uni00AD" k="178" /> +<hkern g1="ordmasculine" g2="middot" k="178" /> +<hkern g1="ordmasculine" g2="guillemotright" k="178" /> +<hkern g1="ordmasculine" g2="Agrave" k="182" /> +<hkern g1="ordmasculine" g2="Aacute" k="182" /> +<hkern g1="ordmasculine" g2="Acircumflex" k="182" /> +<hkern g1="ordmasculine" g2="Atilde" k="182" /> +<hkern g1="ordmasculine" g2="Adieresis" k="182" /> +<hkern g1="ordmasculine" g2="Aring" k="182" /> +<hkern g1="ordmasculine" g2="AE" k="182" /> +<hkern g1="ordmasculine" g2="Ccedilla" k="46" /> +<hkern g1="ordmasculine" g2="Ograve" k="46" /> +<hkern g1="ordmasculine" g2="Oacute" k="46" /> +<hkern g1="ordmasculine" g2="Ocircumflex" k="46" /> +<hkern g1="ordmasculine" g2="Otilde" k="46" /> +<hkern g1="ordmasculine" g2="Odieresis" k="46" /> +<hkern g1="ordmasculine" g2="Oslash" k="46" /> +<hkern g1="ordmasculine" g2="Yacute" k="-30" /> +<hkern g1="ordmasculine" g2="agrave" k="64" /> +<hkern g1="ordmasculine" g2="aacute" k="64" /> +<hkern g1="ordmasculine" g2="acircumflex" k="64" /> +<hkern g1="ordmasculine" g2="atilde" k="64" /> +<hkern g1="ordmasculine" g2="adieresis" k="64" /> +<hkern g1="ordmasculine" g2="aring" k="64" /> +<hkern g1="ordmasculine" g2="ae" k="64" /> +<hkern g1="ordmasculine" g2="ccedilla" k="92" /> +<hkern g1="ordmasculine" g2="egrave" k="92" /> +<hkern g1="ordmasculine" g2="eacute" k="92" /> +<hkern g1="ordmasculine" g2="ecircumflex" k="92" /> +<hkern g1="ordmasculine" g2="edieresis" k="92" /> +<hkern g1="ordmasculine" g2="eth" k="92" /> +<hkern g1="ordmasculine" g2="ograve" k="92" /> +<hkern g1="ordmasculine" g2="oacute" k="92" /> +<hkern g1="ordmasculine" g2="ocircumflex" k="92" /> +<hkern g1="ordmasculine" g2="otilde" k="92" /> +<hkern g1="ordmasculine" g2="odieresis" k="92" /> +<hkern g1="ordmasculine" g2="oslash" k="92" /> +<hkern g1="ordmasculine" g2="OE" k="46" /> +<hkern g1="ordmasculine" g2="oe" k="92" /> +<hkern g1="ordmasculine" g2="endash" k="178" /> +<hkern g1="ordmasculine" g2="emdash" k="178" /> +<hkern g1="ordmasculine" g2="quotesinglbase" k="228" /> +<hkern g1="ordmasculine" g2="quotedblbase" k="228" /> +<hkern g1="ordmasculine" g2="bullet" k="178" /> +<hkern g1="ordmasculine" g2="guilsinglleft" k="178" /> +<hkern g1="ordmasculine" g2="guilsinglright" k="178" /> +<hkern g1="guillemotright" g2="quotedbl" k="178" /> +<hkern g1="guillemotright" g2="ampersand" k="52" /> +<hkern g1="guillemotright" g2="quotesingle" k="178" /> +<hkern g1="guillemotright" g2="asterisk" k="178" /> +<hkern g1="guillemotright" g2="comma" k="136" /> +<hkern g1="guillemotright" g2="period" k="136" /> +<hkern g1="guillemotright" g2="slash" k="52" /> +<hkern g1="guillemotright" g2="A" k="52" /> +<hkern g1="guillemotright" g2="T" k="180" /> +<hkern g1="guillemotright" g2="V" k="112" /> +<hkern g1="guillemotright" g2="W" k="32" /> +<hkern g1="guillemotright" g2="X" k="62" /> +<hkern g1="guillemotright" g2="Y" k="160" /> +<hkern g1="guillemotright" g2="Z" k="46" /> +<hkern g1="guillemotright" g2="backslash" k="112" /> +<hkern g1="guillemotright" g2="ordfeminine" k="178" /> +<hkern g1="guillemotright" g2="degree" k="178" /> +<hkern g1="guillemotright" g2="ordmasculine" k="178" /> +<hkern g1="guillemotright" g2="Agrave" k="52" /> +<hkern g1="guillemotright" g2="Aacute" k="52" /> +<hkern g1="guillemotright" g2="Acircumflex" k="52" /> +<hkern g1="guillemotright" g2="Atilde" k="52" /> +<hkern g1="guillemotright" g2="Adieresis" k="52" /> +<hkern g1="guillemotright" g2="Aring" k="52" /> +<hkern g1="guillemotright" g2="AE" k="52" /> +<hkern g1="guillemotright" g2="Yacute" k="160" /> +<hkern g1="guillemotright" g2="quoteleft" k="178" /> +<hkern g1="guillemotright" g2="quoteright" k="178" /> +<hkern g1="guillemotright" g2="quotesinglbase" k="136" /> +<hkern g1="guillemotright" g2="quotedblleft" k="178" /> +<hkern g1="guillemotright" g2="quotedblright" k="178" /> +<hkern g1="guillemotright" g2="quotedblbase" k="136" /> +<hkern g1="Agrave" g2="quotedbl" k="182" /> +<hkern g1="Agrave" g2="quotesingle" k="182" /> +<hkern g1="Agrave" g2="asterisk" k="182" /> +<hkern g1="Agrave" g2="hyphen" k="52" /> +<hkern g1="Agrave" g2="question" k="56" /> +<hkern g1="Agrave" g2="at" k="42" /> +<hkern g1="Agrave" g2="C" k="42" /> +<hkern g1="Agrave" g2="G" k="42" /> +<hkern g1="Agrave" g2="J" k="-50" /> +<hkern g1="Agrave" g2="O" k="42" /> +<hkern g1="Agrave" g2="Q" k="42" /> +<hkern g1="Agrave" g2="T" k="132" /> +<hkern g1="Agrave" g2="U" k="56" /> +<hkern g1="Agrave" g2="V" k="136" /> +<hkern g1="Agrave" g2="W" k="84" /> +<hkern g1="Agrave" g2="Y" k="164" /> +<hkern g1="Agrave" g2="backslash" k="136" /> +<hkern g1="Agrave" g2="v" k="82" /> +<hkern g1="Agrave" g2="y" k="82" /> +<hkern g1="Agrave" g2="ordfeminine" k="182" /> +<hkern g1="Agrave" g2="guillemotleft" k="52" /> +<hkern g1="Agrave" g2="uni00AD" k="52" /> +<hkern g1="Agrave" g2="degree" k="182" /> +<hkern g1="Agrave" g2="twosuperior" k="184" /> +<hkern g1="Agrave" g2="threesuperior" k="184" /> +<hkern g1="Agrave" g2="middot" k="52" /> +<hkern g1="Agrave" g2="onesuperior" k="184" /> +<hkern g1="Agrave" g2="ordmasculine" k="182" /> +<hkern g1="Agrave" g2="guillemotright" k="52" /> +<hkern g1="Agrave" g2="Ccedilla" k="42" /> +<hkern g1="Agrave" g2="Ograve" k="42" /> +<hkern g1="Agrave" g2="Oacute" k="42" /> +<hkern g1="Agrave" g2="Ocircumflex" k="42" /> +<hkern g1="Agrave" g2="Otilde" k="42" /> +<hkern g1="Agrave" g2="Odieresis" k="42" /> +<hkern g1="Agrave" g2="Oslash" k="42" /> +<hkern g1="Agrave" g2="Ugrave" k="56" /> +<hkern g1="Agrave" g2="Uacute" k="56" /> +<hkern g1="Agrave" g2="Ucircumflex" k="56" /> +<hkern g1="Agrave" g2="Udieresis" k="56" /> +<hkern g1="Agrave" g2="Yacute" k="164" /> +<hkern g1="Agrave" g2="OE" k="42" /> +<hkern g1="Agrave" g2="endash" k="52" /> +<hkern g1="Agrave" g2="emdash" k="52" /> +<hkern g1="Agrave" g2="quoteleft" k="182" /> +<hkern g1="Agrave" g2="quoteright" k="182" /> +<hkern g1="Agrave" g2="quotedblleft" k="182" /> +<hkern g1="Agrave" g2="quotedblright" k="182" /> +<hkern g1="Agrave" g2="bullet" k="52" /> +<hkern g1="Agrave" g2="guilsinglleft" k="52" /> +<hkern g1="Agrave" g2="guilsinglright" k="52" /> +<hkern g1="Aacute" g2="quotedbl" k="182" /> +<hkern g1="Aacute" g2="quotesingle" k="182" /> +<hkern g1="Aacute" g2="asterisk" k="182" /> +<hkern g1="Aacute" g2="hyphen" k="52" /> +<hkern g1="Aacute" g2="question" k="56" /> +<hkern g1="Aacute" g2="at" k="42" /> +<hkern g1="Aacute" g2="C" k="42" /> +<hkern g1="Aacute" g2="G" k="42" /> +<hkern g1="Aacute" g2="J" k="-50" /> +<hkern g1="Aacute" g2="O" k="42" /> +<hkern g1="Aacute" g2="Q" k="42" /> +<hkern g1="Aacute" g2="T" k="132" /> +<hkern g1="Aacute" g2="U" k="56" /> +<hkern g1="Aacute" g2="V" k="136" /> +<hkern g1="Aacute" g2="W" k="84" /> +<hkern g1="Aacute" g2="Y" k="164" /> +<hkern g1="Aacute" g2="backslash" k="136" /> +<hkern g1="Aacute" g2="v" k="82" /> +<hkern g1="Aacute" g2="y" k="82" /> +<hkern g1="Aacute" g2="ordfeminine" k="182" /> +<hkern g1="Aacute" g2="guillemotleft" k="52" /> +<hkern g1="Aacute" g2="uni00AD" k="52" /> +<hkern g1="Aacute" g2="degree" k="182" /> +<hkern g1="Aacute" g2="twosuperior" k="184" /> +<hkern g1="Aacute" g2="threesuperior" k="184" /> +<hkern g1="Aacute" g2="middot" k="52" /> +<hkern g1="Aacute" g2="onesuperior" k="184" /> +<hkern g1="Aacute" g2="ordmasculine" k="182" /> +<hkern g1="Aacute" g2="guillemotright" k="52" /> +<hkern g1="Aacute" g2="Ccedilla" k="42" /> +<hkern g1="Aacute" g2="Ograve" k="42" /> +<hkern g1="Aacute" g2="Oacute" k="42" /> +<hkern g1="Aacute" g2="Ocircumflex" k="42" /> +<hkern g1="Aacute" g2="Otilde" k="42" /> +<hkern g1="Aacute" g2="Odieresis" k="42" /> +<hkern g1="Aacute" g2="Oslash" k="42" /> +<hkern g1="Aacute" g2="Ugrave" k="56" /> +<hkern g1="Aacute" g2="Uacute" k="56" /> +<hkern g1="Aacute" g2="Ucircumflex" k="56" /> +<hkern g1="Aacute" g2="Udieresis" k="56" /> +<hkern g1="Aacute" g2="Yacute" k="164" /> +<hkern g1="Aacute" g2="OE" k="42" /> +<hkern g1="Aacute" g2="endash" k="52" /> +<hkern g1="Aacute" g2="emdash" k="52" /> +<hkern g1="Aacute" g2="quoteleft" k="182" /> +<hkern g1="Aacute" g2="quoteright" k="182" /> +<hkern g1="Aacute" g2="quotedblleft" k="182" /> +<hkern g1="Aacute" g2="quotedblright" k="182" /> +<hkern g1="Aacute" g2="bullet" k="52" /> +<hkern g1="Aacute" g2="guilsinglleft" k="52" /> +<hkern g1="Aacute" g2="guilsinglright" k="52" /> +<hkern g1="Acircumflex" g2="quotedbl" k="182" /> +<hkern g1="Acircumflex" g2="quotesingle" k="182" /> +<hkern g1="Acircumflex" g2="asterisk" k="182" /> +<hkern g1="Acircumflex" g2="hyphen" k="52" /> +<hkern g1="Acircumflex" g2="question" k="56" /> +<hkern g1="Acircumflex" g2="at" k="42" /> +<hkern g1="Acircumflex" g2="C" k="42" /> +<hkern g1="Acircumflex" g2="G" k="42" /> +<hkern g1="Acircumflex" g2="J" k="-50" /> +<hkern g1="Acircumflex" g2="O" k="42" /> +<hkern g1="Acircumflex" g2="Q" k="42" /> +<hkern g1="Acircumflex" g2="T" k="132" /> +<hkern g1="Acircumflex" g2="U" k="56" /> +<hkern g1="Acircumflex" g2="V" k="136" /> +<hkern g1="Acircumflex" g2="W" k="84" /> +<hkern g1="Acircumflex" g2="Y" k="164" /> +<hkern g1="Acircumflex" g2="backslash" k="136" /> +<hkern g1="Acircumflex" g2="v" k="82" /> +<hkern g1="Acircumflex" g2="y" k="82" /> +<hkern g1="Acircumflex" g2="ordfeminine" k="182" /> +<hkern g1="Acircumflex" g2="guillemotleft" k="52" /> +<hkern g1="Acircumflex" g2="uni00AD" k="52" /> +<hkern g1="Acircumflex" g2="degree" k="182" /> +<hkern g1="Acircumflex" g2="twosuperior" k="184" /> +<hkern g1="Acircumflex" g2="threesuperior" k="184" /> +<hkern g1="Acircumflex" g2="middot" k="52" /> +<hkern g1="Acircumflex" g2="onesuperior" k="184" /> +<hkern g1="Acircumflex" g2="ordmasculine" k="182" /> +<hkern g1="Acircumflex" g2="guillemotright" k="52" /> +<hkern g1="Acircumflex" g2="Ccedilla" k="42" /> +<hkern g1="Acircumflex" g2="Ograve" k="42" /> +<hkern g1="Acircumflex" g2="Oacute" k="42" /> +<hkern g1="Acircumflex" g2="Ocircumflex" k="42" /> +<hkern g1="Acircumflex" g2="Otilde" k="42" /> +<hkern g1="Acircumflex" g2="Odieresis" k="42" /> +<hkern g1="Acircumflex" g2="Oslash" k="42" /> +<hkern g1="Acircumflex" g2="Ugrave" k="56" /> +<hkern g1="Acircumflex" g2="Uacute" k="56" /> +<hkern g1="Acircumflex" g2="Ucircumflex" k="56" /> +<hkern g1="Acircumflex" g2="Udieresis" k="56" /> +<hkern g1="Acircumflex" g2="Yacute" k="164" /> +<hkern g1="Acircumflex" g2="OE" k="42" /> +<hkern g1="Acircumflex" g2="endash" k="52" /> +<hkern g1="Acircumflex" g2="emdash" k="52" /> +<hkern g1="Acircumflex" g2="quoteleft" k="182" /> +<hkern g1="Acircumflex" g2="quoteright" k="182" /> +<hkern g1="Acircumflex" g2="quotedblleft" k="182" /> +<hkern g1="Acircumflex" g2="quotedblright" k="182" /> +<hkern g1="Acircumflex" g2="bullet" k="52" /> +<hkern g1="Acircumflex" g2="guilsinglleft" k="52" /> +<hkern g1="Acircumflex" g2="guilsinglright" k="52" /> +<hkern g1="Atilde" g2="quotedbl" k="182" /> +<hkern g1="Atilde" g2="quotesingle" k="182" /> +<hkern g1="Atilde" g2="asterisk" k="182" /> +<hkern g1="Atilde" g2="hyphen" k="52" /> +<hkern g1="Atilde" g2="question" k="56" /> +<hkern g1="Atilde" g2="at" k="42" /> +<hkern g1="Atilde" g2="C" k="42" /> +<hkern g1="Atilde" g2="G" k="42" /> +<hkern g1="Atilde" g2="J" k="-50" /> +<hkern g1="Atilde" g2="O" k="42" /> +<hkern g1="Atilde" g2="Q" k="42" /> +<hkern g1="Atilde" g2="T" k="132" /> +<hkern g1="Atilde" g2="U" k="56" /> +<hkern g1="Atilde" g2="V" k="136" /> +<hkern g1="Atilde" g2="W" k="84" /> +<hkern g1="Atilde" g2="Y" k="164" /> +<hkern g1="Atilde" g2="backslash" k="136" /> +<hkern g1="Atilde" g2="v" k="82" /> +<hkern g1="Atilde" g2="y" k="82" /> +<hkern g1="Atilde" g2="ordfeminine" k="182" /> +<hkern g1="Atilde" g2="guillemotleft" k="52" /> +<hkern g1="Atilde" g2="uni00AD" k="52" /> +<hkern g1="Atilde" g2="degree" k="182" /> +<hkern g1="Atilde" g2="twosuperior" k="184" /> +<hkern g1="Atilde" g2="threesuperior" k="184" /> +<hkern g1="Atilde" g2="middot" k="52" /> +<hkern g1="Atilde" g2="onesuperior" k="184" /> +<hkern g1="Atilde" g2="ordmasculine" k="182" /> +<hkern g1="Atilde" g2="guillemotright" k="52" /> +<hkern g1="Atilde" g2="Ccedilla" k="42" /> +<hkern g1="Atilde" g2="Ograve" k="42" /> +<hkern g1="Atilde" g2="Oacute" k="42" /> +<hkern g1="Atilde" g2="Ocircumflex" k="42" /> +<hkern g1="Atilde" g2="Otilde" k="42" /> +<hkern g1="Atilde" g2="Odieresis" k="42" /> +<hkern g1="Atilde" g2="Oslash" k="42" /> +<hkern g1="Atilde" g2="Ugrave" k="56" /> +<hkern g1="Atilde" g2="Uacute" k="56" /> +<hkern g1="Atilde" g2="Ucircumflex" k="56" /> +<hkern g1="Atilde" g2="Udieresis" k="56" /> +<hkern g1="Atilde" g2="Yacute" k="164" /> +<hkern g1="Atilde" g2="OE" k="42" /> +<hkern g1="Atilde" g2="endash" k="52" /> +<hkern g1="Atilde" g2="emdash" k="52" /> +<hkern g1="Atilde" g2="quoteleft" k="182" /> +<hkern g1="Atilde" g2="quoteright" k="182" /> +<hkern g1="Atilde" g2="quotedblleft" k="182" /> +<hkern g1="Atilde" g2="quotedblright" k="182" /> +<hkern g1="Atilde" g2="bullet" k="52" /> +<hkern g1="Atilde" g2="guilsinglleft" k="52" /> +<hkern g1="Atilde" g2="guilsinglright" k="52" /> +<hkern g1="Adieresis" g2="quotedbl" k="182" /> +<hkern g1="Adieresis" g2="quotesingle" k="182" /> +<hkern g1="Adieresis" g2="asterisk" k="182" /> +<hkern g1="Adieresis" g2="hyphen" k="52" /> +<hkern g1="Adieresis" g2="question" k="56" /> +<hkern g1="Adieresis" g2="at" k="42" /> +<hkern g1="Adieresis" g2="C" k="42" /> +<hkern g1="Adieresis" g2="G" k="42" /> +<hkern g1="Adieresis" g2="J" k="-50" /> +<hkern g1="Adieresis" g2="O" k="42" /> +<hkern g1="Adieresis" g2="Q" k="42" /> +<hkern g1="Adieresis" g2="T" k="132" /> +<hkern g1="Adieresis" g2="U" k="56" /> +<hkern g1="Adieresis" g2="V" k="136" /> +<hkern g1="Adieresis" g2="W" k="84" /> +<hkern g1="Adieresis" g2="Y" k="164" /> +<hkern g1="Adieresis" g2="backslash" k="136" /> +<hkern g1="Adieresis" g2="v" k="82" /> +<hkern g1="Adieresis" g2="y" k="82" /> +<hkern g1="Adieresis" g2="ordfeminine" k="182" /> +<hkern g1="Adieresis" g2="guillemotleft" k="52" /> +<hkern g1="Adieresis" g2="uni00AD" k="52" /> +<hkern g1="Adieresis" g2="degree" k="182" /> +<hkern g1="Adieresis" g2="twosuperior" k="184" /> +<hkern g1="Adieresis" g2="threesuperior" k="184" /> +<hkern g1="Adieresis" g2="middot" k="52" /> +<hkern g1="Adieresis" g2="onesuperior" k="184" /> +<hkern g1="Adieresis" g2="ordmasculine" k="182" /> +<hkern g1="Adieresis" g2="guillemotright" k="52" /> +<hkern g1="Adieresis" g2="Ccedilla" k="42" /> +<hkern g1="Adieresis" g2="Ograve" k="42" /> +<hkern g1="Adieresis" g2="Oacute" k="42" /> +<hkern g1="Adieresis" g2="Ocircumflex" k="42" /> +<hkern g1="Adieresis" g2="Otilde" k="42" /> +<hkern g1="Adieresis" g2="Odieresis" k="42" /> +<hkern g1="Adieresis" g2="Oslash" k="42" /> +<hkern g1="Adieresis" g2="Ugrave" k="56" /> +<hkern g1="Adieresis" g2="Uacute" k="56" /> +<hkern g1="Adieresis" g2="Ucircumflex" k="56" /> +<hkern g1="Adieresis" g2="Udieresis" k="56" /> +<hkern g1="Adieresis" g2="Yacute" k="164" /> +<hkern g1="Adieresis" g2="OE" k="42" /> +<hkern g1="Adieresis" g2="endash" k="52" /> +<hkern g1="Adieresis" g2="emdash" k="52" /> +<hkern g1="Adieresis" g2="quoteleft" k="182" /> +<hkern g1="Adieresis" g2="quoteright" k="182" /> +<hkern g1="Adieresis" g2="quotedblleft" k="182" /> +<hkern g1="Adieresis" g2="quotedblright" k="182" /> +<hkern g1="Adieresis" g2="bullet" k="52" /> +<hkern g1="Adieresis" g2="guilsinglleft" k="52" /> +<hkern g1="Adieresis" g2="guilsinglright" k="52" /> +<hkern g1="Aring" g2="quotedbl" k="182" /> +<hkern g1="Aring" g2="quotesingle" k="182" /> +<hkern g1="Aring" g2="asterisk" k="182" /> +<hkern g1="Aring" g2="hyphen" k="52" /> +<hkern g1="Aring" g2="question" k="56" /> +<hkern g1="Aring" g2="at" k="42" /> +<hkern g1="Aring" g2="C" k="42" /> +<hkern g1="Aring" g2="G" k="42" /> +<hkern g1="Aring" g2="J" k="-50" /> +<hkern g1="Aring" g2="O" k="42" /> +<hkern g1="Aring" g2="Q" k="42" /> +<hkern g1="Aring" g2="T" k="132" /> +<hkern g1="Aring" g2="U" k="56" /> +<hkern g1="Aring" g2="V" k="136" /> +<hkern g1="Aring" g2="W" k="84" /> +<hkern g1="Aring" g2="Y" k="164" /> +<hkern g1="Aring" g2="backslash" k="136" /> +<hkern g1="Aring" g2="v" k="82" /> +<hkern g1="Aring" g2="y" k="82" /> +<hkern g1="Aring" g2="ordfeminine" k="182" /> +<hkern g1="Aring" g2="guillemotleft" k="52" /> +<hkern g1="Aring" g2="uni00AD" k="52" /> +<hkern g1="Aring" g2="degree" k="182" /> +<hkern g1="Aring" g2="twosuperior" k="184" /> +<hkern g1="Aring" g2="threesuperior" k="184" /> +<hkern g1="Aring" g2="middot" k="52" /> +<hkern g1="Aring" g2="onesuperior" k="184" /> +<hkern g1="Aring" g2="ordmasculine" k="182" /> +<hkern g1="Aring" g2="guillemotright" k="52" /> +<hkern g1="Aring" g2="Ccedilla" k="42" /> +<hkern g1="Aring" g2="Ograve" k="42" /> +<hkern g1="Aring" g2="Oacute" k="42" /> +<hkern g1="Aring" g2="Ocircumflex" k="42" /> +<hkern g1="Aring" g2="Otilde" k="42" /> +<hkern g1="Aring" g2="Odieresis" k="42" /> +<hkern g1="Aring" g2="Oslash" k="42" /> +<hkern g1="Aring" g2="Ugrave" k="56" /> +<hkern g1="Aring" g2="Uacute" k="56" /> +<hkern g1="Aring" g2="Ucircumflex" k="56" /> +<hkern g1="Aring" g2="Udieresis" k="56" /> +<hkern g1="Aring" g2="Yacute" k="164" /> +<hkern g1="Aring" g2="OE" k="42" /> +<hkern g1="Aring" g2="endash" k="52" /> +<hkern g1="Aring" g2="emdash" k="52" /> +<hkern g1="Aring" g2="quoteleft" k="182" /> +<hkern g1="Aring" g2="quoteright" k="182" /> +<hkern g1="Aring" g2="quotedblleft" k="182" /> +<hkern g1="Aring" g2="quotedblright" k="182" /> +<hkern g1="Aring" g2="bullet" k="52" /> +<hkern g1="Aring" g2="guilsinglleft" k="52" /> +<hkern g1="Aring" g2="guilsinglright" k="52" /> +<hkern g1="Ccedilla" g2="hyphen" k="150" /> +<hkern g1="Ccedilla" g2="guillemotleft" k="150" /> +<hkern g1="Ccedilla" g2="uni00AD" k="150" /> +<hkern g1="Ccedilla" g2="middot" k="150" /> +<hkern g1="Ccedilla" g2="guillemotright" k="150" /> +<hkern g1="Ccedilla" g2="endash" k="150" /> +<hkern g1="Ccedilla" g2="emdash" k="150" /> +<hkern g1="Ccedilla" g2="bullet" k="150" /> +<hkern g1="Ccedilla" g2="guilsinglleft" k="150" /> +<hkern g1="Ccedilla" g2="guilsinglright" k="150" /> +<hkern g1="Eth" g2="quotedbl" k="46" /> +<hkern g1="Eth" g2="ampersand" k="42" /> +<hkern g1="Eth" g2="quotesingle" k="46" /> +<hkern g1="Eth" g2="parenright" k="40" /> +<hkern g1="Eth" g2="asterisk" k="46" /> +<hkern g1="Eth" g2="comma" k="56" /> +<hkern g1="Eth" g2="period" k="56" /> +<hkern g1="Eth" g2="slash" k="42" /> +<hkern g1="Eth" g2="A" k="42" /> +<hkern g1="Eth" g2="T" k="98" /> +<hkern g1="Eth" g2="V" k="52" /> +<hkern g1="Eth" g2="X" k="30" /> +<hkern g1="Eth" g2="Y" k="80" /> +<hkern g1="Eth" g2="Z" k="70" /> +<hkern g1="Eth" g2="backslash" k="52" /> +<hkern g1="Eth" g2="bracketright" k="40" /> +<hkern g1="Eth" g2="braceright" k="40" /> +<hkern g1="Eth" g2="ordfeminine" k="46" /> +<hkern g1="Eth" g2="degree" k="46" /> +<hkern g1="Eth" g2="ordmasculine" k="46" /> +<hkern g1="Eth" g2="Agrave" k="42" /> +<hkern g1="Eth" g2="Aacute" k="42" /> +<hkern g1="Eth" g2="Acircumflex" k="42" /> +<hkern g1="Eth" g2="Atilde" k="42" /> +<hkern g1="Eth" g2="Adieresis" k="42" /> +<hkern g1="Eth" g2="Aring" k="42" /> +<hkern g1="Eth" g2="AE" k="42" /> +<hkern g1="Eth" g2="Yacute" k="80" /> +<hkern g1="Eth" g2="quoteleft" k="46" /> +<hkern g1="Eth" g2="quoteright" k="46" /> +<hkern g1="Eth" g2="quotesinglbase" k="56" /> +<hkern g1="Eth" g2="quotedblleft" k="46" /> +<hkern g1="Eth" g2="quotedblright" k="46" /> +<hkern g1="Eth" g2="quotedblbase" k="56" /> +<hkern g1="Ograve" g2="quotedbl" k="46" /> +<hkern g1="Ograve" g2="ampersand" k="42" /> +<hkern g1="Ograve" g2="quotesingle" k="46" /> +<hkern g1="Ograve" g2="parenright" k="40" /> +<hkern g1="Ograve" g2="asterisk" k="46" /> +<hkern g1="Ograve" g2="comma" k="56" /> +<hkern g1="Ograve" g2="period" k="56" /> +<hkern g1="Ograve" g2="slash" k="42" /> +<hkern g1="Ograve" g2="A" k="42" /> +<hkern g1="Ograve" g2="T" k="98" /> +<hkern g1="Ograve" g2="V" k="52" /> +<hkern g1="Ograve" g2="X" k="30" /> +<hkern g1="Ograve" g2="Y" k="80" /> +<hkern g1="Ograve" g2="Z" k="70" /> +<hkern g1="Ograve" g2="backslash" k="52" /> +<hkern g1="Ograve" g2="bracketright" k="40" /> +<hkern g1="Ograve" g2="braceright" k="40" /> +<hkern g1="Ograve" g2="ordfeminine" k="46" /> +<hkern g1="Ograve" g2="degree" k="46" /> +<hkern g1="Ograve" g2="ordmasculine" k="46" /> +<hkern g1="Ograve" g2="Agrave" k="42" /> +<hkern g1="Ograve" g2="Aacute" k="42" /> +<hkern g1="Ograve" g2="Acircumflex" k="42" /> +<hkern g1="Ograve" g2="Atilde" k="42" /> +<hkern g1="Ograve" g2="Adieresis" k="42" /> +<hkern g1="Ograve" g2="Aring" k="42" /> +<hkern g1="Ograve" g2="AE" k="42" /> +<hkern g1="Ograve" g2="Yacute" k="80" /> +<hkern g1="Ograve" g2="quoteleft" k="46" /> +<hkern g1="Ograve" g2="quoteright" k="46" /> +<hkern g1="Ograve" g2="quotesinglbase" k="56" /> +<hkern g1="Ograve" g2="quotedblleft" k="46" /> +<hkern g1="Ograve" g2="quotedblright" k="46" /> +<hkern g1="Ograve" g2="quotedblbase" k="56" /> +<hkern g1="Oacute" g2="quotedbl" k="46" /> +<hkern g1="Oacute" g2="ampersand" k="42" /> +<hkern g1="Oacute" g2="quotesingle" k="46" /> +<hkern g1="Oacute" g2="parenright" k="40" /> +<hkern g1="Oacute" g2="asterisk" k="46" /> +<hkern g1="Oacute" g2="comma" k="56" /> +<hkern g1="Oacute" g2="period" k="56" /> +<hkern g1="Oacute" g2="slash" k="42" /> +<hkern g1="Oacute" g2="A" k="42" /> +<hkern g1="Oacute" g2="T" k="98" /> +<hkern g1="Oacute" g2="V" k="52" /> +<hkern g1="Oacute" g2="X" k="30" /> +<hkern g1="Oacute" g2="Y" k="80" /> +<hkern g1="Oacute" g2="Z" k="70" /> +<hkern g1="Oacute" g2="backslash" k="52" /> +<hkern g1="Oacute" g2="bracketright" k="40" /> +<hkern g1="Oacute" g2="braceright" k="40" /> +<hkern g1="Oacute" g2="ordfeminine" k="46" /> +<hkern g1="Oacute" g2="degree" k="46" /> +<hkern g1="Oacute" g2="ordmasculine" k="46" /> +<hkern g1="Oacute" g2="Agrave" k="42" /> +<hkern g1="Oacute" g2="Aacute" k="42" /> +<hkern g1="Oacute" g2="Acircumflex" k="42" /> +<hkern g1="Oacute" g2="Atilde" k="42" /> +<hkern g1="Oacute" g2="Adieresis" k="42" /> +<hkern g1="Oacute" g2="Aring" k="42" /> +<hkern g1="Oacute" g2="AE" k="42" /> +<hkern g1="Oacute" g2="Yacute" k="80" /> +<hkern g1="Oacute" g2="quoteleft" k="46" /> +<hkern g1="Oacute" g2="quoteright" k="46" /> +<hkern g1="Oacute" g2="quotesinglbase" k="56" /> +<hkern g1="Oacute" g2="quotedblleft" k="46" /> +<hkern g1="Oacute" g2="quotedblright" k="46" /> +<hkern g1="Oacute" g2="quotedblbase" k="56" /> +<hkern g1="Ocircumflex" g2="quotedbl" k="46" /> +<hkern g1="Ocircumflex" g2="ampersand" k="42" /> +<hkern g1="Ocircumflex" g2="quotesingle" k="46" /> +<hkern g1="Ocircumflex" g2="parenright" k="40" /> +<hkern g1="Ocircumflex" g2="asterisk" k="46" /> +<hkern g1="Ocircumflex" g2="comma" k="56" /> +<hkern g1="Ocircumflex" g2="period" k="56" /> +<hkern g1="Ocircumflex" g2="slash" k="42" /> +<hkern g1="Ocircumflex" g2="A" k="42" /> +<hkern g1="Ocircumflex" g2="T" k="98" /> +<hkern g1="Ocircumflex" g2="V" k="52" /> +<hkern g1="Ocircumflex" g2="X" k="30" /> +<hkern g1="Ocircumflex" g2="Y" k="80" /> +<hkern g1="Ocircumflex" g2="Z" k="70" /> +<hkern g1="Ocircumflex" g2="backslash" k="52" /> +<hkern g1="Ocircumflex" g2="bracketright" k="40" /> +<hkern g1="Ocircumflex" g2="braceright" k="40" /> +<hkern g1="Ocircumflex" g2="ordfeminine" k="46" /> +<hkern g1="Ocircumflex" g2="degree" k="46" /> +<hkern g1="Ocircumflex" g2="ordmasculine" k="46" /> +<hkern g1="Ocircumflex" g2="Agrave" k="42" /> +<hkern g1="Ocircumflex" g2="Aacute" k="42" /> +<hkern g1="Ocircumflex" g2="Acircumflex" k="42" /> +<hkern g1="Ocircumflex" g2="Atilde" k="42" /> +<hkern g1="Ocircumflex" g2="Adieresis" k="42" /> +<hkern g1="Ocircumflex" g2="Aring" k="42" /> +<hkern g1="Ocircumflex" g2="AE" k="42" /> +<hkern g1="Ocircumflex" g2="Yacute" k="80" /> +<hkern g1="Ocircumflex" g2="quoteleft" k="46" /> +<hkern g1="Ocircumflex" g2="quoteright" k="46" /> +<hkern g1="Ocircumflex" g2="quotesinglbase" k="56" /> +<hkern g1="Ocircumflex" g2="quotedblleft" k="46" /> +<hkern g1="Ocircumflex" g2="quotedblright" k="46" /> +<hkern g1="Ocircumflex" g2="quotedblbase" k="56" /> +<hkern g1="Otilde" g2="quotedbl" k="46" /> +<hkern g1="Otilde" g2="ampersand" k="42" /> +<hkern g1="Otilde" g2="quotesingle" k="46" /> +<hkern g1="Otilde" g2="parenright" k="40" /> +<hkern g1="Otilde" g2="asterisk" k="46" /> +<hkern g1="Otilde" g2="comma" k="56" /> +<hkern g1="Otilde" g2="period" k="56" /> +<hkern g1="Otilde" g2="slash" k="42" /> +<hkern g1="Otilde" g2="A" k="42" /> +<hkern g1="Otilde" g2="T" k="98" /> +<hkern g1="Otilde" g2="V" k="52" /> +<hkern g1="Otilde" g2="X" k="30" /> +<hkern g1="Otilde" g2="Y" k="80" /> +<hkern g1="Otilde" g2="Z" k="70" /> +<hkern g1="Otilde" g2="backslash" k="52" /> +<hkern g1="Otilde" g2="bracketright" k="40" /> +<hkern g1="Otilde" g2="braceright" k="40" /> +<hkern g1="Otilde" g2="ordfeminine" k="46" /> +<hkern g1="Otilde" g2="degree" k="46" /> +<hkern g1="Otilde" g2="ordmasculine" k="46" /> +<hkern g1="Otilde" g2="Agrave" k="42" /> +<hkern g1="Otilde" g2="Aacute" k="42" /> +<hkern g1="Otilde" g2="Acircumflex" k="42" /> +<hkern g1="Otilde" g2="Atilde" k="42" /> +<hkern g1="Otilde" g2="Adieresis" k="42" /> +<hkern g1="Otilde" g2="Aring" k="42" /> +<hkern g1="Otilde" g2="AE" k="42" /> +<hkern g1="Otilde" g2="Yacute" k="80" /> +<hkern g1="Otilde" g2="quoteleft" k="46" /> +<hkern g1="Otilde" g2="quoteright" k="46" /> +<hkern g1="Otilde" g2="quotesinglbase" k="56" /> +<hkern g1="Otilde" g2="quotedblleft" k="46" /> +<hkern g1="Otilde" g2="quotedblright" k="46" /> +<hkern g1="Otilde" g2="quotedblbase" k="56" /> +<hkern g1="Odieresis" g2="quotedbl" k="46" /> +<hkern g1="Odieresis" g2="ampersand" k="42" /> +<hkern g1="Odieresis" g2="quotesingle" k="46" /> +<hkern g1="Odieresis" g2="parenright" k="40" /> +<hkern g1="Odieresis" g2="asterisk" k="46" /> +<hkern g1="Odieresis" g2="comma" k="56" /> +<hkern g1="Odieresis" g2="period" k="56" /> +<hkern g1="Odieresis" g2="slash" k="42" /> +<hkern g1="Odieresis" g2="A" k="42" /> +<hkern g1="Odieresis" g2="T" k="98" /> +<hkern g1="Odieresis" g2="V" k="52" /> +<hkern g1="Odieresis" g2="X" k="30" /> +<hkern g1="Odieresis" g2="Y" k="80" /> +<hkern g1="Odieresis" g2="Z" k="70" /> +<hkern g1="Odieresis" g2="backslash" k="52" /> +<hkern g1="Odieresis" g2="bracketright" k="40" /> +<hkern g1="Odieresis" g2="braceright" k="40" /> +<hkern g1="Odieresis" g2="ordfeminine" k="46" /> +<hkern g1="Odieresis" g2="degree" k="46" /> +<hkern g1="Odieresis" g2="ordmasculine" k="46" /> +<hkern g1="Odieresis" g2="Agrave" k="42" /> +<hkern g1="Odieresis" g2="Aacute" k="42" /> +<hkern g1="Odieresis" g2="Acircumflex" k="42" /> +<hkern g1="Odieresis" g2="Atilde" k="42" /> +<hkern g1="Odieresis" g2="Adieresis" k="42" /> +<hkern g1="Odieresis" g2="Aring" k="42" /> +<hkern g1="Odieresis" g2="AE" k="42" /> +<hkern g1="Odieresis" g2="Yacute" k="80" /> +<hkern g1="Odieresis" g2="quoteleft" k="46" /> +<hkern g1="Odieresis" g2="quoteright" k="46" /> +<hkern g1="Odieresis" g2="quotesinglbase" k="56" /> +<hkern g1="Odieresis" g2="quotedblleft" k="46" /> +<hkern g1="Odieresis" g2="quotedblright" k="46" /> +<hkern g1="Odieresis" g2="quotedblbase" k="56" /> +<hkern g1="Ugrave" g2="ampersand" k="56" /> +<hkern g1="Ugrave" g2="comma" k="50" /> +<hkern g1="Ugrave" g2="period" k="50" /> +<hkern g1="Ugrave" g2="slash" k="56" /> +<hkern g1="Ugrave" g2="A" k="56" /> +<hkern g1="Ugrave" g2="Agrave" k="56" /> +<hkern g1="Ugrave" g2="Aacute" k="56" /> +<hkern g1="Ugrave" g2="Acircumflex" k="56" /> +<hkern g1="Ugrave" g2="Atilde" k="56" /> +<hkern g1="Ugrave" g2="Adieresis" k="56" /> +<hkern g1="Ugrave" g2="Aring" k="56" /> +<hkern g1="Ugrave" g2="AE" k="56" /> +<hkern g1="Ugrave" g2="quotesinglbase" k="50" /> +<hkern g1="Ugrave" g2="quotedblbase" k="50" /> +<hkern g1="Uacute" g2="ampersand" k="56" /> +<hkern g1="Uacute" g2="comma" k="50" /> +<hkern g1="Uacute" g2="period" k="50" /> +<hkern g1="Uacute" g2="slash" k="56" /> +<hkern g1="Uacute" g2="A" k="56" /> +<hkern g1="Uacute" g2="Agrave" k="56" /> +<hkern g1="Uacute" g2="Aacute" k="56" /> +<hkern g1="Uacute" g2="Acircumflex" k="56" /> +<hkern g1="Uacute" g2="Atilde" k="56" /> +<hkern g1="Uacute" g2="Adieresis" k="56" /> +<hkern g1="Uacute" g2="Aring" k="56" /> +<hkern g1="Uacute" g2="AE" k="56" /> +<hkern g1="Uacute" g2="quotesinglbase" k="50" /> +<hkern g1="Uacute" g2="quotedblbase" k="50" /> +<hkern g1="Ucircumflex" g2="ampersand" k="56" /> +<hkern g1="Ucircumflex" g2="comma" k="50" /> +<hkern g1="Ucircumflex" g2="period" k="50" /> +<hkern g1="Ucircumflex" g2="slash" k="56" /> +<hkern g1="Ucircumflex" g2="A" k="56" /> +<hkern g1="Ucircumflex" g2="Agrave" k="56" /> +<hkern g1="Ucircumflex" g2="Aacute" k="56" /> +<hkern g1="Ucircumflex" g2="Acircumflex" k="56" /> +<hkern g1="Ucircumflex" g2="Atilde" k="56" /> +<hkern g1="Ucircumflex" g2="Adieresis" k="56" /> +<hkern g1="Ucircumflex" g2="Aring" k="56" /> +<hkern g1="Ucircumflex" g2="AE" k="56" /> +<hkern g1="Ucircumflex" g2="quotesinglbase" k="50" /> +<hkern g1="Ucircumflex" g2="quotedblbase" k="50" /> +<hkern g1="Udieresis" g2="ampersand" k="56" /> +<hkern g1="Udieresis" g2="comma" k="50" /> +<hkern g1="Udieresis" g2="period" k="50" /> +<hkern g1="Udieresis" g2="slash" k="56" /> +<hkern g1="Udieresis" g2="A" k="56" /> +<hkern g1="Udieresis" g2="Agrave" k="56" /> +<hkern g1="Udieresis" g2="Aacute" k="56" /> +<hkern g1="Udieresis" g2="Acircumflex" k="56" /> +<hkern g1="Udieresis" g2="Atilde" k="56" /> +<hkern g1="Udieresis" g2="Adieresis" k="56" /> +<hkern g1="Udieresis" g2="Aring" k="56" /> +<hkern g1="Udieresis" g2="AE" k="56" /> +<hkern g1="Udieresis" g2="quotesinglbase" k="50" /> +<hkern g1="Udieresis" g2="quotedblbase" k="50" /> +<hkern g1="Yacute" g2="quotedbl" k="-30" /> +<hkern g1="Yacute" g2="ampersand" k="164" /> +<hkern g1="Yacute" g2="quotesingle" k="-30" /> +<hkern g1="Yacute" g2="asterisk" k="-30" /> +<hkern g1="Yacute" g2="comma" k="152" /> +<hkern g1="Yacute" g2="hyphen" k="160" /> +<hkern g1="Yacute" g2="period" k="152" /> +<hkern g1="Yacute" g2="slash" k="164" /> +<hkern g1="Yacute" g2="colon" k="122" /> +<hkern g1="Yacute" g2="semicolon" k="122" /> +<hkern g1="Yacute" g2="question" k="-34" /> +<hkern g1="Yacute" g2="at" k="80" /> +<hkern g1="Yacute" g2="A" k="164" /> +<hkern g1="Yacute" g2="C" k="80" /> +<hkern g1="Yacute" g2="G" k="80" /> +<hkern g1="Yacute" g2="J" k="200" /> +<hkern g1="Yacute" g2="O" k="80" /> +<hkern g1="Yacute" g2="Q" k="80" /> +<hkern g1="Yacute" g2="a" k="128" /> +<hkern g1="Yacute" g2="c" k="160" /> +<hkern g1="Yacute" g2="d" k="160" /> +<hkern g1="Yacute" g2="e" k="160" /> +<hkern g1="Yacute" g2="g" k="172" /> +<hkern g1="Yacute" g2="m" k="122" /> +<hkern g1="Yacute" g2="n" k="122" /> +<hkern g1="Yacute" g2="o" k="160" /> +<hkern g1="Yacute" g2="p" k="122" /> +<hkern g1="Yacute" g2="q" k="160" /> +<hkern g1="Yacute" g2="r" k="122" /> +<hkern g1="Yacute" g2="s" k="128" /> +<hkern g1="Yacute" g2="u" k="122" /> +<hkern g1="Yacute" g2="v" k="100" /> +<hkern g1="Yacute" g2="w" k="92" /> +<hkern g1="Yacute" g2="x" k="132" /> +<hkern g1="Yacute" g2="y" k="100" /> +<hkern g1="Yacute" g2="ordfeminine" k="-30" /> +<hkern g1="Yacute" g2="guillemotleft" k="160" /> +<hkern g1="Yacute" g2="uni00AD" k="160" /> +<hkern g1="Yacute" g2="degree" k="-30" /> +<hkern g1="Yacute" g2="twosuperior" k="-50" /> +<hkern g1="Yacute" g2="threesuperior" k="-50" /> +<hkern g1="Yacute" g2="mu" k="122" /> +<hkern g1="Yacute" g2="middot" k="160" /> +<hkern g1="Yacute" g2="onesuperior" k="-50" /> +<hkern g1="Yacute" g2="ordmasculine" k="-30" /> +<hkern g1="Yacute" g2="guillemotright" k="160" /> +<hkern g1="Yacute" g2="Agrave" k="164" /> +<hkern g1="Yacute" g2="Aacute" k="164" /> +<hkern g1="Yacute" g2="Acircumflex" k="164" /> +<hkern g1="Yacute" g2="Atilde" k="164" /> +<hkern g1="Yacute" g2="Adieresis" k="164" /> +<hkern g1="Yacute" g2="Aring" k="164" /> +<hkern g1="Yacute" g2="AE" k="164" /> +<hkern g1="Yacute" g2="Ccedilla" k="80" /> +<hkern g1="Yacute" g2="Ograve" k="80" /> +<hkern g1="Yacute" g2="Oacute" k="80" /> +<hkern g1="Yacute" g2="Ocircumflex" k="80" /> +<hkern g1="Yacute" g2="Otilde" k="80" /> +<hkern g1="Yacute" g2="Odieresis" k="80" /> +<hkern g1="Yacute" g2="Oslash" k="80" /> +<hkern g1="Yacute" g2="agrave" k="128" /> +<hkern g1="Yacute" g2="aacute" k="128" /> +<hkern g1="Yacute" g2="acircumflex" k="128" /> +<hkern g1="Yacute" g2="atilde" k="128" /> +<hkern g1="Yacute" g2="adieresis" k="128" /> +<hkern g1="Yacute" g2="aring" k="128" /> +<hkern g1="Yacute" g2="ae" k="128" /> +<hkern g1="Yacute" g2="ccedilla" k="160" /> +<hkern g1="Yacute" g2="egrave" k="160" /> +<hkern g1="Yacute" g2="eacute" k="160" /> +<hkern g1="Yacute" g2="ecircumflex" k="160" /> +<hkern g1="Yacute" g2="edieresis" k="160" /> +<hkern g1="Yacute" g2="eth" k="160" /> +<hkern g1="Yacute" g2="ntilde" k="122" /> +<hkern g1="Yacute" g2="ograve" k="160" /> +<hkern g1="Yacute" g2="oacute" k="160" /> +<hkern g1="Yacute" g2="ocircumflex" k="160" /> +<hkern g1="Yacute" g2="otilde" k="160" /> +<hkern g1="Yacute" g2="odieresis" k="160" /> +<hkern g1="Yacute" g2="oslash" k="160" /> +<hkern g1="Yacute" g2="ugrave" k="122" /> +<hkern g1="Yacute" g2="uacute" k="122" /> +<hkern g1="Yacute" g2="ucircumflex" k="122" /> +<hkern g1="Yacute" g2="udieresis" k="122" /> +<hkern g1="Yacute" g2="OE" k="80" /> +<hkern g1="Yacute" g2="oe" k="160" /> +<hkern g1="Yacute" g2="endash" k="160" /> +<hkern g1="Yacute" g2="emdash" k="160" /> +<hkern g1="Yacute" g2="quoteleft" k="-30" /> +<hkern g1="Yacute" g2="quoteright" k="-30" /> +<hkern g1="Yacute" g2="quotesinglbase" k="152" /> +<hkern g1="Yacute" g2="quotedblleft" k="-30" /> +<hkern g1="Yacute" g2="quotedblright" k="-30" /> +<hkern g1="Yacute" g2="quotedblbase" k="152" /> +<hkern g1="Yacute" g2="bullet" k="160" /> +<hkern g1="Yacute" g2="guilsinglleft" k="160" /> +<hkern g1="Yacute" g2="guilsinglright" k="160" /> +<hkern g1="Thorn" g2="quotedbl" k="46" /> +<hkern g1="Thorn" g2="ampersand" k="42" /> +<hkern g1="Thorn" g2="quotesingle" k="46" /> +<hkern g1="Thorn" g2="parenright" k="40" /> +<hkern g1="Thorn" g2="asterisk" k="46" /> +<hkern g1="Thorn" g2="comma" k="56" /> +<hkern g1="Thorn" g2="period" k="56" /> +<hkern g1="Thorn" g2="slash" k="42" /> +<hkern g1="Thorn" g2="A" k="42" /> +<hkern g1="Thorn" g2="T" k="98" /> +<hkern g1="Thorn" g2="V" k="52" /> +<hkern g1="Thorn" g2="X" k="30" /> +<hkern g1="Thorn" g2="Y" k="80" /> +<hkern g1="Thorn" g2="Z" k="70" /> +<hkern g1="Thorn" g2="backslash" k="52" /> +<hkern g1="Thorn" g2="bracketright" k="40" /> +<hkern g1="Thorn" g2="braceright" k="40" /> +<hkern g1="Thorn" g2="ordfeminine" k="46" /> +<hkern g1="Thorn" g2="degree" k="46" /> +<hkern g1="Thorn" g2="ordmasculine" k="46" /> +<hkern g1="Thorn" g2="Agrave" k="42" /> +<hkern g1="Thorn" g2="Aacute" k="42" /> +<hkern g1="Thorn" g2="Acircumflex" k="42" /> +<hkern g1="Thorn" g2="Atilde" k="42" /> +<hkern g1="Thorn" g2="Adieresis" k="42" /> +<hkern g1="Thorn" g2="Aring" k="42" /> +<hkern g1="Thorn" g2="AE" k="42" /> +<hkern g1="Thorn" g2="Yacute" k="80" /> +<hkern g1="Thorn" g2="quoteleft" k="46" /> +<hkern g1="Thorn" g2="quoteright" k="46" /> +<hkern g1="Thorn" g2="quotesinglbase" k="56" /> +<hkern g1="Thorn" g2="quotedblleft" k="46" /> +<hkern g1="Thorn" g2="quotedblright" k="46" /> +<hkern g1="Thorn" g2="quotedblbase" k="56" /> +<hkern g1="agrave" g2="quotedbl" k="72" /> +<hkern g1="agrave" g2="quotesingle" k="72" /> +<hkern g1="agrave" g2="asterisk" k="72" /> +<hkern g1="agrave" g2="v" k="32" /> +<hkern g1="agrave" g2="w" k="16" /> +<hkern g1="agrave" g2="y" k="32" /> +<hkern g1="agrave" g2="ordfeminine" k="72" /> +<hkern g1="agrave" g2="degree" k="72" /> +<hkern g1="agrave" g2="twosuperior" k="72" /> +<hkern g1="agrave" g2="threesuperior" k="72" /> +<hkern g1="agrave" g2="onesuperior" k="72" /> +<hkern g1="agrave" g2="ordmasculine" k="72" /> +<hkern g1="agrave" g2="quoteleft" k="72" /> +<hkern g1="agrave" g2="quoteright" k="72" /> +<hkern g1="agrave" g2="quotedblleft" k="72" /> +<hkern g1="agrave" g2="quotedblright" k="72" /> +<hkern g1="aacute" g2="quotedbl" k="72" /> +<hkern g1="aacute" g2="quotesingle" k="72" /> +<hkern g1="aacute" g2="asterisk" k="72" /> +<hkern g1="aacute" g2="v" k="32" /> +<hkern g1="aacute" g2="w" k="16" /> +<hkern g1="aacute" g2="y" k="32" /> +<hkern g1="aacute" g2="ordfeminine" k="72" /> +<hkern g1="aacute" g2="degree" k="72" /> +<hkern g1="aacute" g2="twosuperior" k="72" /> +<hkern g1="aacute" g2="threesuperior" k="72" /> +<hkern g1="aacute" g2="onesuperior" k="72" /> +<hkern g1="aacute" g2="ordmasculine" k="72" /> +<hkern g1="aacute" g2="quoteleft" k="72" /> +<hkern g1="aacute" g2="quoteright" k="72" /> +<hkern g1="aacute" g2="quotedblleft" k="72" /> +<hkern g1="aacute" g2="quotedblright" k="72" /> +<hkern g1="acircumflex" g2="quotedbl" k="72" /> +<hkern g1="acircumflex" g2="quotesingle" k="72" /> +<hkern g1="acircumflex" g2="asterisk" k="72" /> +<hkern g1="acircumflex" g2="v" k="32" /> +<hkern g1="acircumflex" g2="w" k="16" /> +<hkern g1="acircumflex" g2="y" k="32" /> +<hkern g1="acircumflex" g2="ordfeminine" k="72" /> +<hkern g1="acircumflex" g2="degree" k="72" /> +<hkern g1="acircumflex" g2="twosuperior" k="72" /> +<hkern g1="acircumflex" g2="threesuperior" k="72" /> +<hkern g1="acircumflex" g2="onesuperior" k="72" /> +<hkern g1="acircumflex" g2="ordmasculine" k="72" /> +<hkern g1="acircumflex" g2="quoteleft" k="72" /> +<hkern g1="acircumflex" g2="quoteright" k="72" /> +<hkern g1="acircumflex" g2="quotedblleft" k="72" /> +<hkern g1="acircumflex" g2="quotedblright" k="72" /> +<hkern g1="atilde" g2="quotedbl" k="72" /> +<hkern g1="atilde" g2="quotesingle" k="72" /> +<hkern g1="atilde" g2="asterisk" k="72" /> +<hkern g1="atilde" g2="v" k="32" /> +<hkern g1="atilde" g2="w" k="16" /> +<hkern g1="atilde" g2="y" k="32" /> +<hkern g1="atilde" g2="ordfeminine" k="72" /> +<hkern g1="atilde" g2="degree" k="72" /> +<hkern g1="atilde" g2="twosuperior" k="72" /> +<hkern g1="atilde" g2="threesuperior" k="72" /> +<hkern g1="atilde" g2="onesuperior" k="72" /> +<hkern g1="atilde" g2="ordmasculine" k="72" /> +<hkern g1="atilde" g2="quoteleft" k="72" /> +<hkern g1="atilde" g2="quoteright" k="72" /> +<hkern g1="atilde" g2="quotedblleft" k="72" /> +<hkern g1="atilde" g2="quotedblright" k="72" /> +<hkern g1="adieresis" g2="quotedbl" k="72" /> +<hkern g1="adieresis" g2="quotesingle" k="72" /> +<hkern g1="adieresis" g2="asterisk" k="72" /> +<hkern g1="adieresis" g2="v" k="32" /> +<hkern g1="adieresis" g2="w" k="16" /> +<hkern g1="adieresis" g2="y" k="32" /> +<hkern g1="adieresis" g2="ordfeminine" k="72" /> +<hkern g1="adieresis" g2="degree" k="72" /> +<hkern g1="adieresis" g2="twosuperior" k="72" /> +<hkern g1="adieresis" g2="threesuperior" k="72" /> +<hkern g1="adieresis" g2="onesuperior" k="72" /> +<hkern g1="adieresis" g2="ordmasculine" k="72" /> +<hkern g1="adieresis" g2="quoteleft" k="72" /> +<hkern g1="adieresis" g2="quoteright" k="72" /> +<hkern g1="adieresis" g2="quotedblleft" k="72" /> +<hkern g1="adieresis" g2="quotedblright" k="72" /> +<hkern g1="aring" g2="quotedbl" k="72" /> +<hkern g1="aring" g2="quotesingle" k="72" /> +<hkern g1="aring" g2="asterisk" k="72" /> +<hkern g1="aring" g2="v" k="32" /> +<hkern g1="aring" g2="w" k="16" /> +<hkern g1="aring" g2="y" k="32" /> +<hkern g1="aring" g2="ordfeminine" k="72" /> +<hkern g1="aring" g2="degree" k="72" /> +<hkern g1="aring" g2="twosuperior" k="72" /> +<hkern g1="aring" g2="threesuperior" k="72" /> +<hkern g1="aring" g2="onesuperior" k="72" /> +<hkern g1="aring" g2="ordmasculine" k="72" /> +<hkern g1="aring" g2="quoteleft" k="72" /> +<hkern g1="aring" g2="quoteright" k="72" /> +<hkern g1="aring" g2="quotedblleft" k="72" /> +<hkern g1="aring" g2="quotedblright" k="72" /> +<hkern g1="ae" g2="quotedbl" k="92" /> +<hkern g1="ae" g2="quotesingle" k="92" /> +<hkern g1="ae" g2="parenright" k="32" /> +<hkern g1="ae" g2="asterisk" k="92" /> +<hkern g1="ae" g2="V" k="116" /> +<hkern g1="ae" g2="W" k="32" /> +<hkern g1="ae" g2="backslash" k="116" /> +<hkern g1="ae" g2="bracketright" k="32" /> +<hkern g1="ae" g2="v" k="26" /> +<hkern g1="ae" g2="x" k="60" /> +<hkern g1="ae" g2="y" k="26" /> +<hkern g1="ae" g2="braceright" k="32" /> +<hkern g1="ae" g2="ordfeminine" k="92" /> +<hkern g1="ae" g2="degree" k="92" /> +<hkern g1="ae" g2="ordmasculine" k="92" /> +<hkern g1="ae" g2="quoteleft" k="92" /> +<hkern g1="ae" g2="quoteright" k="92" /> +<hkern g1="ae" g2="quotedblleft" k="92" /> +<hkern g1="ae" g2="quotedblright" k="92" /> +<hkern g1="egrave" g2="quotedbl" k="92" /> +<hkern g1="egrave" g2="quotesingle" k="92" /> +<hkern g1="egrave" g2="parenright" k="32" /> +<hkern g1="egrave" g2="asterisk" k="92" /> +<hkern g1="egrave" g2="V" k="116" /> +<hkern g1="egrave" g2="W" k="32" /> +<hkern g1="egrave" g2="backslash" k="116" /> +<hkern g1="egrave" g2="bracketright" k="32" /> +<hkern g1="egrave" g2="v" k="26" /> +<hkern g1="egrave" g2="x" k="60" /> +<hkern g1="egrave" g2="y" k="26" /> +<hkern g1="egrave" g2="braceright" k="32" /> +<hkern g1="egrave" g2="ordfeminine" k="92" /> +<hkern g1="egrave" g2="degree" k="92" /> +<hkern g1="egrave" g2="ordmasculine" k="92" /> +<hkern g1="egrave" g2="quoteleft" k="92" /> +<hkern g1="egrave" g2="quoteright" k="92" /> +<hkern g1="egrave" g2="quotedblleft" k="92" /> +<hkern g1="egrave" g2="quotedblright" k="92" /> +<hkern g1="eacute" g2="quotedbl" k="92" /> +<hkern g1="eacute" g2="quotesingle" k="92" /> +<hkern g1="eacute" g2="parenright" k="32" /> +<hkern g1="eacute" g2="asterisk" k="92" /> +<hkern g1="eacute" g2="V" k="116" /> +<hkern g1="eacute" g2="W" k="32" /> +<hkern g1="eacute" g2="backslash" k="116" /> +<hkern g1="eacute" g2="bracketright" k="32" /> +<hkern g1="eacute" g2="v" k="26" /> +<hkern g1="eacute" g2="x" k="60" /> +<hkern g1="eacute" g2="y" k="26" /> +<hkern g1="eacute" g2="braceright" k="32" /> +<hkern g1="eacute" g2="ordfeminine" k="92" /> +<hkern g1="eacute" g2="degree" k="92" /> +<hkern g1="eacute" g2="ordmasculine" k="92" /> +<hkern g1="eacute" g2="quoteleft" k="92" /> +<hkern g1="eacute" g2="quoteright" k="92" /> +<hkern g1="eacute" g2="quotedblleft" k="92" /> +<hkern g1="eacute" g2="quotedblright" k="92" /> +<hkern g1="ecircumflex" g2="quotedbl" k="92" /> +<hkern g1="ecircumflex" g2="quotesingle" k="92" /> +<hkern g1="ecircumflex" g2="parenright" k="32" /> +<hkern g1="ecircumflex" g2="asterisk" k="92" /> +<hkern g1="ecircumflex" g2="V" k="116" /> +<hkern g1="ecircumflex" g2="W" k="32" /> +<hkern g1="ecircumflex" g2="backslash" k="116" /> +<hkern g1="ecircumflex" g2="bracketright" k="32" /> +<hkern g1="ecircumflex" g2="v" k="26" /> +<hkern g1="ecircumflex" g2="x" k="60" /> +<hkern g1="ecircumflex" g2="y" k="26" /> +<hkern g1="ecircumflex" g2="braceright" k="32" /> +<hkern g1="ecircumflex" g2="ordfeminine" k="92" /> +<hkern g1="ecircumflex" g2="degree" k="92" /> +<hkern g1="ecircumflex" g2="ordmasculine" k="92" /> +<hkern g1="ecircumflex" g2="quoteleft" k="92" /> +<hkern g1="ecircumflex" g2="quoteright" k="92" /> +<hkern g1="ecircumflex" g2="quotedblleft" k="92" /> +<hkern g1="ecircumflex" g2="quotedblright" k="92" /> +<hkern g1="edieresis" g2="quotedbl" k="92" /> +<hkern g1="edieresis" g2="quotesingle" k="92" /> +<hkern g1="edieresis" g2="parenright" k="32" /> +<hkern g1="edieresis" g2="asterisk" k="92" /> +<hkern g1="edieresis" g2="V" k="116" /> +<hkern g1="edieresis" g2="W" k="32" /> +<hkern g1="edieresis" g2="backslash" k="116" /> +<hkern g1="edieresis" g2="bracketright" k="32" /> +<hkern g1="edieresis" g2="v" k="26" /> +<hkern g1="edieresis" g2="x" k="60" /> +<hkern g1="edieresis" g2="y" k="26" /> +<hkern g1="edieresis" g2="braceright" k="32" /> +<hkern g1="edieresis" g2="ordfeminine" k="92" /> +<hkern g1="edieresis" g2="degree" k="92" /> +<hkern g1="edieresis" g2="ordmasculine" k="92" /> +<hkern g1="edieresis" g2="quoteleft" k="92" /> +<hkern g1="edieresis" g2="quoteright" k="92" /> +<hkern g1="edieresis" g2="quotedblleft" k="92" /> +<hkern g1="edieresis" g2="quotedblright" k="92" /> +<hkern g1="ntilde" g2="quotedbl" k="72" /> +<hkern g1="ntilde" g2="quotesingle" k="72" /> +<hkern g1="ntilde" g2="asterisk" k="72" /> +<hkern g1="ntilde" g2="v" k="32" /> +<hkern g1="ntilde" g2="w" k="16" /> +<hkern g1="ntilde" g2="y" k="32" /> +<hkern g1="ntilde" g2="ordfeminine" k="72" /> +<hkern g1="ntilde" g2="degree" k="72" /> +<hkern g1="ntilde" g2="twosuperior" k="72" /> +<hkern g1="ntilde" g2="threesuperior" k="72" /> +<hkern g1="ntilde" g2="onesuperior" k="72" /> +<hkern g1="ntilde" g2="ordmasculine" k="72" /> +<hkern g1="ntilde" g2="quoteleft" k="72" /> +<hkern g1="ntilde" g2="quoteright" k="72" /> +<hkern g1="ntilde" g2="quotedblleft" k="72" /> +<hkern g1="ntilde" g2="quotedblright" k="72" /> +<hkern g1="ograve" g2="quotedbl" k="92" /> +<hkern g1="ograve" g2="quotesingle" k="92" /> +<hkern g1="ograve" g2="parenright" k="32" /> +<hkern g1="ograve" g2="asterisk" k="92" /> +<hkern g1="ograve" g2="V" k="116" /> +<hkern g1="ograve" g2="W" k="32" /> +<hkern g1="ograve" g2="backslash" k="116" /> +<hkern g1="ograve" g2="bracketright" k="32" /> +<hkern g1="ograve" g2="v" k="26" /> +<hkern g1="ograve" g2="x" k="60" /> +<hkern g1="ograve" g2="y" k="26" /> +<hkern g1="ograve" g2="braceright" k="32" /> +<hkern g1="ograve" g2="ordfeminine" k="92" /> +<hkern g1="ograve" g2="degree" k="92" /> +<hkern g1="ograve" g2="ordmasculine" k="92" /> +<hkern g1="ograve" g2="quoteleft" k="92" /> +<hkern g1="ograve" g2="quoteright" k="92" /> +<hkern g1="ograve" g2="quotedblleft" k="92" /> +<hkern g1="ograve" g2="quotedblright" k="92" /> +<hkern g1="oacute" g2="quotedbl" k="92" /> +<hkern g1="oacute" g2="quotesingle" k="92" /> +<hkern g1="oacute" g2="parenright" k="32" /> +<hkern g1="oacute" g2="asterisk" k="92" /> +<hkern g1="oacute" g2="V" k="116" /> +<hkern g1="oacute" g2="W" k="32" /> +<hkern g1="oacute" g2="backslash" k="116" /> +<hkern g1="oacute" g2="bracketright" k="32" /> +<hkern g1="oacute" g2="v" k="26" /> +<hkern g1="oacute" g2="x" k="60" /> +<hkern g1="oacute" g2="y" k="26" /> +<hkern g1="oacute" g2="braceright" k="32" /> +<hkern g1="oacute" g2="ordfeminine" k="92" /> +<hkern g1="oacute" g2="degree" k="92" /> +<hkern g1="oacute" g2="ordmasculine" k="92" /> +<hkern g1="oacute" g2="quoteleft" k="92" /> +<hkern g1="oacute" g2="quoteright" k="92" /> +<hkern g1="oacute" g2="quotedblleft" k="92" /> +<hkern g1="oacute" g2="quotedblright" k="92" /> +<hkern g1="ocircumflex" g2="quotedbl" k="92" /> +<hkern g1="ocircumflex" g2="quotesingle" k="92" /> +<hkern g1="ocircumflex" g2="parenright" k="32" /> +<hkern g1="ocircumflex" g2="asterisk" k="92" /> +<hkern g1="ocircumflex" g2="V" k="116" /> +<hkern g1="ocircumflex" g2="W" k="32" /> +<hkern g1="ocircumflex" g2="backslash" k="116" /> +<hkern g1="ocircumflex" g2="bracketright" k="32" /> +<hkern g1="ocircumflex" g2="v" k="26" /> +<hkern g1="ocircumflex" g2="x" k="60" /> +<hkern g1="ocircumflex" g2="y" k="26" /> +<hkern g1="ocircumflex" g2="braceright" k="32" /> +<hkern g1="ocircumflex" g2="ordfeminine" k="92" /> +<hkern g1="ocircumflex" g2="degree" k="92" /> +<hkern g1="ocircumflex" g2="ordmasculine" k="92" /> +<hkern g1="ocircumflex" g2="quoteleft" k="92" /> +<hkern g1="ocircumflex" g2="quoteright" k="92" /> +<hkern g1="ocircumflex" g2="quotedblleft" k="92" /> +<hkern g1="ocircumflex" g2="quotedblright" k="92" /> +<hkern g1="otilde" g2="quotedbl" k="92" /> +<hkern g1="otilde" g2="quotesingle" k="92" /> +<hkern g1="otilde" g2="parenright" k="32" /> +<hkern g1="otilde" g2="asterisk" k="92" /> +<hkern g1="otilde" g2="V" k="116" /> +<hkern g1="otilde" g2="W" k="32" /> +<hkern g1="otilde" g2="backslash" k="116" /> +<hkern g1="otilde" g2="bracketright" k="32" /> +<hkern g1="otilde" g2="v" k="26" /> +<hkern g1="otilde" g2="x" k="60" /> +<hkern g1="otilde" g2="y" k="26" /> +<hkern g1="otilde" g2="braceright" k="32" /> +<hkern g1="otilde" g2="ordfeminine" k="92" /> +<hkern g1="otilde" g2="degree" k="92" /> +<hkern g1="otilde" g2="ordmasculine" k="92" /> +<hkern g1="otilde" g2="quoteleft" k="92" /> +<hkern g1="otilde" g2="quoteright" k="92" /> +<hkern g1="otilde" g2="quotedblleft" k="92" /> +<hkern g1="otilde" g2="quotedblright" k="92" /> +<hkern g1="odieresis" g2="quotedbl" k="92" /> +<hkern g1="odieresis" g2="quotesingle" k="92" /> +<hkern g1="odieresis" g2="parenright" k="32" /> +<hkern g1="odieresis" g2="asterisk" k="92" /> +<hkern g1="odieresis" g2="V" k="116" /> +<hkern g1="odieresis" g2="W" k="32" /> +<hkern g1="odieresis" g2="backslash" k="116" /> +<hkern g1="odieresis" g2="bracketright" k="32" /> +<hkern g1="odieresis" g2="v" k="26" /> +<hkern g1="odieresis" g2="x" k="60" /> +<hkern g1="odieresis" g2="y" k="26" /> +<hkern g1="odieresis" g2="braceright" k="32" /> +<hkern g1="odieresis" g2="ordfeminine" k="92" /> +<hkern g1="odieresis" g2="degree" k="92" /> +<hkern g1="odieresis" g2="ordmasculine" k="92" /> +<hkern g1="odieresis" g2="quoteleft" k="92" /> +<hkern g1="odieresis" g2="quoteright" k="92" /> +<hkern g1="odieresis" g2="quotedblleft" k="92" /> +<hkern g1="odieresis" g2="quotedblright" k="92" /> +<hkern g1="oslash" g2="quotedbl" k="92" /> +<hkern g1="oslash" g2="quotesingle" k="92" /> +<hkern g1="oslash" g2="parenright" k="32" /> +<hkern g1="oslash" g2="asterisk" k="92" /> +<hkern g1="oslash" g2="V" k="116" /> +<hkern g1="oslash" g2="W" k="32" /> +<hkern g1="oslash" g2="backslash" k="116" /> +<hkern g1="oslash" g2="bracketright" k="32" /> +<hkern g1="oslash" g2="v" k="26" /> +<hkern g1="oslash" g2="x" k="60" /> +<hkern g1="oslash" g2="y" k="26" /> +<hkern g1="oslash" g2="braceright" k="32" /> +<hkern g1="oslash" g2="ordfeminine" k="92" /> +<hkern g1="oslash" g2="degree" k="92" /> +<hkern g1="oslash" g2="ordmasculine" k="92" /> +<hkern g1="oslash" g2="quoteleft" k="92" /> +<hkern g1="oslash" g2="quoteright" k="92" /> +<hkern g1="oslash" g2="quotedblleft" k="92" /> +<hkern g1="oslash" g2="quotedblright" k="92" /> +<hkern g1="thorn" g2="quotedbl" k="92" /> +<hkern g1="thorn" g2="quotesingle" k="92" /> +<hkern g1="thorn" g2="parenright" k="32" /> +<hkern g1="thorn" g2="asterisk" k="92" /> +<hkern g1="thorn" g2="V" k="116" /> +<hkern g1="thorn" g2="W" k="32" /> +<hkern g1="thorn" g2="backslash" k="116" /> +<hkern g1="thorn" g2="bracketright" k="32" /> +<hkern g1="thorn" g2="v" k="26" /> +<hkern g1="thorn" g2="x" k="60" /> +<hkern g1="thorn" g2="y" k="26" /> +<hkern g1="thorn" g2="braceright" k="32" /> +<hkern g1="thorn" g2="ordfeminine" k="92" /> +<hkern g1="thorn" g2="degree" k="92" /> +<hkern g1="thorn" g2="ordmasculine" k="92" /> +<hkern g1="thorn" g2="quoteleft" k="92" /> +<hkern g1="thorn" g2="quoteright" k="92" /> +<hkern g1="thorn" g2="quotedblleft" k="92" /> +<hkern g1="thorn" g2="quotedblright" k="92" /> +<hkern g1="oe" g2="quotedbl" k="92" /> +<hkern g1="oe" g2="quotesingle" k="92" /> +<hkern g1="oe" g2="parenright" k="32" /> +<hkern g1="oe" g2="asterisk" k="92" /> +<hkern g1="oe" g2="V" k="116" /> +<hkern g1="oe" g2="W" k="32" /> +<hkern g1="oe" g2="backslash" k="116" /> +<hkern g1="oe" g2="bracketright" k="32" /> +<hkern g1="oe" g2="v" k="26" /> +<hkern g1="oe" g2="x" k="60" /> +<hkern g1="oe" g2="y" k="26" /> +<hkern g1="oe" g2="braceright" k="32" /> +<hkern g1="oe" g2="ordfeminine" k="92" /> +<hkern g1="oe" g2="degree" k="92" /> +<hkern g1="oe" g2="ordmasculine" k="92" /> +<hkern g1="oe" g2="quoteleft" k="92" /> +<hkern g1="oe" g2="quoteright" k="92" /> +<hkern g1="oe" g2="quotedblleft" k="92" /> +<hkern g1="oe" g2="quotedblright" k="92" /> +<hkern g1="endash" g2="quotedbl" k="178" /> +<hkern g1="endash" g2="ampersand" k="52" /> +<hkern g1="endash" g2="quotesingle" k="178" /> +<hkern g1="endash" g2="asterisk" k="178" /> +<hkern g1="endash" g2="comma" k="136" /> +<hkern g1="endash" g2="period" k="136" /> +<hkern g1="endash" g2="slash" k="52" /> +<hkern g1="endash" g2="A" k="52" /> +<hkern g1="endash" g2="T" k="180" /> +<hkern g1="endash" g2="V" k="112" /> +<hkern g1="endash" g2="W" k="32" /> +<hkern g1="endash" g2="X" k="62" /> +<hkern g1="endash" g2="Y" k="160" /> +<hkern g1="endash" g2="Z" k="46" /> +<hkern g1="endash" g2="backslash" k="112" /> +<hkern g1="endash" g2="ordfeminine" k="178" /> +<hkern g1="endash" g2="degree" k="178" /> +<hkern g1="endash" g2="ordmasculine" k="178" /> +<hkern g1="endash" g2="Agrave" k="52" /> +<hkern g1="endash" g2="Aacute" k="52" /> +<hkern g1="endash" g2="Acircumflex" k="52" /> +<hkern g1="endash" g2="Atilde" k="52" /> +<hkern g1="endash" g2="Adieresis" k="52" /> +<hkern g1="endash" g2="Aring" k="52" /> +<hkern g1="endash" g2="AE" k="52" /> +<hkern g1="endash" g2="Yacute" k="160" /> +<hkern g1="endash" g2="quoteleft" k="178" /> +<hkern g1="endash" g2="quoteright" k="178" /> +<hkern g1="endash" g2="quotesinglbase" k="136" /> +<hkern g1="endash" g2="quotedblleft" k="178" /> +<hkern g1="endash" g2="quotedblright" k="178" /> +<hkern g1="endash" g2="quotedblbase" k="136" /> +<hkern g1="emdash" g2="quotedbl" k="178" /> +<hkern g1="emdash" g2="ampersand" k="52" /> +<hkern g1="emdash" g2="quotesingle" k="178" /> +<hkern g1="emdash" g2="asterisk" k="178" /> +<hkern g1="emdash" g2="comma" k="136" /> +<hkern g1="emdash" g2="period" k="136" /> +<hkern g1="emdash" g2="slash" k="52" /> +<hkern g1="emdash" g2="A" k="52" /> +<hkern g1="emdash" g2="T" k="180" /> +<hkern g1="emdash" g2="V" k="112" /> +<hkern g1="emdash" g2="W" k="32" /> +<hkern g1="emdash" g2="X" k="62" /> +<hkern g1="emdash" g2="Y" k="160" /> +<hkern g1="emdash" g2="Z" k="46" /> +<hkern g1="emdash" g2="backslash" k="112" /> +<hkern g1="emdash" g2="ordfeminine" k="178" /> +<hkern g1="emdash" g2="degree" k="178" /> +<hkern g1="emdash" g2="ordmasculine" k="178" /> +<hkern g1="emdash" g2="Agrave" k="52" /> +<hkern g1="emdash" g2="Aacute" k="52" /> +<hkern g1="emdash" g2="Acircumflex" k="52" /> +<hkern g1="emdash" g2="Atilde" k="52" /> +<hkern g1="emdash" g2="Adieresis" k="52" /> +<hkern g1="emdash" g2="Aring" k="52" /> +<hkern g1="emdash" g2="AE" k="52" /> +<hkern g1="emdash" g2="Yacute" k="160" /> +<hkern g1="emdash" g2="quoteleft" k="178" /> +<hkern g1="emdash" g2="quoteright" k="178" /> +<hkern g1="emdash" g2="quotesinglbase" k="136" /> +<hkern g1="emdash" g2="quotedblleft" k="178" /> +<hkern g1="emdash" g2="quotedblright" k="178" /> +<hkern g1="emdash" g2="quotedblbase" k="136" /> +<hkern g1="quoteleft" g2="ampersand" k="182" /> +<hkern g1="quoteleft" g2="comma" k="228" /> +<hkern g1="quoteleft" g2="hyphen" k="178" /> +<hkern g1="quoteleft" g2="period" k="228" /> +<hkern g1="quoteleft" g2="slash" k="182" /> +<hkern g1="quoteleft" g2="at" k="46" /> +<hkern g1="quoteleft" g2="A" k="182" /> +<hkern g1="quoteleft" g2="C" k="46" /> +<hkern g1="quoteleft" g2="G" k="46" /> +<hkern g1="quoteleft" g2="O" k="46" /> +<hkern g1="quoteleft" g2="Q" k="46" /> +<hkern g1="quoteleft" g2="V" k="-48" /> +<hkern g1="quoteleft" g2="W" k="-48" /> +<hkern g1="quoteleft" g2="Y" k="-30" /> +<hkern g1="quoteleft" g2="backslash" k="-48" /> +<hkern g1="quoteleft" g2="a" k="64" /> +<hkern g1="quoteleft" g2="c" k="92" /> +<hkern g1="quoteleft" g2="d" k="92" /> +<hkern g1="quoteleft" g2="e" k="92" /> +<hkern g1="quoteleft" g2="o" k="92" /> +<hkern g1="quoteleft" g2="q" k="92" /> +<hkern g1="quoteleft" g2="guillemotleft" k="178" /> +<hkern g1="quoteleft" g2="uni00AD" k="178" /> +<hkern g1="quoteleft" g2="middot" k="178" /> +<hkern g1="quoteleft" g2="guillemotright" k="178" /> +<hkern g1="quoteleft" g2="Agrave" k="182" /> +<hkern g1="quoteleft" g2="Aacute" k="182" /> +<hkern g1="quoteleft" g2="Acircumflex" k="182" /> +<hkern g1="quoteleft" g2="Atilde" k="182" /> +<hkern g1="quoteleft" g2="Adieresis" k="182" /> +<hkern g1="quoteleft" g2="Aring" k="182" /> +<hkern g1="quoteleft" g2="AE" k="182" /> +<hkern g1="quoteleft" g2="Ccedilla" k="46" /> +<hkern g1="quoteleft" g2="Ograve" k="46" /> +<hkern g1="quoteleft" g2="Oacute" k="46" /> +<hkern g1="quoteleft" g2="Ocircumflex" k="46" /> +<hkern g1="quoteleft" g2="Otilde" k="46" /> +<hkern g1="quoteleft" g2="Odieresis" k="46" /> +<hkern g1="quoteleft" g2="Oslash" k="46" /> +<hkern g1="quoteleft" g2="Yacute" k="-30" /> +<hkern g1="quoteleft" g2="agrave" k="64" /> +<hkern g1="quoteleft" g2="aacute" k="64" /> +<hkern g1="quoteleft" g2="acircumflex" k="64" /> +<hkern g1="quoteleft" g2="atilde" k="64" /> +<hkern g1="quoteleft" g2="adieresis" k="64" /> +<hkern g1="quoteleft" g2="aring" k="64" /> +<hkern g1="quoteleft" g2="ae" k="64" /> +<hkern g1="quoteleft" g2="ccedilla" k="92" /> +<hkern g1="quoteleft" g2="egrave" k="92" /> +<hkern g1="quoteleft" g2="eacute" k="92" /> +<hkern g1="quoteleft" g2="ecircumflex" k="92" /> +<hkern g1="quoteleft" g2="edieresis" k="92" /> +<hkern g1="quoteleft" g2="eth" k="92" /> +<hkern g1="quoteleft" g2="ograve" k="92" /> +<hkern g1="quoteleft" g2="oacute" k="92" /> +<hkern g1="quoteleft" g2="ocircumflex" k="92" /> +<hkern g1="quoteleft" g2="otilde" k="92" /> +<hkern g1="quoteleft" g2="odieresis" k="92" /> +<hkern g1="quoteleft" g2="oslash" k="92" /> +<hkern g1="quoteleft" g2="OE" k="46" /> +<hkern g1="quoteleft" g2="oe" k="92" /> +<hkern g1="quoteleft" g2="endash" k="178" /> +<hkern g1="quoteleft" g2="emdash" k="178" /> +<hkern g1="quoteleft" g2="quotesinglbase" k="228" /> +<hkern g1="quoteleft" g2="quotedblbase" k="228" /> +<hkern g1="quoteleft" g2="bullet" k="178" /> +<hkern g1="quoteleft" g2="guilsinglleft" k="178" /> +<hkern g1="quoteleft" g2="guilsinglright" k="178" /> +<hkern g1="quoteright" g2="ampersand" k="182" /> +<hkern g1="quoteright" g2="comma" k="228" /> +<hkern g1="quoteright" g2="hyphen" k="178" /> +<hkern g1="quoteright" g2="period" k="228" /> +<hkern g1="quoteright" g2="slash" k="182" /> +<hkern g1="quoteright" g2="at" k="46" /> +<hkern g1="quoteright" g2="A" k="182" /> +<hkern g1="quoteright" g2="C" k="46" /> +<hkern g1="quoteright" g2="G" k="46" /> +<hkern g1="quoteright" g2="O" k="46" /> +<hkern g1="quoteright" g2="Q" k="46" /> +<hkern g1="quoteright" g2="V" k="-48" /> +<hkern g1="quoteright" g2="W" k="-48" /> +<hkern g1="quoteright" g2="Y" k="-30" /> +<hkern g1="quoteright" g2="backslash" k="-48" /> +<hkern g1="quoteright" g2="a" k="64" /> +<hkern g1="quoteright" g2="c" k="92" /> +<hkern g1="quoteright" g2="d" k="92" /> +<hkern g1="quoteright" g2="e" k="92" /> +<hkern g1="quoteright" g2="o" k="92" /> +<hkern g1="quoteright" g2="q" k="92" /> +<hkern g1="quoteright" g2="guillemotleft" k="178" /> +<hkern g1="quoteright" g2="uni00AD" k="178" /> +<hkern g1="quoteright" g2="middot" k="178" /> +<hkern g1="quoteright" g2="guillemotright" k="178" /> +<hkern g1="quoteright" g2="Agrave" k="182" /> +<hkern g1="quoteright" g2="Aacute" k="182" /> +<hkern g1="quoteright" g2="Acircumflex" k="182" /> +<hkern g1="quoteright" g2="Atilde" k="182" /> +<hkern g1="quoteright" g2="Adieresis" k="182" /> +<hkern g1="quoteright" g2="Aring" k="182" /> +<hkern g1="quoteright" g2="AE" k="182" /> +<hkern g1="quoteright" g2="Ccedilla" k="46" /> +<hkern g1="quoteright" g2="Ograve" k="46" /> +<hkern g1="quoteright" g2="Oacute" k="46" /> +<hkern g1="quoteright" g2="Ocircumflex" k="46" /> +<hkern g1="quoteright" g2="Otilde" k="46" /> +<hkern g1="quoteright" g2="Odieresis" k="46" /> +<hkern g1="quoteright" g2="Oslash" k="46" /> +<hkern g1="quoteright" g2="Yacute" k="-30" /> +<hkern g1="quoteright" g2="agrave" k="64" /> +<hkern g1="quoteright" g2="aacute" k="64" /> +<hkern g1="quoteright" g2="acircumflex" k="64" /> +<hkern g1="quoteright" g2="atilde" k="64" /> +<hkern g1="quoteright" g2="adieresis" k="64" /> +<hkern g1="quoteright" g2="aring" k="64" /> +<hkern g1="quoteright" g2="ae" k="64" /> +<hkern g1="quoteright" g2="ccedilla" k="92" /> +<hkern g1="quoteright" g2="egrave" k="92" /> +<hkern g1="quoteright" g2="eacute" k="92" /> +<hkern g1="quoteright" g2="ecircumflex" k="92" /> +<hkern g1="quoteright" g2="edieresis" k="92" /> +<hkern g1="quoteright" g2="eth" k="92" /> +<hkern g1="quoteright" g2="ograve" k="92" /> +<hkern g1="quoteright" g2="oacute" k="92" /> +<hkern g1="quoteright" g2="ocircumflex" k="92" /> +<hkern g1="quoteright" g2="otilde" k="92" /> +<hkern g1="quoteright" g2="odieresis" k="92" /> +<hkern g1="quoteright" g2="oslash" k="92" /> +<hkern g1="quoteright" g2="OE" k="46" /> +<hkern g1="quoteright" g2="oe" k="92" /> +<hkern g1="quoteright" g2="endash" k="178" /> +<hkern g1="quoteright" g2="emdash" k="178" /> +<hkern g1="quoteright" g2="quotesinglbase" k="228" /> +<hkern g1="quoteright" g2="quotedblbase" k="228" /> +<hkern g1="quoteright" g2="bullet" k="178" /> +<hkern g1="quoteright" g2="guilsinglleft" k="178" /> +<hkern g1="quoteright" g2="guilsinglright" k="178" /> +<hkern g1="quotesinglbase" g2="quotedbl" k="228" /> +<hkern g1="quotesinglbase" g2="quotesingle" k="228" /> +<hkern g1="quotesinglbase" g2="asterisk" k="228" /> +<hkern g1="quotesinglbase" g2="hyphen" k="136" /> +<hkern g1="quotesinglbase" g2="at" k="56" /> +<hkern g1="quotesinglbase" g2="C" k="56" /> +<hkern g1="quotesinglbase" g2="G" k="56" /> +<hkern g1="quotesinglbase" g2="O" k="56" /> +<hkern g1="quotesinglbase" g2="Q" k="56" /> +<hkern g1="quotesinglbase" g2="T" k="180" /> +<hkern g1="quotesinglbase" g2="V" k="180" /> +<hkern g1="quotesinglbase" g2="W" k="122" /> +<hkern g1="quotesinglbase" g2="Y" k="152" /> +<hkern g1="quotesinglbase" g2="backslash" k="180" /> +<hkern g1="quotesinglbase" g2="v" k="132" /> +<hkern g1="quotesinglbase" g2="w" k="62" /> +<hkern g1="quotesinglbase" g2="y" k="132" /> +<hkern g1="quotesinglbase" g2="ordfeminine" k="228" /> +<hkern g1="quotesinglbase" g2="guillemotleft" k="136" /> +<hkern g1="quotesinglbase" g2="uni00AD" k="136" /> +<hkern g1="quotesinglbase" g2="degree" k="228" /> +<hkern g1="quotesinglbase" g2="middot" k="136" /> +<hkern g1="quotesinglbase" g2="ordmasculine" k="228" /> +<hkern g1="quotesinglbase" g2="guillemotright" k="136" /> +<hkern g1="quotesinglbase" g2="Ccedilla" k="56" /> +<hkern g1="quotesinglbase" g2="Ograve" k="56" /> +<hkern g1="quotesinglbase" g2="Oacute" k="56" /> +<hkern g1="quotesinglbase" g2="Ocircumflex" k="56" /> +<hkern g1="quotesinglbase" g2="Otilde" k="56" /> +<hkern g1="quotesinglbase" g2="Odieresis" k="56" /> +<hkern g1="quotesinglbase" g2="Oslash" k="56" /> +<hkern g1="quotesinglbase" g2="Yacute" k="152" /> +<hkern g1="quotesinglbase" g2="OE" k="56" /> +<hkern g1="quotesinglbase" g2="endash" k="136" /> +<hkern g1="quotesinglbase" g2="emdash" k="136" /> +<hkern g1="quotesinglbase" g2="quoteleft" k="228" /> +<hkern g1="quotesinglbase" g2="quoteright" k="228" /> +<hkern g1="quotesinglbase" g2="quotedblleft" k="228" /> +<hkern g1="quotesinglbase" g2="quotedblright" k="228" /> +<hkern g1="quotesinglbase" g2="bullet" k="136" /> +<hkern g1="quotesinglbase" g2="guilsinglleft" k="136" /> +<hkern g1="quotesinglbase" g2="guilsinglright" k="136" /> +<hkern g1="quotedblleft" g2="ampersand" k="182" /> +<hkern g1="quotedblleft" g2="comma" k="228" /> +<hkern g1="quotedblleft" g2="hyphen" k="178" /> +<hkern g1="quotedblleft" g2="period" k="228" /> +<hkern g1="quotedblleft" g2="slash" k="182" /> +<hkern g1="quotedblleft" g2="at" k="46" /> +<hkern g1="quotedblleft" g2="A" k="182" /> +<hkern g1="quotedblleft" g2="C" k="46" /> +<hkern g1="quotedblleft" g2="G" k="46" /> +<hkern g1="quotedblleft" g2="O" k="46" /> +<hkern g1="quotedblleft" g2="Q" k="46" /> +<hkern g1="quotedblleft" g2="V" k="-48" /> +<hkern g1="quotedblleft" g2="W" k="-48" /> +<hkern g1="quotedblleft" g2="Y" k="-30" /> +<hkern g1="quotedblleft" g2="backslash" k="-48" /> +<hkern g1="quotedblleft" g2="a" k="64" /> +<hkern g1="quotedblleft" g2="c" k="92" /> +<hkern g1="quotedblleft" g2="d" k="92" /> +<hkern g1="quotedblleft" g2="e" k="92" /> +<hkern g1="quotedblleft" g2="o" k="92" /> +<hkern g1="quotedblleft" g2="q" k="92" /> +<hkern g1="quotedblleft" g2="guillemotleft" k="178" /> +<hkern g1="quotedblleft" g2="uni00AD" k="178" /> +<hkern g1="quotedblleft" g2="middot" k="178" /> +<hkern g1="quotedblleft" g2="guillemotright" k="178" /> +<hkern g1="quotedblleft" g2="Agrave" k="182" /> +<hkern g1="quotedblleft" g2="Aacute" k="182" /> +<hkern g1="quotedblleft" g2="Acircumflex" k="182" /> +<hkern g1="quotedblleft" g2="Atilde" k="182" /> +<hkern g1="quotedblleft" g2="Adieresis" k="182" /> +<hkern g1="quotedblleft" g2="Aring" k="182" /> +<hkern g1="quotedblleft" g2="AE" k="182" /> +<hkern g1="quotedblleft" g2="Ccedilla" k="46" /> +<hkern g1="quotedblleft" g2="Ograve" k="46" /> +<hkern g1="quotedblleft" g2="Oacute" k="46" /> +<hkern g1="quotedblleft" g2="Ocircumflex" k="46" /> +<hkern g1="quotedblleft" g2="Otilde" k="46" /> +<hkern g1="quotedblleft" g2="Odieresis" k="46" /> +<hkern g1="quotedblleft" g2="Oslash" k="46" /> +<hkern g1="quotedblleft" g2="Yacute" k="-30" /> +<hkern g1="quotedblleft" g2="agrave" k="64" /> +<hkern g1="quotedblleft" g2="aacute" k="64" /> +<hkern g1="quotedblleft" g2="acircumflex" k="64" /> +<hkern g1="quotedblleft" g2="atilde" k="64" /> +<hkern g1="quotedblleft" g2="adieresis" k="64" /> +<hkern g1="quotedblleft" g2="aring" k="64" /> +<hkern g1="quotedblleft" g2="ae" k="64" /> +<hkern g1="quotedblleft" g2="ccedilla" k="92" /> +<hkern g1="quotedblleft" g2="egrave" k="92" /> +<hkern g1="quotedblleft" g2="eacute" k="92" /> +<hkern g1="quotedblleft" g2="ecircumflex" k="92" /> +<hkern g1="quotedblleft" g2="edieresis" k="92" /> +<hkern g1="quotedblleft" g2="eth" k="92" /> +<hkern g1="quotedblleft" g2="ograve" k="92" /> +<hkern g1="quotedblleft" g2="oacute" k="92" /> +<hkern g1="quotedblleft" g2="ocircumflex" k="92" /> +<hkern g1="quotedblleft" g2="otilde" k="92" /> +<hkern g1="quotedblleft" g2="odieresis" k="92" /> +<hkern g1="quotedblleft" g2="oslash" k="92" /> +<hkern g1="quotedblleft" g2="OE" k="46" /> +<hkern g1="quotedblleft" g2="oe" k="92" /> +<hkern g1="quotedblleft" g2="endash" k="178" /> +<hkern g1="quotedblleft" g2="emdash" k="178" /> +<hkern g1="quotedblleft" g2="quotesinglbase" k="228" /> +<hkern g1="quotedblleft" g2="quotedblbase" k="228" /> +<hkern g1="quotedblleft" g2="bullet" k="178" /> +<hkern g1="quotedblleft" g2="guilsinglleft" k="178" /> +<hkern g1="quotedblleft" g2="guilsinglright" k="178" /> +<hkern g1="quotedblright" g2="ampersand" k="182" /> +<hkern g1="quotedblright" g2="comma" k="228" /> +<hkern g1="quotedblright" g2="hyphen" k="178" /> +<hkern g1="quotedblright" g2="period" k="228" /> +<hkern g1="quotedblright" g2="slash" k="182" /> +<hkern g1="quotedblright" g2="at" k="46" /> +<hkern g1="quotedblright" g2="A" k="182" /> +<hkern g1="quotedblright" g2="C" k="46" /> +<hkern g1="quotedblright" g2="G" k="46" /> +<hkern g1="quotedblright" g2="O" k="46" /> +<hkern g1="quotedblright" g2="Q" k="46" /> +<hkern g1="quotedblright" g2="V" k="-48" /> +<hkern g1="quotedblright" g2="W" k="-48" /> +<hkern g1="quotedblright" g2="Y" k="-30" /> +<hkern g1="quotedblright" g2="backslash" k="-48" /> +<hkern g1="quotedblright" g2="a" k="64" /> +<hkern g1="quotedblright" g2="c" k="92" /> +<hkern g1="quotedblright" g2="d" k="92" /> +<hkern g1="quotedblright" g2="e" k="92" /> +<hkern g1="quotedblright" g2="o" k="92" /> +<hkern g1="quotedblright" g2="q" k="92" /> +<hkern g1="quotedblright" g2="guillemotleft" k="178" /> +<hkern g1="quotedblright" g2="uni00AD" k="178" /> +<hkern g1="quotedblright" g2="middot" k="178" /> +<hkern g1="quotedblright" g2="guillemotright" k="178" /> +<hkern g1="quotedblright" g2="Agrave" k="182" /> +<hkern g1="quotedblright" g2="Aacute" k="182" /> +<hkern g1="quotedblright" g2="Acircumflex" k="182" /> +<hkern g1="quotedblright" g2="Atilde" k="182" /> +<hkern g1="quotedblright" g2="Adieresis" k="182" /> +<hkern g1="quotedblright" g2="Aring" k="182" /> +<hkern g1="quotedblright" g2="AE" k="182" /> +<hkern g1="quotedblright" g2="Ccedilla" k="46" /> +<hkern g1="quotedblright" g2="Ograve" k="46" /> +<hkern g1="quotedblright" g2="Oacute" k="46" /> +<hkern g1="quotedblright" g2="Ocircumflex" k="46" /> +<hkern g1="quotedblright" g2="Otilde" k="46" /> +<hkern g1="quotedblright" g2="Odieresis" k="46" /> +<hkern g1="quotedblright" g2="Oslash" k="46" /> +<hkern g1="quotedblright" g2="Yacute" k="-30" /> +<hkern g1="quotedblright" g2="agrave" k="64" /> +<hkern g1="quotedblright" g2="aacute" k="64" /> +<hkern g1="quotedblright" g2="acircumflex" k="64" /> +<hkern g1="quotedblright" g2="atilde" k="64" /> +<hkern g1="quotedblright" g2="adieresis" k="64" /> +<hkern g1="quotedblright" g2="aring" k="64" /> +<hkern g1="quotedblright" g2="ae" k="64" /> +<hkern g1="quotedblright" g2="ccedilla" k="92" /> +<hkern g1="quotedblright" g2="egrave" k="92" /> +<hkern g1="quotedblright" g2="eacute" k="92" /> +<hkern g1="quotedblright" g2="ecircumflex" k="92" /> +<hkern g1="quotedblright" g2="edieresis" k="92" /> +<hkern g1="quotedblright" g2="eth" k="92" /> +<hkern g1="quotedblright" g2="ograve" k="92" /> +<hkern g1="quotedblright" g2="oacute" k="92" /> +<hkern g1="quotedblright" g2="ocircumflex" k="92" /> +<hkern g1="quotedblright" g2="otilde" k="92" /> +<hkern g1="quotedblright" g2="odieresis" k="92" /> +<hkern g1="quotedblright" g2="oslash" k="92" /> +<hkern g1="quotedblright" g2="OE" k="46" /> +<hkern g1="quotedblright" g2="oe" k="92" /> +<hkern g1="quotedblright" g2="endash" k="178" /> +<hkern g1="quotedblright" g2="emdash" k="178" /> +<hkern g1="quotedblright" g2="quotesinglbase" k="228" /> +<hkern g1="quotedblright" g2="quotedblbase" k="228" /> +<hkern g1="quotedblright" g2="bullet" k="178" /> +<hkern g1="quotedblright" g2="guilsinglleft" k="178" /> +<hkern g1="quotedblright" g2="guilsinglright" k="178" /> +<hkern g1="quotedblbase" g2="quotedbl" k="228" /> +<hkern g1="quotedblbase" g2="quotesingle" k="228" /> +<hkern g1="quotedblbase" g2="asterisk" k="228" /> +<hkern g1="quotedblbase" g2="hyphen" k="136" /> +<hkern g1="quotedblbase" g2="at" k="56" /> +<hkern g1="quotedblbase" g2="C" k="56" /> +<hkern g1="quotedblbase" g2="G" k="56" /> +<hkern g1="quotedblbase" g2="O" k="56" /> +<hkern g1="quotedblbase" g2="Q" k="56" /> +<hkern g1="quotedblbase" g2="T" k="180" /> +<hkern g1="quotedblbase" g2="V" k="180" /> +<hkern g1="quotedblbase" g2="W" k="122" /> +<hkern g1="quotedblbase" g2="Y" k="152" /> +<hkern g1="quotedblbase" g2="backslash" k="180" /> +<hkern g1="quotedblbase" g2="v" k="132" /> +<hkern g1="quotedblbase" g2="w" k="62" /> +<hkern g1="quotedblbase" g2="y" k="132" /> +<hkern g1="quotedblbase" g2="ordfeminine" k="228" /> +<hkern g1="quotedblbase" g2="guillemotleft" k="136" /> +<hkern g1="quotedblbase" g2="uni00AD" k="136" /> +<hkern g1="quotedblbase" g2="degree" k="228" /> +<hkern g1="quotedblbase" g2="middot" k="136" /> +<hkern g1="quotedblbase" g2="ordmasculine" k="228" /> +<hkern g1="quotedblbase" g2="guillemotright" k="136" /> +<hkern g1="quotedblbase" g2="Ccedilla" k="56" /> +<hkern g1="quotedblbase" g2="Ograve" k="56" /> +<hkern g1="quotedblbase" g2="Oacute" k="56" /> +<hkern g1="quotedblbase" g2="Ocircumflex" k="56" /> +<hkern g1="quotedblbase" g2="Otilde" k="56" /> +<hkern g1="quotedblbase" g2="Odieresis" k="56" /> +<hkern g1="quotedblbase" g2="Oslash" k="56" /> +<hkern g1="quotedblbase" g2="Yacute" k="152" /> +<hkern g1="quotedblbase" g2="OE" k="56" /> +<hkern g1="quotedblbase" g2="endash" k="136" /> +<hkern g1="quotedblbase" g2="emdash" k="136" /> +<hkern g1="quotedblbase" g2="quoteleft" k="228" /> +<hkern g1="quotedblbase" g2="quoteright" k="228" /> +<hkern g1="quotedblbase" g2="quotedblleft" k="228" /> +<hkern g1="quotedblbase" g2="quotedblright" k="228" /> +<hkern g1="quotedblbase" g2="bullet" k="136" /> +<hkern g1="quotedblbase" g2="guilsinglleft" k="136" /> +<hkern g1="quotedblbase" g2="guilsinglright" k="136" /> +<hkern g1="bullet" g2="quotedbl" k="178" /> +<hkern g1="bullet" g2="ampersand" k="52" /> +<hkern g1="bullet" g2="quotesingle" k="178" /> +<hkern g1="bullet" g2="asterisk" k="178" /> +<hkern g1="bullet" g2="comma" k="136" /> +<hkern g1="bullet" g2="period" k="136" /> +<hkern g1="bullet" g2="slash" k="52" /> +<hkern g1="bullet" g2="A" k="52" /> +<hkern g1="bullet" g2="T" k="180" /> +<hkern g1="bullet" g2="V" k="112" /> +<hkern g1="bullet" g2="W" k="32" /> +<hkern g1="bullet" g2="X" k="62" /> +<hkern g1="bullet" g2="Y" k="160" /> +<hkern g1="bullet" g2="Z" k="46" /> +<hkern g1="bullet" g2="backslash" k="112" /> +<hkern g1="bullet" g2="ordfeminine" k="178" /> +<hkern g1="bullet" g2="degree" k="178" /> +<hkern g1="bullet" g2="ordmasculine" k="178" /> +<hkern g1="bullet" g2="Agrave" k="52" /> +<hkern g1="bullet" g2="Aacute" k="52" /> +<hkern g1="bullet" g2="Acircumflex" k="52" /> +<hkern g1="bullet" g2="Atilde" k="52" /> +<hkern g1="bullet" g2="Adieresis" k="52" /> +<hkern g1="bullet" g2="Aring" k="52" /> +<hkern g1="bullet" g2="AE" k="52" /> +<hkern g1="bullet" g2="Yacute" k="160" /> +<hkern g1="bullet" g2="quoteleft" k="178" /> +<hkern g1="bullet" g2="quoteright" k="178" /> +<hkern g1="bullet" g2="quotesinglbase" k="136" /> +<hkern g1="bullet" g2="quotedblleft" k="178" /> +<hkern g1="bullet" g2="quotedblright" k="178" /> +<hkern g1="bullet" g2="quotedblbase" k="136" /> +<hkern g1="guilsinglleft" g2="quotedbl" k="178" /> +<hkern g1="guilsinglleft" g2="ampersand" k="52" /> +<hkern g1="guilsinglleft" g2="quotesingle" k="178" /> +<hkern g1="guilsinglleft" g2="asterisk" k="178" /> +<hkern g1="guilsinglleft" g2="comma" k="136" /> +<hkern g1="guilsinglleft" g2="period" k="136" /> +<hkern g1="guilsinglleft" g2="slash" k="52" /> +<hkern g1="guilsinglleft" g2="A" k="52" /> +<hkern g1="guilsinglleft" g2="T" k="180" /> +<hkern g1="guilsinglleft" g2="V" k="112" /> +<hkern g1="guilsinglleft" g2="W" k="32" /> +<hkern g1="guilsinglleft" g2="X" k="62" /> +<hkern g1="guilsinglleft" g2="Y" k="160" /> +<hkern g1="guilsinglleft" g2="Z" k="46" /> +<hkern g1="guilsinglleft" g2="backslash" k="112" /> +<hkern g1="guilsinglleft" g2="ordfeminine" k="178" /> +<hkern g1="guilsinglleft" g2="degree" k="178" /> +<hkern g1="guilsinglleft" g2="ordmasculine" k="178" /> +<hkern g1="guilsinglleft" g2="Agrave" k="52" /> +<hkern g1="guilsinglleft" g2="Aacute" k="52" /> +<hkern g1="guilsinglleft" g2="Acircumflex" k="52" /> +<hkern g1="guilsinglleft" g2="Atilde" k="52" /> +<hkern g1="guilsinglleft" g2="Adieresis" k="52" /> +<hkern g1="guilsinglleft" g2="Aring" k="52" /> +<hkern g1="guilsinglleft" g2="AE" k="52" /> +<hkern g1="guilsinglleft" g2="Yacute" k="160" /> +<hkern g1="guilsinglleft" g2="quoteleft" k="178" /> +<hkern g1="guilsinglleft" g2="quoteright" k="178" /> +<hkern g1="guilsinglleft" g2="quotesinglbase" k="136" /> +<hkern g1="guilsinglleft" g2="quotedblleft" k="178" /> +<hkern g1="guilsinglleft" g2="quotedblright" k="178" /> +<hkern g1="guilsinglleft" g2="quotedblbase" k="136" /> +<hkern g1="guilsinglright" g2="quotedbl" k="178" /> +<hkern g1="guilsinglright" g2="ampersand" k="52" /> +<hkern g1="guilsinglright" g2="quotesingle" k="178" /> +<hkern g1="guilsinglright" g2="asterisk" k="178" /> +<hkern g1="guilsinglright" g2="comma" k="136" /> +<hkern g1="guilsinglright" g2="period" k="136" /> +<hkern g1="guilsinglright" g2="slash" k="52" /> +<hkern g1="guilsinglright" g2="A" k="52" /> +<hkern g1="guilsinglright" g2="T" k="180" /> +<hkern g1="guilsinglright" g2="V" k="112" /> +<hkern g1="guilsinglright" g2="W" k="32" /> +<hkern g1="guilsinglright" g2="X" k="62" /> +<hkern g1="guilsinglright" g2="Y" k="160" /> +<hkern g1="guilsinglright" g2="Z" k="46" /> +<hkern g1="guilsinglright" g2="backslash" k="112" /> +<hkern g1="guilsinglright" g2="ordfeminine" k="178" /> +<hkern g1="guilsinglright" g2="degree" k="178" /> +<hkern g1="guilsinglright" g2="ordmasculine" k="178" /> +<hkern g1="guilsinglright" g2="Agrave" k="52" /> +<hkern g1="guilsinglright" g2="Aacute" k="52" /> +<hkern g1="guilsinglright" g2="Acircumflex" k="52" /> +<hkern g1="guilsinglright" g2="Atilde" k="52" /> +<hkern g1="guilsinglright" g2="Adieresis" k="52" /> +<hkern g1="guilsinglright" g2="Aring" k="52" /> +<hkern g1="guilsinglright" g2="AE" k="52" /> +<hkern g1="guilsinglright" g2="Yacute" k="160" /> +<hkern g1="guilsinglright" g2="quoteleft" k="178" /> +<hkern g1="guilsinglright" g2="quoteright" k="178" /> +<hkern g1="guilsinglright" g2="quotesinglbase" k="136" /> +<hkern g1="guilsinglright" g2="quotedblleft" k="178" /> +<hkern g1="guilsinglright" g2="quotedblright" k="178" /> +<hkern g1="guilsinglright" g2="quotedblbase" k="136" /> +</font> +</defs> +</svg> diff --git a/client/css/fonts/Lato-regular/Lato-regular.ttf b/client/css/fonts/Lato-regular/Lato-regular.ttf new file mode 100755 index 00000000..7608bc3e Binary files /dev/null and b/client/css/fonts/Lato-regular/Lato-regular.ttf differ diff --git a/client/css/fonts/Lato-regular/Lato-regular.woff b/client/css/fonts/Lato-regular/Lato-regular.woff new file mode 100755 index 00000000..fe27504d Binary files /dev/null and b/client/css/fonts/Lato-regular/Lato-regular.woff differ diff --git a/client/css/fonts/Lato-regular/Lato-regular.woff2 b/client/css/fonts/Lato-regular/Lato-regular.woff2 new file mode 100755 index 00000000..c83fe955 Binary files /dev/null and b/client/css/fonts/Lato-regular/Lato-regular.woff2 differ diff --git a/client/css/fonts/Open-Sans-300/LICENSE.txt b/client/css/fonts/Open-Sans-300/LICENSE.txt new file mode 100755 index 00000000..d6456956 --- /dev/null +++ b/client/css/fonts/Open-Sans-300/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/client/css/fonts/Open-Sans-300/Open-Sans-300.eot b/client/css/fonts/Open-Sans-300/Open-Sans-300.eot new file mode 100755 index 00000000..5219d9e2 Binary files /dev/null and b/client/css/fonts/Open-Sans-300/Open-Sans-300.eot differ diff --git a/client/css/fonts/Open-Sans-300/Open-Sans-300.svg b/client/css/fonts/Open-Sans-300/Open-Sans-300.svg new file mode 100755 index 00000000..851d83c7 --- /dev/null +++ b/client/css/fonts/Open-Sans-300/Open-Sans-300.svg @@ -0,0 +1,1633 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg xmlns="http://www.w3.org/2000/svg"> +<defs > +<font id="OpenSans" horiz-adv-x="1159" ><font-face + font-family="Open Sans Light" + units-per-em="2048" + panose-1="2 11 3 6 3 5 4 2 2 4" + ascent="2189" + descent="-600" + alphabetic="0" /> +<glyph unicode=" " glyph-name="space" horiz-adv-x="532" /> +<glyph unicode="!" glyph-name="exclam" horiz-adv-x="492" d="M276 377H215L186 1462H305L276 377ZM164 78Q164 176 244 176Q326 176 326 78Q326 -20 244 -20Q164 -20 164 78Z" /> +<glyph unicode=""" glyph-name="quotedbl" horiz-adv-x="723" d="M260 1462L227 934H166L133 1462H260ZM590 1462L557 934H496L463 1462H590Z" /> +<glyph unicode="#" glyph-name="numbersign" horiz-adv-x="1323" d="M967 928L891 530H1194V451H874L788 0H698L786 451H426L340 0H252L338 451H55V530H354L430 928H133V1008H444L530 1462H621L532 1008H897L985 1462H1071L983 1008H1268V928H967ZM440 530H803L881 +928H518L440 530Z" /> +<glyph unicode="$" glyph-name="dollar" horiz-adv-x="1169" d="M991 440Q991 307 892 223T618 117V-119H537V113Q445 115 337 135T164 186V289Q239 253 343 228T537 203V711Q392 755 322 799T220 903T188 1049Q188 1173 282 1257T537 1362V1554H618V1364Q815 +1355 969 1292L936 1202Q795 1264 618 1274V788Q831 722 911 644T991 440ZM881 444Q881 529 818 584T618 680V209Q740 222 810 284T881 444ZM297 1049Q297 963 354 908T537 815V1268Q418 1252 358 1192T297 1049Z" /> +<glyph unicode="%" glyph-name="percent" horiz-adv-x="1653" d="M211 1026Q211 840 256 747T397 653Q590 653 590 1026Q590 1210 541 1302T397 1395Q301 1395 256 1303T211 1026ZM688 1026Q688 800 613 683T397 565Q264 565 189 685T113 1026Q113 1249 185 1366T397 +1483Q536 1483 612 1363T688 1026ZM1063 438Q1063 253 1108 161T1249 68Q1442 68 1442 438Q1442 807 1249 807Q1153 807 1108 716T1063 438ZM1540 438Q1540 212 1466 95T1251 -23Q1115 -23 1040 98T965 438Q965 663 1038 779T1251 895Q1388 895 1464 775T1540 438ZM1280 +1462L469 0H373L1184 1462H1280Z" /> +<glyph unicode="&" glyph-name="ampersand" horiz-adv-x="1460" d="M123 371Q123 509 196 606T471 811L396 893Q330 964 298 1032T266 1174Q266 1317 361 1401T618 1485Q773 1485 863 1404T954 1180Q954 1075 884 988T631 793L1083 336Q1144 408 1187 493T1262 +694H1358Q1295 448 1149 268L1415 0H1280L1087 197Q995 107 923 66T766 2T571 -20Q362 -20 243 83T123 371ZM578 70Q706 70 812 113T1022 260L539 745Q403 673 343 623T255 513T227 375Q227 232 320 151T578 70ZM373 1176Q373 1097 413 1030T565 856Q724 941 786 +1015T848 1184Q848 1278 786 1336T618 1395Q504 1395 439 1337T373 1176Z" /> +<glyph unicode="'" glyph-name="quotesingle" horiz-adv-x="393" d="M260 1462L227 934H166L133 1462H260Z" /> +<glyph unicode="(" glyph-name="parenleft" horiz-adv-x="557" d="M82 561Q82 826 159 1057T383 1462H496Q348 1280 269 1050T190 563Q190 80 494 -324H383Q236 -154 159 73T82 561Z" /> +<glyph unicode=")" glyph-name="parenright" horiz-adv-x="557" d="M475 561Q475 298 398 71T174 -324H63Q367 80 367 563Q367 820 288 1050T61 1462H174Q321 1287 398 1056T475 561Z" /> +<glyph unicode="*" glyph-name="asterisk" horiz-adv-x="1128" d="M631 1556L594 1151L999 1255L1020 1124L625 1085L872 745L748 674L557 1053L377 674L252 745L494 1085L104 1124L123 1255L524 1151L485 1556H631Z" /> +<glyph unicode="+" glyph-name="plus" horiz-adv-x="1169" d="M625 764H1059V682H625V250H543V682H111V764H543V1198H625V764Z" /> +<glyph unicode="," glyph-name="comma" horiz-adv-x="440" d="M295 238L307 217Q232 -48 133 -264H68Q145 11 178 238H295Z" /> +<glyph unicode="-" glyph-name="hyphen" horiz-adv-x="659" d="M92 512V594H567V512H92Z" /> +<glyph unicode="." glyph-name="period" horiz-adv-x="487" d="M162 78Q162 176 242 176Q324 176 324 78Q324 -20 242 -20Q162 -20 162 78Z" /> +<glyph unicode="/" glyph-name="slash" horiz-adv-x="698" d="M674 1462L129 0H25L569 1462H674Z" /> +<glyph unicode="0" glyph-name="zero" horiz-adv-x="1169" d="M1055 735Q1055 350 938 165T582 -20Q353 -20 234 170T115 735Q115 1117 230 1301T582 1485Q813 1485 934 1295T1055 735ZM223 735Q223 395 312 233T582 70Q771 70 857 238T944 735Q944 1059 858 1227T582 +1395Q393 1395 308 1227T223 735Z" /> +<glyph unicode="1" glyph-name="one" horiz-adv-x="1169" d="M682 0H584V1065Q584 1210 596 1366Q581 1351 565 1337T256 1094L199 1165L596 1462H682V0Z" /> +<glyph unicode="2" glyph-name="two" horiz-adv-x="1169" d="M1028 0H113V88L502 494Q666 664 732 754T829 926T860 1098Q860 1229 774 1311T551 1393Q368 1393 201 1260L147 1329Q330 1483 553 1483Q744 1483 853 1381T963 1100Q963 955 890 820T621 485L246 +100V96H1028V0Z" /> +<glyph unicode="3" glyph-name="three" horiz-adv-x="1169" d="M979 1118Q979 982 894 889T664 770V764Q840 742 932 652T1024 410Q1024 205 885 93T483 -20Q260 -20 94 63V162Q178 118 282 93T479 68Q700 68 811 157T922 410Q922 555 809 633T475 711H317V807H477Q659 +807 765 893T872 1128Q872 1250 786 1323T559 1397Q450 1397 360 1367T158 1262L109 1329Q194 1400 314 1441T557 1483Q759 1483 869 1388T979 1118Z" /> +<glyph unicode="4" glyph-name="four" horiz-adv-x="1169" d="M1141 373H889V0H795V373H43V440L768 1470H889V459H1141V373ZM795 459V877Q795 1179 809 1384H801Q781 1347 678 1196L162 459H795Z" /> +<glyph unicode="5" glyph-name="five" horiz-adv-x="1169" d="M537 879Q771 879 905 766T1040 455Q1040 230 900 105T514 -20Q405 -20 307 1T143 63V166Q251 111 335 90T514 68Q706 68 822 169T938 444Q938 607 825 700T518 793Q388 793 246 754L186 793L244 1462H948V1366H338L293 +850Q449 879 537 879Z" /> +<glyph unicode="6" glyph-name="six" horiz-adv-x="1169" d="M131 623Q131 908 208 1102T428 1391T772 1485Q866 1485 944 1462V1374Q871 1401 768 1401Q521 1401 384 1223T229 705H242Q318 803 416 853T623 903Q828 903 943 786T1059 463Q1059 239 938 110T610 +-20Q388 -20 260 149T131 623ZM610 68Q774 68 865 171T956 465Q956 633 866 727T621 821Q519 821 432 776T292 657T240 504Q240 393 289 291T423 128T610 68Z" /> +<glyph unicode="7" glyph-name="seven" horiz-adv-x="1169" d="M334 0L936 1366H109V1462H1055V1389L451 0H334Z" /> +<glyph unicode="8" glyph-name="eight" horiz-adv-x="1169" d="M582 1487Q768 1487 881 1392T995 1135Q995 1023 925 937T696 778Q888 699 966 605T1044 377Q1044 196 918 88T578 -20Q357 -20 239 81T121 375Q121 506 204 605T461 774Q300 850 234 934T168 1137Q168 +1242 221 1321T369 1444T582 1487ZM223 360Q223 222 316 146T578 70Q742 70 842 150T942 369Q942 493 864 570T561 733Q377 662 300 576T223 360ZM580 1397Q439 1397 354 1328T268 1137Q268 1067 299 1014T390 917T590 815Q753 878 824 954T895 1137Q895 1257 811 +1327T580 1397Z" /> +<glyph unicode="9" glyph-name="nine" horiz-adv-x="1169" d="M1036 842Q1036 554 961 360T741 73T391 -20Q287 -20 199 6V92Q242 78 302 71T395 63Q642 63 782 241T938 762H926Q853 666 752 615T541 563Q338 563 225 675T111 993Q111 1213 235 1349T559 1485Q703 +1485 811 1410T977 1188T1036 842ZM559 1397Q401 1397 307 1291T213 999Q213 825 300 735T549 645Q650 645 737 690T876 809T928 961Q928 1078 882 1180T752 1339T559 1397Z" /> +<glyph unicode=":" glyph-name="colon" horiz-adv-x="487" d="M162 78Q162 176 242 176Q324 176 324 78Q324 -20 242 -20Q162 -20 162 78ZM162 971Q162 1069 242 1069Q324 1069 324 971Q324 918 301 895T242 872Q208 872 185 895T162 971Z" /> +<glyph unicode=";" glyph-name="semicolon" horiz-adv-x="487" d="M303 238L315 217Q240 -48 141 -264H76Q105 -167 138 -19T186 238H303ZM162 971Q162 1069 242 1069Q324 1069 324 971Q324 918 301 895T242 872Q208 872 185 895T162 971Z" /> +<glyph unicode="<" glyph-name="less" horiz-adv-x="1169" d="M1059 266L111 682V743L1059 1217V1122L236 717L1059 362V266Z" /> +<glyph unicode="=" glyph-name="equal" horiz-adv-x="1169" d="M111 885V967H1059V885H111ZM111 477V559H1059V477H111Z" /> +<glyph unicode=">" glyph-name="greater" horiz-adv-x="1169" d="M111 362L934 717L111 1122V1217L1059 743V682L111 266V362Z" /> +<glyph unicode="?" glyph-name="question" horiz-adv-x="862" d="M293 377V414Q293 537 330 615T469 782L560 861Q632 922 663 982T694 1120Q694 1247 611 1322T391 1397Q312 1397 243 1380T94 1323L57 1403Q167 1451 241 1467T395 1483Q578 1483 683 1385T788 +1114Q788 1046 770 995T720 901T641 817T539 729Q475 675 441 631T391 537T375 391V377H293ZM260 78Q260 176 340 176Q422 176 422 78Q422 -20 340 -20Q260 -20 260 78Z" /> +<glyph unicode="@" glyph-name="at" horiz-adv-x="1815" d="M1702 725Q1702 497 1612 359T1366 221Q1277 221 1222 275T1157 422H1153Q1110 322 1029 272T840 221Q692 221 611 317T530 588Q530 790 650 918T965 1047Q1103 1047 1251 1006L1229 542V512Q1229 408 +1264 356T1380 303Q1483 303 1548 419T1614 723Q1614 917 1535 1063T1310 1287T975 1366Q745 1366 570 1267T300 985T205 567Q205 245 372 70T846 -106Q939 -106 1034 -88T1266 -18V-117Q1063 -197 852 -197Q503 -197 308 3T113 561Q113 817 221 1021T528 1339T977 +1452Q1192 1452 1357 1363T1612 1109T1702 725ZM633 590Q633 447 688 375T862 303Q1117 303 1135 649L1151 940Q1072 967 958 967Q809 967 721 865T633 590Z" /> +<glyph unicode="A" glyph-name="A" horiz-adv-x="1229" d="M911 516H317L113 0H0L588 1468H653L1229 0H1114L911 516ZM354 608H877L678 1135Q653 1197 618 1307Q591 1211 559 1133L354 608Z" /> +<glyph unicode="B" glyph-name="B" horiz-adv-x="1284" d="M207 1462H608Q879 1462 1006 1370T1133 1092Q1133 965 1056 881T829 772V766Q1004 740 1086 656T1169 420Q1169 218 1035 109T655 0H207V1462ZM309 811H631Q837 811 930 879T1024 1094Q1024 1240 919 +1306T604 1372H309V811ZM309 721V90H653Q1059 90 1059 420Q1059 721 631 721H309Z" /> +<glyph unicode="C" glyph-name="C" horiz-adv-x="1272" d="M831 1391Q556 1391 398 1215T240 733Q240 420 389 247T815 74Q999 74 1153 121V31Q1008 -20 791 -20Q483 -20 306 179T129 735Q129 958 213 1128T456 1390T825 1483Q1039 1483 1208 1403L1167 1311Q1007 +1391 831 1391Z" /> +<glyph unicode="D" glyph-name="D" horiz-adv-x="1446" d="M1317 745Q1317 377 1124 189T557 0H207V1462H602Q952 1462 1134 1279T1317 745ZM1206 741Q1206 1055 1047 1213T578 1372H309V90H551Q1206 90 1206 741Z" /> +<glyph unicode="E" glyph-name="E" horiz-adv-x="1130" d="M1006 0H207V1462H1006V1368H309V815H967V721H309V94H1006V0Z" /> +<glyph unicode="F" glyph-name="F" horiz-adv-x="1028" d="M309 0H207V1462H1008V1368H309V748H969V653H309V0Z" /> +<glyph unicode="G" glyph-name="G" horiz-adv-x="1481" d="M782 737H1321V70Q1109 -20 844 -20Q498 -20 314 175T129 729Q129 952 220 1124T482 1391T874 1485Q1113 1485 1303 1397L1262 1305Q1072 1393 868 1393Q579 1393 410 1215T240 733Q240 403 401 237T874 +70Q1076 70 1217 127V641H782V737Z" /> +<glyph unicode="H" glyph-name="H" horiz-adv-x="1473" d="M1266 0H1163V719H309V0H207V1462H309V813H1163V1462H1266V0Z" /> +<glyph unicode="I" glyph-name="I" horiz-adv-x="516" d="M207 0V1462H309V0H207Z" /> +<glyph unicode="J" glyph-name="J" horiz-adv-x="506" d="M-33 -369Q-125 -369 -184 -342V-254Q-106 -274 -35 -274Q207 -274 207 -10V1462H309V0Q309 -369 -33 -369Z" /> +<glyph unicode="K" glyph-name="K" horiz-adv-x="1190" d="M1190 0H1065L504 772L309 600V0H207V1462H309V702L471 864L1044 1462H1174L575 844L1190 0Z" /> +<glyph unicode="L" glyph-name="L" horiz-adv-x="1051" d="M207 0V1462H309V96H1006V0H207Z" /> +<glyph unicode="M" glyph-name="M" horiz-adv-x="1767" d="M850 0L305 1350H297Q305 1226 305 1096V0H207V1462H365L883 176H889L1407 1462H1561V0H1458V1108Q1458 1224 1470 1348H1462L915 0H850Z" /> +<glyph unicode="N" glyph-name="N" horiz-adv-x="1477" d="M1270 0H1167L301 1298H293Q305 1066 305 948V0H207V1462H309L1174 166H1180Q1171 346 1171 508V1462H1270V0Z" /> +<glyph unicode="O" glyph-name="O" horiz-adv-x="1565" d="M1436 733Q1436 385 1262 183T782 -20Q477 -20 303 182T129 735Q129 1084 304 1284T784 1485Q1090 1485 1263 1284T1436 733ZM240 733Q240 419 380 248T782 76Q1046 76 1185 246T1325 733Q1325 1049 1186 +1217T784 1386Q523 1386 382 1216T240 733Z" /> +<glyph unicode="P" glyph-name="P" horiz-adv-x="1198" d="M1087 1042Q1087 830 943 717T535 604H309V0H207V1462H565Q1087 1462 1087 1042ZM309 692H510Q757 692 867 773T977 1038Q977 1207 873 1288T551 1370H309V692Z" /> +<glyph unicode="Q" glyph-name="Q" horiz-adv-x="1565" d="M1436 733Q1436 439 1310 247T961 0L1294 -348H1128L846 -18L813 -20H782Q477 -20 303 182T129 735Q129 1084 304 1284T784 1485Q1090 1485 1263 1284T1436 733ZM240 733Q240 419 380 248T782 76Q1046 +76 1185 246T1325 733Q1325 1049 1186 1217T784 1386Q523 1386 382 1216T240 733Z" /> +<glyph unicode="R" glyph-name="R" horiz-adv-x="1217" d="M309 637V0H207V1462H555Q827 1462 957 1362T1087 1059Q1087 912 1010 811T774 666L1171 0H1049L672 637H309ZM309 725H588Q773 725 875 807T977 1051Q977 1218 877 1294T551 1370H309V725Z" /> +<glyph unicode="S" glyph-name="S" horiz-adv-x="1116" d="M1014 377Q1014 194 880 87T522 -20Q254 -20 111 39V141Q269 74 514 74Q694 74 799 156T905 373Q905 456 870 510T756 610T524 707Q300 784 215 873T129 1112Q129 1276 257 1379T588 1483Q794 1483 975 +1405L938 1317Q756 1393 590 1393Q428 1393 332 1318T236 1114Q236 1033 265 981T362 888T592 788Q763 729 849 674T974 548T1014 377Z" /> +<glyph unicode="T" glyph-name="T" horiz-adv-x="1073" d="M588 0H485V1366H10V1462H1063V1366H588V0Z" /> +<glyph unicode="U" glyph-name="U" horiz-adv-x="1473" d="M1282 1462V516Q1282 264 1136 122T729 -20Q475 -20 333 122T190 520V1462H293V516Q293 305 410 188T741 70Q950 70 1065 185T1180 506V1462H1282Z" /> +<glyph unicode="V" glyph-name="V" horiz-adv-x="1182" d="M1071 1462H1182L635 0H545L0 1462H109L477 467Q561 242 590 129Q610 204 669 362L1071 1462Z" /> +<glyph unicode="W" glyph-name="W" horiz-adv-x="1827" d="M1372 0H1288L967 1128Q927 1267 907 1356Q891 1269 862 1156T539 0H453L51 1462H158L414 520Q429 463 442 415T465 324T484 242T500 162Q524 298 602 575L852 1462H965L1258 444Q1309 268 1331 160Q1344 +232 1364 313T1673 1462H1776L1372 0Z" /> +<glyph unicode="X" glyph-name="X" horiz-adv-x="1102" d="M1102 0H985L553 682L113 0H0L492 762L45 1462H160L555 836L956 1462H1065L612 764L1102 0Z" /> +<glyph unicode="Y" glyph-name="Y" horiz-adv-x="1081" d="M543 662L971 1462H1081L594 565V0H489V557L0 1462H117L543 662Z" /> +<glyph unicode="Z" glyph-name="Z" horiz-adv-x="1180" d="M1098 0H82V76L938 1366H121V1462H1075V1386L217 96H1098V0Z" /> +<glyph unicode="[" glyph-name="bracketleft" horiz-adv-x="653" d="M602 -324H174V1462H602V1368H272V-229H602V-324Z" /> +<glyph unicode="\" glyph-name="backslash" horiz-adv-x="698" d="M127 1462L674 0H571L25 1462H127Z" /> +<glyph unicode="]" glyph-name="bracketright" horiz-adv-x="653" d="M51 -229H381V1368H51V1462H479V-324H51V-229Z" /> +<glyph unicode="^" glyph-name="asciicircum" horiz-adv-x="1169" d="M88 561L553 1473H621L1081 561H981L586 1352L188 561H88Z" /> +<glyph unicode="_" glyph-name="underscore" horiz-adv-x="842" d="M846 -266H-4V-184H846V-266Z" /> +<glyph unicode="`" glyph-name="grave" horiz-adv-x="1182" d="M776 1241H707Q611 1320 519 1412T393 1552V1569H535Q561 1521 633 1427T776 1257V1241Z" /> +<glyph unicode="a" glyph-name="a" horiz-adv-x="1085" d="M842 0L817 172H809Q727 67 641 24T436 -20Q276 -20 187 62T98 289Q98 448 230 536T614 629L821 635V707Q821 862 758 941T555 1020Q404 1020 242 936L205 1022Q384 1106 559 1106Q738 1106 826 1013T915 +723V0H842ZM442 70Q616 70 716 169T817 446V553L627 545Q398 534 301 474T203 285Q203 183 265 127T442 70Z" /> +<glyph unicode="b" glyph-name="b" horiz-adv-x="1219" d="M641 1108Q869 1108 984 965T1100 545Q1100 274 979 127T637 -20Q521 -20 428 28T281 164H272L244 0H182V1556H281V1165Q281 1077 277 1003L274 918H281Q343 1016 430 1062T641 1108ZM639 1018Q447 1018 +364 908T281 545V528Q281 282 367 175T637 68Q815 68 905 192T995 547Q995 1018 639 1018Z" /> +<glyph unicode="c" glyph-name="c" horiz-adv-x="973" d="M616 -20Q383 -20 251 127T119 537Q119 807 256 957T631 1108Q772 1108 901 1059L874 971Q733 1018 629 1018Q429 1018 326 895T223 539Q223 319 326 195T614 70Q762 70 889 123V31Q785 -20 616 -20Z" /> +<glyph unicode="d" glyph-name="d" horiz-adv-x="1219" d="M580 1108Q698 1108 784 1065T938 918H944Q938 1044 938 1165V1556H1036V0H971L946 166H938Q814 -20 582 -20Q357 -20 238 120T119 528Q119 810 237 959T580 1108ZM580 1018Q402 1018 313 893T223 530Q223 +68 582 68Q766 68 852 175T938 528V545Q938 797 854 907T580 1018Z" /> +<glyph unicode="e" glyph-name="e" horiz-adv-x="1124" d="M621 -20Q384 -20 252 126T119 535Q119 795 247 951T592 1108Q784 1108 895 974T1006 610V530H223Q225 306 327 188T621 70Q714 70 784 83T963 139V49Q871 9 793 -5T621 -20ZM592 1020Q435 1020 340 917T229 +618H901Q901 807 819 913T592 1020Z" /> +<glyph unicode="f" glyph-name="f" horiz-adv-x="614" d="M586 1001H330V0H231V1001H29V1059L231 1096V1180Q231 1380 304 1473T545 1567Q635 1567 725 1540L702 1454Q622 1479 543 1479Q427 1479 379 1411T330 1188V1087H586V1001Z" /> +<glyph unicode="g" glyph-name="g" horiz-adv-x="1071" d="M1030 1087V1018L805 1004Q895 892 895 758Q895 601 791 504T510 406Q436 406 406 412Q347 381 316 339T285 250Q285 198 324 174T457 150H647Q824 150 918 79T1012 -133Q1012 -305 873 -398T475 -492Q270 +-492 158 -413T45 -193Q45 -81 114 -7T303 94Q254 115 225 153T195 242Q195 351 334 434Q239 473 186 556T133 748Q133 911 236 1009T516 1108Q623 1108 682 1087H1030ZM150 -184Q150 -408 483 -408Q911 -408 911 -135Q911 -37 844 7T627 51H449Q150 51 150 -184ZM233 +748Q233 622 309 553T514 483Q650 483 722 552T795 752Q795 891 721 960T512 1030Q382 1030 308 956T233 748Z" /> +<glyph unicode="h" glyph-name="h" horiz-adv-x="1208" d="M940 0V705Q940 869 871 943T657 1018Q462 1018 372 920T281 600V0H182V1556H281V1061L276 922H283Q344 1020 437 1064T668 1108Q1038 1108 1038 711V0H940Z" /> +<glyph unicode="i" glyph-name="i" horiz-adv-x="463" d="M281 0H182V1087H281V0ZM168 1389Q168 1485 231 1485Q262 1485 279 1460T297 1389Q297 1344 280 1318T231 1292Q168 1292 168 1389Z" /> +<glyph unicode="j" glyph-name="j" horiz-adv-x="463" d="M37 -492Q-43 -492 -98 -467V-381Q-29 -401 31 -401Q182 -401 182 -225V1087H281V-211Q281 -346 218 -419T37 -492ZM168 1389Q168 1485 231 1485Q262 1485 279 1460T297 1389Q297 1344 280 1318T231 1292Q168 +1292 168 1389Z" /> +<glyph unicode="k" glyph-name="k" horiz-adv-x="991" d="M279 477L834 1087H954L526 623L991 0H872L459 549L281 387V0H182V1556H281V776L274 477H279Z" /> +<glyph unicode="l" glyph-name="l" horiz-adv-x="463" d="M281 0H182V1556H281V0Z" /> +<glyph unicode="m" glyph-name="m" horiz-adv-x="1808" d="M1540 0V713Q1540 872 1478 945T1288 1018Q1121 1018 1041 926T961 637V0H860V743Q860 1018 608 1018Q437 1018 359 919T281 600V0H182V1087H264L285 938H291Q336 1019 419 1063T602 1108Q859 1108 932 +915H936Q989 1008 1078 1058T1282 1108Q1460 1108 1549 1013T1638 711V0H1540Z" /> +<glyph unicode="n" glyph-name="n" horiz-adv-x="1208" d="M940 0V705Q940 869 871 943T657 1018Q462 1018 372 920T281 600V0H182V1087H266L285 938H291Q397 1108 668 1108Q1038 1108 1038 711V0H940Z" /> +<glyph unicode="o" glyph-name="o" horiz-adv-x="1200" d="M1081 545Q1081 279 952 130T596 -20Q453 -20 344 49T177 247T119 545Q119 811 248 959T602 1108Q826 1108 953 958T1081 545ZM223 545Q223 321 321 196T600 70Q780 70 878 195T977 545Q977 770 878 894T598 +1018Q418 1018 321 895T223 545Z" /> +<glyph unicode="p" glyph-name="p" horiz-adv-x="1219" d="M647 -20Q396 -20 281 168H274L277 84Q281 10 281 -78V-492H182V1087H266L285 932H291Q403 1108 649 1108Q869 1108 984 964T1100 543Q1100 275 979 128T647 -20ZM645 68Q812 68 903 192T995 539Q995 +1018 649 1018Q459 1018 370 914T281 573V541Q281 286 366 177T645 68Z" /> +<glyph unicode="q" glyph-name="q" horiz-adv-x="1219" d="M569 -20Q355 -20 237 122T119 532Q119 807 237 957T575 1108Q811 1108 928 934H934L952 1087H1036V-492H938V-78Q938 44 944 170H938Q820 -20 569 -20ZM571 68Q769 68 853 177T938 543V555Q938 800 853 +909T582 1018Q406 1018 315 894T223 530Q223 301 312 185T571 68Z" /> +<glyph unicode="r" glyph-name="r" horiz-adv-x="797" d="M610 1108Q679 1108 758 1094L739 999Q671 1016 598 1016Q459 1016 370 898T281 600V0H182V1087H266L276 891H283Q350 1011 426 1059T610 1108Z" /> +<glyph unicode="s" glyph-name="s" horiz-adv-x="954" d="M856 283Q856 137 745 59T430 -20Q212 -20 84 47V154Q248 72 430 72Q591 72 674 125T758 268Q758 350 692 406T473 516Q310 575 244 617T145 713T111 844Q111 966 213 1037T500 1108Q676 1108 834 1042L797 +952Q637 1018 500 1018Q367 1018 289 974T211 852Q211 767 271 716T508 602Q655 549 722 507T822 410T856 283Z" /> +<glyph unicode="t" glyph-name="t" horiz-adv-x="686" d="M469 68Q563 68 633 84V4Q561 -20 467 -20Q323 -20 255 57T186 299V1001H25V1059L186 1104L236 1350H287V1087H606V1001H287V313Q287 188 331 128T469 68Z" /> +<glyph unicode="u" glyph-name="u" horiz-adv-x="1208" d="M268 1087V383Q268 219 337 145T551 70Q745 70 836 168T928 487V1087H1026V0H942L924 150H918Q812 -20 541 -20Q170 -20 170 377V1087H268Z" /> +<glyph unicode="v" glyph-name="v" horiz-adv-x="940" d="M420 0L0 1087H102L383 348Q439 206 467 100H473Q514 236 557 350L838 1087H940L520 0H420Z" /> +<glyph unicode="w" glyph-name="w" horiz-adv-x="1481" d="M1051 0L813 727Q790 801 754 944H748L727 870L682 725L440 0H342L31 1087H137L311 457Q372 223 391 113H397Q456 347 483 424L707 1087H797L1010 426Q1082 191 1098 115H1104Q1112 180 1184 463L1350 +1087H1450L1155 0H1051Z" /> +<glyph unicode="x" glyph-name="x" horiz-adv-x="1020" d="M449 559L70 1087H184L508 629L829 1087H938L565 559L965 0H850L508 485L164 0H55L449 559Z" /> +<glyph unicode="y" glyph-name="y" horiz-adv-x="940" d="M0 1087H102L332 477Q437 196 465 98H471Q513 227 608 483L838 1087H940L453 -176Q394 -330 354 -384T261 -465T131 -492Q74 -492 4 -471V-385Q62 -401 129 -401Q180 -401 219 -377T289 -303T362 -143T416 +0L0 1087Z" /> +<glyph unicode="z" glyph-name="z" horiz-adv-x="944" d="M858 0H82V63L727 999H129V1087H856V1024L207 88H858V0Z" /> +<glyph unicode="{" glyph-name="braceleft" horiz-adv-x="723" d="M389 -27Q389 -129 448 -179T651 -233V-324Q456 -324 374 -249T291 -18V319Q291 524 61 528V608Q183 610 237 659T291 807V1157Q291 1456 651 1462V1372Q513 1367 451 1314T389 1157V852Q389 722 +345 658T203 573V565Q300 545 344 482T389 295V-27Z" /> +<glyph unicode="|" glyph-name="bar" horiz-adv-x="1108" d="M508 1561H600V-506H508V1561Z" /> +<glyph unicode="}" glyph-name="braceright" horiz-adv-x="723" d="M334 295Q334 418 378 481T520 565V573Q423 593 379 657T334 852V1157Q334 1260 273 1313T72 1372V1462Q246 1462 339 1385T432 1157V807Q432 707 486 659T662 608V528Q432 524 432 319V-18Q432 +-173 350 -248T72 -324V-233Q213 -231 273 -181T334 -27V295Z" /> +<glyph unicode="~" glyph-name="asciitilde" horiz-adv-x="1169" d="M334 745Q285 745 226 715T111 625V719Q219 829 344 829Q405 829 459 816T614 758Q740 700 834 700Q890 700 943 730T1059 825V729Q1011 680 955 648T825 616Q709 616 555 688Q431 745 334 745Z" /> +<glyph unicode=" " glyph-name="nbspace" horiz-adv-x="532" /> +<glyph unicode="¡" glyph-name="exclamdown" horiz-adv-x="492" d="M215 711H276L305 -375H186L215 711ZM166 1010Q166 1108 246 1108Q328 1108 328 1010Q328 957 305 934T246 911Q212 911 189 934T166 1010Z" /> +<glyph unicode="¢" glyph-name="cent" horiz-adv-x="1169" d="M602 190Q416 220 314 365T211 745Q211 977 313 1126T602 1309V1483H684V1317H698Q829 1317 973 1262L942 1178Q808 1229 705 1229Q518 1229 417 1107T315 748Q315 523 415 399T696 274Q827 274 +963 332V240Q853 184 696 184H684V-20H602V190Z" /> +<glyph unicode="£" glyph-name="sterling" horiz-adv-x="1169" d="M412 676V420Q412 304 377 224T264 96H1073V0H78V84Q188 105 249 194T311 418V676H100V758H311V1055Q311 1259 409 1370T690 1481Q865 1481 1020 1413L985 1327Q828 1393 690 1393Q549 1393 +481 1312T412 1059V758H823V676H412Z" /> +<glyph unicode="¤" glyph-name="currency" horiz-adv-x="1169" d="M991 723Q991 572 901 467L1040 326L981 266L844 408Q734 315 584 315Q431 315 324 408L186 266L127 326L266 467Q176 573 176 723Q176 870 266 981L127 1122L186 1182L324 1040Q427 1133 +584 1133Q739 1133 844 1040L981 1182L1040 1122L901 981Q991 870 991 723ZM584 395Q718 395 812 490T907 723Q907 859 812 956T584 1053Q450 1053 355 956T260 723Q260 587 354 491T584 395Z" /> +<glyph unicode="¥" glyph-name="yen" horiz-adv-x="1169" d="M586 666L1014 1462H1124L692 674H975V592H637V387H975V305H637V0H532V305H195V387H532V592H195V674H473L43 1462H160L586 666Z" /> +<glyph unicode="¦" glyph-name="brokenbar" horiz-adv-x="1108" d="M508 1561H600V797H508V1561ZM508 258H600V-506H508V258Z" /> +<glyph unicode="§" glyph-name="section" horiz-adv-x="1057" d="M145 813Q145 896 195 965T334 1073Q248 1120 209 1175T170 1311Q170 1428 271 1494T547 1561Q722 1561 883 1497L848 1417Q757 1451 690 1464T545 1477Q411 1477 340 1433T268 1313Q268 1259 +293 1225T379 1159T567 1085Q759 1021 831 953T903 782Q903 609 717 508Q803 466 846 412T889 276Q889 141 776 69T465 -4Q373 -4 294 11T129 63V158Q311 80 461 80Q623 80 708 129T793 270Q793 325 768 357T680 423T489 502Q289 575 217 643T145 813ZM246 825Q246 +760 277 721T383 646T633 547Q715 588 759 645T803 766Q803 828 771 868T663 945T426 1032Q345 1009 296 953T246 825Z" /> +<glyph unicode="¨" glyph-name="dieresis" horiz-adv-x="1182" d="M336 1389Q336 1435 351 1455T399 1475Q463 1475 463 1389Q463 1303 399 1303Q336 1303 336 1389ZM717 1389Q717 1435 732 1455T780 1475Q844 1475 844 1389Q844 1303 780 1303Q717 1303 717 1389Z" /> +<glyph unicode="©" glyph-name="copyright" horiz-adv-x="1704" d="M897 1092Q755 1092 675 998T594 733Q594 547 668 458T889 369Q973 369 1087 412V324Q985 279 879 279Q692 279 591 394T489 725Q489 933 600 1057T897 1182Q1016 1182 1124 1130L1087 1047Q989 +1092 897 1092ZM100 731Q100 931 200 1106T475 1382T852 1483Q1052 1483 1227 1383T1503 1108T1604 731Q1604 534 1507 361T1235 84T852 -20Q645 -20 470 83T198 360T100 731ZM193 731Q193 553 281 402T522 161T852 72Q1030 72 1181 160T1422 401T1511 731Q1511 +905 1426 1056T1187 1299T852 1391Q676 1391 524 1303T282 1060T193 731Z" /> +<glyph unicode="ª" glyph-name="ordfeminine" horiz-adv-x="686" d="M512 813L487 885Q403 801 285 801Q190 801 134 850T78 989Q78 1089 158 1140T399 1200L494 1204V1247Q494 1324 456 1361T350 1399Q263 1399 154 1350L121 1423Q238 1479 352 1479Q580 +1479 580 1264V813H512ZM168 993Q168 939 203 908T299 877Q389 877 441 927T494 1069V1133L406 1128Q290 1122 229 1092T168 993Z" /> +<glyph unicode="«" glyph-name="guillemotleft" horiz-adv-x="885" d="M82 543L391 936L453 893L199 530L453 168L391 125L82 516V543ZM442 543L752 936L813 893L559 530L813 168L752 125L442 516V543Z" /> +<glyph unicode="¬" glyph-name="logicalnot" horiz-adv-x="1169" d="M1038 764V270H956V682H111V764H1038Z" /> +<glyph unicode="­" glyph-name="uni00AD" horiz-adv-x="659" d="M92 512V594H567V512H92Z" /> +<glyph unicode="®" glyph-name="registered" horiz-adv-x="1704" d="M709 731H821Q912 731 964 777T1016 913Q1016 1085 819 1085H709V731ZM1120 918Q1120 839 1082 779T971 684L1208 291H1087L877 651H709V291H608V1171H819Q962 1171 1041 1109T1120 918ZM100 +731Q100 931 200 1106T475 1382T852 1483Q1052 1483 1227 1383T1503 1108T1604 731Q1604 534 1507 361T1235 84T852 -20Q645 -20 470 83T198 360T100 731ZM193 731Q193 553 281 402T522 161T852 72Q1030 72 1181 160T1422 401T1511 731Q1511 905 1426 1056T1187 +1299T852 1391Q676 1391 524 1303T282 1060T193 731Z" /> +<glyph unicode="¯" glyph-name="overscore" horiz-adv-x="1024" d="M1030 1556H-6V1638H1030V1556Z" /> +<glyph unicode="°" glyph-name="degree" horiz-adv-x="877" d="M139 1184Q139 1316 225 1399T438 1483Q564 1483 650 1400T737 1184Q737 1052 651 969T438 885Q308 885 224 968T139 1184ZM229 1184Q229 1093 290 1030T438 967Q524 967 585 1029T647 1184Q647 +1276 587 1338T438 1401Q348 1401 289 1337T229 1184Z" /> +<glyph unicode="±" glyph-name="plusminus" horiz-adv-x="1169" d="M111 1V83H1059V1H111ZM625 764H1059V682H625V250H543V682H111V764H543V1198H625V764Z" /> +<glyph unicode="²" glyph-name="twosuperior" horiz-adv-x="688" d="M629 586H53V664L295 901Q420 1022 467 1094T514 1243Q514 1314 468 1355T344 1397Q236 1397 127 1315L78 1380Q197 1483 348 1483Q472 1483 542 1420T612 1245Q612 1198 599 1156T559 +1071T491 981T182 674H629V586Z" /> +<glyph unicode="³" glyph-name="threesuperior" horiz-adv-x="688" d="M616 1260Q616 1182 572 1129T455 1053Q641 1008 641 842Q641 712 553 641T305 569Q161 569 41 629V717Q177 655 307 655Q422 655 481 704T541 840Q541 923 482 962T303 1001H172V1085H307Q412 +1085 465 1128T518 1249Q518 1316 471 1356T344 1397Q216 1397 98 1319L51 1389Q181 1483 344 1483Q471 1483 543 1423T616 1260Z" /> +<glyph unicode="´" glyph-name="acute" horiz-adv-x="1182" d="M393 1257Q466 1336 537 1428T635 1569H776V1552Q740 1500 654 1414T463 1241H393V1257Z" /> +<glyph unicode="µ" glyph-name="mu" horiz-adv-x="1221" d="M281 1087V383Q281 219 350 145T563 70Q757 70 848 168T940 487V1087H1038V0H954L936 150H930Q880 73 780 27T563 -20Q464 -20 396 7T276 92Q281 0 281 -78V-492H182V1087H281Z" /> +<glyph unicode="¶" glyph-name="paragraph" horiz-adv-x="1341" d="M1106 -260H1006V1462H778V-260H678V559Q614 541 532 541Q316 541 215 666T113 1042Q113 1302 222 1429T563 1556H1106V-260Z" /> +<glyph unicode="·" glyph-name="middot" horiz-adv-x="487" d="M162 721Q162 819 242 819Q324 819 324 721Q324 623 242 623Q162 623 162 721Z" /> +<glyph unicode="¸" glyph-name="cedilla" horiz-adv-x="420" d="M393 -291Q393 -391 326 -441T137 -492Q69 -492 43 -481V-393Q73 -403 135 -403Q213 -403 254 -375T295 -295Q295 -201 102 -174L195 0H291L225 -117Q393 -154 393 -291Z" /> +<glyph unicode="¹" glyph-name="onesuperior" horiz-adv-x="688" d="M350 1462H442V586H344V1133Q344 1232 356 1366Q330 1343 123 1221L76 1298L350 1462Z" /> +<glyph unicode="º" glyph-name="ordmasculine" horiz-adv-x="739" d="M670 1141Q670 980 590 891T367 801Q224 801 147 887T70 1141Q70 1303 148 1391T371 1479Q513 1479 591 1392T670 1141ZM160 1141Q160 877 369 877Q578 877 578 1141Q578 1272 528 1335T369 +1399Q260 1399 210 1336T160 1141Z" /> +<glyph unicode="»" glyph-name="guillemotright" horiz-adv-x="885" d="M803 518L494 125L432 168L686 530L432 893L494 936L803 545V518ZM442 518L133 125L72 168L326 530L72 893L133 936L442 545V518Z" /> +<glyph unicode="¼" glyph-name="onequarter" horiz-adv-x="1516" d="M589 1462H681V586H583V1133Q583 1232 595 1366Q569 1343 362 1221L315 1298L589 1462ZM1148 1462L337 0H243L1054 1462H1148ZM1392 242H1263V1H1173V242H760V302L1167 883H1263V320H1392V242ZM1173 +320V541Q1173 673 1181 773Q1175 761 1160 738T864 320H1173Z" /> +<glyph unicode="½" glyph-name="onehalf" horiz-adv-x="1516" d="M541 1462H633V586H535V1133Q535 1232 547 1366Q521 1343 314 1221L267 1298L541 1462ZM1073 1462L262 0H168L979 1462H1073ZM1403 1H827V79L1069 316Q1194 437 1241 509T1288 658Q1288 729 +1242 770T1118 812Q1010 812 901 730L852 795Q971 898 1122 898Q1246 898 1316 835T1386 660Q1386 613 1373 571T1333 486T1265 396T956 89H1403V1Z" /> +<glyph unicode="¾" glyph-name="threequarters" horiz-adv-x="1516" d="M616 1260Q616 1182 572 1129T455 1053Q641 1008 641 842Q641 712 553 641T305 569Q161 569 41 629V717Q177 655 307 655Q422 655 481 704T541 840Q541 923 482 962T303 1001H172V1085H307Q412 +1085 465 1128T518 1249Q518 1316 471 1356T344 1397Q216 1397 98 1319L51 1389Q181 1483 344 1483Q471 1483 543 1423T616 1260ZM1300 1462L489 0H395L1206 1462H1300ZM1495 242H1366V1H1276V242H863V302L1270 883H1366V320H1495V242ZM1276 320V541Q1276 673 1284 +773Q1278 761 1263 738T967 320H1276Z" /> +<glyph unicode="¿" glyph-name="questiondown" horiz-adv-x="862" d="M569 711V674Q569 549 530 470T393 305L303 226Q230 165 199 106T168 -33Q168 -157 250 -233T471 -309Q596 -309 704 -263L768 -236L805 -315Q694 -363 620 -379T467 -395Q283 -395 179 +-296T74 -27Q74 43 94 97T152 199T324 358Q388 411 422 456T472 550T487 696V711H569ZM440 1010Q440 1108 520 1108Q602 1108 602 1010Q602 957 579 934T520 911Q486 911 463 934T440 1010Z" /> +<glyph unicode="À" glyph-name="Agrave" horiz-adv-x="1229" d="M911 516H317L113 0H0L588 1468H653L1229 0H1114L911 516ZM354 608H877L678 1135Q653 1197 618 1307Q591 1211 559 1133L354 608ZM720 1579H651Q555 1658 463 1750T337 1890V1907H479Q505 1859 +577 1765T720 1595V1579Z" /> +<glyph unicode="Á" glyph-name="Aacute" horiz-adv-x="1229" d="M911 516H317L113 0H0L588 1468H653L1229 0H1114L911 516ZM354 608H877L678 1135Q653 1197 618 1307Q591 1211 559 1133L354 608ZM504 1595Q577 1674 648 1766T746 1907H887V1890Q851 1838 +765 1752T574 1579H504V1595Z" /> +<glyph unicode="Â" glyph-name="Acircumflex" horiz-adv-x="1229" d="M911 516H317L113 0H0L588 1468H653L1229 0H1114L911 516ZM354 608H877L678 1135Q653 1197 618 1307Q591 1211 559 1133L354 608ZM328 1595Q390 1662 459 1751T570 1907H668Q736 1787 +910 1595V1579H840Q718 1680 619 1786Q511 1672 398 1579H328V1595Z" /> +<glyph unicode="Ã" glyph-name="Atilde" horiz-adv-x="1229" d="M911 516H317L113 0H0L588 1468H653L1229 0H1114L911 516ZM354 608H877L678 1135Q653 1197 618 1307Q591 1211 559 1133L354 608ZM784 1581Q748 1581 709 1599T608 1671Q576 1697 546 1717T483 +1737Q438 1737 408 1703T360 1581H287Q297 1692 350 1755T487 1819Q535 1819 575 1794T657 1735Q691 1707 723 1685T784 1663Q830 1663 861 1699T909 1819H985Q969 1703 916 1642T784 1581Z" /> +<glyph unicode="Ä" glyph-name="Adieresis" horiz-adv-x="1229" d="M911 516H317L113 0H0L588 1468H653L1229 0H1114L911 516ZM354 608H877L678 1135Q653 1197 618 1307Q591 1211 559 1133L354 608ZM367 1727Q367 1773 382 1793T430 1813Q494 1813 494 1727Q494 +1641 430 1641Q367 1641 367 1727ZM748 1727Q748 1773 763 1793T811 1813Q875 1813 875 1727Q875 1641 811 1641Q748 1641 748 1727Z" /> +<glyph unicode="Å" glyph-name="Aring" horiz-adv-x="1229" d="M911 516H317L113 0H0L588 1468H653L1229 0H1114L911 516ZM354 608H877L678 1135Q653 1197 618 1307Q591 1211 559 1133L354 608ZM836 1610Q836 1513 776 1455T619 1397Q522 1397 462 1455T402 +1610Q402 1704 462 1762T619 1821Q716 1821 776 1762T836 1610ZM482 1610Q482 1544 519 1507T619 1469Q681 1469 718 1506T756 1610Q756 1674 717 1711T619 1749Q557 1749 520 1711T482 1610Z" /> +<glyph unicode="Æ" glyph-name="AE" horiz-adv-x="1653" d="M1528 0H811V516H336L109 0H-2L651 1462H1528V1368H913V815H1489V721H913V94H1528V0ZM377 608H811V1368H711L377 608Z" /> +<glyph unicode="Ç" glyph-name="Ccedilla" horiz-adv-x="1272" d="M831 1391Q556 1391 398 1215T240 733Q240 420 389 247T815 74Q999 74 1153 121V31Q1008 -20 791 -20Q483 -20 306 179T129 735Q129 958 213 1128T456 1390T825 1483Q1039 1483 1208 1403L1167 +1311Q1007 1391 831 1391ZM911 -291Q911 -391 844 -441T655 -492Q587 -492 561 -481V-393Q591 -403 653 -403Q731 -403 772 -375T813 -295Q813 -201 620 -174L713 0H809L743 -117Q911 -154 911 -291Z" /> +<glyph unicode="È" glyph-name="Egrave" horiz-adv-x="1130" d="M1006 0H207V1462H1006V1368H309V815H967V721H309V94H1006V0ZM697 1579H628Q532 1658 440 1750T314 1890V1907H456Q482 1859 554 1765T697 1595V1579Z" /> +<glyph unicode="É" glyph-name="Eacute" horiz-adv-x="1130" d="M1006 0H207V1462H1006V1368H309V815H967V721H309V94H1006V0ZM463 1595Q536 1674 607 1766T705 1907H846V1890Q810 1838 724 1752T533 1579H463V1595Z" /> +<glyph unicode="Ê" glyph-name="Ecircumflex" horiz-adv-x="1130" d="M1006 0H207V1462H1006V1368H309V815H967V721H309V94H1006V0ZM315 1595Q377 1662 446 1751T557 1907H655Q723 1787 897 1595V1579H827Q705 1680 606 1786Q498 1672 385 1579H315V1595Z" /> +<glyph unicode="Ë" glyph-name="Edieresis" horiz-adv-x="1130" d="M1006 0H207V1462H1006V1368H309V815H967V721H309V94H1006V0ZM354 1727Q354 1773 369 1793T417 1813Q481 1813 481 1727Q481 1641 417 1641Q354 1641 354 1727ZM735 1727Q735 1773 750 1793T798 +1813Q862 1813 862 1727Q862 1641 798 1641Q735 1641 735 1727Z" /> +<glyph unicode="Ì" glyph-name="Igrave" horiz-adv-x="516" d="M207 0V1462H309V0H207ZM320 1579H251Q155 1658 63 1750T-63 1890V1907H79Q105 1859 177 1765T320 1595V1579Z" /> +<glyph unicode="Í" glyph-name="Iacute" horiz-adv-x="516" d="M207 0V1462H309V0H207ZM191 1595Q264 1674 335 1766T433 1907H574V1890Q538 1838 452 1752T261 1579H191V1595Z" /> +<glyph unicode="Î" glyph-name="Icircumflex" horiz-adv-x="516" d="M207 0V1462H309V0H207ZM-32 1595Q30 1662 99 1751T210 1907H308Q376 1787 550 1595V1579H480Q358 1680 259 1786Q151 1672 38 1579H-32V1595Z" /> +<glyph unicode="Ï" glyph-name="Idieresis" horiz-adv-x="516" d="M207 0V1462H309V0H207ZM5 1727Q5 1773 20 1793T68 1813Q132 1813 132 1727Q132 1641 68 1641Q5 1641 5 1727ZM386 1727Q386 1773 401 1793T449 1813Q513 1813 513 1727Q513 1641 449 1641Q386 +1641 386 1727Z" /> +<glyph unicode="Ð" glyph-name="Eth" horiz-adv-x="1466" d="M1317 745Q1317 377 1124 189T557 0H207V678H47V772H207V1462H602Q952 1462 1134 1279T1317 745ZM1206 741Q1206 1055 1047 1213T578 1372H309V772H715V678H309V90H551Q1206 90 1206 741Z" /> +<glyph unicode="Ñ" glyph-name="Ntilde" horiz-adv-x="1477" d="M1270 0H1167L301 1298H293Q305 1066 305 948V0H207V1462H309L1174 166H1180Q1171 346 1171 508V1462H1270V0ZM897 1581Q861 1581 822 1599T721 1671Q689 1697 659 1717T596 1737Q551 1737 +521 1703T473 1581H400Q410 1692 463 1755T600 1819Q648 1819 688 1794T770 1735Q804 1707 836 1685T897 1663Q943 1663 974 1699T1022 1819H1098Q1082 1703 1029 1642T897 1581Z" /> +<glyph unicode="Ò" glyph-name="Ograve" horiz-adv-x="1565" d="M1436 733Q1436 385 1262 183T782 -20Q477 -20 303 182T129 735Q129 1084 304 1284T784 1485Q1090 1485 1263 1284T1436 733ZM240 733Q240 419 380 248T782 76Q1046 76 1185 246T1325 733Q1325 +1049 1186 1217T784 1386Q523 1386 382 1216T240 733ZM885 1579H816Q720 1658 628 1750T502 1890V1907H644Q670 1859 742 1765T885 1595V1579Z" /> +<glyph unicode="Ó" glyph-name="Oacute" horiz-adv-x="1565" d="M1436 733Q1436 385 1262 183T782 -20Q477 -20 303 182T129 735Q129 1084 304 1284T784 1485Q1090 1485 1263 1284T1436 733ZM240 733Q240 419 380 248T782 76Q1046 76 1185 246T1325 733Q1325 +1049 1186 1217T784 1386Q523 1386 382 1216T240 733ZM686 1595Q759 1674 830 1766T928 1907H1069V1890Q1033 1838 947 1752T756 1579H686V1595Z" /> +<glyph unicode="Ô" glyph-name="Ocircumflex" horiz-adv-x="1565" d="M1436 733Q1436 385 1262 183T782 -20Q477 -20 303 182T129 735Q129 1084 304 1284T784 1485Q1090 1485 1263 1284T1436 733ZM240 733Q240 419 380 248T782 76Q1046 76 1185 246T1325 +733Q1325 1049 1186 1217T784 1386Q523 1386 382 1216T240 733ZM492 1595Q554 1662 623 1751T734 1907H832Q900 1787 1074 1595V1579H1004Q882 1680 783 1786Q675 1672 562 1579H492V1595Z" /> +<glyph unicode="Õ" glyph-name="Otilde" horiz-adv-x="1565" d="M1436 733Q1436 385 1262 183T782 -20Q477 -20 303 182T129 735Q129 1084 304 1284T784 1485Q1090 1485 1263 1284T1436 733ZM240 733Q240 419 380 248T782 76Q1046 76 1185 246T1325 733Q1325 +1049 1186 1217T784 1386Q523 1386 382 1216T240 733ZM940 1581Q904 1581 865 1599T764 1671Q732 1697 702 1717T639 1737Q594 1737 564 1703T516 1581H443Q453 1692 506 1755T643 1819Q691 1819 731 1794T813 1735Q847 1707 879 1685T940 1663Q986 1663 1017 1699T1065 +1819H1141Q1125 1703 1072 1642T940 1581Z" /> +<glyph unicode="Ö" glyph-name="Odieresis" horiz-adv-x="1565" d="M1436 733Q1436 385 1262 183T782 -20Q477 -20 303 182T129 735Q129 1084 304 1284T784 1485Q1090 1485 1263 1284T1436 733ZM240 733Q240 419 380 248T782 76Q1046 76 1185 246T1325 733Q1325 +1049 1186 1217T784 1386Q523 1386 382 1216T240 733ZM529 1727Q529 1773 544 1793T592 1813Q656 1813 656 1727Q656 1641 592 1641Q529 1641 529 1727ZM910 1727Q910 1773 925 1793T973 1813Q1037 1813 1037 1727Q1037 1641 973 1641Q910 1641 910 1727Z" /> +<glyph unicode="×" glyph-name="multiply" horiz-adv-x="1169" d="M584 780L993 1188L1051 1130L643 723L1049 315L991 258L584 666L178 258L121 315L526 723L119 1130L176 1188L584 780Z" /> +<glyph unicode="Ø" glyph-name="Oslash" horiz-adv-x="1565" d="M1436 733Q1436 385 1262 183T782 -20Q546 -20 387 100L301 -20L227 39L317 166Q129 366 129 735Q129 1084 304 1284T784 1485Q1016 1485 1176 1364L1284 1516L1356 1456L1245 1303Q1436 1096 +1436 733ZM1325 733Q1325 1048 1186 1219L444 182Q577 76 782 76Q1046 76 1185 246T1325 733ZM240 733Q240 421 379 250L1118 1284Q985 1386 784 1386Q523 1386 382 1216T240 733Z" /> +<glyph unicode="Ù" glyph-name="Ugrave" horiz-adv-x="1473" d="M1282 1462V516Q1282 264 1136 122T729 -20Q475 -20 333 122T190 520V1462H293V516Q293 305 410 188T741 70Q950 70 1065 185T1180 506V1462H1282ZM833 1579H764Q668 1658 576 1750T450 1890V1907H592Q618 +1859 690 1765T833 1595V1579Z" /> +<glyph unicode="Ú" glyph-name="Uacute" horiz-adv-x="1473" d="M1282 1462V516Q1282 264 1136 122T729 -20Q475 -20 333 122T190 520V1462H293V516Q293 305 410 188T741 70Q950 70 1065 185T1180 506V1462H1282ZM633 1595Q706 1674 777 1766T875 1907H1016V1890Q980 +1838 894 1752T703 1579H633V1595Z" /> +<glyph unicode="Û" glyph-name="Ucircumflex" horiz-adv-x="1473" d="M1282 1462V516Q1282 264 1136 122T729 -20Q475 -20 333 122T190 520V1462H293V516Q293 305 410 188T741 70Q950 70 1065 185T1180 506V1462H1282ZM444 1595Q506 1662 575 1751T686 1907H784Q852 +1787 1026 1595V1579H956Q834 1680 735 1786Q627 1672 514 1579H444V1595Z" /> +<glyph unicode="Ü" glyph-name="Udieresis" horiz-adv-x="1473" d="M1282 1462V516Q1282 264 1136 122T729 -20Q475 -20 333 122T190 520V1462H293V516Q293 305 410 188T741 70Q950 70 1065 185T1180 506V1462H1282ZM481 1727Q481 1773 496 1793T544 1813Q608 +1813 608 1727Q608 1641 544 1641Q481 1641 481 1727ZM862 1727Q862 1773 877 1793T925 1813Q989 1813 989 1727Q989 1641 925 1641Q862 1641 862 1727Z" /> +<glyph unicode="Ý" glyph-name="Yacute" horiz-adv-x="1081" d="M543 662L971 1462H1081L594 565V0H489V557L0 1462H117L543 662ZM434 1595Q507 1674 578 1766T676 1907H817V1890Q781 1838 695 1752T504 1579H434V1595Z" /> +<glyph unicode="Þ" glyph-name="Thorn" horiz-adv-x="1198" d="M1087 778Q1087 566 943 453T535 340H309V0H207V1462H309V1198H565Q1087 1198 1087 778ZM309 428H510Q757 428 867 509T977 774Q977 943 873 1024T551 1106H309V428Z" /> +<glyph unicode="ß" glyph-name="germandbls" horiz-adv-x="1194" d="M961 1284Q961 1145 822 1034Q741 970 712 934T682 858Q682 814 696 790T748 733T850 655Q956 580 1001 531T1069 428T1092 307Q1092 151 1004 66T758 -20Q663 -20 584 -2T457 47V154Q522 +116 605 92T758 68Q872 68 932 122T993 283Q993 366 954 427T805 563Q678 650 630 710T582 856Q582 916 614 966T721 1074Q795 1131 827 1179T860 1286Q860 1379 790 1429T588 1479Q443 1479 362 1410T281 1214V0H182V1206Q182 1379 285 1473T578 1567Q766 1567 +863 1495T961 1284Z" /> +<glyph unicode="à" glyph-name="agrave" horiz-adv-x="1085" d="M842 0L817 172H809Q727 67 641 24T436 -20Q276 -20 187 62T98 289Q98 448 230 536T614 629L821 635V707Q821 862 758 941T555 1020Q404 1020 242 936L205 1022Q384 1106 559 1106Q738 1106 +826 1013T915 723V0H842ZM442 70Q616 70 716 169T817 446V553L627 545Q398 534 301 474T203 285Q203 183 265 127T442 70ZM638 1241H569Q473 1320 381 1412T255 1552V1569H397Q423 1521 495 1427T638 1257V1241Z" /> +<glyph unicode="á" glyph-name="aacute" horiz-adv-x="1085" d="M842 0L817 172H809Q727 67 641 24T436 -20Q276 -20 187 62T98 289Q98 448 230 536T614 629L821 635V707Q821 862 758 941T555 1020Q404 1020 242 936L205 1022Q384 1106 559 1106Q738 1106 +826 1013T915 723V0H842ZM442 70Q616 70 716 169T817 446V553L627 545Q398 534 301 474T203 285Q203 183 265 127T442 70ZM422 1257Q495 1336 566 1428T664 1569H805V1552Q769 1500 683 1414T492 1241H422V1257Z" /> +<glyph unicode="â" glyph-name="acircumflex" horiz-adv-x="1085" d="M842 0L817 172H809Q727 67 641 24T436 -20Q276 -20 187 62T98 289Q98 448 230 536T614 629L821 635V707Q821 862 758 941T555 1020Q404 1020 242 936L205 1022Q384 1106 559 1106Q738 +1106 826 1013T915 723V0H842ZM442 70Q616 70 716 169T817 446V553L627 545Q398 534 301 474T203 285Q203 183 265 127T442 70ZM507 1257Q569 1324 638 1413T749 1569H847Q915 1449 1089 1257V1241H1019Q897 1342 798 1448Q690 1334 577 1241H507V1257Z" /> +<glyph unicode="ã" glyph-name="atilde" horiz-adv-x="1085" d="M842 0L817 172H809Q727 67 641 24T436 -20Q276 -20 187 62T98 289Q98 448 230 536T614 629L821 635V707Q821 862 758 941T555 1020Q404 1020 242 936L205 1022Q384 1106 559 1106Q738 1106 +826 1013T915 723V0H842ZM442 70Q616 70 716 169T817 446V553L627 545Q398 534 301 474T203 285Q203 183 265 127T442 70ZM953 1243Q917 1243 878 1261T777 1333Q745 1359 715 1379T652 1399Q607 1399 577 1365T529 1243H456Q466 1354 519 1417T656 1481Q704 1481 +744 1456T826 1397Q860 1369 892 1347T953 1325Q999 1325 1030 1361T1078 1481H1154Q1138 1365 1085 1304T953 1243Z" /> +<glyph unicode="ä" glyph-name="adieresis" horiz-adv-x="1085" d="M842 0L817 172H809Q727 67 641 24T436 -20Q276 -20 187 62T98 289Q98 448 230 536T614 629L821 635V707Q821 862 758 941T555 1020Q404 1020 242 936L205 1022Q384 1106 559 1106Q738 1106 +826 1013T915 723V0H842ZM442 70Q616 70 716 169T817 446V553L627 545Q398 534 301 474T203 285Q203 183 265 127T442 70ZM538 1389Q538 1435 553 1455T601 1475Q665 1475 665 1389Q665 1303 601 1303Q538 1303 538 1389ZM919 1389Q919 1435 934 1455T982 1475Q1046 +1475 1046 1389Q1046 1303 982 1303Q919 1303 919 1389Z" /> +<glyph unicode="å" glyph-name="aring" horiz-adv-x="1085" d="M842 0L817 172H809Q727 67 641 24T436 -20Q276 -20 187 62T98 289Q98 448 230 536T614 629L821 635V707Q821 862 758 941T555 1020Q404 1020 242 936L205 1022Q384 1106 559 1106Q738 1106 +826 1013T915 723V0H842ZM442 70Q616 70 716 169T817 446V553L627 545Q398 534 301 474T203 285Q203 183 265 127T442 70ZM1015 1456Q1015 1359 955 1301T798 1243Q701 1243 641 1301T581 1456Q581 1550 641 1608T798 1667Q895 1667 955 1608T1015 1456ZM661 1456Q661 +1390 698 1353T798 1315Q860 1315 897 1352T935 1456Q935 1520 896 1557T798 1595Q736 1595 699 1557T661 1456Z" /> +<glyph unicode="æ" glyph-name="ae" horiz-adv-x="1731" d="M1243 -20Q948 -20 846 236Q778 103 678 42T426 -20Q270 -20 184 62T98 289Q98 443 223 532T600 629L801 635V707Q801 862 740 941T541 1020Q393 1020 236 936L199 1022Q372 1106 545 1106Q806 +1106 870 895Q981 1108 1217 1108Q1401 1108 1506 974T1612 610V530H897Q897 70 1245 70Q1330 70 1395 82T1569 139V49Q1477 8 1404 -6T1243 -20ZM434 70Q603 70 700 169T797 446V553L610 545Q391 534 297 474T203 285Q203 183 264 127T434 70ZM1217 1020Q933 1020 +903 618H1507Q1507 806 1430 913T1217 1020Z" /> +<glyph unicode="ç" glyph-name="ccedilla" horiz-adv-x="973" d="M616 -20Q383 -20 251 127T119 537Q119 807 256 957T631 1108Q772 1108 901 1059L874 971Q733 1018 629 1018Q429 1018 326 895T223 539Q223 319 326 195T614 70Q762 70 889 123V31Q785 -20 +616 -20ZM723 -291Q723 -391 656 -441T467 -492Q399 -492 373 -481V-393Q403 -403 465 -403Q543 -403 584 -375T625 -295Q625 -201 432 -174L525 0H621L555 -117Q723 -154 723 -291Z" /> +<glyph unicode="è" glyph-name="egrave" horiz-adv-x="1124" d="M621 -20Q384 -20 252 126T119 535Q119 795 247 951T592 1108Q784 1108 895 974T1006 610V530H223Q225 306 327 188T621 70Q714 70 784 83T963 139V49Q871 9 793 -5T621 -20ZM592 1020Q435 +1020 340 917T229 618H901Q901 807 819 913T592 1020ZM941 1241H872Q776 1320 684 1412T558 1552V1569H700Q726 1521 798 1427T941 1257V1241Z" /> +<glyph unicode="é" glyph-name="eacute" horiz-adv-x="1124" d="M621 -20Q384 -20 252 126T119 535Q119 795 247 951T592 1108Q784 1108 895 974T1006 610V530H223Q225 306 327 188T621 70Q714 70 784 83T963 139V49Q871 9 793 -5T621 -20ZM592 1020Q435 +1020 340 917T229 618H901Q901 807 819 913T592 1020ZM452 1257Q525 1336 596 1428T694 1569H835V1552Q799 1500 713 1414T522 1241H452V1257Z" /> +<glyph unicode="ê" glyph-name="ecircumflex" horiz-adv-x="1124" d="M621 -20Q384 -20 252 126T119 535Q119 795 247 951T592 1108Q784 1108 895 974T1006 610V530H223Q225 306 327 188T621 70Q714 70 784 83T963 139V49Q871 9 793 -5T621 -20ZM592 1020Q435 +1020 340 917T229 618H901Q901 807 819 913T592 1020ZM546 1257Q608 1324 677 1413T788 1569H886Q954 1449 1128 1257V1241H1058Q936 1342 837 1448Q729 1334 616 1241H546V1257Z" /> +<glyph unicode="ë" glyph-name="edieresis" horiz-adv-x="1124" d="M621 -20Q384 -20 252 126T119 535Q119 795 247 951T592 1108Q784 1108 895 974T1006 610V530H223Q225 306 327 188T621 70Q714 70 784 83T963 139V49Q871 9 793 -5T621 -20ZM592 1020Q435 +1020 340 917T229 618H901Q901 807 819 913T592 1020ZM587 1389Q587 1435 602 1455T650 1475Q714 1475 714 1389Q714 1303 650 1303Q587 1303 587 1389ZM968 1389Q968 1435 983 1455T1031 1475Q1095 1475 1095 1389Q1095 1303 1031 1303Q968 1303 968 1389Z" /> +<glyph unicode="ì" glyph-name="igrave" horiz-adv-x="463" d="M281 0H182V1087H281V0ZM349 1241H280Q184 1320 92 1412T-34 1552V1569H108Q134 1521 206 1427T349 1257V1241Z" /> +<glyph unicode="í" glyph-name="iacute" horiz-adv-x="463" d="M281 0H182V1087H281V0ZM107 1257Q180 1336 251 1428T349 1569H490V1552Q454 1500 368 1414T177 1241H107V1257Z" /> +<glyph unicode="î" glyph-name="icircumflex" horiz-adv-x="463" d="M281 0H182V1087H281V0ZM-58 1257Q4 1324 73 1413T184 1569H282Q350 1449 524 1257V1241H454Q332 1342 233 1448Q125 1334 12 1241H-58V1257Z" /> +<glyph unicode="ï" glyph-name="idieresis" horiz-adv-x="463" d="M281 0H182V1087H281V0ZM-21 1389Q-21 1435 -6 1455T42 1475Q106 1475 106 1389Q106 1303 42 1303Q-21 1303 -21 1389ZM360 1389Q360 1435 375 1455T423 1475Q487 1475 487 1389Q487 1303 +423 1303Q360 1303 360 1389Z" /> +<glyph unicode="ð" glyph-name="eth" horiz-adv-x="1174" d="M1055 559Q1055 283 931 132T582 -20Q368 -20 243 110T117 471Q117 699 243 828T586 958Q694 958 773 925T922 829L926 831Q862 1101 657 1290L387 1133L338 1210L582 1356Q496 1418 383 1475L428 +1556Q575 1487 676 1411L901 1548L950 1464L748 1343Q902 1192 978 990T1055 559ZM950 557Q950 703 853 785T586 868Q401 868 311 768T221 463Q221 277 315 174T584 70Q763 70 856 193T950 557Z" /> +<glyph unicode="ñ" glyph-name="ntilde" horiz-adv-x="1208" d="M940 0V705Q940 869 871 943T657 1018Q462 1018 372 920T281 600V0H182V1087H266L285 938H291Q397 1108 668 1108Q1038 1108 1038 711V0H940ZM1035 1243Q999 1243 960 1261T859 1333Q827 1359 +797 1379T734 1399Q689 1399 659 1365T611 1243H538Q548 1354 601 1417T738 1481Q786 1481 826 1456T908 1397Q942 1369 974 1347T1035 1325Q1081 1325 1112 1361T1160 1481H1236Q1220 1365 1167 1304T1035 1243Z" /> +<glyph unicode="ò" glyph-name="ograve" horiz-adv-x="1200" d="M1081 545Q1081 279 952 130T596 -20Q453 -20 344 49T177 247T119 545Q119 811 248 959T602 1108Q826 1108 953 958T1081 545ZM223 545Q223 321 321 196T600 70Q780 70 878 195T977 545Q977 +770 878 894T598 1018Q418 1018 321 895T223 545ZM974 1241H905Q809 1320 717 1412T591 1552V1569H733Q759 1521 831 1427T974 1257V1241Z" /> +<glyph unicode="ó" glyph-name="oacute" horiz-adv-x="1200" d="M1081 545Q1081 279 952 130T596 -20Q453 -20 344 49T177 247T119 545Q119 811 248 959T602 1108Q826 1108 953 958T1081 545ZM223 545Q223 321 321 196T600 70Q780 70 878 195T977 545Q977 +770 878 894T598 1018Q418 1018 321 895T223 545ZM499 1257Q572 1336 643 1428T741 1569H882V1552Q846 1500 760 1414T569 1241H499V1257Z" /> +<glyph unicode="ô" glyph-name="ocircumflex" horiz-adv-x="1200" d="M1081 545Q1081 279 952 130T596 -20Q453 -20 344 49T177 247T119 545Q119 811 248 959T602 1108Q826 1108 953 958T1081 545ZM223 545Q223 321 321 196T600 70Q780 70 878 195T977 545Q977 +770 878 894T598 1018Q418 1018 321 895T223 545ZM309 1257Q371 1324 440 1413T551 1569H649Q717 1449 891 1257V1241H821Q699 1342 600 1448Q492 1334 379 1241H309V1257Z" /> +<glyph unicode="õ" glyph-name="otilde" horiz-adv-x="1200" d="M1081 545Q1081 279 952 130T596 -20Q453 -20 344 49T177 247T119 545Q119 811 248 959T602 1108Q826 1108 953 958T1081 545ZM223 545Q223 321 321 196T600 70Q780 70 878 195T977 545Q977 +770 878 894T598 1018Q418 1018 321 895T223 545ZM1017 1243Q981 1243 942 1261T841 1333Q809 1359 779 1379T716 1399Q671 1399 641 1365T593 1243H520Q530 1354 583 1417T720 1481Q768 1481 808 1456T890 1397Q924 1369 956 1347T1017 1325Q1063 1325 1094 1361T1142 +1481H1218Q1202 1365 1149 1304T1017 1243Z" /> +<glyph unicode="ö" glyph-name="odieresis" horiz-adv-x="1200" d="M1081 545Q1081 279 952 130T596 -20Q453 -20 344 49T177 247T119 545Q119 811 248 959T602 1108Q826 1108 953 958T1081 545ZM223 545Q223 321 321 196T600 70Q780 70 878 195T977 545Q977 +770 878 894T598 1018Q418 1018 321 895T223 545ZM346 1389Q346 1435 361 1455T409 1475Q473 1475 473 1389Q473 1303 409 1303Q346 1303 346 1389ZM727 1389Q727 1435 742 1455T790 1475Q854 1475 854 1389Q854 1303 790 1303Q727 1303 727 1389Z" /> +<glyph unicode="÷" glyph-name="divide" horiz-adv-x="1169" d="M111 682V764H1059V682H111ZM504 1075Q504 1174 584 1174Q666 1174 666 1075Q666 1023 643 1000T584 977Q550 977 527 1000T504 1075ZM504 371Q504 469 584 469Q666 469 666 371Q666 318 643 +295T584 272Q550 272 527 295T504 371Z" /> +<glyph unicode="ø" glyph-name="oslash" horiz-adv-x="1200" d="M1081 545Q1081 279 952 130T596 -20Q423 -20 305 78L219 -35L147 23L240 143Q119 296 119 545Q119 811 248 959T602 1108Q781 1108 903 1004L999 1128L1073 1073L969 936Q1081 789 1081 545ZM223 +545Q223 345 301 223L844 928Q746 1018 598 1018Q418 1018 321 895T223 545ZM977 545Q977 735 905 854L362 152Q456 70 600 70Q780 70 878 195T977 545Z" /> +<glyph unicode="ù" glyph-name="ugrave" horiz-adv-x="1208" d="M268 1087V383Q268 219 337 145T551 70Q745 70 836 168T928 487V1087H1026V0H942L924 150H918Q812 -20 541 -20Q170 -20 170 377V1087H268ZM943 1241H874Q778 1320 686 1412T560 1552V1569H702Q728 +1521 800 1427T943 1257V1241Z" /> +<glyph unicode="ú" glyph-name="uacute" horiz-adv-x="1208" d="M268 1087V383Q268 219 337 145T551 70Q745 70 836 168T928 487V1087H1026V0H942L924 150H918Q812 -20 541 -20Q170 -20 170 377V1087H268ZM495 1257Q568 1336 639 1428T737 1569H878V1552Q842 +1500 756 1414T565 1241H495V1257Z" /> +<glyph unicode="û" glyph-name="ucircumflex" horiz-adv-x="1208" d="M268 1087V383Q268 219 337 145T551 70Q745 70 836 168T928 487V1087H1026V0H942L924 150H918Q812 -20 541 -20Q170 -20 170 377V1087H268ZM313 1257Q375 1324 444 1413T555 1569H653Q721 +1449 895 1257V1241H825Q703 1342 604 1448Q496 1334 383 1241H313V1257Z" /> +<glyph unicode="ü" glyph-name="udieresis" horiz-adv-x="1208" d="M268 1087V383Q268 219 337 145T551 70Q745 70 836 168T928 487V1087H1026V0H942L924 150H918Q812 -20 541 -20Q170 -20 170 377V1087H268ZM350 1389Q350 1435 365 1455T413 1475Q477 1475 +477 1389Q477 1303 413 1303Q350 1303 350 1389ZM731 1389Q731 1435 746 1455T794 1475Q858 1475 858 1389Q858 1303 794 1303Q731 1303 731 1389Z" /> +<glyph unicode="ý" glyph-name="yacute" horiz-adv-x="940" d="M0 1087H102L332 477Q437 196 465 98H471Q513 227 608 483L838 1087H940L453 -176Q394 -330 354 -384T261 -465T131 -492Q74 -492 4 -471V-385Q62 -401 129 -401Q180 -401 219 -377T289 -303T362 +-143T416 0L0 1087ZM617 1257Q690 1336 761 1428T859 1569H1000V1552Q964 1500 878 1414T687 1241H617V1257Z" /> +<glyph unicode="þ" glyph-name="thorn" horiz-adv-x="1219" d="M281 918Q395 1108 649 1108Q869 1108 984 964T1100 543Q1100 275 979 128T647 -20Q396 -20 281 168H274L277 84Q281 10 281 -78V-492H182V1556H281V1165L274 918H281ZM645 68Q812 68 903 192T995 +539Q995 1018 647 1018Q454 1018 368 913T281 559V541Q281 286 366 177T645 68Z" /> +<glyph unicode="ÿ" glyph-name="ydieresis" horiz-adv-x="940" d="M0 1087H102L332 477Q437 196 465 98H471Q513 227 608 483L838 1087H940L453 -176Q394 -330 354 -384T261 -465T131 -492Q74 -492 4 -471V-385Q62 -401 129 -401Q180 -401 219 -377T289 -303T362 +-143T416 0L0 1087ZM470 1389Q470 1435 485 1455T533 1475Q597 1475 597 1389Q597 1303 533 1303Q470 1303 470 1389ZM851 1389Q851 1435 866 1455T914 1475Q978 1475 978 1389Q978 1303 914 1303Q851 1303 851 1389Z" /> +<glyph unicode="–" glyph-name="endash" horiz-adv-x="1024" d="M82 512V594H942V512H82Z" /> +<glyph unicode="—" glyph-name="emdash" horiz-adv-x="2048" d="M82 512V594H1966V512H82Z" /> +<glyph unicode="‘" glyph-name="quoteleft" horiz-adv-x="297" d="M41 961L29 981Q61 1093 110 1232T203 1462H268Q238 1361 204 1205T158 961H41Z" /> +<glyph unicode="’" glyph-name="quoteright" horiz-adv-x="297" d="M256 1462L268 1442Q193 1177 94 961H29Q58 1057 90 1202T139 1462H256Z" /> +<glyph unicode="‚" glyph-name="quotesinglbase" horiz-adv-x="451" d="M295 238L307 218Q232 -47 133 -263H68Q97 -167 129 -22T178 238H295Z" /> +<glyph unicode="“" glyph-name="quotedblleft" horiz-adv-x="614" d="M358 961L346 981Q380 1101 429 1236T520 1462H586Q556 1364 523 1214T475 961H358ZM41 961L29 981Q61 1093 110 1232T203 1462H268Q238 1361 204 1205T158 961H41Z" /> +<glyph unicode="”" glyph-name="quotedblright" horiz-adv-x="614" d="M256 1462L268 1442Q193 1177 94 961H29Q58 1057 90 1202T139 1462H256ZM573 1462L586 1442Q550 1314 501 1181T412 961H346Q376 1059 409 1209T457 1462H573Z" /> +<glyph unicode="„" glyph-name="quotedblbase" horiz-adv-x="768" d="M295 238L307 218Q232 -47 133 -263H68Q97 -167 129 -22T178 238H295ZM612 238L625 218Q589 90 540 -43T451 -263H385Q415 -165 448 -15T496 238H612Z" /> +<glyph unicode="•" glyph-name="bullet" horiz-adv-x="770" d="M231 748Q231 837 271 882T385 928Q458 928 498 881T539 748Q539 663 498 615T385 567Q313 567 272 614T231 748Z" /> +<glyph unicode="‹" glyph-name="guilsinglleft" horiz-adv-x="524" d="M82 543L391 936L453 893L199 530L453 168L391 125L82 516V543Z" /> +<glyph unicode="›" glyph-name="guilsinglright" horiz-adv-x="524" d="M442 518L133 125L72 168L326 530L72 893L133 936L442 545V518Z" /> +<hkern g1="quotedbl" g2="A" k="143" /> +<hkern g1="quotedbl" g2="T" k="-41" /> +<hkern g1="quotedbl" g2="V" k="-41" /> +<hkern g1="quotedbl" g2="W" k="-41" /> +<hkern g1="quotedbl" g2="Y" k="-20" /> +<hkern g1="quotedbl" g2="a" k="82" /> +<hkern g1="quotedbl" g2="c" k="123" /> +<hkern g1="quotedbl" g2="d" k="123" /> +<hkern g1="quotedbl" g2="e" k="123" /> +<hkern g1="quotedbl" g2="g" k="61" /> +<hkern g1="quotedbl" g2="m" k="61" /> +<hkern g1="quotedbl" g2="n" k="61" /> +<hkern g1="quotedbl" g2="o" k="123" /> +<hkern g1="quotedbl" g2="p" k="61" /> +<hkern g1="quotedbl" g2="q" k="123" /> +<hkern g1="quotedbl" g2="r" k="61" /> +<hkern g1="quotedbl" g2="s" k="61" /> +<hkern g1="quotedbl" g2="u" k="61" /> +<hkern g1="quotedbl" g2="Agrave" k="143" /> +<hkern g1="quotedbl" g2="Aacute" k="143" /> +<hkern g1="quotedbl" g2="Acircumflex" k="143" /> +<hkern g1="quotedbl" g2="Atilde" k="143" /> +<hkern g1="quotedbl" g2="Adieresis" k="143" /> +<hkern g1="quotedbl" g2="Aring" k="143" /> +<hkern g1="quotedbl" g2="Yacute" k="-20" /> +<hkern g1="quotedbl" g2="agrave" k="123" /> +<hkern g1="quotedbl" g2="aacute" k="82" /> +<hkern g1="quotedbl" g2="acircumflex" k="82" /> +<hkern g1="quotedbl" g2="atilde" k="82" /> +<hkern g1="quotedbl" g2="adieresis" k="82" /> +<hkern g1="quotedbl" g2="aring" k="82" /> +<hkern g1="quotedbl" g2="ae" k="82" /> +<hkern g1="quotedbl" g2="ccedilla" k="123" /> +<hkern g1="quotedbl" g2="egrave" k="123" /> +<hkern g1="quotedbl" g2="eacute" k="123" /> +<hkern g1="quotedbl" g2="ecircumflex" k="123" /> +<hkern g1="quotedbl" g2="edieresis" k="123" /> +<hkern g1="quotedbl" g2="ograve" k="123" /> +<hkern g1="quotedbl" g2="oacute" k="123" /> +<hkern g1="quotedbl" g2="ocircumflex" k="123" /> +<hkern g1="quotedbl" g2="otilde" k="123" /> +<hkern g1="quotedbl" g2="odieresis" k="123" /> +<hkern g1="quotedbl" g2="oslash" k="123" /> +<hkern g1="quotedbl" g2="ugrave" k="61" /> +<hkern g1="quotedbl" g2="uacute" k="61" /> +<hkern g1="quotedbl" g2="ucircumflex" k="61" /> +<hkern g1="quotedbl" g2="udieresis" k="61" /> +<hkern g1="quotedbl" g2="oe" k="123" /> +<hkern g1="quotesingle" g2="A" k="143" /> +<hkern g1="quotesingle" g2="T" k="-41" /> +<hkern g1="quotesingle" g2="V" k="-41" /> +<hkern g1="quotesingle" g2="W" k="-41" /> +<hkern g1="quotesingle" g2="Y" k="-20" /> +<hkern g1="quotesingle" g2="a" k="82" /> +<hkern g1="quotesingle" g2="c" k="123" /> +<hkern g1="quotesingle" g2="d" k="123" /> +<hkern g1="quotesingle" g2="e" k="123" /> +<hkern g1="quotesingle" g2="g" k="61" /> +<hkern g1="quotesingle" g2="m" k="61" /> +<hkern g1="quotesingle" g2="n" k="61" /> +<hkern g1="quotesingle" g2="o" k="123" /> +<hkern g1="quotesingle" g2="p" k="61" /> +<hkern g1="quotesingle" g2="q" k="123" /> +<hkern g1="quotesingle" g2="r" k="61" /> +<hkern g1="quotesingle" g2="s" k="61" /> +<hkern g1="quotesingle" g2="u" k="61" /> +<hkern g1="quotesingle" g2="Agrave" k="143" /> +<hkern g1="quotesingle" g2="Aacute" k="143" /> +<hkern g1="quotesingle" g2="Acircumflex" k="143" /> +<hkern g1="quotesingle" g2="Atilde" k="143" /> +<hkern g1="quotesingle" g2="Adieresis" k="143" /> +<hkern g1="quotesingle" g2="Aring" k="143" /> +<hkern g1="quotesingle" g2="Yacute" k="-20" /> +<hkern g1="quotesingle" g2="agrave" k="123" /> +<hkern g1="quotesingle" g2="aacute" k="82" /> +<hkern g1="quotesingle" g2="acircumflex" k="82" /> +<hkern g1="quotesingle" g2="atilde" k="82" /> +<hkern g1="quotesingle" g2="adieresis" k="82" /> +<hkern g1="quotesingle" g2="aring" k="82" /> +<hkern g1="quotesingle" g2="ae" k="82" /> +<hkern g1="quotesingle" g2="ccedilla" k="123" /> +<hkern g1="quotesingle" g2="egrave" k="123" /> +<hkern g1="quotesingle" g2="eacute" k="123" /> +<hkern g1="quotesingle" g2="ecircumflex" k="123" /> +<hkern g1="quotesingle" g2="edieresis" k="123" /> +<hkern g1="quotesingle" g2="ograve" k="123" /> +<hkern g1="quotesingle" g2="oacute" k="123" /> +<hkern g1="quotesingle" g2="ocircumflex" k="123" /> +<hkern g1="quotesingle" g2="otilde" k="123" /> +<hkern g1="quotesingle" g2="odieresis" k="123" /> +<hkern g1="quotesingle" g2="oslash" k="123" /> +<hkern g1="quotesingle" g2="ugrave" k="61" /> +<hkern g1="quotesingle" g2="uacute" k="61" /> +<hkern g1="quotesingle" g2="ucircumflex" k="61" /> +<hkern g1="quotesingle" g2="udieresis" k="61" /> +<hkern g1="quotesingle" g2="oe" k="123" /> +<hkern g1="parenleft" g2="J" k="-184" /> +<hkern g1="comma" g2="C" k="102" /> +<hkern g1="comma" g2="G" k="102" /> +<hkern g1="comma" g2="O" k="102" /> +<hkern g1="comma" g2="Q" k="102" /> +<hkern g1="comma" g2="T" k="143" /> +<hkern g1="comma" g2="U" k="41" /> +<hkern g1="comma" g2="V" k="123" /> +<hkern g1="comma" g2="W" k="123" /> +<hkern g1="comma" g2="Y" k="123" /> +<hkern g1="comma" g2="Ccedilla" k="102" /> +<hkern g1="comma" g2="Ograve" k="102" /> +<hkern g1="comma" g2="Oacute" k="102" /> +<hkern g1="comma" g2="Ocircumflex" k="102" /> +<hkern g1="comma" g2="Otilde" k="102" /> +<hkern g1="comma" g2="Odieresis" k="102" /> +<hkern g1="comma" g2="Oslash" k="102" /> +<hkern g1="comma" g2="Ugrave" k="41" /> +<hkern g1="comma" g2="Uacute" k="41" /> +<hkern g1="comma" g2="Ucircumflex" k="41" /> +<hkern g1="comma" g2="Udieresis" k="41" /> +<hkern g1="comma" g2="Yacute" k="123" /> +<hkern g1="comma" g2="OE" k="102" /> +<hkern g1="hyphen" g2="T" k="82" /> +<hkern g1="period" g2="C" k="102" /> +<hkern g1="period" g2="G" k="102" /> +<hkern g1="period" g2="O" k="102" /> +<hkern g1="period" g2="Q" k="102" /> +<hkern g1="period" g2="T" k="143" /> +<hkern g1="period" g2="U" k="41" /> +<hkern g1="period" g2="V" k="123" /> +<hkern g1="period" g2="W" k="123" /> +<hkern g1="period" g2="Y" k="123" /> +<hkern g1="period" g2="Ccedilla" k="102" /> +<hkern g1="period" g2="Ograve" k="102" /> +<hkern g1="period" g2="Oacute" k="102" /> +<hkern g1="period" g2="Ocircumflex" k="102" /> +<hkern g1="period" g2="Otilde" k="102" /> +<hkern g1="period" g2="Odieresis" k="102" /> +<hkern g1="period" g2="Oslash" k="102" /> +<hkern g1="period" g2="Ugrave" k="41" /> +<hkern g1="period" g2="Uacute" k="41" /> +<hkern g1="period" g2="Ucircumflex" k="41" /> +<hkern g1="period" g2="Udieresis" k="41" /> +<hkern g1="period" g2="Yacute" k="123" /> +<hkern g1="period" g2="OE" k="102" /> +<hkern g1="A" g2="quotedbl" k="143" /> +<hkern g1="A" g2="quotesingle" k="143" /> +<hkern g1="A" g2="C" k="41" /> +<hkern g1="A" g2="G" k="41" /> +<hkern g1="A" g2="J" k="-266" /> +<hkern g1="A" g2="O" k="41" /> +<hkern g1="A" g2="Q" k="41" /> +<hkern g1="A" g2="T" k="143" /> +<hkern g1="A" g2="V" k="82" /> +<hkern g1="A" g2="W" k="82" /> +<hkern g1="A" g2="Y" k="123" /> +<hkern g1="A" g2="Ccedilla" k="41" /> +<hkern g1="A" g2="Ograve" k="41" /> +<hkern g1="A" g2="Oacute" k="41" /> +<hkern g1="A" g2="Ocircumflex" k="41" /> +<hkern g1="A" g2="Otilde" k="41" /> +<hkern g1="A" g2="Odieresis" k="41" /> +<hkern g1="A" g2="Oslash" k="41" /> +<hkern g1="A" g2="Yacute" k="123" /> +<hkern g1="A" g2="OE" k="41" /> +<hkern g1="A" g2="quoteright" k="143" /> +<hkern g1="A" g2="quotedblright" k="143" /> +<hkern g1="B" g2="comma" k="82" /> +<hkern g1="B" g2="period" k="82" /> +<hkern g1="B" g2="A" k="41" /> +<hkern g1="B" g2="T" k="61" /> +<hkern g1="B" g2="V" k="20" /> +<hkern g1="B" g2="W" k="20" /> +<hkern g1="B" g2="X" k="41" /> +<hkern g1="B" g2="Y" k="20" /> +<hkern g1="B" g2="Z" k="20" /> +<hkern g1="B" g2="Agrave" k="41" /> +<hkern g1="B" g2="Aacute" k="41" /> +<hkern g1="B" g2="Acircumflex" k="41" /> +<hkern g1="B" g2="Atilde" k="41" /> +<hkern g1="B" g2="Adieresis" k="41" /> +<hkern g1="B" g2="Aring" k="41" /> +<hkern g1="B" g2="Yacute" k="20" /> +<hkern g1="B" g2="quotesinglbase" k="82" /> +<hkern g1="B" g2="quotedblbase" k="82" /> +<hkern g1="C" g2="C" k="41" /> +<hkern g1="C" g2="G" k="41" /> +<hkern g1="C" g2="O" k="41" /> +<hkern g1="C" g2="Q" k="41" /> +<hkern g1="C" g2="Ccedilla" k="41" /> +<hkern g1="C" g2="Ograve" k="41" /> +<hkern g1="C" g2="Oacute" k="41" /> +<hkern g1="C" g2="Ocircumflex" k="41" /> +<hkern g1="C" g2="Otilde" k="41" /> +<hkern g1="C" g2="Odieresis" k="41" /> +<hkern g1="C" g2="Oslash" k="41" /> +<hkern g1="C" g2="OE" k="41" /> +<hkern g1="D" g2="comma" k="82" /> +<hkern g1="D" g2="period" k="82" /> +<hkern g1="D" g2="A" k="41" /> +<hkern g1="D" g2="T" k="61" /> +<hkern g1="D" g2="V" k="20" /> +<hkern g1="D" g2="W" k="20" /> +<hkern g1="D" g2="X" k="41" /> +<hkern g1="D" g2="Y" k="20" /> +<hkern g1="D" g2="Z" k="20" /> +<hkern g1="D" g2="Agrave" k="41" /> +<hkern g1="D" g2="Aacute" k="41" /> +<hkern g1="D" g2="Acircumflex" k="41" /> +<hkern g1="D" g2="Atilde" k="41" /> +<hkern g1="D" g2="Adieresis" k="41" /> +<hkern g1="D" g2="Aring" k="41" /> +<hkern g1="D" g2="Yacute" k="20" /> +<hkern g1="D" g2="quotesinglbase" k="82" /> +<hkern g1="D" g2="quotedblbase" k="82" /> +<hkern g1="E" g2="J" k="-123" /> +<hkern g1="F" g2="comma" k="123" /> +<hkern g1="F" g2="period" k="123" /> +<hkern g1="F" g2="question" k="-41" /> +<hkern g1="F" g2="A" k="41" /> +<hkern g1="F" g2="Agrave" k="41" /> +<hkern g1="F" g2="Aacute" k="41" /> +<hkern g1="F" g2="Acircumflex" k="41" /> +<hkern g1="F" g2="Atilde" k="41" /> +<hkern g1="F" g2="Adieresis" k="41" /> +<hkern g1="F" g2="Aring" k="41" /> +<hkern g1="F" g2="quotesinglbase" k="123" /> +<hkern g1="F" g2="quotedblbase" k="123" /> +<hkern g1="K" g2="C" k="41" /> +<hkern g1="K" g2="G" k="41" /> +<hkern g1="K" g2="O" k="41" /> +<hkern g1="K" g2="Q" k="41" /> +<hkern g1="K" g2="Ccedilla" k="41" /> +<hkern g1="K" g2="Ograve" k="41" /> +<hkern g1="K" g2="Oacute" k="41" /> +<hkern g1="K" g2="Ocircumflex" k="41" /> +<hkern g1="K" g2="Otilde" k="41" /> +<hkern g1="K" g2="Odieresis" k="41" /> +<hkern g1="K" g2="Oslash" k="41" /> +<hkern g1="K" g2="OE" k="41" /> +<hkern g1="L" g2="quotedbl" k="164" /> +<hkern g1="L" g2="quotesingle" k="164" /> +<hkern g1="L" g2="C" k="41" /> +<hkern g1="L" g2="G" k="41" /> +<hkern g1="L" g2="O" k="41" /> +<hkern g1="L" g2="Q" k="41" /> +<hkern g1="L" g2="T" k="41" /> +<hkern g1="L" g2="U" k="20" /> +<hkern g1="L" g2="V" k="41" /> +<hkern g1="L" g2="W" k="41" /> +<hkern g1="L" g2="Y" k="61" /> +<hkern g1="L" g2="Ccedilla" k="41" /> +<hkern g1="L" g2="Ograve" k="41" /> +<hkern g1="L" g2="Oacute" k="41" /> +<hkern g1="L" g2="Ocircumflex" k="41" /> +<hkern g1="L" g2="Otilde" k="41" /> +<hkern g1="L" g2="Odieresis" k="41" /> +<hkern g1="L" g2="Oslash" k="41" /> +<hkern g1="L" g2="Ugrave" k="20" /> +<hkern g1="L" g2="Uacute" k="20" /> +<hkern g1="L" g2="Ucircumflex" k="20" /> +<hkern g1="L" g2="Udieresis" k="20" /> +<hkern g1="L" g2="Yacute" k="61" /> +<hkern g1="L" g2="OE" k="41" /> +<hkern g1="L" g2="quoteright" k="164" /> +<hkern g1="L" g2="quotedblright" k="164" /> +<hkern g1="O" g2="comma" k="82" /> +<hkern g1="O" g2="period" k="82" /> +<hkern g1="O" g2="A" k="41" /> +<hkern g1="O" g2="T" k="61" /> +<hkern g1="O" g2="V" k="20" /> +<hkern g1="O" g2="W" k="20" /> +<hkern g1="O" g2="X" k="41" /> +<hkern g1="O" g2="Y" k="20" /> +<hkern g1="O" g2="Z" k="20" /> +<hkern g1="O" g2="Agrave" k="41" /> +<hkern g1="O" g2="Aacute" k="41" /> +<hkern g1="O" g2="Acircumflex" k="41" /> +<hkern g1="O" g2="Atilde" k="41" /> +<hkern g1="O" g2="Adieresis" k="41" /> +<hkern g1="O" g2="Aring" k="41" /> +<hkern g1="O" g2="Yacute" k="20" /> +<hkern g1="O" g2="quotesinglbase" k="82" /> +<hkern g1="O" g2="quotedblbase" k="82" /> +<hkern g1="P" g2="comma" k="266" /> +<hkern g1="P" g2="period" k="266" /> +<hkern g1="P" g2="A" k="102" /> +<hkern g1="P" g2="X" k="41" /> +<hkern g1="P" g2="Z" k="20" /> +<hkern g1="P" g2="Agrave" k="102" /> +<hkern g1="P" g2="Aacute" k="102" /> +<hkern g1="P" g2="Acircumflex" k="102" /> +<hkern g1="P" g2="Atilde" k="102" /> +<hkern g1="P" g2="Adieresis" k="102" /> +<hkern g1="P" g2="Aring" k="102" /> +<hkern g1="P" g2="quotesinglbase" k="266" /> +<hkern g1="P" g2="quotedblbase" k="266" /> +<hkern g1="Q" g2="comma" k="82" /> +<hkern g1="Q" g2="period" k="82" /> +<hkern g1="Q" g2="A" k="41" /> +<hkern g1="Q" g2="T" k="61" /> +<hkern g1="Q" g2="V" k="20" /> +<hkern g1="Q" g2="W" k="20" /> +<hkern g1="Q" g2="X" k="41" /> +<hkern g1="Q" g2="Y" k="20" /> +<hkern g1="Q" g2="Z" k="20" /> +<hkern g1="Q" g2="Agrave" k="41" /> +<hkern g1="Q" g2="Aacute" k="41" /> +<hkern g1="Q" g2="Acircumflex" k="41" /> +<hkern g1="Q" g2="Atilde" k="41" /> +<hkern g1="Q" g2="Adieresis" k="41" /> +<hkern g1="Q" g2="Aring" k="41" /> +<hkern g1="Q" g2="Yacute" k="20" /> +<hkern g1="Q" g2="quotesinglbase" k="82" /> +<hkern g1="Q" g2="quotedblbase" k="82" /> +<hkern g1="T" g2="comma" k="123" /> +<hkern g1="T" g2="hyphen" k="82" /> +<hkern g1="T" g2="period" k="123" /> +<hkern g1="T" g2="question" k="-41" /> +<hkern g1="T" g2="A" k="143" /> +<hkern g1="T" g2="C" k="41" /> +<hkern g1="T" g2="G" k="41" /> +<hkern g1="T" g2="O" k="41" /> +<hkern g1="T" g2="Q" k="41" /> +<hkern g1="T" g2="T" k="-41" /> +<hkern g1="T" g2="a" k="164" /> +<hkern g1="T" g2="c" k="143" /> +<hkern g1="T" g2="d" k="143" /> +<hkern g1="T" g2="e" k="143" /> +<hkern g1="T" g2="g" k="143" /> +<hkern g1="T" g2="m" k="102" /> +<hkern g1="T" g2="n" k="102" /> +<hkern g1="T" g2="o" k="143" /> +<hkern g1="T" g2="p" k="102" /> +<hkern g1="T" g2="q" k="143" /> +<hkern g1="T" g2="r" k="102" /> +<hkern g1="T" g2="s" k="123" /> +<hkern g1="T" g2="u" k="102" /> +<hkern g1="T" g2="v" k="41" /> +<hkern g1="T" g2="w" k="41" /> +<hkern g1="T" g2="x" k="41" /> +<hkern g1="T" g2="y" k="41" /> +<hkern g1="T" g2="z" k="82" /> +<hkern g1="T" g2="Agrave" k="143" /> +<hkern g1="T" g2="Aacute" k="143" /> +<hkern g1="T" g2="Acircumflex" k="143" /> +<hkern g1="T" g2="Atilde" k="143" /> +<hkern g1="T" g2="Adieresis" k="143" /> +<hkern g1="T" g2="Aring" k="143" /> +<hkern g1="T" g2="Ccedilla" k="41" /> +<hkern g1="T" g2="Ograve" k="41" /> +<hkern g1="T" g2="Oacute" k="41" /> +<hkern g1="T" g2="Ocircumflex" k="41" /> +<hkern g1="T" g2="Otilde" k="41" /> +<hkern g1="T" g2="Odieresis" k="41" /> +<hkern g1="T" g2="Oslash" k="41" /> +<hkern g1="T" g2="agrave" k="143" /> +<hkern g1="T" g2="aacute" k="164" /> +<hkern g1="T" g2="acircumflex" k="164" /> +<hkern g1="T" g2="atilde" k="164" /> +<hkern g1="T" g2="adieresis" k="164" /> +<hkern g1="T" g2="aring" k="164" /> +<hkern g1="T" g2="ae" k="164" /> +<hkern g1="T" g2="ccedilla" k="143" /> +<hkern g1="T" g2="egrave" k="143" /> +<hkern g1="T" g2="eacute" k="143" /> +<hkern g1="T" g2="ecircumflex" k="143" /> +<hkern g1="T" g2="edieresis" k="143" /> +<hkern g1="T" g2="ograve" k="143" /> +<hkern g1="T" g2="oacute" k="143" /> +<hkern g1="T" g2="ocircumflex" k="143" /> +<hkern g1="T" g2="otilde" k="143" /> +<hkern g1="T" g2="odieresis" k="143" /> +<hkern g1="T" g2="oslash" k="143" /> +<hkern g1="T" g2="ugrave" k="102" /> +<hkern g1="T" g2="uacute" k="102" /> +<hkern g1="T" g2="ucircumflex" k="102" /> +<hkern g1="T" g2="udieresis" k="102" /> +<hkern g1="T" g2="yacute" k="41" /> +<hkern g1="T" g2="OE" k="41" /> +<hkern g1="T" g2="oe" k="143" /> +<hkern g1="T" g2="endash" k="82" /> +<hkern g1="T" g2="emdash" k="82" /> +<hkern g1="T" g2="quotesinglbase" k="123" /> +<hkern g1="T" g2="quotedblbase" k="123" /> +<hkern g1="U" g2="comma" k="41" /> +<hkern g1="U" g2="period" k="41" /> +<hkern g1="U" g2="A" k="20" /> +<hkern g1="U" g2="Agrave" k="20" /> +<hkern g1="U" g2="Aacute" k="20" /> +<hkern g1="U" g2="Acircumflex" k="20" /> +<hkern g1="U" g2="Atilde" k="20" /> +<hkern g1="U" g2="Adieresis" k="20" /> +<hkern g1="U" g2="Aring" k="20" /> +<hkern g1="U" g2="quotesinglbase" k="41" /> +<hkern g1="U" g2="quotedblbase" k="41" /> +<hkern g1="V" g2="comma" k="102" /> +<hkern g1="V" g2="period" k="102" /> +<hkern g1="V" g2="question" k="-41" /> +<hkern g1="V" g2="A" k="82" /> +<hkern g1="V" g2="C" k="20" /> +<hkern g1="V" g2="G" k="20" /> +<hkern g1="V" g2="O" k="20" /> +<hkern g1="V" g2="Q" k="20" /> +<hkern g1="V" g2="a" k="41" /> +<hkern g1="V" g2="c" k="41" /> +<hkern g1="V" g2="d" k="41" /> +<hkern g1="V" g2="e" k="41" /> +<hkern g1="V" g2="g" k="20" /> +<hkern g1="V" g2="m" k="20" /> +<hkern g1="V" g2="n" k="20" /> +<hkern g1="V" g2="o" k="41" /> +<hkern g1="V" g2="p" k="20" /> +<hkern g1="V" g2="q" k="41" /> +<hkern g1="V" g2="r" k="20" /> +<hkern g1="V" g2="s" k="20" /> +<hkern g1="V" g2="u" k="20" /> +<hkern g1="V" g2="Agrave" k="82" /> +<hkern g1="V" g2="Aacute" k="82" /> +<hkern g1="V" g2="Acircumflex" k="82" /> +<hkern g1="V" g2="Atilde" k="82" /> +<hkern g1="V" g2="Adieresis" k="82" /> +<hkern g1="V" g2="Aring" k="82" /> +<hkern g1="V" g2="Ccedilla" k="20" /> +<hkern g1="V" g2="Ograve" k="20" /> +<hkern g1="V" g2="Oacute" k="20" /> +<hkern g1="V" g2="Ocircumflex" k="20" /> +<hkern g1="V" g2="Otilde" k="20" /> +<hkern g1="V" g2="Odieresis" k="20" /> +<hkern g1="V" g2="Oslash" k="20" /> +<hkern g1="V" g2="agrave" k="41" /> +<hkern g1="V" g2="aacute" k="41" /> +<hkern g1="V" g2="acircumflex" k="41" /> +<hkern g1="V" g2="atilde" k="41" /> +<hkern g1="V" g2="adieresis" k="41" /> +<hkern g1="V" g2="aring" k="41" /> +<hkern g1="V" g2="ae" k="41" /> +<hkern g1="V" g2="ccedilla" k="41" /> +<hkern g1="V" g2="egrave" k="41" /> +<hkern g1="V" g2="eacute" k="41" /> +<hkern g1="V" g2="ecircumflex" k="41" /> +<hkern g1="V" g2="edieresis" k="41" /> +<hkern g1="V" g2="ograve" k="41" /> +<hkern g1="V" g2="oacute" k="41" /> +<hkern g1="V" g2="ocircumflex" k="41" /> +<hkern g1="V" g2="otilde" k="41" /> +<hkern g1="V" g2="odieresis" k="41" /> +<hkern g1="V" g2="oslash" k="41" /> +<hkern g1="V" g2="ugrave" k="20" /> +<hkern g1="V" g2="uacute" k="20" /> +<hkern g1="V" g2="ucircumflex" k="20" /> +<hkern g1="V" g2="udieresis" k="20" /> +<hkern g1="V" g2="OE" k="20" /> +<hkern g1="V" g2="oe" k="41" /> +<hkern g1="V" g2="quotesinglbase" k="102" /> +<hkern g1="V" g2="quotedblbase" k="102" /> +<hkern g1="W" g2="comma" k="102" /> +<hkern g1="W" g2="period" k="102" /> +<hkern g1="W" g2="question" k="-41" /> +<hkern g1="W" g2="A" k="82" /> +<hkern g1="W" g2="C" k="20" /> +<hkern g1="W" g2="G" k="20" /> +<hkern g1="W" g2="O" k="20" /> +<hkern g1="W" g2="Q" k="20" /> +<hkern g1="W" g2="a" k="41" /> +<hkern g1="W" g2="c" k="41" /> +<hkern g1="W" g2="d" k="41" /> +<hkern g1="W" g2="e" k="41" /> +<hkern g1="W" g2="g" k="20" /> +<hkern g1="W" g2="m" k="20" /> +<hkern g1="W" g2="n" k="20" /> +<hkern g1="W" g2="o" k="41" /> +<hkern g1="W" g2="p" k="20" /> +<hkern g1="W" g2="q" k="41" /> +<hkern g1="W" g2="r" k="20" /> +<hkern g1="W" g2="s" k="20" /> +<hkern g1="W" g2="u" k="20" /> +<hkern g1="W" g2="Agrave" k="82" /> +<hkern g1="W" g2="Aacute" k="82" /> +<hkern g1="W" g2="Acircumflex" k="82" /> +<hkern g1="W" g2="Atilde" k="82" /> +<hkern g1="W" g2="Adieresis" k="82" /> +<hkern g1="W" g2="Aring" k="82" /> +<hkern g1="W" g2="Ccedilla" k="20" /> +<hkern g1="W" g2="Ograve" k="20" /> +<hkern g1="W" g2="Oacute" k="20" /> +<hkern g1="W" g2="Ocircumflex" k="20" /> +<hkern g1="W" g2="Otilde" k="20" /> +<hkern g1="W" g2="Odieresis" k="20" /> +<hkern g1="W" g2="Oslash" k="20" /> +<hkern g1="W" g2="agrave" k="41" /> +<hkern g1="W" g2="aacute" k="41" /> +<hkern g1="W" g2="acircumflex" k="41" /> +<hkern g1="W" g2="atilde" k="41" /> +<hkern g1="W" g2="adieresis" k="41" /> +<hkern g1="W" g2="aring" k="41" /> +<hkern g1="W" g2="ae" k="41" /> +<hkern g1="W" g2="ccedilla" k="41" /> +<hkern g1="W" g2="egrave" k="41" /> +<hkern g1="W" g2="eacute" k="41" /> +<hkern g1="W" g2="ecircumflex" k="41" /> +<hkern g1="W" g2="edieresis" k="41" /> +<hkern g1="W" g2="ograve" k="41" /> +<hkern g1="W" g2="oacute" k="41" /> +<hkern g1="W" g2="ocircumflex" k="41" /> +<hkern g1="W" g2="otilde" k="41" /> +<hkern g1="W" g2="odieresis" k="41" /> +<hkern g1="W" g2="oslash" k="41" /> +<hkern g1="W" g2="ugrave" k="20" /> +<hkern g1="W" g2="uacute" k="20" /> +<hkern g1="W" g2="ucircumflex" k="20" /> +<hkern g1="W" g2="udieresis" k="20" /> +<hkern g1="W" g2="OE" k="20" /> +<hkern g1="W" g2="oe" k="41" /> +<hkern g1="W" g2="quotesinglbase" k="102" /> +<hkern g1="W" g2="quotedblbase" k="102" /> +<hkern g1="X" g2="C" k="41" /> +<hkern g1="X" g2="G" k="41" /> +<hkern g1="X" g2="O" k="41" /> +<hkern g1="X" g2="Q" k="41" /> +<hkern g1="X" g2="Ccedilla" k="41" /> +<hkern g1="X" g2="Ograve" k="41" /> +<hkern g1="X" g2="Oacute" k="41" /> +<hkern g1="X" g2="Ocircumflex" k="41" /> +<hkern g1="X" g2="Otilde" k="41" /> +<hkern g1="X" g2="Odieresis" k="41" /> +<hkern g1="X" g2="Oslash" k="41" /> +<hkern g1="X" g2="OE" k="41" /> +<hkern g1="Y" g2="comma" k="123" /> +<hkern g1="Y" g2="period" k="123" /> +<hkern g1="Y" g2="question" k="-41" /> +<hkern g1="Y" g2="A" k="123" /> +<hkern g1="Y" g2="C" k="41" /> +<hkern g1="Y" g2="G" k="41" /> +<hkern g1="Y" g2="O" k="41" /> +<hkern g1="Y" g2="Q" k="41" /> +<hkern g1="Y" g2="a" k="102" /> +<hkern g1="Y" g2="c" k="102" /> +<hkern g1="Y" g2="d" k="102" /> +<hkern g1="Y" g2="e" k="102" /> +<hkern g1="Y" g2="g" k="41" /> +<hkern g1="Y" g2="m" k="61" /> +<hkern g1="Y" g2="n" k="61" /> +<hkern g1="Y" g2="o" k="102" /> +<hkern g1="Y" g2="p" k="61" /> +<hkern g1="Y" g2="q" k="102" /> +<hkern g1="Y" g2="r" k="61" /> +<hkern g1="Y" g2="s" k="82" /> +<hkern g1="Y" g2="u" k="61" /> +<hkern g1="Y" g2="z" k="41" /> +<hkern g1="Y" g2="Agrave" k="123" /> +<hkern g1="Y" g2="Aacute" k="123" /> +<hkern g1="Y" g2="Acircumflex" k="123" /> +<hkern g1="Y" g2="Atilde" k="123" /> +<hkern g1="Y" g2="Adieresis" k="123" /> +<hkern g1="Y" g2="Aring" k="123" /> +<hkern g1="Y" g2="Ccedilla" k="41" /> +<hkern g1="Y" g2="Ograve" k="41" /> +<hkern g1="Y" g2="Oacute" k="41" /> +<hkern g1="Y" g2="Ocircumflex" k="41" /> +<hkern g1="Y" g2="Otilde" k="41" /> +<hkern g1="Y" g2="Odieresis" k="41" /> +<hkern g1="Y" g2="Oslash" k="41" /> +<hkern g1="Y" g2="agrave" k="102" /> +<hkern g1="Y" g2="aacute" k="102" /> +<hkern g1="Y" g2="acircumflex" k="102" /> +<hkern g1="Y" g2="atilde" k="102" /> +<hkern g1="Y" g2="adieresis" k="102" /> +<hkern g1="Y" g2="aring" k="102" /> +<hkern g1="Y" g2="ae" k="102" /> +<hkern g1="Y" g2="ccedilla" k="102" /> +<hkern g1="Y" g2="egrave" k="102" /> +<hkern g1="Y" g2="eacute" k="102" /> +<hkern g1="Y" g2="ecircumflex" k="102" /> +<hkern g1="Y" g2="edieresis" k="102" /> +<hkern g1="Y" g2="ograve" k="102" /> +<hkern g1="Y" g2="oacute" k="102" /> +<hkern g1="Y" g2="ocircumflex" k="102" /> +<hkern g1="Y" g2="otilde" k="102" /> +<hkern g1="Y" g2="odieresis" k="102" /> +<hkern g1="Y" g2="oslash" k="102" /> +<hkern g1="Y" g2="ugrave" k="61" /> +<hkern g1="Y" g2="uacute" k="61" /> +<hkern g1="Y" g2="ucircumflex" k="61" /> +<hkern g1="Y" g2="udieresis" k="61" /> +<hkern g1="Y" g2="OE" k="41" /> +<hkern g1="Y" g2="oe" k="102" /> +<hkern g1="Y" g2="quotesinglbase" k="123" /> +<hkern g1="Y" g2="quotedblbase" k="123" /> +<hkern g1="Z" g2="C" k="20" /> +<hkern g1="Z" g2="G" k="20" /> +<hkern g1="Z" g2="O" k="20" /> +<hkern g1="Z" g2="Q" k="20" /> +<hkern g1="Z" g2="Ccedilla" k="20" /> +<hkern g1="Z" g2="Ograve" k="20" /> +<hkern g1="Z" g2="Oacute" k="20" /> +<hkern g1="Z" g2="Ocircumflex" k="20" /> +<hkern g1="Z" g2="Otilde" k="20" /> +<hkern g1="Z" g2="Odieresis" k="20" /> +<hkern g1="Z" g2="Oslash" k="20" /> +<hkern g1="Z" g2="OE" k="20" /> +<hkern g1="bracketleft" g2="J" k="-184" /> +<hkern g1="a" g2="quotedbl" k="20" /> +<hkern g1="a" g2="quotesingle" k="20" /> +<hkern g1="a" g2="quoteright" k="20" /> +<hkern g1="a" g2="quotedblright" k="20" /> +<hkern g1="b" g2="quotedbl" k="20" /> +<hkern g1="b" g2="quotesingle" k="20" /> +<hkern g1="b" g2="v" k="41" /> +<hkern g1="b" g2="w" k="41" /> +<hkern g1="b" g2="x" k="41" /> +<hkern g1="b" g2="y" k="41" /> +<hkern g1="b" g2="z" k="20" /> +<hkern g1="b" g2="yacute" k="41" /> +<hkern g1="b" g2="quoteright" k="20" /> +<hkern g1="b" g2="quotedblright" k="20" /> +<hkern g1="c" g2="quotedbl" k="-41" /> +<hkern g1="c" g2="quotesingle" k="-41" /> +<hkern g1="c" g2="quoteright" k="-41" /> +<hkern g1="c" g2="quotedblright" k="-41" /> +<hkern g1="e" g2="quotedbl" k="20" /> +<hkern g1="e" g2="quotesingle" k="20" /> +<hkern g1="e" g2="v" k="41" /> +<hkern g1="e" g2="w" k="41" /> +<hkern g1="e" g2="x" k="41" /> +<hkern g1="e" g2="y" k="41" /> +<hkern g1="e" g2="z" k="20" /> +<hkern g1="e" g2="yacute" k="41" /> +<hkern g1="e" g2="quoteright" k="20" /> +<hkern g1="e" g2="quotedblright" k="20" /> +<hkern g1="f" g2="quotedbl" k="-123" /> +<hkern g1="f" g2="quotesingle" k="-123" /> +<hkern g1="f" g2="quoteright" k="-123" /> +<hkern g1="f" g2="quotedblright" k="-123" /> +<hkern g1="h" g2="quotedbl" k="20" /> +<hkern g1="h" g2="quotesingle" k="20" /> +<hkern g1="h" g2="quoteright" k="20" /> +<hkern g1="h" g2="quotedblright" k="20" /> +<hkern g1="k" g2="c" k="41" /> +<hkern g1="k" g2="d" k="41" /> +<hkern g1="k" g2="e" k="41" /> +<hkern g1="k" g2="o" k="41" /> +<hkern g1="k" g2="q" k="41" /> +<hkern g1="k" g2="agrave" k="41" /> +<hkern g1="k" g2="ccedilla" k="41" /> +<hkern g1="k" g2="egrave" k="41" /> +<hkern g1="k" g2="eacute" k="41" /> +<hkern g1="k" g2="ecircumflex" k="41" /> +<hkern g1="k" g2="edieresis" k="41" /> +<hkern g1="k" g2="ograve" k="41" /> +<hkern g1="k" g2="oacute" k="41" /> +<hkern g1="k" g2="ocircumflex" k="41" /> +<hkern g1="k" g2="otilde" k="41" /> +<hkern g1="k" g2="odieresis" k="41" /> +<hkern g1="k" g2="oslash" k="41" /> +<hkern g1="k" g2="oe" k="41" /> +<hkern g1="m" g2="quotedbl" k="20" /> +<hkern g1="m" g2="quotesingle" k="20" /> +<hkern g1="m" g2="quoteright" k="20" /> +<hkern g1="m" g2="quotedblright" k="20" /> +<hkern g1="n" g2="quotedbl" k="20" /> +<hkern g1="n" g2="quotesingle" k="20" /> +<hkern g1="n" g2="quoteright" k="20" /> +<hkern g1="n" g2="quotedblright" k="20" /> +<hkern g1="o" g2="quotedbl" k="20" /> +<hkern g1="o" g2="quotesingle" k="20" /> +<hkern g1="o" g2="v" k="41" /> +<hkern g1="o" g2="w" k="41" /> +<hkern g1="o" g2="x" k="41" /> +<hkern g1="o" g2="y" k="41" /> +<hkern g1="o" g2="z" k="20" /> +<hkern g1="o" g2="yacute" k="41" /> +<hkern g1="o" g2="quoteright" k="20" /> +<hkern g1="o" g2="quotedblright" k="20" /> +<hkern g1="p" g2="quotedbl" k="20" /> +<hkern g1="p" g2="quotesingle" k="20" /> +<hkern g1="p" g2="v" k="41" /> +<hkern g1="p" g2="w" k="41" /> +<hkern g1="p" g2="x" k="41" /> +<hkern g1="p" g2="y" k="41" /> +<hkern g1="p" g2="z" k="20" /> +<hkern g1="p" g2="yacute" k="41" /> +<hkern g1="p" g2="quoteright" k="20" /> +<hkern g1="p" g2="quotedblright" k="20" /> +<hkern g1="r" g2="quotedbl" k="-82" /> +<hkern g1="r" g2="quotesingle" k="-82" /> +<hkern g1="r" g2="a" k="41" /> +<hkern g1="r" g2="c" k="41" /> +<hkern g1="r" g2="d" k="41" /> +<hkern g1="r" g2="e" k="41" /> +<hkern g1="r" g2="g" k="20" /> +<hkern g1="r" g2="o" k="41" /> +<hkern g1="r" g2="q" k="41" /> +<hkern g1="r" g2="agrave" k="41" /> +<hkern g1="r" g2="aacute" k="41" /> +<hkern g1="r" g2="acircumflex" k="41" /> +<hkern g1="r" g2="atilde" k="41" /> +<hkern g1="r" g2="adieresis" k="41" /> +<hkern g1="r" g2="aring" k="41" /> +<hkern g1="r" g2="ae" k="41" /> +<hkern g1="r" g2="ccedilla" k="41" /> +<hkern g1="r" g2="egrave" k="41" /> +<hkern g1="r" g2="eacute" k="41" /> +<hkern g1="r" g2="ecircumflex" k="41" /> +<hkern g1="r" g2="edieresis" k="41" /> +<hkern g1="r" g2="ograve" k="41" /> +<hkern g1="r" g2="oacute" k="41" /> +<hkern g1="r" g2="ocircumflex" k="41" /> +<hkern g1="r" g2="otilde" k="41" /> +<hkern g1="r" g2="odieresis" k="41" /> +<hkern g1="r" g2="oslash" k="41" /> +<hkern g1="r" g2="oe" k="41" /> +<hkern g1="r" g2="quoteright" k="-82" /> +<hkern g1="r" g2="quotedblright" k="-82" /> +<hkern g1="t" g2="quotedbl" k="-41" /> +<hkern g1="t" g2="quotesingle" k="-41" /> +<hkern g1="t" g2="quoteright" k="-41" /> +<hkern g1="t" g2="quotedblright" k="-41" /> +<hkern g1="v" g2="quotedbl" k="-82" /> +<hkern g1="v" g2="quotesingle" k="-82" /> +<hkern g1="v" g2="comma" k="82" /> +<hkern g1="v" g2="period" k="82" /> +<hkern g1="v" g2="question" k="-41" /> +<hkern g1="v" g2="quoteright" k="-82" /> +<hkern g1="v" g2="quotesinglbase" k="82" /> +<hkern g1="v" g2="quotedblright" k="-82" /> +<hkern g1="v" g2="quotedblbase" k="82" /> +<hkern g1="w" g2="quotedbl" k="-82" /> +<hkern g1="w" g2="quotesingle" k="-82" /> +<hkern g1="w" g2="comma" k="82" /> +<hkern g1="w" g2="period" k="82" /> +<hkern g1="w" g2="question" k="-41" /> +<hkern g1="w" g2="quoteright" k="-82" /> +<hkern g1="w" g2="quotesinglbase" k="82" /> +<hkern g1="w" g2="quotedblright" k="-82" /> +<hkern g1="w" g2="quotedblbase" k="82" /> +<hkern g1="x" g2="c" k="41" /> +<hkern g1="x" g2="d" k="41" /> +<hkern g1="x" g2="e" k="41" /> +<hkern g1="x" g2="o" k="41" /> +<hkern g1="x" g2="q" k="41" /> +<hkern g1="x" g2="agrave" k="41" /> +<hkern g1="x" g2="ccedilla" k="41" /> +<hkern g1="x" g2="egrave" k="41" /> +<hkern g1="x" g2="eacute" k="41" /> +<hkern g1="x" g2="ecircumflex" k="41" /> +<hkern g1="x" g2="edieresis" k="41" /> +<hkern g1="x" g2="ograve" k="41" /> +<hkern g1="x" g2="oacute" k="41" /> +<hkern g1="x" g2="ocircumflex" k="41" /> +<hkern g1="x" g2="otilde" k="41" /> +<hkern g1="x" g2="odieresis" k="41" /> +<hkern g1="x" g2="oslash" k="41" /> +<hkern g1="x" g2="oe" k="41" /> +<hkern g1="y" g2="quotedbl" k="-82" /> +<hkern g1="y" g2="quotesingle" k="-82" /> +<hkern g1="y" g2="comma" k="82" /> +<hkern g1="y" g2="period" k="82" /> +<hkern g1="y" g2="question" k="-41" /> +<hkern g1="y" g2="quoteright" k="-82" /> +<hkern g1="y" g2="quotesinglbase" k="82" /> +<hkern g1="y" g2="quotedblright" k="-82" /> +<hkern g1="y" g2="quotedblbase" k="82" /> +<hkern g1="braceleft" g2="J" k="-184" /> +<hkern g1="Agrave" g2="quotedbl" k="143" /> +<hkern g1="Agrave" g2="quotesingle" k="143" /> +<hkern g1="Agrave" g2="C" k="41" /> +<hkern g1="Agrave" g2="G" k="41" /> +<hkern g1="Agrave" g2="J" k="-266" /> +<hkern g1="Agrave" g2="O" k="41" /> +<hkern g1="Agrave" g2="Q" k="41" /> +<hkern g1="Agrave" g2="T" k="143" /> +<hkern g1="Agrave" g2="V" k="82" /> +<hkern g1="Agrave" g2="W" k="82" /> +<hkern g1="Agrave" g2="Y" k="123" /> +<hkern g1="Agrave" g2="Ccedilla" k="41" /> +<hkern g1="Agrave" g2="Ograve" k="41" /> +<hkern g1="Agrave" g2="Oacute" k="41" /> +<hkern g1="Agrave" g2="Ocircumflex" k="41" /> +<hkern g1="Agrave" g2="Otilde" k="41" /> +<hkern g1="Agrave" g2="Odieresis" k="41" /> +<hkern g1="Agrave" g2="Oslash" k="41" /> +<hkern g1="Agrave" g2="Yacute" k="123" /> +<hkern g1="Agrave" g2="OE" k="41" /> +<hkern g1="Agrave" g2="quoteright" k="143" /> +<hkern g1="Agrave" g2="quotedblright" k="143" /> +<hkern g1="Aacute" g2="quotedbl" k="143" /> +<hkern g1="Aacute" g2="quotesingle" k="143" /> +<hkern g1="Aacute" g2="C" k="41" /> +<hkern g1="Aacute" g2="G" k="41" /> +<hkern g1="Aacute" g2="J" k="-266" /> +<hkern g1="Aacute" g2="O" k="41" /> +<hkern g1="Aacute" g2="Q" k="41" /> +<hkern g1="Aacute" g2="T" k="143" /> +<hkern g1="Aacute" g2="V" k="82" /> +<hkern g1="Aacute" g2="W" k="82" /> +<hkern g1="Aacute" g2="Y" k="123" /> +<hkern g1="Aacute" g2="Ccedilla" k="41" /> +<hkern g1="Aacute" g2="Ograve" k="41" /> +<hkern g1="Aacute" g2="Oacute" k="41" /> +<hkern g1="Aacute" g2="Ocircumflex" k="41" /> +<hkern g1="Aacute" g2="Otilde" k="41" /> +<hkern g1="Aacute" g2="Odieresis" k="41" /> +<hkern g1="Aacute" g2="Oslash" k="41" /> +<hkern g1="Aacute" g2="Yacute" k="123" /> +<hkern g1="Aacute" g2="OE" k="41" /> +<hkern g1="Aacute" g2="quoteright" k="143" /> +<hkern g1="Aacute" g2="quotedblright" k="143" /> +<hkern g1="Acircumflex" g2="quotedbl" k="143" /> +<hkern g1="Acircumflex" g2="quotesingle" k="143" /> +<hkern g1="Acircumflex" g2="C" k="41" /> +<hkern g1="Acircumflex" g2="G" k="41" /> +<hkern g1="Acircumflex" g2="J" k="-266" /> +<hkern g1="Acircumflex" g2="O" k="41" /> +<hkern g1="Acircumflex" g2="Q" k="41" /> +<hkern g1="Acircumflex" g2="T" k="143" /> +<hkern g1="Acircumflex" g2="V" k="82" /> +<hkern g1="Acircumflex" g2="W" k="82" /> +<hkern g1="Acircumflex" g2="Y" k="123" /> +<hkern g1="Acircumflex" g2="Ccedilla" k="41" /> +<hkern g1="Acircumflex" g2="Ograve" k="41" /> +<hkern g1="Acircumflex" g2="Oacute" k="41" /> +<hkern g1="Acircumflex" g2="Ocircumflex" k="41" /> +<hkern g1="Acircumflex" g2="Otilde" k="41" /> +<hkern g1="Acircumflex" g2="Odieresis" k="41" /> +<hkern g1="Acircumflex" g2="Oslash" k="41" /> +<hkern g1="Acircumflex" g2="Yacute" k="123" /> +<hkern g1="Acircumflex" g2="OE" k="41" /> +<hkern g1="Acircumflex" g2="quoteright" k="143" /> +<hkern g1="Acircumflex" g2="quotedblright" k="143" /> +<hkern g1="Atilde" g2="quotedbl" k="143" /> +<hkern g1="Atilde" g2="quotesingle" k="143" /> +<hkern g1="Atilde" g2="C" k="41" /> +<hkern g1="Atilde" g2="G" k="41" /> +<hkern g1="Atilde" g2="J" k="-266" /> +<hkern g1="Atilde" g2="O" k="41" /> +<hkern g1="Atilde" g2="Q" k="41" /> +<hkern g1="Atilde" g2="T" k="143" /> +<hkern g1="Atilde" g2="V" k="82" /> +<hkern g1="Atilde" g2="W" k="82" /> +<hkern g1="Atilde" g2="Y" k="123" /> +<hkern g1="Atilde" g2="Ccedilla" k="41" /> +<hkern g1="Atilde" g2="Ograve" k="41" /> +<hkern g1="Atilde" g2="Oacute" k="41" /> +<hkern g1="Atilde" g2="Ocircumflex" k="41" /> +<hkern g1="Atilde" g2="Otilde" k="41" /> +<hkern g1="Atilde" g2="Odieresis" k="41" /> +<hkern g1="Atilde" g2="Oslash" k="41" /> +<hkern g1="Atilde" g2="Yacute" k="123" /> +<hkern g1="Atilde" g2="OE" k="41" /> +<hkern g1="Atilde" g2="quoteright" k="143" /> +<hkern g1="Atilde" g2="quotedblright" k="143" /> +<hkern g1="Adieresis" g2="quotedbl" k="143" /> +<hkern g1="Adieresis" g2="quotesingle" k="143" /> +<hkern g1="Adieresis" g2="C" k="41" /> +<hkern g1="Adieresis" g2="G" k="41" /> +<hkern g1="Adieresis" g2="J" k="-266" /> +<hkern g1="Adieresis" g2="O" k="41" /> +<hkern g1="Adieresis" g2="Q" k="41" /> +<hkern g1="Adieresis" g2="T" k="143" /> +<hkern g1="Adieresis" g2="V" k="82" /> +<hkern g1="Adieresis" g2="W" k="82" /> +<hkern g1="Adieresis" g2="Y" k="123" /> +<hkern g1="Adieresis" g2="Ccedilla" k="41" /> +<hkern g1="Adieresis" g2="Ograve" k="41" /> +<hkern g1="Adieresis" g2="Oacute" k="41" /> +<hkern g1="Adieresis" g2="Ocircumflex" k="41" /> +<hkern g1="Adieresis" g2="Otilde" k="41" /> +<hkern g1="Adieresis" g2="Odieresis" k="41" /> +<hkern g1="Adieresis" g2="Oslash" k="41" /> +<hkern g1="Adieresis" g2="Yacute" k="123" /> +<hkern g1="Adieresis" g2="OE" k="41" /> +<hkern g1="Adieresis" g2="quoteright" k="143" /> +<hkern g1="Adieresis" g2="quotedblright" k="143" /> +<hkern g1="Aring" g2="quotedbl" k="143" /> +<hkern g1="Aring" g2="quotesingle" k="143" /> +<hkern g1="Aring" g2="C" k="41" /> +<hkern g1="Aring" g2="G" k="41" /> +<hkern g1="Aring" g2="J" k="-266" /> +<hkern g1="Aring" g2="O" k="41" /> +<hkern g1="Aring" g2="Q" k="41" /> +<hkern g1="Aring" g2="T" k="143" /> +<hkern g1="Aring" g2="V" k="82" /> +<hkern g1="Aring" g2="W" k="82" /> +<hkern g1="Aring" g2="Y" k="123" /> +<hkern g1="Aring" g2="Ccedilla" k="41" /> +<hkern g1="Aring" g2="Ograve" k="41" /> +<hkern g1="Aring" g2="Oacute" k="41" /> +<hkern g1="Aring" g2="Ocircumflex" k="41" /> +<hkern g1="Aring" g2="Otilde" k="41" /> +<hkern g1="Aring" g2="Odieresis" k="41" /> +<hkern g1="Aring" g2="Oslash" k="41" /> +<hkern g1="Aring" g2="Yacute" k="123" /> +<hkern g1="Aring" g2="OE" k="41" /> +<hkern g1="Aring" g2="quoteright" k="143" /> +<hkern g1="Aring" g2="quotedblright" k="143" /> +<hkern g1="AE" g2="J" k="-123" /> +<hkern g1="Ccedilla" g2="C" k="41" /> +<hkern g1="Ccedilla" g2="G" k="41" /> +<hkern g1="Ccedilla" g2="O" k="41" /> +<hkern g1="Ccedilla" g2="Q" k="41" /> +<hkern g1="Ccedilla" g2="Ccedilla" k="41" /> +<hkern g1="Ccedilla" g2="Ograve" k="41" /> +<hkern g1="Ccedilla" g2="Oacute" k="41" /> +<hkern g1="Ccedilla" g2="Ocircumflex" k="41" /> +<hkern g1="Ccedilla" g2="Otilde" k="41" /> +<hkern g1="Ccedilla" g2="Odieresis" k="41" /> +<hkern g1="Ccedilla" g2="Oslash" k="41" /> +<hkern g1="Ccedilla" g2="OE" k="41" /> +<hkern g1="Egrave" g2="J" k="-123" /> +<hkern g1="Eacute" g2="J" k="-123" /> +<hkern g1="Ecircumflex" g2="J" k="-123" /> +<hkern g1="Edieresis" g2="J" k="-123" /> +<hkern g1="Eth" g2="comma" k="82" /> +<hkern g1="Eth" g2="period" k="82" /> +<hkern g1="Eth" g2="A" k="41" /> +<hkern g1="Eth" g2="T" k="61" /> +<hkern g1="Eth" g2="V" k="20" /> +<hkern g1="Eth" g2="W" k="20" /> +<hkern g1="Eth" g2="X" k="41" /> +<hkern g1="Eth" g2="Y" k="20" /> +<hkern g1="Eth" g2="Z" k="20" /> +<hkern g1="Eth" g2="Agrave" k="41" /> +<hkern g1="Eth" g2="Aacute" k="41" /> +<hkern g1="Eth" g2="Acircumflex" k="41" /> +<hkern g1="Eth" g2="Atilde" k="41" /> +<hkern g1="Eth" g2="Adieresis" k="41" /> +<hkern g1="Eth" g2="Aring" k="41" /> +<hkern g1="Eth" g2="Yacute" k="20" /> +<hkern g1="Eth" g2="quotesinglbase" k="82" /> +<hkern g1="Eth" g2="quotedblbase" k="82" /> +<hkern g1="Ograve" g2="comma" k="82" /> +<hkern g1="Ograve" g2="period" k="82" /> +<hkern g1="Ograve" g2="A" k="41" /> +<hkern g1="Ograve" g2="T" k="61" /> +<hkern g1="Ograve" g2="V" k="20" /> +<hkern g1="Ograve" g2="W" k="20" /> +<hkern g1="Ograve" g2="X" k="41" /> +<hkern g1="Ograve" g2="Y" k="20" /> +<hkern g1="Ograve" g2="Z" k="20" /> +<hkern g1="Ograve" g2="Agrave" k="41" /> +<hkern g1="Ograve" g2="Aacute" k="41" /> +<hkern g1="Ograve" g2="Acircumflex" k="41" /> +<hkern g1="Ograve" g2="Atilde" k="41" /> +<hkern g1="Ograve" g2="Adieresis" k="41" /> +<hkern g1="Ograve" g2="Aring" k="41" /> +<hkern g1="Ograve" g2="Yacute" k="20" /> +<hkern g1="Ograve" g2="quotesinglbase" k="82" /> +<hkern g1="Ograve" g2="quotedblbase" k="82" /> +<hkern g1="Oacute" g2="comma" k="82" /> +<hkern g1="Oacute" g2="period" k="82" /> +<hkern g1="Oacute" g2="A" k="41" /> +<hkern g1="Oacute" g2="T" k="61" /> +<hkern g1="Oacute" g2="V" k="20" /> +<hkern g1="Oacute" g2="W" k="20" /> +<hkern g1="Oacute" g2="X" k="41" /> +<hkern g1="Oacute" g2="Y" k="20" /> +<hkern g1="Oacute" g2="Z" k="20" /> +<hkern g1="Oacute" g2="Agrave" k="41" /> +<hkern g1="Oacute" g2="Aacute" k="41" /> +<hkern g1="Oacute" g2="Acircumflex" k="41" /> +<hkern g1="Oacute" g2="Atilde" k="41" /> +<hkern g1="Oacute" g2="Adieresis" k="41" /> +<hkern g1="Oacute" g2="Aring" k="41" /> +<hkern g1="Oacute" g2="Yacute" k="20" /> +<hkern g1="Oacute" g2="quotesinglbase" k="82" /> +<hkern g1="Oacute" g2="quotedblbase" k="82" /> +<hkern g1="Ocircumflex" g2="comma" k="82" /> +<hkern g1="Ocircumflex" g2="period" k="82" /> +<hkern g1="Ocircumflex" g2="A" k="41" /> +<hkern g1="Ocircumflex" g2="T" k="61" /> +<hkern g1="Ocircumflex" g2="V" k="20" /> +<hkern g1="Ocircumflex" g2="W" k="20" /> +<hkern g1="Ocircumflex" g2="X" k="41" /> +<hkern g1="Ocircumflex" g2="Y" k="20" /> +<hkern g1="Ocircumflex" g2="Z" k="20" /> +<hkern g1="Ocircumflex" g2="Agrave" k="41" /> +<hkern g1="Ocircumflex" g2="Aacute" k="41" /> +<hkern g1="Ocircumflex" g2="Acircumflex" k="41" /> +<hkern g1="Ocircumflex" g2="Atilde" k="41" /> +<hkern g1="Ocircumflex" g2="Adieresis" k="41" /> +<hkern g1="Ocircumflex" g2="Aring" k="41" /> +<hkern g1="Ocircumflex" g2="Yacute" k="20" /> +<hkern g1="Ocircumflex" g2="quotesinglbase" k="82" /> +<hkern g1="Ocircumflex" g2="quotedblbase" k="82" /> +<hkern g1="Otilde" g2="comma" k="82" /> +<hkern g1="Otilde" g2="period" k="82" /> +<hkern g1="Otilde" g2="A" k="41" /> +<hkern g1="Otilde" g2="T" k="61" /> +<hkern g1="Otilde" g2="V" k="20" /> +<hkern g1="Otilde" g2="W" k="20" /> +<hkern g1="Otilde" g2="X" k="41" /> +<hkern g1="Otilde" g2="Y" k="20" /> +<hkern g1="Otilde" g2="Z" k="20" /> +<hkern g1="Otilde" g2="Agrave" k="41" /> +<hkern g1="Otilde" g2="Aacute" k="41" /> +<hkern g1="Otilde" g2="Acircumflex" k="41" /> +<hkern g1="Otilde" g2="Atilde" k="41" /> +<hkern g1="Otilde" g2="Adieresis" k="41" /> +<hkern g1="Otilde" g2="Aring" k="41" /> +<hkern g1="Otilde" g2="Yacute" k="20" /> +<hkern g1="Otilde" g2="quotesinglbase" k="82" /> +<hkern g1="Otilde" g2="quotedblbase" k="82" /> +<hkern g1="Odieresis" g2="comma" k="82" /> +<hkern g1="Odieresis" g2="period" k="82" /> +<hkern g1="Odieresis" g2="A" k="41" /> +<hkern g1="Odieresis" g2="T" k="61" /> +<hkern g1="Odieresis" g2="V" k="20" /> +<hkern g1="Odieresis" g2="W" k="20" /> +<hkern g1="Odieresis" g2="X" k="41" /> +<hkern g1="Odieresis" g2="Y" k="20" /> +<hkern g1="Odieresis" g2="Z" k="20" /> +<hkern g1="Odieresis" g2="Agrave" k="41" /> +<hkern g1="Odieresis" g2="Aacute" k="41" /> +<hkern g1="Odieresis" g2="Acircumflex" k="41" /> +<hkern g1="Odieresis" g2="Atilde" k="41" /> +<hkern g1="Odieresis" g2="Adieresis" k="41" /> +<hkern g1="Odieresis" g2="Aring" k="41" /> +<hkern g1="Odieresis" g2="Yacute" k="20" /> +<hkern g1="Odieresis" g2="quotesinglbase" k="82" /> +<hkern g1="Odieresis" g2="quotedblbase" k="82" /> +<hkern g1="Oslash" g2="comma" k="82" /> +<hkern g1="Oslash" g2="period" k="82" /> +<hkern g1="Oslash" g2="A" k="41" /> +<hkern g1="Oslash" g2="T" k="61" /> +<hkern g1="Oslash" g2="V" k="20" /> +<hkern g1="Oslash" g2="W" k="20" /> +<hkern g1="Oslash" g2="X" k="41" /> +<hkern g1="Oslash" g2="Y" k="20" /> +<hkern g1="Oslash" g2="Z" k="20" /> +<hkern g1="Oslash" g2="Agrave" k="41" /> +<hkern g1="Oslash" g2="Aacute" k="41" /> +<hkern g1="Oslash" g2="Acircumflex" k="41" /> +<hkern g1="Oslash" g2="Atilde" k="41" /> +<hkern g1="Oslash" g2="Adieresis" k="41" /> +<hkern g1="Oslash" g2="Aring" k="41" /> +<hkern g1="Oslash" g2="Yacute" k="20" /> +<hkern g1="Oslash" g2="quotesinglbase" k="82" /> +<hkern g1="Oslash" g2="quotedblbase" k="82" /> +<hkern g1="Ugrave" g2="comma" k="41" /> +<hkern g1="Ugrave" g2="period" k="41" /> +<hkern g1="Ugrave" g2="A" k="20" /> +<hkern g1="Ugrave" g2="Agrave" k="20" /> +<hkern g1="Ugrave" g2="Aacute" k="20" /> +<hkern g1="Ugrave" g2="Acircumflex" k="20" /> +<hkern g1="Ugrave" g2="Atilde" k="20" /> +<hkern g1="Ugrave" g2="Adieresis" k="20" /> +<hkern g1="Ugrave" g2="Aring" k="20" /> +<hkern g1="Ugrave" g2="quotesinglbase" k="41" /> +<hkern g1="Ugrave" g2="quotedblbase" k="41" /> +<hkern g1="Uacute" g2="comma" k="41" /> +<hkern g1="Uacute" g2="period" k="41" /> +<hkern g1="Uacute" g2="A" k="20" /> +<hkern g1="Uacute" g2="Agrave" k="20" /> +<hkern g1="Uacute" g2="Aacute" k="20" /> +<hkern g1="Uacute" g2="Acircumflex" k="20" /> +<hkern g1="Uacute" g2="Atilde" k="20" /> +<hkern g1="Uacute" g2="Adieresis" k="20" /> +<hkern g1="Uacute" g2="Aring" k="20" /> +<hkern g1="Uacute" g2="quotesinglbase" k="41" /> +<hkern g1="Uacute" g2="quotedblbase" k="41" /> +<hkern g1="Ucircumflex" g2="comma" k="41" /> +<hkern g1="Ucircumflex" g2="period" k="41" /> +<hkern g1="Ucircumflex" g2="A" k="20" /> +<hkern g1="Ucircumflex" g2="Agrave" k="20" /> +<hkern g1="Ucircumflex" g2="Aacute" k="20" /> +<hkern g1="Ucircumflex" g2="Acircumflex" k="20" /> +<hkern g1="Ucircumflex" g2="Atilde" k="20" /> +<hkern g1="Ucircumflex" g2="Adieresis" k="20" /> +<hkern g1="Ucircumflex" g2="Aring" k="20" /> +<hkern g1="Ucircumflex" g2="quotesinglbase" k="41" /> +<hkern g1="Ucircumflex" g2="quotedblbase" k="41" /> +<hkern g1="Udieresis" g2="comma" k="41" /> +<hkern g1="Udieresis" g2="period" k="41" /> +<hkern g1="Udieresis" g2="A" k="20" /> +<hkern g1="Udieresis" g2="Agrave" k="20" /> +<hkern g1="Udieresis" g2="Aacute" k="20" /> +<hkern g1="Udieresis" g2="Acircumflex" k="20" /> +<hkern g1="Udieresis" g2="Atilde" k="20" /> +<hkern g1="Udieresis" g2="Adieresis" k="20" /> +<hkern g1="Udieresis" g2="Aring" k="20" /> +<hkern g1="Udieresis" g2="quotesinglbase" k="41" /> +<hkern g1="Udieresis" g2="quotedblbase" k="41" /> +<hkern g1="Yacute" g2="comma" k="123" /> +<hkern g1="Yacute" g2="period" k="123" /> +<hkern g1="Yacute" g2="question" k="-41" /> +<hkern g1="Yacute" g2="A" k="123" /> +<hkern g1="Yacute" g2="C" k="41" /> +<hkern g1="Yacute" g2="G" k="41" /> +<hkern g1="Yacute" g2="O" k="41" /> +<hkern g1="Yacute" g2="Q" k="41" /> +<hkern g1="Yacute" g2="a" k="102" /> +<hkern g1="Yacute" g2="c" k="102" /> +<hkern g1="Yacute" g2="d" k="102" /> +<hkern g1="Yacute" g2="e" k="102" /> +<hkern g1="Yacute" g2="g" k="41" /> +<hkern g1="Yacute" g2="m" k="61" /> +<hkern g1="Yacute" g2="n" k="61" /> +<hkern g1="Yacute" g2="o" k="102" /> +<hkern g1="Yacute" g2="p" k="61" /> +<hkern g1="Yacute" g2="q" k="102" /> +<hkern g1="Yacute" g2="r" k="61" /> +<hkern g1="Yacute" g2="s" k="82" /> +<hkern g1="Yacute" g2="u" k="61" /> +<hkern g1="Yacute" g2="z" k="41" /> +<hkern g1="Yacute" g2="Agrave" k="123" /> +<hkern g1="Yacute" g2="Aacute" k="123" /> +<hkern g1="Yacute" g2="Acircumflex" k="123" /> +<hkern g1="Yacute" g2="Atilde" k="123" /> +<hkern g1="Yacute" g2="Adieresis" k="123" /> +<hkern g1="Yacute" g2="Aring" k="123" /> +<hkern g1="Yacute" g2="Ccedilla" k="41" /> +<hkern g1="Yacute" g2="Ograve" k="41" /> +<hkern g1="Yacute" g2="Oacute" k="41" /> +<hkern g1="Yacute" g2="Ocircumflex" k="41" /> +<hkern g1="Yacute" g2="Otilde" k="41" /> +<hkern g1="Yacute" g2="Odieresis" k="41" /> +<hkern g1="Yacute" g2="Oslash" k="41" /> +<hkern g1="Yacute" g2="agrave" k="102" /> +<hkern g1="Yacute" g2="aacute" k="102" /> +<hkern g1="Yacute" g2="acircumflex" k="102" /> +<hkern g1="Yacute" g2="atilde" k="102" /> +<hkern g1="Yacute" g2="adieresis" k="102" /> +<hkern g1="Yacute" g2="aring" k="102" /> +<hkern g1="Yacute" g2="ae" k="102" /> +<hkern g1="Yacute" g2="ccedilla" k="102" /> +<hkern g1="Yacute" g2="egrave" k="102" /> +<hkern g1="Yacute" g2="eacute" k="102" /> +<hkern g1="Yacute" g2="ecircumflex" k="102" /> +<hkern g1="Yacute" g2="edieresis" k="102" /> +<hkern g1="Yacute" g2="ograve" k="102" /> +<hkern g1="Yacute" g2="oacute" k="102" /> +<hkern g1="Yacute" g2="ocircumflex" k="102" /> +<hkern g1="Yacute" g2="otilde" k="102" /> +<hkern g1="Yacute" g2="odieresis" k="102" /> +<hkern g1="Yacute" g2="oslash" k="102" /> +<hkern g1="Yacute" g2="ugrave" k="61" /> +<hkern g1="Yacute" g2="uacute" k="61" /> +<hkern g1="Yacute" g2="ucircumflex" k="61" /> +<hkern g1="Yacute" g2="udieresis" k="61" /> +<hkern g1="Yacute" g2="OE" k="41" /> +<hkern g1="Yacute" g2="oe" k="102" /> +<hkern g1="Yacute" g2="quotesinglbase" k="123" /> +<hkern g1="Yacute" g2="quotedblbase" k="123" /> +<hkern g1="Thorn" g2="comma" k="266" /> +<hkern g1="Thorn" g2="period" k="266" /> +<hkern g1="Thorn" g2="A" k="102" /> +<hkern g1="Thorn" g2="X" k="41" /> +<hkern g1="Thorn" g2="Z" k="20" /> +<hkern g1="Thorn" g2="Agrave" k="102" /> +<hkern g1="Thorn" g2="Aacute" k="102" /> +<hkern g1="Thorn" g2="Acircumflex" k="102" /> +<hkern g1="Thorn" g2="Atilde" k="102" /> +<hkern g1="Thorn" g2="Adieresis" k="102" /> +<hkern g1="Thorn" g2="Aring" k="102" /> +<hkern g1="Thorn" g2="quotesinglbase" k="266" /> +<hkern g1="Thorn" g2="quotedblbase" k="266" /> +<hkern g1="agrave" g2="quotedbl" k="20" /> +<hkern g1="agrave" g2="quotesingle" k="20" /> +<hkern g1="agrave" g2="quoteright" k="20" /> +<hkern g1="agrave" g2="quotedblright" k="20" /> +<hkern g1="aacute" g2="quotedbl" k="20" /> +<hkern g1="aacute" g2="quotesingle" k="20" /> +<hkern g1="aacute" g2="quoteright" k="20" /> +<hkern g1="aacute" g2="quotedblright" k="20" /> +<hkern g1="acircumflex" g2="quotedbl" k="20" /> +<hkern g1="acircumflex" g2="quotesingle" k="20" /> +<hkern g1="acircumflex" g2="quoteright" k="20" /> +<hkern g1="acircumflex" g2="quotedblright" k="20" /> +<hkern g1="atilde" g2="quotedbl" k="20" /> +<hkern g1="atilde" g2="quotesingle" k="20" /> +<hkern g1="atilde" g2="quoteright" k="20" /> +<hkern g1="atilde" g2="quotedblright" k="20" /> +<hkern g1="adieresis" g2="quotedbl" k="20" /> +<hkern g1="adieresis" g2="quotesingle" k="20" /> +<hkern g1="adieresis" g2="quoteright" k="20" /> +<hkern g1="adieresis" g2="quotedblright" k="20" /> +<hkern g1="aring" g2="quotedbl" k="20" /> +<hkern g1="aring" g2="quotesingle" k="20" /> +<hkern g1="aring" g2="quoteright" k="20" /> +<hkern g1="aring" g2="quotedblright" k="20" /> +<hkern g1="egrave" g2="quotedbl" k="20" /> +<hkern g1="egrave" g2="quotesingle" k="20" /> +<hkern g1="egrave" g2="v" k="41" /> +<hkern g1="egrave" g2="w" k="41" /> +<hkern g1="egrave" g2="x" k="41" /> +<hkern g1="egrave" g2="y" k="41" /> +<hkern g1="egrave" g2="z" k="20" /> +<hkern g1="egrave" g2="yacute" k="41" /> +<hkern g1="egrave" g2="quoteright" k="20" /> +<hkern g1="egrave" g2="quotedblright" k="20" /> +<hkern g1="eacute" g2="quotedbl" k="20" /> +<hkern g1="eacute" g2="quotesingle" k="20" /> +<hkern g1="eacute" g2="v" k="41" /> +<hkern g1="eacute" g2="w" k="41" /> +<hkern g1="eacute" g2="x" k="41" /> +<hkern g1="eacute" g2="y" k="41" /> +<hkern g1="eacute" g2="z" k="20" /> +<hkern g1="eacute" g2="yacute" k="41" /> +<hkern g1="eacute" g2="quoteright" k="20" /> +<hkern g1="eacute" g2="quotedblright" k="20" /> +<hkern g1="ecircumflex" g2="quotedbl" k="20" /> +<hkern g1="ecircumflex" g2="quotesingle" k="20" /> +<hkern g1="ecircumflex" g2="v" k="41" /> +<hkern g1="ecircumflex" g2="w" k="41" /> +<hkern g1="ecircumflex" g2="x" k="41" /> +<hkern g1="ecircumflex" g2="y" k="41" /> +<hkern g1="ecircumflex" g2="z" k="20" /> +<hkern g1="ecircumflex" g2="yacute" k="41" /> +<hkern g1="ecircumflex" g2="quoteright" k="20" /> +<hkern g1="ecircumflex" g2="quotedblright" k="20" /> +<hkern g1="edieresis" g2="quotedbl" k="20" /> +<hkern g1="edieresis" g2="quotesingle" k="20" /> +<hkern g1="edieresis" g2="v" k="41" /> +<hkern g1="edieresis" g2="w" k="41" /> +<hkern g1="edieresis" g2="x" k="41" /> +<hkern g1="edieresis" g2="y" k="41" /> +<hkern g1="edieresis" g2="z" k="20" /> +<hkern g1="edieresis" g2="yacute" k="41" /> +<hkern g1="edieresis" g2="quoteright" k="20" /> +<hkern g1="edieresis" g2="quotedblright" k="20" /> +<hkern g1="eth" g2="quotedbl" k="20" /> +<hkern g1="eth" g2="quotesingle" k="20" /> +<hkern g1="eth" g2="v" k="41" /> +<hkern g1="eth" g2="w" k="41" /> +<hkern g1="eth" g2="x" k="41" /> +<hkern g1="eth" g2="y" k="41" /> +<hkern g1="eth" g2="z" k="20" /> +<hkern g1="eth" g2="yacute" k="41" /> +<hkern g1="eth" g2="quoteright" k="20" /> +<hkern g1="eth" g2="quotedblright" k="20" /> +<hkern g1="ograve" g2="quotedbl" k="20" /> +<hkern g1="ograve" g2="quotesingle" k="20" /> +<hkern g1="ograve" g2="v" k="41" /> +<hkern g1="ograve" g2="w" k="41" /> +<hkern g1="ograve" g2="x" k="41" /> +<hkern g1="ograve" g2="y" k="41" /> +<hkern g1="ograve" g2="z" k="20" /> +<hkern g1="ograve" g2="yacute" k="41" /> +<hkern g1="ograve" g2="quoteright" k="20" /> +<hkern g1="ograve" g2="quotedblright" k="20" /> +<hkern g1="oacute" g2="quotedbl" k="20" /> +<hkern g1="oacute" g2="quotesingle" k="20" /> +<hkern g1="oacute" g2="v" k="41" /> +<hkern g1="oacute" g2="w" k="41" /> +<hkern g1="oacute" g2="x" k="41" /> +<hkern g1="oacute" g2="y" k="41" /> +<hkern g1="oacute" g2="z" k="20" /> +<hkern g1="oacute" g2="yacute" k="41" /> +<hkern g1="oacute" g2="quoteright" k="20" /> +<hkern g1="oacute" g2="quotedblright" k="20" /> +<hkern g1="ocircumflex" g2="quotedbl" k="20" /> +<hkern g1="ocircumflex" g2="quotesingle" k="20" /> +<hkern g1="ocircumflex" g2="v" k="41" /> +<hkern g1="ocircumflex" g2="w" k="41" /> +<hkern g1="ocircumflex" g2="x" k="41" /> +<hkern g1="ocircumflex" g2="y" k="41" /> +<hkern g1="ocircumflex" g2="z" k="20" /> +<hkern g1="ocircumflex" g2="yacute" k="41" /> +<hkern g1="ocircumflex" g2="quoteright" k="20" /> +<hkern g1="ocircumflex" g2="quotedblright" k="20" /> +<hkern g1="odieresis" g2="quotedbl" k="41" /> +<hkern g1="odieresis" g2="quotesingle" k="41" /> +<hkern g1="odieresis" g2="quoteright" k="41" /> +<hkern g1="odieresis" g2="quotedblright" k="41" /> +<hkern g1="oslash" g2="quotedbl" k="20" /> +<hkern g1="oslash" g2="quotesingle" k="20" /> +<hkern g1="oslash" g2="v" k="41" /> +<hkern g1="oslash" g2="w" k="41" /> +<hkern g1="oslash" g2="x" k="41" /> +<hkern g1="oslash" g2="y" k="41" /> +<hkern g1="oslash" g2="z" k="20" /> +<hkern g1="oslash" g2="yacute" k="41" /> +<hkern g1="oslash" g2="quoteright" k="20" /> +<hkern g1="oslash" g2="quotedblright" k="20" /> +<hkern g1="yacute" g2="quotedbl" k="-82" /> +<hkern g1="yacute" g2="quotesingle" k="-82" /> +<hkern g1="yacute" g2="comma" k="82" /> +<hkern g1="yacute" g2="period" k="82" /> +<hkern g1="yacute" g2="question" k="-41" /> +<hkern g1="yacute" g2="quoteright" k="-82" /> +<hkern g1="yacute" g2="quotesinglbase" k="82" /> +<hkern g1="yacute" g2="quotedblright" k="-82" /> +<hkern g1="yacute" g2="quotedblbase" k="82" /> +<hkern g1="thorn" g2="quotedbl" k="20" /> +<hkern g1="thorn" g2="quotesingle" k="20" /> +<hkern g1="thorn" g2="v" k="41" /> +<hkern g1="thorn" g2="w" k="41" /> +<hkern g1="thorn" g2="x" k="41" /> +<hkern g1="thorn" g2="y" k="41" /> +<hkern g1="thorn" g2="z" k="20" /> +<hkern g1="thorn" g2="yacute" k="41" /> +<hkern g1="thorn" g2="quoteright" k="20" /> +<hkern g1="thorn" g2="quotedblright" k="20" /> +<hkern g1="ydieresis" g2="quotedbl" k="-82" /> +<hkern g1="ydieresis" g2="quotesingle" k="-82" /> +<hkern g1="ydieresis" g2="comma" k="82" /> +<hkern g1="ydieresis" g2="period" k="82" /> +<hkern g1="ydieresis" g2="question" k="-41" /> +<hkern g1="ydieresis" g2="quoteright" k="-82" /> +<hkern g1="ydieresis" g2="quotesinglbase" k="82" /> +<hkern g1="ydieresis" g2="quotedblright" k="-82" /> +<hkern g1="ydieresis" g2="quotedblbase" k="82" /> +<hkern g1="OE" g2="J" k="-123" /> +</font> +</defs> +</svg> diff --git a/client/css/fonts/Open-Sans-300/Open-Sans-300.ttf b/client/css/fonts/Open-Sans-300/Open-Sans-300.ttf new file mode 100755 index 00000000..d7d7cd1f Binary files /dev/null and b/client/css/fonts/Open-Sans-300/Open-Sans-300.ttf differ diff --git a/client/css/fonts/Open-Sans-300/Open-Sans-300.woff b/client/css/fonts/Open-Sans-300/Open-Sans-300.woff new file mode 100755 index 00000000..32da261f Binary files /dev/null and b/client/css/fonts/Open-Sans-300/Open-Sans-300.woff differ diff --git a/client/css/fonts/Open-Sans-300/Open-Sans-300.woff2 b/client/css/fonts/Open-Sans-300/Open-Sans-300.woff2 new file mode 100755 index 00000000..cf3ec55e Binary files /dev/null and b/client/css/fonts/Open-Sans-300/Open-Sans-300.woff2 differ diff --git a/client/css/fonts/Open-Sans-700/LICENSE.txt b/client/css/fonts/Open-Sans-700/LICENSE.txt new file mode 100755 index 00000000..d6456956 --- /dev/null +++ b/client/css/fonts/Open-Sans-700/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/client/css/fonts/Open-Sans-700/Open-Sans-700.eot b/client/css/fonts/Open-Sans-700/Open-Sans-700.eot new file mode 100755 index 00000000..a78a2a9b Binary files /dev/null and b/client/css/fonts/Open-Sans-700/Open-Sans-700.eot differ diff --git a/client/css/fonts/Open-Sans-700/Open-Sans-700.svg b/client/css/fonts/Open-Sans-700/Open-Sans-700.svg new file mode 100755 index 00000000..a294c817 --- /dev/null +++ b/client/css/fonts/Open-Sans-700/Open-Sans-700.svg @@ -0,0 +1,1635 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg xmlns="http://www.w3.org/2000/svg"> +<defs > +<font id="OpenSans" horiz-adv-x="1295" ><font-face + font-family="Open Sans" + units-per-em="2048" + panose-1="2 11 8 6 3 5 4 2 2 4" + ascent="2189" + descent="-600" + alphabetic="0" /> +<glyph unicode=" " glyph-name="space" horiz-adv-x="532" /> +<glyph unicode="!" glyph-name="exclam" horiz-adv-x="586" d="M416 485H172L121 1462H467L416 485ZM117 143Q117 227 162 270T293 313Q376 313 421 269T467 143Q467 64 421 19T293 -27Q209 -27 163 17T117 143Z" /> +<glyph unicode=""" glyph-name="quotedbl" horiz-adv-x="967" d="M412 1462L371 934H174L133 1462H412ZM834 1462L793 934H596L555 1462H834Z" /> +<glyph unicode="#" glyph-name="numbersign" horiz-adv-x="1323" d="M999 844L952 612H1210V406H913L836 0H616L694 406H500L424 0H209L283 406H45V612H322L369 844H117V1053H406L483 1460H702L625 1053H823L901 1460H1116L1038 1053H1278V844H999ZM539 612H735L782 +844H586L539 612Z" /> +<glyph unicode="$" glyph-name="dollar" horiz-adv-x="1169" d="M1092 457Q1092 298 977 202T655 86V-119H518V82Q274 87 90 168V432Q177 389 299 356T518 317V627L451 653Q253 731 171 822T88 1049Q88 1194 201 1287T518 1401V1554H655V1405Q884 1395 1069 1313L975 +1079Q819 1143 655 1157V862Q850 787 932 732T1053 611T1092 457ZM791 442Q791 484 757 513T655 573V324Q791 347 791 442ZM389 1049Q389 1005 419 977T518 918V1153Q389 1134 389 1049Z" /> +<glyph unicode="%" glyph-name="percent" horiz-adv-x="1845" d="M315 1024Q315 897 337 835T410 772Q506 772 506 1024Q506 1274 410 1274Q360 1274 338 1213T315 1024ZM758 1026Q758 796 669 681T408 565Q243 565 153 683T63 1026Q63 1483 408 1483Q577 1483 +667 1365T758 1026ZM1446 1462L635 0H395L1206 1462H1446ZM1339 440Q1339 313 1361 251T1434 188Q1530 188 1530 440Q1530 690 1434 690Q1384 690 1362 629T1339 440ZM1782 442Q1782 213 1693 98T1432 -18Q1267 -18 1177 100T1087 442Q1087 899 1432 899Q1601 899 +1691 781T1782 442Z" /> +<glyph unicode="&" glyph-name="ampersand" horiz-adv-x="1536" d="M1536 0H1159L1044 113Q853 -20 612 -20Q368 -20 225 92T82 395Q82 532 142 628T350 809Q275 895 241 973T207 1145Q207 1297 323 1390T635 1483Q821 1483 932 1397T1044 1165Q1044 1046 +975 948T752 760L1036 483Q1107 600 1159 784H1477Q1441 649 1378 521T1235 293L1536 0ZM403 424Q403 338 467 287T633 236Q759 236 860 297L528 627Q470 583 437 535T403 424ZM762 1133Q762 1186 726 1216T633 1247Q566 1247 528 1215T489 1124Q489 1036 584 930Q670 +978 716 1024T762 1133Z" /> +<glyph unicode="'" glyph-name="quotesingle" horiz-adv-x="545" d="M412 1462L371 934H174L133 1462H412Z" /> +<glyph unicode="(" glyph-name="parenleft" horiz-adv-x="694" d="M82 561Q82 826 159 1057T383 1462H633Q492 1269 420 1038T348 563Q348 318 421 90T631 -324H383Q236 -154 159 73T82 561Z" /> +<glyph unicode=")" glyph-name="parenright" horiz-adv-x="694" d="M612 561Q612 298 535 71T311 -324H63Q198 -140 272 88T346 563Q346 807 274 1038T61 1462H311Q458 1287 535 1056T612 561Z" /> +<glyph unicode="*" glyph-name="asterisk" horiz-adv-x="1116" d="M688 1556L647 1188L1020 1292L1053 1040L713 1016L936 719L709 598L553 911L416 600L180 719L401 1016L63 1042L102 1292L467 1188L426 1556H688Z" /> +<glyph unicode="+" glyph-name="plus" horiz-adv-x="1169" d="M475 612H88V831H475V1221H694V831H1081V612H694V227H475V612Z" /> +<glyph unicode="," glyph-name="comma" horiz-adv-x="594" d="M459 215Q407 13 283 -264H63Q128 2 164 238H444L459 215Z" /> +<glyph unicode="-" glyph-name="hyphen" horiz-adv-x="659" d="M61 424V674H598V424H61Z" /> +<glyph unicode="." glyph-name="period" horiz-adv-x="584" d="M117 143Q117 227 162 270T293 313Q376 313 421 269T467 143Q467 64 421 19T293 -27Q209 -27 163 17T117 143Z" /> +<glyph unicode="/" glyph-name="slash" horiz-adv-x="846" d="M836 1462L291 0H14L559 1462H836Z" /> +<glyph unicode="0" glyph-name="zero" horiz-adv-x="1169" d="M1096 731Q1096 348 971 164T584 -20Q331 -20 203 170T74 731Q74 1118 199 1301T584 1485Q837 1485 966 1293T1096 731ZM381 731Q381 462 427 346T584 229Q692 229 740 347T788 731Q788 1000 740 1117T584 +1235Q475 1235 428 1118T381 731Z" /> +<glyph unicode="1" glyph-name="one" horiz-adv-x="1169" d="M846 0H537V846L540 985L545 1137Q468 1060 438 1036L270 901L121 1087L592 1462H846V0Z" /> +<glyph unicode="2" glyph-name="two" horiz-adv-x="1169" d="M1104 0H82V215L449 586Q612 753 662 817T734 937T756 1051Q756 1139 708 1182T578 1225Q493 1225 413 1186T246 1075L78 1274Q186 1366 257 1404T412 1462T600 1483Q737 1483 842 1433T1005 1293T1063 +1087Q1063 986 1028 898T918 716T655 451L467 274V260H1104V0Z" /> +<glyph unicode="3" glyph-name="three" horiz-adv-x="1169" d="M1047 1135Q1047 998 964 902T731 770V764Q908 742 999 657T1090 426Q1090 215 937 98T500 -20Q262 -20 78 59V322Q163 279 265 252T467 225Q620 225 693 277T766 444Q766 547 682 590T414 633H303V870H416Q586 +870 664 914T743 1067Q743 1233 535 1233Q463 1233 389 1209T223 1126L80 1339Q280 1483 557 1483Q784 1483 915 1391T1047 1135Z" /> +<glyph unicode="4" glyph-name="four" horiz-adv-x="1169" d="M1137 303H961V0H659V303H35V518L676 1462H961V543H1137V303ZM659 543V791Q659 853 664 971T672 1108H664Q627 1026 575 948L307 543H659Z" /> +<glyph unicode="5" glyph-name="five" horiz-adv-x="1169" d="M614 934Q826 934 951 815T1077 489Q1077 244 926 112T494 -20Q250 -20 100 59V326Q179 284 284 258T483 231Q766 231 766 463Q766 684 473 684Q420 684 356 674T252 651L129 717L184 1462H977V1200H455L428 +913L463 920Q524 934 614 934Z" /> +<glyph unicode="6" glyph-name="six" horiz-adv-x="1169" d="M72 621Q72 1055 255 1267T805 1479Q930 1479 1001 1464V1217Q912 1237 825 1237Q666 1237 566 1189T415 1047T356 780H369Q468 950 686 950Q882 950 993 827T1104 487Q1104 253 972 117T606 -20Q444 +-20 324 55T138 274T72 621ZM600 227Q699 227 752 293T805 483Q805 590 756 651T606 713Q512 713 446 652T379 510Q379 391 441 309T600 227Z" /> +<glyph unicode="7" glyph-name="seven" horiz-adv-x="1169" d="M227 0L776 1200H55V1460H1104V1266L551 0H227Z" /> +<glyph unicode="8" glyph-name="eight" horiz-adv-x="1169" d="M586 1481Q796 1481 924 1386T1053 1128Q1053 1016 991 929T791 772Q955 684 1026 589T1098 379Q1098 199 957 90T586 -20Q346 -20 209 82T72 371Q72 496 138 593T352 764Q227 843 172 933T117 1130Q117 +1287 247 1384T586 1481ZM358 389Q358 303 418 255T582 207Q697 207 754 256T811 387Q811 454 755 512T571 637Q358 539 358 389ZM584 1255Q505 1255 457 1215T408 1106Q408 1046 446 999T586 901Q684 947 723 995T762 1106Q762 1175 712 1215T584 1255Z" /> +<glyph unicode="9" glyph-name="nine" horiz-adv-x="1169" d="M1098 838Q1098 406 916 193T365 -20Q235 -20 168 -6V242Q252 221 344 221Q499 221 599 266T752 409T813 678H801Q743 584 667 546T477 508Q286 508 176 630T66 971Q66 1206 199 1342T563 1479Q725 +1479 846 1403T1033 1183T1098 838ZM569 1231Q473 1231 419 1165T365 975Q365 869 414 807T563 745Q657 745 724 806T791 948Q791 1067 729 1149T569 1231Z" /> +<glyph unicode=":" glyph-name="colon" horiz-adv-x="584" d="M117 143Q117 227 162 270T293 313Q376 313 421 269T467 143Q467 64 421 19T293 -27Q209 -27 163 17T117 143ZM117 969Q117 1053 162 1096T293 1139Q376 1139 421 1095T467 969Q467 888 421 844T293 +799Q209 799 163 843T117 969Z" /> +<glyph unicode=";" glyph-name="semicolon" horiz-adv-x="594" d="M444 238L459 215Q407 13 283 -264H63Q128 2 164 238H444ZM117 969Q117 1053 162 1096T293 1139Q376 1139 421 1095T467 969Q467 888 421 844T293 799Q209 799 163 843T117 969Z" /> +<glyph unicode="<" glyph-name="less" horiz-adv-x="1169" d="M1081 203L88 641V784L1081 1280V1040L397 723L1081 442V203Z" /> +<glyph unicode="=" glyph-name="equal" horiz-adv-x="1169" d="M88 805V1024H1081V805H88ZM88 418V637H1081V418H88Z" /> +<glyph unicode=">" glyph-name="greater" horiz-adv-x="1169" d="M88 442L772 723L88 1040V1280L1081 784V641L88 203V442Z" /> +<glyph unicode="?" glyph-name="question" horiz-adv-x="977" d="M276 485V559Q276 655 317 726T467 877Q572 952 605 999T639 1104Q639 1169 591 1203T457 1237Q307 1237 115 1139L6 1358Q229 1483 479 1483Q685 1483 806 1384T928 1120Q928 1010 878 930T688 +750Q592 679 567 642T541 545V485H276ZM244 143Q244 227 289 270T420 313Q503 313 548 269T594 143Q594 64 548 19T420 -27Q336 -27 290 17T244 143Z" /> +<glyph unicode="@" glyph-name="at" horiz-adv-x="1837" d="M1735 752Q1735 608 1689 489T1559 301T1364 233Q1290 233 1233 268T1151 362H1135Q1027 233 860 233Q683 233 581 339T479 631Q479 842 613 971T963 1100Q1049 1100 1152 1084T1323 1044L1300 555Q1300 +416 1376 416Q1440 416 1478 509T1516 754Q1516 915 1449 1038T1261 1227T983 1292Q781 1292 632 1209T404 970T324 608Q324 332 471 185T899 37Q1005 37 1132 60T1382 129V-63Q1168 -154 907 -154Q527 -154 315 46T102 602Q102 849 210 1050T519 1366T981 1481Q1201 +1481 1374 1391T1641 1135T1735 752ZM711 627Q711 416 883 416Q973 416 1020 479T1077 686L1090 907Q1039 918 975 918Q850 918 781 840T711 627Z" /> +<glyph unicode="A" glyph-name="A" horiz-adv-x="1413" d="M1079 0L973 348H440L334 0H0L516 1468H895L1413 0H1079ZM899 608Q752 1081 734 1143T707 1241Q674 1113 518 608H899Z" /> +<glyph unicode="B" glyph-name="B" horiz-adv-x="1376" d="M184 1462H639Q950 1462 1090 1374T1231 1092Q1231 961 1170 877T1006 776V766Q1145 735 1206 650T1268 424Q1268 224 1124 112T731 0H184V1462ZM494 883H674Q800 883 856 922T913 1051Q913 1135 852 +1171T657 1208H494V883ZM494 637V256H696Q824 256 885 305T946 455Q946 637 686 637H494Z" /> +<glyph unicode="C" glyph-name="C" horiz-adv-x="1305" d="M805 1225Q630 1225 534 1094T438 727Q438 238 805 238Q959 238 1178 315V55Q998 -20 776 -20Q457 -20 288 173T119 729Q119 957 202 1128T440 1391T805 1483Q1018 1483 1233 1380L1133 1128Q1051 1167 +968 1196T805 1225Z" /> +<glyph unicode="D" glyph-name="D" horiz-adv-x="1516" d="M1397 745Q1397 384 1192 192T598 0H184V1462H643Q1001 1462 1199 1273T1397 745ZM1075 737Q1075 1208 659 1208H494V256H627Q1075 256 1075 737Z" /> +<glyph unicode="E" glyph-name="E" horiz-adv-x="1147" d="M1026 0H184V1462H1026V1208H494V887H989V633H494V256H1026V0Z" /> +<glyph unicode="F" glyph-name="F" horiz-adv-x="1124" d="M489 0H184V1462H1022V1208H489V831H985V578H489V0Z" /> +<glyph unicode="G" glyph-name="G" horiz-adv-x="1483" d="M739 821H1319V63Q1178 17 1054 -1T799 -20Q468 -20 294 174T119 733Q119 1087 321 1285T883 1483Q1108 1483 1317 1393L1214 1145Q1054 1225 881 1225Q680 1225 559 1090T438 727Q438 489 535 364T819 +238Q916 238 1016 258V563H739V821Z" /> +<glyph unicode="H" glyph-name="H" horiz-adv-x="1567" d="M1382 0H1073V631H494V0H184V1462H494V889H1073V1462H1382V0Z" /> +<glyph unicode="I" glyph-name="I" horiz-adv-x="678" d="M184 0V1462H494V0H184Z" /> +<glyph unicode="J" glyph-name="J" horiz-adv-x="678" d="M31 -430Q-74 -430 -152 -408V-150Q-72 -170 -6 -170Q96 -170 140 -107T184 92V1462H494V94Q494 -162 377 -296T31 -430Z" /> +<glyph unicode="K" glyph-name="K" horiz-adv-x="1360" d="M1360 0H1008L625 616L494 522V0H184V1462H494V793L616 965L1012 1462H1356L846 815L1360 0Z" /> +<glyph unicode="L" glyph-name="L" horiz-adv-x="1157" d="M184 0V1462H494V256H1087V0H184Z" /> +<glyph unicode="M" glyph-name="M" horiz-adv-x="1931" d="M803 0L451 1147H442Q461 797 461 680V0H184V1462H606L952 344H958L1325 1462H1747V0H1458V692Q1458 741 1459 805T1473 1145H1464L1087 0H803Z" /> +<glyph unicode="N" glyph-name="N" horiz-adv-x="1665" d="M1481 0H1087L451 1106H442Q461 813 461 688V0H184V1462H575L1210 367H1217Q1202 652 1202 770V1462H1481V0Z" /> +<glyph unicode="O" glyph-name="O" horiz-adv-x="1630" d="M1511 733Q1511 370 1331 175T815 -20Q479 -20 299 175T119 735Q119 1100 299 1292T817 1485Q1154 1485 1332 1291T1511 733ZM444 733Q444 488 537 364T815 240Q1186 240 1186 733Q1186 1227 817 1227Q632 +1227 538 1103T444 733Z" /> +<glyph unicode="P" glyph-name="P" horiz-adv-x="1286" d="M494 774H596Q739 774 810 830T881 995Q881 1104 822 1156T635 1208H494V774ZM1194 1006Q1194 770 1047 645T627 520H494V0H184V1462H651Q917 1462 1055 1348T1194 1006Z" /> +<glyph unicode="Q" glyph-name="Q" horiz-adv-x="1630" d="M1511 733Q1511 475 1420 301T1151 45L1503 -348H1106L838 -20H815Q479 -20 299 175T119 735Q119 1100 299 1292T817 1485Q1154 1485 1332 1291T1511 733ZM444 733Q444 488 537 364T815 240Q1186 240 +1186 733Q1186 1227 817 1227Q632 1227 538 1103T444 733Z" /> +<glyph unicode="R" glyph-name="R" horiz-adv-x="1352" d="M494 813H594Q741 813 811 862T881 1016Q881 1120 810 1164T588 1208H494V813ZM494 561V0H184V1462H610Q908 1462 1051 1354T1194 1024Q1194 895 1123 795T922 637Q1252 144 1352 0H1008L659 561H494Z" /> +<glyph unicode="S" glyph-name="S" horiz-adv-x="1128" d="M1047 406Q1047 208 905 94T508 -20Q274 -20 94 68V356Q242 290 344 263T532 236Q634 236 688 275T743 391Q743 434 719 467T649 532T459 631Q325 694 258 752T151 887T111 1067Q111 1261 242 1372T606 +1483Q720 1483 823 1456T1040 1380L940 1139Q823 1187 747 1206T596 1225Q508 1225 461 1184T414 1077Q414 1036 433 1006T493 947T690 844Q895 746 971 648T1047 406Z" /> +<glyph unicode="T" glyph-name="T" horiz-adv-x="1186" d="M748 0H438V1204H41V1462H1145V1204H748V0Z" /> +<glyph unicode="U" glyph-name="U" horiz-adv-x="1548" d="M1374 1462V516Q1374 354 1302 232T1092 45T768 -20Q486 -20 330 124T174 520V1462H483V567Q483 398 551 319T776 240Q928 240 996 319T1065 569V1462H1374Z" /> +<glyph unicode="V" glyph-name="V" horiz-adv-x="1331" d="M1018 1462H1331L834 0H496L0 1462H313L588 592Q611 515 635 413T666 270Q677 362 741 592L1018 1462Z" /> +<glyph unicode="W" glyph-name="W" horiz-adv-x="1980" d="M1608 0H1255L1057 768Q1046 809 1020 937T989 1110Q983 1056 959 937T922 766L725 0H373L0 1462H305L492 664Q541 443 563 281Q569 338 590 457T631 643L844 1462H1137L1350 643Q1364 588 1385 475T1417 +281Q1427 359 1449 475T1489 664L1675 1462H1980L1608 0Z" /> +<glyph unicode="X" glyph-name="X" horiz-adv-x="1366" d="M1366 0H1012L672 553L332 0H0L485 754L31 1462H373L688 936L997 1462H1331L872 737L1366 0Z" /> +<glyph unicode="Y" glyph-name="Y" horiz-adv-x="1278" d="M639 860L944 1462H1278L793 569V0H485V559L0 1462H336L639 860Z" /> +<glyph unicode="Z" glyph-name="Z" horiz-adv-x="1186" d="M1137 0H49V201L750 1206H68V1462H1118V1262L418 256H1137V0Z" /> +<glyph unicode="[" glyph-name="bracketleft" horiz-adv-x="678" d="M627 -324H143V1462H627V1251H403V-113H627V-324Z" /> +<glyph unicode="\" glyph-name="backslash" horiz-adv-x="846" d="M289 1462L834 0H557L12 1462H289Z" /> +<glyph unicode="]" glyph-name="bracketright" horiz-adv-x="678" d="M51 -113H274V1251H51V1462H535V-324H51V-113Z" /> +<glyph unicode="^" glyph-name="asciicircum" horiz-adv-x="1090" d="M8 520L446 1470H590L1085 520H846L524 1163L244 520H8Z" /> +<glyph unicode="_" glyph-name="underscore" horiz-adv-x="842" d="M846 -324H-4V-184H846V-324Z" /> +<glyph unicode="`" glyph-name="grave" horiz-adv-x="1243" d="M707 1241Q644 1285 522 1383T332 1548V1569H674Q737 1468 909 1268V1241H707Z" /> +<glyph unicode="a" glyph-name="a" horiz-adv-x="1237" d="M870 0L811 152H803Q726 55 645 18T432 -20Q271 -20 179 72T86 334Q86 512 210 596T586 690L780 696V745Q780 915 606 915Q472 915 291 834L190 1040Q383 1141 618 1141Q843 1141 963 1043T1083 745V0H870ZM780 +518L662 514Q529 510 464 466T399 332Q399 203 547 203Q653 203 716 264T780 426V518Z" /> +<glyph unicode="b" glyph-name="b" horiz-adv-x="1296" d="M782 1139Q980 1139 1092 985T1204 561Q1204 284 1089 132T774 -20Q577 -20 465 123H444L393 0H160V1556H465V1194Q465 1125 453 973H465Q572 1139 782 1139ZM684 895Q571 895 519 826T465 596V563Q465 +383 518 305T688 227Q782 227 837 313T893 565Q893 730 837 812T684 895Z" /> +<glyph unicode="c" glyph-name="c" horiz-adv-x="1053" d="M614 -20Q92 -20 92 553Q92 838 234 988T641 1139Q835 1139 989 1063L899 827Q827 856 765 874T641 893Q403 893 403 555Q403 227 641 227Q729 227 804 250T954 324V63Q880 16 805 -2T614 -20Z" /> +<glyph unicode="d" glyph-name="d" horiz-adv-x="1296" d="M514 -20Q317 -20 205 133T92 557Q92 832 206 985T522 1139Q733 1139 844 975H854Q831 1100 831 1198V1556H1137V0H903L844 145H831Q727 -20 514 -20ZM621 223Q738 223 792 291T852 522V555Q852 735 797 +813T616 891Q514 891 458 805T401 553Q401 388 458 306T621 223Z" /> +<glyph unicode="e" glyph-name="e" horiz-adv-x="1210" d="M623 922Q526 922 471 861T408 686H836Q834 799 777 860T623 922ZM666 -20Q396 -20 244 129T92 551Q92 832 232 985T621 1139Q858 1139 990 1004T1122 631V483H401Q406 353 478 280T680 207Q781 207 871 +228T1059 295V59Q979 19 888 0T666 -20Z" /> +<glyph unicode="f" glyph-name="f" horiz-adv-x="793" d="M778 889H514V0H209V889H41V1036L209 1118V1200Q209 1391 303 1479T604 1567Q762 1567 885 1520L807 1296Q715 1325 637 1325Q572 1325 543 1287T514 1188V1118H778V889Z" /> +<glyph unicode="g" glyph-name="g" horiz-adv-x="1157" d="M1133 1118V963L958 918Q1006 843 1006 750Q1006 570 881 470T532 369L477 372L432 377Q385 341 385 297Q385 231 553 231H743Q927 231 1023 152T1120 -80Q1120 -276 957 -384T487 -492Q253 -492 130 +-411T6 -182Q6 -81 69 -13T254 84Q207 104 172 149T137 246Q137 310 174 352T281 436Q193 474 142 558T90 756Q90 939 209 1039T549 1139Q596 1139 660 1131T743 1118H1133ZM270 -158Q270 -221 330 -257T500 -293Q664 -293 757 -248T850 -125Q850 -62 795 -38T625 +-14H467Q383 -14 327 -53T270 -158ZM381 752Q381 661 422 608T549 555Q635 555 675 608T715 752Q715 954 549 954Q381 954 381 752Z" /> +<glyph unicode="h" glyph-name="h" horiz-adv-x="1346" d="M1192 0H887V653Q887 895 707 895Q579 895 522 808T465 526V0H160V1556H465V1239Q465 1202 458 1065L451 975H467Q569 1139 791 1139Q988 1139 1090 1033T1192 729V0Z" /> +<glyph unicode="i" glyph-name="i" horiz-adv-x="625" d="M147 1407Q147 1556 313 1556Q479 1556 479 1407Q479 1336 438 1297T313 1257Q147 1257 147 1407ZM465 0H160V1118H465V0Z" /> +<glyph unicode="j" glyph-name="j" horiz-adv-x="625" d="M70 -492Q-47 -492 -131 -467V-227Q-61 -246 12 -246Q89 -246 124 -203T160 -76V1118H465V-121Q465 -299 362 -395T70 -492ZM147 1407Q147 1556 313 1556Q479 1556 479 1407Q479 1336 438 1297T313 1257Q147 +1257 147 1407Z" /> +<glyph unicode="k" glyph-name="k" horiz-adv-x="1270" d="M453 608L586 778L899 1118H1243L799 633L1270 0H918L596 453L465 348V0H160V1556H465V862L449 608H453Z" /> +<glyph unicode="l" glyph-name="l" horiz-adv-x="625" d="M465 0H160V1556H465V0Z" /> +<glyph unicode="m" glyph-name="m" horiz-adv-x="2011" d="M1161 0H856V653Q856 774 816 834T688 895Q571 895 518 809T465 526V0H160V1118H393L434 975H451Q496 1052 581 1095T776 1139Q1027 1139 1116 975H1143Q1188 1053 1275 1096T1473 1139Q1663 1139 1760 +1042T1858 729V0H1552V653Q1552 774 1512 834T1384 895Q1272 895 1217 815T1161 561V0Z" /> +<glyph unicode="n" glyph-name="n" horiz-adv-x="1346" d="M1192 0H887V653Q887 774 844 834T707 895Q579 895 522 810T465 526V0H160V1118H393L434 975H451Q502 1056 591 1097T795 1139Q990 1139 1091 1034T1192 729V0Z" /> +<glyph unicode="o" glyph-name="o" horiz-adv-x="1268" d="M403 561Q403 395 457 310T635 225Q757 225 810 309T864 561Q864 727 810 810T633 893Q511 893 457 811T403 561ZM1176 561Q1176 288 1032 134T631 -20Q470 -20 347 50T158 253T92 561Q92 835 235 987T637 +1139Q798 1139 921 1069T1110 868T1176 561Z" /> +<glyph unicode="p" glyph-name="p" horiz-adv-x="1296" d="M774 -20Q577 -20 465 123H449Q465 -17 465 -39V-492H160V1118H408L451 973H465Q572 1139 782 1139Q980 1139 1092 986T1204 561Q1204 382 1152 250T1002 49T774 -20ZM684 895Q571 895 519 826T465 596V563Q465 +383 518 305T688 227Q893 227 893 565Q893 730 843 812T684 895Z" /> +<glyph unicode="q" glyph-name="q" horiz-adv-x="1296" d="M623 219Q739 219 793 285T852 518V555Q852 735 797 813T618 891Q403 891 403 553Q403 385 456 302T623 219ZM514 -20Q316 -20 204 132T92 557Q92 831 206 985T520 1139Q626 1139 705 1099T844 975H852L879 +1118H1137V-492H831V-23Q831 38 844 145H831Q782 64 701 22T514 -20Z" /> +<glyph unicode="r" glyph-name="r" horiz-adv-x="930" d="M784 1139Q846 1139 887 1130L864 844Q827 854 774 854Q628 854 547 779T465 569V0H160V1118H391L436 930H451Q503 1024 591 1081T784 1139Z" /> +<glyph unicode="s" glyph-name="s" horiz-adv-x="1018" d="M940 332Q940 160 821 70T463 -20Q341 -20 255 -4T94 45V297Q179 257 285 230T473 203Q639 203 639 299Q639 335 617 357T541 408T397 475Q268 529 208 575T120 680T92 827Q92 976 207 1057T535 1139Q737 +1139 928 1051L836 831Q752 867 679 890T530 913Q395 913 395 840Q395 799 438 769T629 680Q760 627 821 581T911 475T940 332Z" /> +<glyph unicode="t" glyph-name="t" horiz-adv-x="889" d="M631 223Q711 223 823 258V31Q709 -20 543 -20Q360 -20 277 72T193 350V889H47V1018L215 1120L303 1356H498V1118H811V889H498V350Q498 285 534 254T631 223Z" /> +<glyph unicode="u" glyph-name="u" horiz-adv-x="1346" d="M952 0L911 143H895Q846 65 756 23T551 -20Q354 -20 254 85T154 389V1118H459V465Q459 344 502 284T639 223Q767 223 824 308T881 592V1118H1186V0H952Z" /> +<glyph unicode="v" glyph-name="v" horiz-adv-x="1165" d="M426 0L0 1118H319L535 481Q571 360 580 252H586Q591 348 631 481L846 1118H1165L739 0H426Z" /> +<glyph unicode="w" glyph-name="w" horiz-adv-x="1753" d="M1079 0L993 391L877 885H870L666 0H338L20 1118H324L453 623Q484 490 516 256H522Q526 332 557 497L573 582L711 1118H1047L1178 582Q1182 560 1190 517T1207 426T1221 331T1229 256H1235Q1244 328 1267 +453T1300 623L1434 1118H1733L1411 0H1079Z" /> +<glyph unicode="x" glyph-name="x" horiz-adv-x="1184" d="M389 571L29 1118H375L592 762L811 1118H1157L793 571L1174 0H827L592 383L356 0H10L389 571Z" /> +<glyph unicode="y" glyph-name="y" horiz-adv-x="1165" d="M0 1118H334L545 489Q572 407 582 295H588Q599 398 631 489L838 1118H1165L692 -143Q627 -318 507 -405T225 -492Q146 -492 70 -475V-233Q125 -246 190 -246Q271 -246 331 -197T426 -47L444 8L0 1118Z" /> +<glyph unicode="z" glyph-name="z" horiz-adv-x="999" d="M938 0H55V180L573 885H86V1118H920V920L416 233H938V0Z" /> +<glyph unicode="{" glyph-name="braceleft" horiz-adv-x="807" d="M287 270Q287 357 222 403T31 449V688Q157 688 222 732T287 858V866V1184Q287 1337 384 1399T725 1462V1237Q626 1234 589 1199T551 1096V797Q545 609 317 575V563Q551 528 551 351V342V43Q551 +-25 588 -60T725 -98V-324Q481 -324 384 -262T287 -45V270Z" /> +<glyph unicode="|" glyph-name="bar" horiz-adv-x="1128" d="M455 1550H674V-465H455V1550Z" /> +<glyph unicode="}" glyph-name="braceright" horiz-adv-x="807" d="M520 -45Q520 -157 479 -214T344 -297T82 -324V-98Q181 -96 218 -62T256 43V342V353Q256 439 315 492T489 563V575Q262 609 256 797V1096Q256 1166 219 1200T82 1237V1462Q249 1462 344 1436T479 +1352T520 1184V866V856Q520 772 581 730T776 688V449Q651 449 586 408T520 270V-45Z" /> +<glyph unicode="~" glyph-name="asciitilde" horiz-adv-x="1169" d="M322 672Q267 672 205 639T88 551V782Q191 891 344 891Q417 891 481 875T621 827Q750 772 848 772Q901 772 964 804T1081 893V662Q980 553 825 553Q759 553 699 566T549 616Q418 672 322 672Z" /> +<glyph unicode=" " glyph-name="nbspace" horiz-adv-x="532" /> +<glyph unicode="¡" glyph-name="exclamdown" horiz-adv-x="586" d="M168 606H412L463 -369H117L168 606ZM467 948Q467 864 422 821T291 778Q208 778 163 822T117 948Q117 1029 163 1073T291 1118Q375 1118 421 1074T467 948Z" /> +<glyph unicode="¢" glyph-name="cent" horiz-adv-x="1169" d="M563 176Q143 235 143 741Q143 1002 247 1144T563 1317V1483H741V1325Q907 1316 1040 1251L950 1016Q878 1045 816 1063T692 1081Q571 1081 513 998T455 743Q455 416 692 416Q774 416 840 431T1006 +492V238Q879 177 741 168V-20H563V176Z" /> +<glyph unicode="£" glyph-name="sterling" horiz-adv-x="1169" d="M700 1483Q895 1483 1090 1401L997 1171Q840 1235 725 1235Q647 1235 605 1191T563 1063V870H938V651H563V508Q563 338 412 260H1130V0H82V248Q185 292 223 349T262 506V651H84V870H262V1065Q262 +1266 376 1374T700 1483Z" /> +<glyph unicode="¤" glyph-name="currency" horiz-adv-x="1169" d="M188 723Q188 825 242 920L113 1047L260 1194L387 1067Q478 1120 584 1120Q689 1120 780 1065L907 1194L1057 1051L928 922Q981 833 981 723Q981 616 928 524L1053 399L907 254L780 379Q685 +328 584 328Q469 328 385 379L260 256L115 401L242 526Q188 619 188 723ZM395 723Q395 646 449 591T584 535Q665 535 720 590T776 723Q776 803 720 858T584 913Q506 913 451 857T395 723Z" /> +<glyph unicode="¥" glyph-name="yen" horiz-adv-x="1169" d="M584 860L848 1462H1161L778 715H973V537H727V399H973V221H727V0H440V221H193V399H440V537H193V715H383L6 1462H322L584 860Z" /> +<glyph unicode="¦" glyph-name="brokenbar" horiz-adv-x="1128" d="M455 1550H674V735H455V1550ZM455 350H674V-465H455V350Z" /> +<glyph unicode="§" glyph-name="section" horiz-adv-x="995" d="M121 805Q121 884 157 949T254 1055Q121 1139 121 1288Q121 1419 232 1498T526 1577Q696 1577 889 1493L807 1303Q739 1335 669 1360T520 1386Q439 1386 402 1363T365 1292Q365 1243 414 1206T578 +1124Q741 1060 818 976T895 782Q895 605 770 522Q832 482 863 430T895 303Q895 155 776 68T455 -20Q252 -20 106 59V266Q187 225 286 197T455 168Q649 168 649 285Q649 324 631 348T567 397T442 457Q259 531 190 609T121 805ZM344 827Q344 760 409 708T590 610Q668 +667 668 756Q668 824 618 871T434 967Q397 953 371 914T344 827Z" /> +<glyph unicode="¨" glyph-name="dieresis" horiz-adv-x="1243" d="M279 1405Q279 1470 316 1505T418 1540Q484 1540 521 1503T559 1405Q559 1345 521 1309T418 1272Q354 1272 317 1307T279 1405ZM682 1405Q682 1475 722 1507T823 1540Q888 1540 926 1504T965 +1405Q965 1344 926 1308T823 1272Q763 1272 723 1304T682 1405Z" /> +<glyph unicode="©" glyph-name="copyright" horiz-adv-x="1704" d="M895 1010Q798 1010 745 936T692 731Q692 451 895 451Q952 451 1018 466T1141 510V319Q1021 262 889 262Q685 262 573 387T461 733Q461 953 571 1075T881 1198Q1030 1198 1186 1120L1112 +952Q999 1010 895 1010ZM100 731Q100 931 200 1106T475 1382T852 1483Q1052 1483 1227 1383T1503 1108T1604 731Q1604 534 1507 361T1235 84T852 -20Q645 -20 470 83T198 360T100 731ZM242 731Q242 567 324 426T548 203T852 121Q1016 121 1157 203T1380 427T1462 +731Q1462 895 1380 1036T1156 1259T852 1341Q688 1341 547 1259T324 1035T242 731Z" /> +<glyph unicode="ª" glyph-name="ordfeminine" horiz-adv-x="784" d="M561 764L530 874Q487 816 425 784T289 752Q172 752 110 810T47 975Q47 1084 129 1138T397 1202L496 1206Q496 1323 369 1323Q288 1323 152 1262L86 1397Q152 1429 231 1454T410 1479Q547 +1479 621 1408T696 1206V764H561ZM252 977Q252 939 275 921T330 903Q407 903 451 944T496 1051V1087L397 1081Q252 1071 252 977Z" /> +<glyph unicode="«" glyph-name="guillemotleft" horiz-adv-x="1260" d="M82 573L453 1028L672 909L393 561L672 213L453 94L82 547V573ZM588 573L958 1028L1178 909L899 561L1178 213L958 94L588 547V573Z" /> +<glyph unicode="¬" glyph-name="logicalnot" horiz-adv-x="1169" d="M1081 248H862V612H88V831H1081V248Z" /> +<glyph unicode="­" glyph-name="uni00AD" horiz-adv-x="659" d="M61 424V674H598V424H61Z" /> +<glyph unicode="®" glyph-name="registered" horiz-adv-x="1704" d="M1157 905Q1157 735 1014 672L1251 272H997L819 610H772V272H543V1188H807Q988 1188 1072 1118T1157 905ZM772 778H803Q869 778 897 806T926 901Q926 966 898 993T801 1020H772V778ZM100 +731Q100 931 200 1106T475 1382T852 1483Q1052 1483 1227 1383T1503 1108T1604 731Q1604 534 1507 361T1235 84T852 -20Q645 -20 470 83T198 360T100 731ZM242 731Q242 567 324 426T548 203T852 121Q1016 121 1157 203T1380 427T1462 731Q1462 895 1380 1036T1156 +1259T852 1341Q688 1341 547 1259T324 1035T242 731Z" /> +<glyph unicode="¯" glyph-name="overscore" horiz-adv-x="1024" d="M1030 1556H-6V1757H1030V1556Z" /> +<glyph unicode="°" glyph-name="degree" horiz-adv-x="877" d="M92 1137Q92 1229 138 1309T264 1436T438 1483Q530 1483 610 1437T737 1310T784 1137Q784 1044 738 964T611 838T438 793Q293 793 193 892T92 1137ZM283 1137Q283 1073 327 1028T438 983Q504 +983 549 1029T594 1137Q594 1200 549 1247T438 1294Q374 1294 329 1248T283 1137Z" /> +<glyph unicode="±" glyph-name="plusminus" horiz-adv-x="1169" d="M475 674H88V893H475V1282H694V893H1081V674H694V289H475V674ZM88 0V219H1081V0H88Z" /> +<glyph unicode="²" glyph-name="twosuperior" horiz-adv-x="776" d="M702 586H55V754L279 973Q381 1073 409 1117T438 1212Q438 1250 414 1270T350 1290Q269 1290 170 1202L47 1354Q194 1483 383 1483Q520 1483 599 1417T678 1233Q678 1148 631 1073T455 +881L350 786H702V586Z" /> +<glyph unicode="³" glyph-name="threesuperior" horiz-adv-x="776" d="M666 1249Q666 1106 496 1051V1038Q590 1018 642 963T694 829Q694 708 606 639T332 569Q189 569 59 639V829Q207 739 330 739Q473 739 473 846Q473 899 429 925T307 952H195V1112H287Q370 +1112 410 1138T451 1221Q451 1259 426 1284T350 1309Q303 1309 261 1290T162 1231L61 1372Q123 1419 198 1450T377 1481Q504 1481 585 1417T666 1249Z" /> +<glyph unicode="´" glyph-name="acute" horiz-adv-x="1243" d="M332 1241V1268Q504 1468 567 1569H909V1548Q857 1496 732 1394T535 1241H332Z" /> +<glyph unicode="µ" glyph-name="mu" horiz-adv-x="1352" d="M465 465Q465 344 509 284T647 223Q773 223 830 309T887 592V1118H1192V0H961L918 150H903Q861 65 801 23T653 -20Q591 -20 539 3T455 70L460 -15L465 -172V-492H160V1118H465V465Z" /> +<glyph unicode="¶" glyph-name="paragraph" horiz-adv-x="1341" d="M1167 -260H1006V1356H840V-260H678V559Q616 541 532 541Q316 541 215 666T113 1042Q113 1302 222 1429T563 1556H1167V-260Z" /> +<glyph unicode="·" glyph-name="middot" horiz-adv-x="584" d="M117 723Q117 807 162 850T293 893Q376 893 421 849T467 723Q467 642 421 598T293 553Q209 553 163 597T117 723Z" /> +<glyph unicode="¸" glyph-name="cedilla" horiz-adv-x="420" d="M418 -250Q418 -378 343 -435T109 -492Q31 -492 -37 -471V-303Q-10 -310 35 -317T106 -324Q178 -324 178 -262Q178 -179 12 -154L90 0H283L256 -61Q330 -85 374 -135T418 -250Z" /> +<glyph unicode="¹" glyph-name="onesuperior" horiz-adv-x="776" d="M584 586H346V1032L349 1144L354 1239Q327 1203 279 1161L201 1100L92 1227L393 1462H584V586Z" /> +<glyph unicode="º" glyph-name="ordmasculine" horiz-adv-x="795" d="M737 1116Q737 945 646 849T395 752Q242 752 150 850T57 1116Q57 1285 146 1382T399 1479Q551 1479 644 1381T737 1116ZM260 1116Q260 1016 292 966T397 915Q469 915 500 965T532 1116Q532 +1216 501 1265T397 1315Q325 1315 293 1266T260 1116Z" /> +<glyph unicode="»" glyph-name="guillemotright" horiz-adv-x="1260" d="M1178 547L807 94L588 213L866 561L588 909L807 1028L1178 573V547ZM672 547L301 94L82 213L360 561L82 909L301 1028L672 573V547Z" /> +<glyph unicode="¼" glyph-name="onequarter" horiz-adv-x="1804" d="M794 586H556V1032L559 1144L564 1239Q537 1203 489 1161L411 1100L302 1227L603 1462H794V586ZM1370 1462L559 0H320L1131 1462H1370ZM1682 152H1557V1H1319V152H936V306L1321 883H1557V320H1682V152ZM1319 +320V484Q1319 570 1325 668Q1316 642 1290 588T1248 511L1121 320H1319Z" /> +<glyph unicode="½" glyph-name="onehalf" horiz-adv-x="1804" d="M794 586H556V1032L559 1144L564 1239Q537 1203 489 1161L411 1100L302 1227L603 1462H794V586ZM1370 1462L559 0H320L1131 1462H1370ZM1716 1H1069V169L1293 388Q1395 488 1423 532T1452 +627Q1452 665 1428 685T1364 705Q1283 705 1184 617L1061 769Q1208 898 1397 898Q1534 898 1613 832T1692 648Q1692 563 1645 488T1469 296L1364 201H1716V1Z" /> +<glyph unicode="¾" glyph-name="threequarters" horiz-adv-x="1804" d="M697 1249Q697 1106 527 1051V1038Q621 1018 673 963T725 829Q725 708 637 639T363 569Q220 569 90 639V829Q238 739 361 739Q504 739 504 846Q504 899 460 925T338 952H226V1112H318Q401 +1112 441 1138T482 1221Q482 1259 457 1284T381 1309Q334 1309 292 1290T193 1231L92 1372Q154 1419 229 1450T408 1481Q535 1481 616 1417T697 1249ZM1441 1462L630 0H391L1202 1462H1441ZM1712 152H1587V1H1349V152H966V306L1351 883H1587V320H1712V152ZM1349 +320V484Q1349 570 1355 668Q1346 642 1320 588T1278 511L1151 320H1349Z" /> +<glyph unicode="¿" glyph-name="questiondown" horiz-adv-x="977" d="M713 606V532Q713 434 669 363T516 215Q407 137 379 93T350 -14Q350 -71 393 -108T526 -145Q605 -145 695 -116T881 -45L983 -266Q885 -322 762 -356T532 -391Q312 -391 187 -295T61 -29Q61 +79 109 158T301 342Q396 412 422 449T449 547V606H713ZM745 948Q745 864 700 821T569 778Q486 778 441 822T395 948Q395 1029 441 1073T569 1118Q653 1118 699 1074T745 948Z" /> +<glyph unicode="À" glyph-name="Agrave" horiz-adv-x="1413" d="M1079 0L973 348H440L334 0H0L516 1468H895L1413 0H1079ZM899 608Q752 1081 734 1143T707 1241Q674 1113 518 608H899ZM713 1579Q650 1623 528 1721T338 1886V1907H680Q743 1806 915 1606V1579H713Z" /> +<glyph unicode="Á" glyph-name="Aacute" horiz-adv-x="1413" d="M1079 0L973 348H440L334 0H0L516 1468H895L1413 0H1079ZM899 608Q752 1081 734 1143T707 1241Q674 1113 518 608H899ZM541 1579V1606Q713 1806 776 1907H1118V1886Q1066 1834 941 1732T744 1579H541Z" /> +<glyph unicode="Â" glyph-name="Acircumflex" horiz-adv-x="1413" d="M1079 0L973 348H440L334 0H0L516 1468H895L1413 0H1079ZM899 608Q752 1081 734 1143T707 1241Q674 1113 518 608H899ZM938 1579Q781 1672 704 1755Q626 1674 475 1579H272V1606Q461 1795 +528 1907H885Q916 1855 992 1766T1141 1606V1579H938Z" /> +<glyph unicode="Ã" glyph-name="Atilde" horiz-adv-x="1413" d="M1079 0L973 348H440L334 0H0L516 1468H895L1413 0H1079ZM899 608Q752 1081 734 1143T707 1241Q674 1113 518 608H899ZM543 1684Q512 1684 484 1658T442 1577H293Q304 1722 375 1804T565 1886Q606 +1886 645 1870T723 1834T799 1798T872 1782Q903 1782 931 1808T973 1888H1122Q1111 1743 1039 1661T850 1579Q809 1579 770 1595T692 1631T616 1667T543 1684Z" /> +<glyph unicode="Ä" glyph-name="Adieresis" horiz-adv-x="1413" d="M1079 0L973 348H440L334 0H0L516 1468H895L1413 0H1079ZM899 608Q752 1081 734 1143T707 1241Q674 1113 518 608H899ZM365 1743Q365 1808 402 1843T504 1878Q570 1878 607 1841T645 1743Q645 +1683 607 1647T504 1610Q440 1610 403 1645T365 1743ZM768 1743Q768 1813 808 1845T909 1878Q974 1878 1012 1842T1051 1743Q1051 1682 1012 1646T909 1610Q849 1610 809 1642T768 1743Z" /> +<glyph unicode="Å" glyph-name="Aring" horiz-adv-x="1413" d="M1079 0L973 348H440L334 0H0L516 1468H895L1413 0H1079ZM899 608Q752 1081 734 1143T707 1241Q674 1113 518 608H899ZM959 1567Q959 1459 888 1393T705 1327Q593 1327 525 1391T457 1565Q457 +1673 524 1737T705 1802Q815 1802 887 1736T959 1567ZM801 1565Q801 1610 774 1635T705 1661Q663 1661 636 1636T609 1565Q609 1520 633 1494T705 1468Q747 1468 774 1494T801 1565Z" /> +<glyph unicode="Æ" glyph-name="AE" horiz-adv-x="1950" d="M1829 0H956V348H465L315 0H0L655 1462H1829V1208H1266V887H1792V633H1266V256H1829V0ZM578 608H956V1198H829L578 608Z" /> +<glyph unicode="Ç" glyph-name="Ccedilla" horiz-adv-x="1305" d="M805 1225Q630 1225 534 1094T438 727Q438 238 805 238Q959 238 1178 315V55Q998 -20 776 -20Q457 -20 288 173T119 729Q119 957 202 1128T440 1391T805 1483Q1018 1483 1233 1380L1133 1128Q1051 +1167 968 1196T805 1225ZM959 -250Q959 -378 884 -435T650 -492Q572 -492 504 -471V-303Q531 -310 576 -317T647 -324Q719 -324 719 -262Q719 -179 553 -154L631 0H824L797 -61Q871 -85 915 -135T959 -250Z" /> +<glyph unicode="È" glyph-name="Egrave" horiz-adv-x="1147" d="M1026 0H184V1462H1026V1208H494V887H989V633H494V256H1026V0ZM634 1579Q571 1623 449 1721T259 1886V1907H601Q664 1806 836 1606V1579H634Z" /> +<glyph unicode="É" glyph-name="Eacute" horiz-adv-x="1147" d="M1026 0H184V1462H1026V1208H494V887H989V633H494V256H1026V0ZM424 1579V1606Q596 1806 659 1907H1001V1886Q949 1834 824 1732T627 1579H424Z" /> +<glyph unicode="Ê" glyph-name="Ecircumflex" horiz-adv-x="1147" d="M1026 0H184V1462H1026V1208H494V887H989V633H494V256H1026V0ZM841 1579Q684 1672 607 1755Q529 1674 378 1579H175V1606Q364 1795 431 1907H788Q819 1855 895 1766T1044 1606V1579H841Z" /> +<glyph unicode="Ë" glyph-name="Edieresis" horiz-adv-x="1147" d="M1026 0H184V1462H1026V1208H494V887H989V633H494V256H1026V0ZM272 1743Q272 1808 309 1843T411 1878Q477 1878 514 1841T552 1743Q552 1683 514 1647T411 1610Q347 1610 310 1645T272 1743ZM675 +1743Q675 1813 715 1845T816 1878Q881 1878 919 1842T958 1743Q958 1682 919 1646T816 1610Q756 1610 716 1642T675 1743Z" /> +<glyph unicode="Ì" glyph-name="Igrave" horiz-adv-x="678" d="M184 0V1462H494V0H184ZM317 1579Q254 1623 132 1721T-58 1886V1907H284Q347 1806 519 1606V1579H317Z" /> +<glyph unicode="Í" glyph-name="Iacute" horiz-adv-x="678" d="M184 0V1462H494V0H184ZM167 1579V1606Q339 1806 402 1907H744V1886Q692 1834 567 1732T370 1579H167Z" /> +<glyph unicode="Î" glyph-name="Icircumflex" horiz-adv-x="678" d="M184 0V1462H494V0H184ZM570 1579Q413 1672 336 1755Q258 1674 107 1579H-96V1606Q93 1795 160 1907H517Q548 1855 624 1766T773 1606V1579H570Z" /> +<glyph unicode="Ï" glyph-name="Idieresis" horiz-adv-x="678" d="M184 0V1462H494V0H184ZM-3 1743Q-3 1808 34 1843T136 1878Q202 1878 239 1841T277 1743Q277 1683 239 1647T136 1610Q72 1610 35 1645T-3 1743ZM400 1743Q400 1813 440 1845T541 1878Q606 +1878 644 1842T683 1743Q683 1682 644 1646T541 1610Q481 1610 441 1642T400 1743Z" /> +<glyph unicode="Ð" glyph-name="Eth" horiz-adv-x="1516" d="M47 850H184V1462H643Q1001 1462 1199 1273T1397 745Q1397 384 1192 192T598 0H184V596H47V850ZM1075 737Q1075 969 971 1088T657 1208H494V850H731V596H494V256H625Q1075 256 1075 737Z" /> +<glyph unicode="Ñ" glyph-name="Ntilde" horiz-adv-x="1665" d="M1481 0H1087L451 1106H442Q461 813 461 688V0H184V1462H575L1210 367H1217Q1202 652 1202 770V1462H1481V0ZM668 1684Q637 1684 609 1658T567 1577H418Q429 1722 500 1804T690 1886Q731 1886 +770 1870T848 1834T924 1798T997 1782Q1028 1782 1056 1808T1098 1888H1247Q1236 1743 1164 1661T975 1579Q934 1579 895 1595T817 1631T741 1667T668 1684Z" /> +<glyph unicode="Ò" glyph-name="Ograve" horiz-adv-x="1630" d="M1511 733Q1511 370 1331 175T815 -20Q479 -20 299 175T119 735Q119 1100 299 1292T817 1485Q1154 1485 1332 1291T1511 733ZM444 733Q444 488 537 364T815 240Q1186 240 1186 733Q1186 1227 +817 1227Q632 1227 538 1103T444 733ZM824 1579Q761 1623 639 1721T449 1886V1907H791Q854 1806 1026 1606V1579H824Z" /> +<glyph unicode="Ó" glyph-name="Oacute" horiz-adv-x="1630" d="M1511 733Q1511 370 1331 175T815 -20Q479 -20 299 175T119 735Q119 1100 299 1292T817 1485Q1154 1485 1332 1291T1511 733ZM444 733Q444 488 537 364T815 240Q1186 240 1186 733Q1186 1227 +817 1227Q632 1227 538 1103T444 733ZM658 1579V1606Q830 1806 893 1907H1235V1886Q1183 1834 1058 1732T861 1579H658Z" /> +<glyph unicode="Ô" glyph-name="Ocircumflex" horiz-adv-x="1630" d="M1511 733Q1511 370 1331 175T815 -20Q479 -20 299 175T119 735Q119 1100 299 1292T817 1485Q1154 1485 1332 1291T1511 733ZM444 733Q444 488 537 364T815 240Q1186 240 1186 733Q1186 +1227 817 1227Q632 1227 538 1103T444 733ZM1047 1579Q890 1672 813 1755Q735 1674 584 1579H381V1606Q570 1795 637 1907H994Q1025 1855 1101 1766T1250 1606V1579H1047Z" /> +<glyph unicode="Õ" glyph-name="Otilde" horiz-adv-x="1630" d="M1511 733Q1511 370 1331 175T815 -20Q479 -20 299 175T119 735Q119 1100 299 1292T817 1485Q1154 1485 1332 1291T1511 733ZM444 733Q444 488 537 364T815 240Q1186 240 1186 733Q1186 1227 +817 1227Q632 1227 538 1103T444 733ZM652 1684Q621 1684 593 1658T551 1577H402Q413 1722 484 1804T674 1886Q715 1886 754 1870T832 1834T908 1798T981 1782Q1012 1782 1040 1808T1082 1888H1231Q1220 1743 1148 1661T959 1579Q918 1579 879 1595T801 1631T725 +1667T652 1684Z" /> +<glyph unicode="Ö" glyph-name="Odieresis" horiz-adv-x="1630" d="M1511 733Q1511 370 1331 175T815 -20Q479 -20 299 175T119 735Q119 1100 299 1292T817 1485Q1154 1485 1332 1291T1511 733ZM444 733Q444 488 537 364T815 240Q1186 240 1186 733Q1186 +1227 817 1227Q632 1227 538 1103T444 733ZM474 1743Q474 1808 511 1843T613 1878Q679 1878 716 1841T754 1743Q754 1683 716 1647T613 1610Q549 1610 512 1645T474 1743ZM877 1743Q877 1813 917 1845T1018 1878Q1083 1878 1121 1842T1160 1743Q1160 1682 1121 +1646T1018 1610Q958 1610 918 1642T877 1743Z" /> +<glyph unicode="×" glyph-name="multiply" horiz-adv-x="1169" d="M428 723L129 1024L281 1178L582 879L887 1178L1040 1028L735 723L1036 420L887 268L582 569L281 270L131 422L428 723Z" /> +<glyph unicode="Ø" glyph-name="Oslash" horiz-adv-x="1630" d="M1511 733Q1511 370 1331 175T815 -20Q618 -20 479 45L389 -90L227 18L317 154Q119 348 119 735Q119 1100 299 1292T817 1485Q1015 1485 1161 1415L1245 1540L1405 1436L1317 1305Q1511 1111 +1511 733ZM444 733Q444 542 500 426L1006 1182Q922 1227 817 1227Q632 1227 538 1103T444 733ZM1186 733Q1186 913 1135 1030L635 279Q711 240 815 240Q1186 240 1186 733Z" /> +<glyph unicode="Ù" glyph-name="Ugrave" horiz-adv-x="1548" d="M1374 1462V516Q1374 354 1302 232T1092 45T768 -20Q486 -20 330 124T174 520V1462H483V567Q483 398 551 319T776 240Q928 240 996 319T1065 569V1462H1374ZM750 1579Q687 1623 565 1721T375 +1886V1907H717Q780 1806 952 1606V1579H750Z" /> +<glyph unicode="Ú" glyph-name="Uacute" horiz-adv-x="1548" d="M1374 1462V516Q1374 354 1302 232T1092 45T768 -20Q486 -20 330 124T174 520V1462H483V567Q483 398 551 319T776 240Q928 240 996 319T1065 569V1462H1374ZM602 1579V1606Q774 1806 837 1907H1179V1886Q1127 +1834 1002 1732T805 1579H602Z" /> +<glyph unicode="Û" glyph-name="Ucircumflex" horiz-adv-x="1548" d="M1374 1462V516Q1374 354 1302 232T1092 45T768 -20Q486 -20 330 124T174 520V1462H483V567Q483 398 551 319T776 240Q928 240 996 319T1065 569V1462H1374ZM1006 1579Q849 1672 772 1755Q694 +1674 543 1579H340V1606Q529 1795 596 1907H953Q984 1855 1060 1766T1209 1606V1579H1006Z" /> +<glyph unicode="Ü" glyph-name="Udieresis" horiz-adv-x="1548" d="M1374 1462V516Q1374 354 1302 232T1092 45T768 -20Q486 -20 330 124T174 520V1462H483V567Q483 398 551 319T776 240Q928 240 996 319T1065 569V1462H1374ZM433 1743Q433 1808 470 1843T572 +1878Q638 1878 675 1841T713 1743Q713 1683 675 1647T572 1610Q508 1610 471 1645T433 1743ZM836 1743Q836 1813 876 1845T977 1878Q1042 1878 1080 1842T1119 1743Q1119 1682 1080 1646T977 1610Q917 1610 877 1642T836 1743Z" /> +<glyph unicode="Ý" glyph-name="Yacute" horiz-adv-x="1278" d="M639 860L944 1462H1278L793 569V0H485V559L0 1462H336L639 860ZM461 1579V1606Q633 1806 696 1907H1038V1886Q986 1834 861 1732T664 1579H461Z" /> +<glyph unicode="Þ" glyph-name="Thorn" horiz-adv-x="1286" d="M1194 770Q1194 541 1052 417T647 293H494V0H184V1462H494V1233H672Q926 1233 1060 1114T1194 770ZM494 543H594Q739 543 810 595T881 770Q881 877 818 929T618 981H494V543Z" /> +<glyph unicode="ß" glyph-name="germandbls" horiz-adv-x="1456" d="M1249 1241Q1249 1177 1228 1129T1175 1042T1106 975T1037 922T984 877T963 834Q963 807 989 781T1082 715Q1228 624 1280 575T1358 465T1384 326Q1384 154 1268 67T924 -20Q825 -20 753 +-6T621 43V285Q674 249 756 224T903 199Q1071 199 1071 322Q1071 363 1055 388T998 444T883 516Q757 588 708 647T659 788Q659 852 694 905T799 1007Q876 1062 907 1102T938 1188Q938 1248 875 1288T711 1329Q595 1329 530 1277T465 1128V0H160V1139Q160 1340 306 +1453T711 1567Q955 1567 1102 1479T1249 1241Z" /> +<glyph unicode="à" glyph-name="agrave" horiz-adv-x="1237" d="M870 0L811 152H803Q726 55 645 18T432 -20Q271 -20 179 72T86 334Q86 512 210 596T586 690L780 696V745Q780 915 606 915Q472 915 291 834L190 1040Q383 1141 618 1141Q843 1141 963 1043T1083 +745V0H870ZM780 518L662 514Q529 510 464 466T399 332Q399 203 547 203Q653 203 716 264T780 426V518ZM870 1241Q807 1285 685 1383T495 1548V1569H837Q900 1468 1072 1268V1241H870Z" /> +<glyph unicode="á" glyph-name="aacute" horiz-adv-x="1237" d="M870 0L811 152H803Q726 55 645 18T432 -20Q271 -20 179 72T86 334Q86 512 210 596T586 690L780 696V745Q780 915 606 915Q472 915 291 834L190 1040Q383 1141 618 1141Q843 1141 963 1043T1083 +745V0H870ZM780 518L662 514Q529 510 464 466T399 332Q399 203 547 203Q653 203 716 264T780 426V518ZM441 1241V1268Q613 1468 676 1569H1018V1548Q966 1496 841 1394T644 1241H441Z" /> +<glyph unicode="â" glyph-name="acircumflex" horiz-adv-x="1237" d="M870 0L811 152H803Q726 55 645 18T432 -20Q271 -20 179 72T86 334Q86 512 210 596T586 690L780 696V745Q780 915 606 915Q472 915 291 834L190 1040Q383 1141 618 1141Q843 1141 963 +1043T1083 745V0H870ZM780 518L662 514Q529 510 464 466T399 332Q399 203 547 203Q653 203 716 264T780 426V518ZM1099 1496Q942 1589 865 1672Q787 1591 636 1496H433V1523Q622 1712 689 1824H1046Q1077 1772 1153 1683T1302 1523V1496H1099Z" /> +<glyph unicode="ã" glyph-name="atilde" horiz-adv-x="1237" d="M870 0L811 152H803Q726 55 645 18T432 -20Q271 -20 179 72T86 334Q86 512 210 596T586 690L780 696V745Q780 915 606 915Q472 915 291 834L190 1040Q383 1141 618 1141Q843 1141 963 1043T1083 +745V0H870ZM780 518L662 514Q529 510 464 466T399 332Q399 203 547 203Q653 203 716 264T780 426V518ZM467 1346Q436 1346 408 1320T366 1239H217Q228 1384 299 1466T489 1548Q530 1548 569 1532T647 1496T723 1460T796 1444Q827 1444 855 1470T897 1550H1046Q1035 +1405 963 1323T774 1241Q733 1241 694 1257T616 1293T540 1329T467 1346Z" /> +<glyph unicode="ä" glyph-name="adieresis" horiz-adv-x="1237" d="M870 0L811 152H803Q726 55 645 18T432 -20Q271 -20 179 72T86 334Q86 512 210 596T586 690L780 696V745Q780 915 606 915Q472 915 291 834L190 1040Q383 1141 618 1141Q843 1141 963 1043T1083 +745V0H870ZM780 518L662 514Q529 510 464 466T399 332Q399 203 547 203Q653 203 716 264T780 426V518ZM285 1405Q285 1470 322 1505T424 1540Q490 1540 527 1503T565 1405Q565 1345 527 1309T424 1272Q360 1272 323 1307T285 1405ZM688 1405Q688 1475 728 1507T829 +1540Q894 1540 932 1504T971 1405Q971 1344 932 1308T829 1272Q769 1272 729 1304T688 1405Z" /> +<glyph unicode="å" glyph-name="aring" horiz-adv-x="1237" d="M870 0L811 152H803Q726 55 645 18T432 -20Q271 -20 179 72T86 334Q86 512 210 596T586 690L780 696V745Q780 915 606 915Q472 915 291 834L190 1040Q383 1141 618 1141Q843 1141 963 1043T1083 +745V0H870ZM780 518L662 514Q529 510 464 466T399 332Q399 203 547 203Q653 203 716 264T780 426V518ZM883 1479Q883 1371 812 1305T629 1239Q517 1239 449 1303T381 1477Q381 1585 448 1649T629 1714Q739 1714 811 1648T883 1479ZM725 1477Q725 1522 698 1547T629 +1573Q587 1573 560 1548T533 1477Q533 1432 557 1406T629 1380Q671 1380 698 1406T725 1477Z" /> +<glyph unicode="æ" glyph-name="ae" horiz-adv-x="1878" d="M1329 -20Q1192 -20 1080 30T895 186Q797 69 699 25T442 -20Q281 -20 184 74T86 334Q86 512 207 596T569 690L760 696V780Q760 849 716 882T594 915Q454 915 289 838L190 1040Q379 1141 612 1141Q839 +1141 954 1010Q1020 1074 1106 1106T1313 1139Q1534 1139 1662 1002T1790 631V483H1067Q1072 353 1144 280T1346 207Q1542 207 1726 295V59Q1647 20 1555 0T1329 -20ZM760 518L647 514Q523 510 461 467T399 332Q399 203 539 203Q640 203 700 264T760 426V518ZM1307 +922Q1090 922 1073 686H1503Q1501 798 1448 860T1307 922Z" /> +<glyph unicode="ç" glyph-name="ccedilla" horiz-adv-x="1053" d="M614 -20Q92 -20 92 553Q92 838 234 988T641 1139Q835 1139 989 1063L899 827Q827 856 765 874T641 893Q403 893 403 555Q403 227 641 227Q729 227 804 250T954 324V63Q880 16 805 -2T614 +-20ZM805 -250Q805 -378 730 -435T496 -492Q418 -492 350 -471V-303Q377 -310 422 -317T493 -324Q565 -324 565 -262Q565 -179 399 -154L477 0H670L643 -61Q717 -85 761 -135T805 -250Z" /> +<glyph unicode="è" glyph-name="egrave" horiz-adv-x="1210" d="M623 922Q526 922 471 861T408 686H836Q834 799 777 860T623 922ZM666 -20Q396 -20 244 129T92 551Q92 832 232 985T621 1139Q858 1139 990 1004T1122 631V483H401Q406 353 478 280T680 207Q781 +207 871 228T1059 295V59Q979 19 888 0T666 -20ZM876 1241Q813 1285 691 1383T501 1548V1569H843Q906 1468 1078 1268V1241H876Z" /> +<glyph unicode="é" glyph-name="eacute" horiz-adv-x="1210" d="M623 922Q526 922 471 861T408 686H836Q834 799 777 860T623 922ZM666 -20Q396 -20 244 129T92 551Q92 832 232 985T621 1139Q858 1139 990 1004T1122 631V483H401Q406 353 478 280T680 207Q781 +207 871 228T1059 295V59Q979 19 888 0T666 -20ZM447 1241V1268Q619 1468 682 1569H1024V1548Q972 1496 847 1394T650 1241H447Z" /> +<glyph unicode="ê" glyph-name="ecircumflex" horiz-adv-x="1210" d="M623 922Q526 922 471 861T408 686H836Q834 799 777 860T623 922ZM666 -20Q396 -20 244 129T92 551Q92 832 232 985T621 1139Q858 1139 990 1004T1122 631V483H401Q406 353 478 280T680 +207Q781 207 871 228T1059 295V59Q979 19 888 0T666 -20ZM860 1241Q703 1334 626 1417Q548 1336 397 1241H194V1268Q383 1457 450 1569H807Q838 1517 914 1428T1063 1268V1241H860Z" /> +<glyph unicode="ë" glyph-name="edieresis" horiz-adv-x="1210" d="M623 922Q526 922 471 861T408 686H836Q834 799 777 860T623 922ZM666 -20Q396 -20 244 129T92 551Q92 832 232 985T621 1139Q858 1139 990 1004T1122 631V483H401Q406 353 478 280T680 +207Q781 207 871 228T1059 295V59Q979 19 888 0T666 -20ZM297 1405Q297 1470 334 1505T436 1540Q502 1540 539 1503T577 1405Q577 1345 539 1309T436 1272Q372 1272 335 1307T297 1405ZM700 1405Q700 1475 740 1507T841 1540Q906 1540 944 1504T983 1405Q983 1344 +944 1308T841 1272Q781 1272 741 1304T700 1405Z" /> +<glyph unicode="ì" glyph-name="igrave" horiz-adv-x="625" d="M465 0H160V1118H465V0ZM274 1241Q211 1285 89 1383T-101 1548V1569H241Q304 1468 476 1268V1241H274Z" /> +<glyph unicode="í" glyph-name="iacute" horiz-adv-x="625" d="M465 0H160V1118H465V0ZM145 1241V1268Q317 1468 380 1569H722V1548Q670 1496 545 1394T348 1241H145Z" /> +<glyph unicode="î" glyph-name="icircumflex" horiz-adv-x="625" d="M465 0H160V1118H465V0ZM544 1241Q387 1334 310 1417Q232 1336 81 1241H-122V1268Q67 1457 134 1569H491Q522 1517 598 1428T747 1268V1241H544Z" /> +<glyph unicode="ï" glyph-name="idieresis" horiz-adv-x="625" d="M465 0H160V1118H465V0ZM-29 1405Q-29 1470 8 1505T110 1540Q176 1540 213 1503T251 1405Q251 1345 213 1309T110 1272Q46 1272 9 1307T-29 1405ZM374 1405Q374 1475 414 1507T515 1540Q580 +1540 618 1504T657 1405Q657 1344 618 1308T515 1272Q455 1272 415 1304T374 1405Z" /> +<glyph unicode="ð" glyph-name="eth" horiz-adv-x="1268" d="M510 1303Q430 1356 358 1395L459 1571Q603 1506 717 1430L942 1569L1042 1415L872 1311Q1028 1168 1102 987T1176 573Q1176 293 1031 137T631 -20Q386 -20 239 117T92 489Q92 722 222 858T573 +995Q778 995 848 897L856 901Q789 1063 664 1182L434 1040L334 1196L510 1303ZM864 532Q864 640 803 705T635 770Q514 770 459 702T403 487Q403 347 463 276T635 205Q758 205 811 287T864 532Z" /> +<glyph unicode="ñ" glyph-name="ntilde" horiz-adv-x="1346" d="M1192 0H887V653Q887 774 844 834T707 895Q579 895 522 810T465 526V0H160V1118H393L434 975H451Q502 1056 591 1097T795 1139Q990 1139 1091 1034T1192 729V0ZM508 1346Q477 1346 449 1320T407 +1239H258Q269 1384 340 1466T530 1548Q571 1548 610 1532T688 1496T764 1460T837 1444Q868 1444 896 1470T938 1550H1087Q1076 1405 1004 1323T815 1241Q774 1241 735 1257T657 1293T581 1329T508 1346Z" /> +<glyph unicode="ò" glyph-name="ograve" horiz-adv-x="1268" d="M403 561Q403 395 457 310T635 225Q757 225 810 309T864 561Q864 727 810 810T633 893Q511 893 457 811T403 561ZM1176 561Q1176 288 1032 134T631 -20Q470 -20 347 50T158 253T92 561Q92 835 +235 987T637 1139Q798 1139 921 1069T1110 868T1176 561ZM868 1241Q805 1285 683 1383T493 1548V1569H835Q898 1468 1070 1268V1241H868Z" /> +<glyph unicode="ó" glyph-name="oacute" horiz-adv-x="1268" d="M403 561Q403 395 457 310T635 225Q757 225 810 309T864 561Q864 727 810 810T633 893Q511 893 457 811T403 561ZM1176 561Q1176 288 1032 134T631 -20Q470 -20 347 50T158 253T92 561Q92 835 +235 987T637 1139Q798 1139 921 1069T1110 868T1176 561ZM467 1241V1268Q639 1468 702 1569H1044V1548Q992 1496 867 1394T670 1241H467Z" /> +<glyph unicode="ô" glyph-name="ocircumflex" horiz-adv-x="1268" d="M403 561Q403 395 457 310T635 225Q757 225 810 309T864 561Q864 727 810 810T633 893Q511 893 457 811T403 561ZM1176 561Q1176 288 1032 134T631 -20Q470 -20 347 50T158 253T92 561Q92 +835 235 987T637 1139Q798 1139 921 1069T1110 868T1176 561ZM864 1241Q707 1334 630 1417Q552 1336 401 1241H198V1268Q387 1457 454 1569H811Q842 1517 918 1428T1067 1268V1241H864Z" /> +<glyph unicode="õ" glyph-name="otilde" horiz-adv-x="1268" d="M403 561Q403 395 457 310T635 225Q757 225 810 309T864 561Q864 727 810 810T633 893Q511 893 457 811T403 561ZM1176 561Q1176 288 1032 134T631 -20Q470 -20 347 50T158 253T92 561Q92 835 +235 987T637 1139Q798 1139 921 1069T1110 868T1176 561ZM469 1346Q438 1346 410 1320T368 1239H219Q230 1384 301 1466T491 1548Q532 1548 571 1532T649 1496T725 1460T798 1444Q829 1444 857 1470T899 1550H1048Q1037 1405 965 1323T776 1241Q735 1241 696 1257T618 +1293T542 1329T469 1346Z" /> +<glyph unicode="ö" glyph-name="odieresis" horiz-adv-x="1268" d="M403 561Q403 395 457 310T635 225Q757 225 810 309T864 561Q864 727 810 810T633 893Q511 893 457 811T403 561ZM1176 561Q1176 288 1032 134T631 -20Q470 -20 347 50T158 253T92 561Q92 +835 235 987T637 1139Q798 1139 921 1069T1110 868T1176 561ZM291 1405Q291 1470 328 1505T430 1540Q496 1540 533 1503T571 1405Q571 1345 533 1309T430 1272Q366 1272 329 1307T291 1405ZM694 1405Q694 1475 734 1507T835 1540Q900 1540 938 1504T977 1405Q977 +1344 938 1308T835 1272Q775 1272 735 1304T694 1405Z" /> +<glyph unicode="÷" glyph-name="divide" horiz-adv-x="1169" d="M88 612V831H1081V612H88ZM444 373Q444 449 481 486T584 524Q650 524 686 485T723 373Q723 303 686 262T584 221Q519 221 482 260T444 373ZM444 1071Q444 1146 481 1184T584 1223Q651 1223 +687 1183T723 1071Q723 1001 686 961T584 920Q519 920 482 959T444 1071Z" /> +<glyph unicode="ø" glyph-name="oslash" horiz-adv-x="1268" d="M1176 561Q1176 288 1032 134T631 -20Q505 -20 397 25L330 -76L176 29L244 129Q92 285 92 561Q92 835 235 987T637 1139Q769 1139 885 1087L940 1169L1092 1061L1034 977Q1176 822 1176 561ZM403 +561Q403 467 422 395L739 870Q696 893 633 893Q511 893 457 811T403 561ZM864 561Q864 642 852 702L543 240Q581 225 635 225Q757 225 810 309T864 561Z" /> +<glyph unicode="ù" glyph-name="ugrave" horiz-adv-x="1346" d="M952 0L911 143H895Q846 65 756 23T551 -20Q354 -20 254 85T154 389V1118H459V465Q459 344 502 284T639 223Q767 223 824 308T881 592V1118H1186V0H952ZM876 1241Q813 1285 691 1383T501 1548V1569H843Q906 +1468 1078 1268V1241H876Z" /> +<glyph unicode="ú" glyph-name="uacute" horiz-adv-x="1346" d="M952 0L911 143H895Q846 65 756 23T551 -20Q354 -20 254 85T154 389V1118H459V465Q459 344 502 284T639 223Q767 223 824 308T881 592V1118H1186V0H952ZM498 1241V1268Q670 1468 733 1569H1075V1548Q1023 +1496 898 1394T701 1241H498Z" /> +<glyph unicode="û" glyph-name="ucircumflex" horiz-adv-x="1346" d="M952 0L911 143H895Q846 65 756 23T551 -20Q354 -20 254 85T154 389V1118H459V465Q459 344 502 284T639 223Q767 223 824 308T881 592V1118H1186V0H952ZM901 1241Q744 1334 667 1417Q589 +1336 438 1241H235V1268Q424 1457 491 1569H848Q879 1517 955 1428T1104 1268V1241H901Z" /> +<glyph unicode="ü" glyph-name="udieresis" horiz-adv-x="1346" d="M952 0L911 143H895Q846 65 756 23T551 -20Q354 -20 254 85T154 389V1118H459V465Q459 344 502 284T639 223Q767 223 824 308T881 592V1118H1186V0H952ZM326 1405Q326 1470 363 1505T465 +1540Q531 1540 568 1503T606 1405Q606 1345 568 1309T465 1272Q401 1272 364 1307T326 1405ZM729 1405Q729 1475 769 1507T870 1540Q935 1540 973 1504T1012 1405Q1012 1344 973 1308T870 1272Q810 1272 770 1304T729 1405Z" /> +<glyph unicode="ý" glyph-name="yacute" horiz-adv-x="1165" d="M0 1118H334L545 489Q572 407 582 295H588Q599 398 631 489L838 1118H1165L692 -143Q627 -318 507 -405T225 -492Q146 -492 70 -475V-233Q125 -246 190 -246Q271 -246 331 -197T426 -47L444 +8L0 1118ZM393 1241V1268Q565 1468 628 1569H970V1548Q918 1496 793 1394T596 1241H393Z" /> +<glyph unicode="þ" glyph-name="thorn" horiz-adv-x="1296" d="M465 973Q515 1054 596 1096T782 1139Q980 1139 1092 985T1204 561Q1204 288 1093 134T782 -20Q569 -20 465 117H451L458 55L465 -39V-492H160V1556H465V1165L458 1045L451 973H465ZM684 895Q571 +895 519 826T465 596V563Q465 383 518 305T688 227Q893 227 893 565Q893 730 843 812T684 895Z" /> +<glyph unicode="ÿ" glyph-name="ydieresis" horiz-adv-x="1165" d="M0 1118H334L545 489Q572 407 582 295H588Q599 398 631 489L838 1118H1165L692 -143Q627 -318 507 -405T225 -492Q146 -492 70 -475V-233Q125 -246 190 -246Q271 -246 331 -197T426 -47L444 +8L0 1118ZM499 1405Q499 1470 536 1505T638 1540Q704 1540 741 1503T779 1405Q779 1345 741 1309T638 1272Q574 1272 537 1307T499 1405ZM902 1405Q902 1475 942 1507T1043 1540Q1108 1540 1146 1504T1185 1405Q1185 1344 1146 1308T1043 1272Q983 1272 943 1304T902 +1405Z" /> +<glyph unicode="–" glyph-name="endash" horiz-adv-x="1024" d="M82 436V666H942V436H82Z" /> +<glyph unicode="—" glyph-name="emdash" horiz-adv-x="2048" d="M82 436V666H1966V436H82Z" /> +<glyph unicode="‘" glyph-name="quoteleft" horiz-adv-x="444" d="M39 961L25 983Q47 1074 97 1211T201 1462H420Q354 1195 319 961H39Z" /> +<glyph unicode="’" glyph-name="quoteright" horiz-adv-x="444" d="M406 1462L420 1440Q370 1243 244 961H25Q94 1257 125 1462H406Z" /> +<glyph unicode="‚" glyph-name="quotesinglbase" horiz-adv-x="596" d="M459 215Q407 13 283 -264H63Q128 2 164 238H444L459 215Z" /> +<glyph unicode="“" glyph-name="quotedblleft" horiz-adv-x="911" d="M492 983Q514 1074 564 1211T668 1462H887Q821 1195 786 961H506L492 983ZM25 983Q47 1074 97 1211T201 1462H420Q354 1195 319 961H39L25 983Z" /> +<glyph unicode="”" glyph-name="quotedblright" horiz-adv-x="911" d="M420 1440Q370 1243 244 961H25Q94 1257 125 1462H406L420 1440ZM887 1440Q837 1243 711 961H492Q561 1257 592 1462H872L887 1440Z" /> +<glyph unicode="„" glyph-name="quotedblbase" horiz-adv-x="1061" d="M459 215Q407 13 283 -264H63Q128 2 164 238H444L459 215ZM926 215Q874 13 750 -264H530Q595 2 631 238H911L926 215Z" /> +<glyph unicode="•" glyph-name="bullet" horiz-adv-x="770" d="M98 748Q98 902 172 983T385 1065Q522 1065 597 983T672 748Q672 596 597 513T385 430Q247 430 173 513T98 748Z" /> +<glyph unicode="‹" glyph-name="guilsinglleft" horiz-adv-x="754" d="M82 573L453 1028L672 909L393 561L672 213L453 94L82 547V573Z" /> +<glyph unicode="›" glyph-name="guilsinglright" horiz-adv-x="754" d="M672 547L301 94L82 213L360 561L82 909L301 1028L672 573V547Z" /> +<hkern g1="quotedbl" g2="A" k="143" /> +<hkern g1="quotedbl" g2="T" k="-41" /> +<hkern g1="quotedbl" g2="V" k="-41" /> +<hkern g1="quotedbl" g2="W" k="-41" /> +<hkern g1="quotedbl" g2="Y" k="-20" /> +<hkern g1="quotedbl" g2="a" k="82" /> +<hkern g1="quotedbl" g2="c" k="123" /> +<hkern g1="quotedbl" g2="d" k="123" /> +<hkern g1="quotedbl" g2="e" k="123" /> +<hkern g1="quotedbl" g2="g" k="61" /> +<hkern g1="quotedbl" g2="m" k="61" /> +<hkern g1="quotedbl" g2="n" k="61" /> +<hkern g1="quotedbl" g2="o" k="123" /> +<hkern g1="quotedbl" g2="p" k="61" /> +<hkern g1="quotedbl" g2="q" k="123" /> +<hkern g1="quotedbl" g2="r" k="61" /> +<hkern g1="quotedbl" g2="s" k="61" /> +<hkern g1="quotedbl" g2="u" k="61" /> +<hkern g1="quotedbl" g2="Agrave" k="143" /> +<hkern g1="quotedbl" g2="Aacute" k="143" /> +<hkern g1="quotedbl" g2="Acircumflex" k="143" /> +<hkern g1="quotedbl" g2="Atilde" k="143" /> +<hkern g1="quotedbl" g2="Adieresis" k="143" /> +<hkern g1="quotedbl" g2="Aring" k="143" /> +<hkern g1="quotedbl" g2="Yacute" k="-20" /> +<hkern g1="quotedbl" g2="agrave" k="123" /> +<hkern g1="quotedbl" g2="aacute" k="82" /> +<hkern g1="quotedbl" g2="acircumflex" k="82" /> +<hkern g1="quotedbl" g2="atilde" k="82" /> +<hkern g1="quotedbl" g2="adieresis" k="82" /> +<hkern g1="quotedbl" g2="aring" k="82" /> +<hkern g1="quotedbl" g2="ae" k="82" /> +<hkern g1="quotedbl" g2="ccedilla" k="123" /> +<hkern g1="quotedbl" g2="egrave" k="123" /> +<hkern g1="quotedbl" g2="eacute" k="123" /> +<hkern g1="quotedbl" g2="ecircumflex" k="123" /> +<hkern g1="quotedbl" g2="edieresis" k="123" /> +<hkern g1="quotedbl" g2="ograve" k="123" /> +<hkern g1="quotedbl" g2="oacute" k="123" /> +<hkern g1="quotedbl" g2="ocircumflex" k="123" /> +<hkern g1="quotedbl" g2="otilde" k="123" /> +<hkern g1="quotedbl" g2="odieresis" k="123" /> +<hkern g1="quotedbl" g2="oslash" k="123" /> +<hkern g1="quotedbl" g2="ugrave" k="61" /> +<hkern g1="quotedbl" g2="uacute" k="61" /> +<hkern g1="quotedbl" g2="ucircumflex" k="61" /> +<hkern g1="quotedbl" g2="udieresis" k="61" /> +<hkern g1="quotedbl" g2="oe" k="123" /> +<hkern g1="quotesingle" g2="A" k="143" /> +<hkern g1="quotesingle" g2="T" k="-41" /> +<hkern g1="quotesingle" g2="V" k="-41" /> +<hkern g1="quotesingle" g2="W" k="-41" /> +<hkern g1="quotesingle" g2="Y" k="-20" /> +<hkern g1="quotesingle" g2="a" k="82" /> +<hkern g1="quotesingle" g2="c" k="123" /> +<hkern g1="quotesingle" g2="d" k="123" /> +<hkern g1="quotesingle" g2="e" k="123" /> +<hkern g1="quotesingle" g2="g" k="61" /> +<hkern g1="quotesingle" g2="m" k="61" /> +<hkern g1="quotesingle" g2="n" k="61" /> +<hkern g1="quotesingle" g2="o" k="123" /> +<hkern g1="quotesingle" g2="p" k="61" /> +<hkern g1="quotesingle" g2="q" k="123" /> +<hkern g1="quotesingle" g2="r" k="61" /> +<hkern g1="quotesingle" g2="s" k="61" /> +<hkern g1="quotesingle" g2="u" k="61" /> +<hkern g1="quotesingle" g2="Agrave" k="143" /> +<hkern g1="quotesingle" g2="Aacute" k="143" /> +<hkern g1="quotesingle" g2="Acircumflex" k="143" /> +<hkern g1="quotesingle" g2="Atilde" k="143" /> +<hkern g1="quotesingle" g2="Adieresis" k="143" /> +<hkern g1="quotesingle" g2="Aring" k="143" /> +<hkern g1="quotesingle" g2="Yacute" k="-20" /> +<hkern g1="quotesingle" g2="agrave" k="123" /> +<hkern g1="quotesingle" g2="aacute" k="82" /> +<hkern g1="quotesingle" g2="acircumflex" k="82" /> +<hkern g1="quotesingle" g2="atilde" k="82" /> +<hkern g1="quotesingle" g2="adieresis" k="82" /> +<hkern g1="quotesingle" g2="aring" k="82" /> +<hkern g1="quotesingle" g2="ae" k="82" /> +<hkern g1="quotesingle" g2="ccedilla" k="123" /> +<hkern g1="quotesingle" g2="egrave" k="123" /> +<hkern g1="quotesingle" g2="eacute" k="123" /> +<hkern g1="quotesingle" g2="ecircumflex" k="123" /> +<hkern g1="quotesingle" g2="edieresis" k="123" /> +<hkern g1="quotesingle" g2="ograve" k="123" /> +<hkern g1="quotesingle" g2="oacute" k="123" /> +<hkern g1="quotesingle" g2="ocircumflex" k="123" /> +<hkern g1="quotesingle" g2="otilde" k="123" /> +<hkern g1="quotesingle" g2="odieresis" k="123" /> +<hkern g1="quotesingle" g2="oslash" k="123" /> +<hkern g1="quotesingle" g2="ugrave" k="61" /> +<hkern g1="quotesingle" g2="uacute" k="61" /> +<hkern g1="quotesingle" g2="ucircumflex" k="61" /> +<hkern g1="quotesingle" g2="udieresis" k="61" /> +<hkern g1="quotesingle" g2="oe" k="123" /> +<hkern g1="parenleft" g2="J" k="-184" /> +<hkern g1="comma" g2="C" k="102" /> +<hkern g1="comma" g2="G" k="102" /> +<hkern g1="comma" g2="O" k="102" /> +<hkern g1="comma" g2="Q" k="102" /> +<hkern g1="comma" g2="T" k="143" /> +<hkern g1="comma" g2="U" k="41" /> +<hkern g1="comma" g2="V" k="123" /> +<hkern g1="comma" g2="W" k="123" /> +<hkern g1="comma" g2="Y" k="123" /> +<hkern g1="comma" g2="Ccedilla" k="102" /> +<hkern g1="comma" g2="Ograve" k="102" /> +<hkern g1="comma" g2="Oacute" k="102" /> +<hkern g1="comma" g2="Ocircumflex" k="102" /> +<hkern g1="comma" g2="Otilde" k="102" /> +<hkern g1="comma" g2="Odieresis" k="102" /> +<hkern g1="comma" g2="Oslash" k="102" /> +<hkern g1="comma" g2="Ugrave" k="41" /> +<hkern g1="comma" g2="Uacute" k="41" /> +<hkern g1="comma" g2="Ucircumflex" k="41" /> +<hkern g1="comma" g2="Udieresis" k="41" /> +<hkern g1="comma" g2="Yacute" k="123" /> +<hkern g1="comma" g2="OE" k="102" /> +<hkern g1="hyphen" g2="T" k="82" /> +<hkern g1="period" g2="C" k="102" /> +<hkern g1="period" g2="G" k="102" /> +<hkern g1="period" g2="O" k="102" /> +<hkern g1="period" g2="Q" k="102" /> +<hkern g1="period" g2="T" k="143" /> +<hkern g1="period" g2="U" k="41" /> +<hkern g1="period" g2="V" k="123" /> +<hkern g1="period" g2="W" k="123" /> +<hkern g1="period" g2="Y" k="123" /> +<hkern g1="period" g2="Ccedilla" k="102" /> +<hkern g1="period" g2="Ograve" k="102" /> +<hkern g1="period" g2="Oacute" k="102" /> +<hkern g1="period" g2="Ocircumflex" k="102" /> +<hkern g1="period" g2="Otilde" k="102" /> +<hkern g1="period" g2="Odieresis" k="102" /> +<hkern g1="period" g2="Oslash" k="102" /> +<hkern g1="period" g2="Ugrave" k="41" /> +<hkern g1="period" g2="Uacute" k="41" /> +<hkern g1="period" g2="Ucircumflex" k="41" /> +<hkern g1="period" g2="Udieresis" k="41" /> +<hkern g1="period" g2="Yacute" k="123" /> +<hkern g1="period" g2="OE" k="102" /> +<hkern g1="A" g2="quotedbl" k="143" /> +<hkern g1="A" g2="quotesingle" k="143" /> +<hkern g1="A" g2="C" k="41" /> +<hkern g1="A" g2="G" k="41" /> +<hkern g1="A" g2="J" k="-266" /> +<hkern g1="A" g2="O" k="41" /> +<hkern g1="A" g2="Q" k="41" /> +<hkern g1="A" g2="T" k="143" /> +<hkern g1="A" g2="V" k="82" /> +<hkern g1="A" g2="W" k="82" /> +<hkern g1="A" g2="Y" k="123" /> +<hkern g1="A" g2="Ccedilla" k="41" /> +<hkern g1="A" g2="Ograve" k="41" /> +<hkern g1="A" g2="Oacute" k="41" /> +<hkern g1="A" g2="Ocircumflex" k="41" /> +<hkern g1="A" g2="Otilde" k="41" /> +<hkern g1="A" g2="Odieresis" k="41" /> +<hkern g1="A" g2="Oslash" k="41" /> +<hkern g1="A" g2="Yacute" k="123" /> +<hkern g1="A" g2="OE" k="41" /> +<hkern g1="A" g2="quoteright" k="143" /> +<hkern g1="A" g2="quotedblright" k="143" /> +<hkern g1="B" g2="comma" k="82" /> +<hkern g1="B" g2="period" k="82" /> +<hkern g1="B" g2="A" k="41" /> +<hkern g1="B" g2="T" k="61" /> +<hkern g1="B" g2="V" k="20" /> +<hkern g1="B" g2="W" k="20" /> +<hkern g1="B" g2="X" k="41" /> +<hkern g1="B" g2="Y" k="20" /> +<hkern g1="B" g2="Z" k="20" /> +<hkern g1="B" g2="Agrave" k="41" /> +<hkern g1="B" g2="Aacute" k="41" /> +<hkern g1="B" g2="Acircumflex" k="41" /> +<hkern g1="B" g2="Atilde" k="41" /> +<hkern g1="B" g2="Adieresis" k="41" /> +<hkern g1="B" g2="Aring" k="41" /> +<hkern g1="B" g2="Yacute" k="20" /> +<hkern g1="B" g2="quotesinglbase" k="82" /> +<hkern g1="B" g2="quotedblbase" k="82" /> +<hkern g1="C" g2="C" k="41" /> +<hkern g1="C" g2="G" k="41" /> +<hkern g1="C" g2="O" k="41" /> +<hkern g1="C" g2="Q" k="41" /> +<hkern g1="C" g2="Ccedilla" k="41" /> +<hkern g1="C" g2="Ograve" k="41" /> +<hkern g1="C" g2="Oacute" k="41" /> +<hkern g1="C" g2="Ocircumflex" k="41" /> +<hkern g1="C" g2="Otilde" k="41" /> +<hkern g1="C" g2="Odieresis" k="41" /> +<hkern g1="C" g2="Oslash" k="41" /> +<hkern g1="C" g2="OE" k="41" /> +<hkern g1="D" g2="comma" k="82" /> +<hkern g1="D" g2="period" k="82" /> +<hkern g1="D" g2="A" k="41" /> +<hkern g1="D" g2="T" k="61" /> +<hkern g1="D" g2="V" k="20" /> +<hkern g1="D" g2="W" k="20" /> +<hkern g1="D" g2="X" k="41" /> +<hkern g1="D" g2="Y" k="20" /> +<hkern g1="D" g2="Z" k="20" /> +<hkern g1="D" g2="Agrave" k="41" /> +<hkern g1="D" g2="Aacute" k="41" /> +<hkern g1="D" g2="Acircumflex" k="41" /> +<hkern g1="D" g2="Atilde" k="41" /> +<hkern g1="D" g2="Adieresis" k="41" /> +<hkern g1="D" g2="Aring" k="41" /> +<hkern g1="D" g2="Yacute" k="20" /> +<hkern g1="D" g2="quotesinglbase" k="82" /> +<hkern g1="D" g2="quotedblbase" k="82" /> +<hkern g1="E" g2="J" k="-123" /> +<hkern g1="F" g2="comma" k="123" /> +<hkern g1="F" g2="period" k="123" /> +<hkern g1="F" g2="question" k="-41" /> +<hkern g1="F" g2="A" k="41" /> +<hkern g1="F" g2="Agrave" k="41" /> +<hkern g1="F" g2="Aacute" k="41" /> +<hkern g1="F" g2="Acircumflex" k="41" /> +<hkern g1="F" g2="Atilde" k="41" /> +<hkern g1="F" g2="Adieresis" k="41" /> +<hkern g1="F" g2="Aring" k="41" /> +<hkern g1="F" g2="quotesinglbase" k="123" /> +<hkern g1="F" g2="quotedblbase" k="123" /> +<hkern g1="K" g2="C" k="41" /> +<hkern g1="K" g2="G" k="41" /> +<hkern g1="K" g2="O" k="41" /> +<hkern g1="K" g2="Q" k="41" /> +<hkern g1="K" g2="Ccedilla" k="41" /> +<hkern g1="K" g2="Ograve" k="41" /> +<hkern g1="K" g2="Oacute" k="41" /> +<hkern g1="K" g2="Ocircumflex" k="41" /> +<hkern g1="K" g2="Otilde" k="41" /> +<hkern g1="K" g2="Odieresis" k="41" /> +<hkern g1="K" g2="Oslash" k="41" /> +<hkern g1="K" g2="OE" k="41" /> +<hkern g1="L" g2="quotedbl" k="164" /> +<hkern g1="L" g2="quotesingle" k="164" /> +<hkern g1="L" g2="C" k="41" /> +<hkern g1="L" g2="G" k="41" /> +<hkern g1="L" g2="O" k="41" /> +<hkern g1="L" g2="Q" k="41" /> +<hkern g1="L" g2="T" k="41" /> +<hkern g1="L" g2="U" k="20" /> +<hkern g1="L" g2="V" k="41" /> +<hkern g1="L" g2="W" k="41" /> +<hkern g1="L" g2="Y" k="61" /> +<hkern g1="L" g2="Ccedilla" k="41" /> +<hkern g1="L" g2="Ograve" k="41" /> +<hkern g1="L" g2="Oacute" k="41" /> +<hkern g1="L" g2="Ocircumflex" k="41" /> +<hkern g1="L" g2="Otilde" k="41" /> +<hkern g1="L" g2="Odieresis" k="41" /> +<hkern g1="L" g2="Oslash" k="41" /> +<hkern g1="L" g2="Ugrave" k="20" /> +<hkern g1="L" g2="Uacute" k="20" /> +<hkern g1="L" g2="Ucircumflex" k="20" /> +<hkern g1="L" g2="Udieresis" k="20" /> +<hkern g1="L" g2="Yacute" k="61" /> +<hkern g1="L" g2="OE" k="41" /> +<hkern g1="L" g2="quoteright" k="164" /> +<hkern g1="L" g2="quotedblright" k="164" /> +<hkern g1="O" g2="comma" k="82" /> +<hkern g1="O" g2="period" k="82" /> +<hkern g1="O" g2="A" k="41" /> +<hkern g1="O" g2="T" k="61" /> +<hkern g1="O" g2="V" k="20" /> +<hkern g1="O" g2="W" k="20" /> +<hkern g1="O" g2="X" k="41" /> +<hkern g1="O" g2="Y" k="20" /> +<hkern g1="O" g2="Z" k="20" /> +<hkern g1="O" g2="Agrave" k="41" /> +<hkern g1="O" g2="Aacute" k="41" /> +<hkern g1="O" g2="Acircumflex" k="41" /> +<hkern g1="O" g2="Atilde" k="41" /> +<hkern g1="O" g2="Adieresis" k="41" /> +<hkern g1="O" g2="Aring" k="41" /> +<hkern g1="O" g2="Yacute" k="20" /> +<hkern g1="O" g2="quotesinglbase" k="82" /> +<hkern g1="O" g2="quotedblbase" k="82" /> +<hkern g1="P" g2="comma" k="266" /> +<hkern g1="P" g2="period" k="266" /> +<hkern g1="P" g2="A" k="102" /> +<hkern g1="P" g2="X" k="41" /> +<hkern g1="P" g2="Z" k="20" /> +<hkern g1="P" g2="Agrave" k="102" /> +<hkern g1="P" g2="Aacute" k="102" /> +<hkern g1="P" g2="Acircumflex" k="102" /> +<hkern g1="P" g2="Atilde" k="102" /> +<hkern g1="P" g2="Adieresis" k="102" /> +<hkern g1="P" g2="Aring" k="102" /> +<hkern g1="P" g2="quotesinglbase" k="266" /> +<hkern g1="P" g2="quotedblbase" k="266" /> +<hkern g1="Q" g2="comma" k="82" /> +<hkern g1="Q" g2="period" k="82" /> +<hkern g1="Q" g2="A" k="41" /> +<hkern g1="Q" g2="T" k="61" /> +<hkern g1="Q" g2="V" k="20" /> +<hkern g1="Q" g2="W" k="20" /> +<hkern g1="Q" g2="X" k="41" /> +<hkern g1="Q" g2="Y" k="20" /> +<hkern g1="Q" g2="Z" k="20" /> +<hkern g1="Q" g2="Agrave" k="41" /> +<hkern g1="Q" g2="Aacute" k="41" /> +<hkern g1="Q" g2="Acircumflex" k="41" /> +<hkern g1="Q" g2="Atilde" k="41" /> +<hkern g1="Q" g2="Adieresis" k="41" /> +<hkern g1="Q" g2="Aring" k="41" /> +<hkern g1="Q" g2="Yacute" k="20" /> +<hkern g1="Q" g2="quotesinglbase" k="82" /> +<hkern g1="Q" g2="quotedblbase" k="82" /> +<hkern g1="T" g2="comma" k="123" /> +<hkern g1="T" g2="hyphen" k="82" /> +<hkern g1="T" g2="period" k="123" /> +<hkern g1="T" g2="question" k="-41" /> +<hkern g1="T" g2="A" k="143" /> +<hkern g1="T" g2="C" k="41" /> +<hkern g1="T" g2="G" k="41" /> +<hkern g1="T" g2="O" k="41" /> +<hkern g1="T" g2="Q" k="41" /> +<hkern g1="T" g2="T" k="-41" /> +<hkern g1="T" g2="a" k="164" /> +<hkern g1="T" g2="c" k="143" /> +<hkern g1="T" g2="d" k="143" /> +<hkern g1="T" g2="e" k="143" /> +<hkern g1="T" g2="g" k="143" /> +<hkern g1="T" g2="m" k="102" /> +<hkern g1="T" g2="n" k="102" /> +<hkern g1="T" g2="o" k="143" /> +<hkern g1="T" g2="p" k="102" /> +<hkern g1="T" g2="q" k="143" /> +<hkern g1="T" g2="r" k="102" /> +<hkern g1="T" g2="s" k="123" /> +<hkern g1="T" g2="u" k="102" /> +<hkern g1="T" g2="v" k="41" /> +<hkern g1="T" g2="w" k="41" /> +<hkern g1="T" g2="x" k="41" /> +<hkern g1="T" g2="y" k="41" /> +<hkern g1="T" g2="z" k="82" /> +<hkern g1="T" g2="Agrave" k="143" /> +<hkern g1="T" g2="Aacute" k="143" /> +<hkern g1="T" g2="Acircumflex" k="143" /> +<hkern g1="T" g2="Atilde" k="143" /> +<hkern g1="T" g2="Adieresis" k="143" /> +<hkern g1="T" g2="Aring" k="143" /> +<hkern g1="T" g2="Ccedilla" k="41" /> +<hkern g1="T" g2="Ograve" k="41" /> +<hkern g1="T" g2="Oacute" k="41" /> +<hkern g1="T" g2="Ocircumflex" k="41" /> +<hkern g1="T" g2="Otilde" k="41" /> +<hkern g1="T" g2="Odieresis" k="41" /> +<hkern g1="T" g2="Oslash" k="41" /> +<hkern g1="T" g2="agrave" k="143" /> +<hkern g1="T" g2="aacute" k="164" /> +<hkern g1="T" g2="acircumflex" k="164" /> +<hkern g1="T" g2="atilde" k="164" /> +<hkern g1="T" g2="adieresis" k="164" /> +<hkern g1="T" g2="aring" k="164" /> +<hkern g1="T" g2="ae" k="164" /> +<hkern g1="T" g2="ccedilla" k="143" /> +<hkern g1="T" g2="egrave" k="143" /> +<hkern g1="T" g2="eacute" k="143" /> +<hkern g1="T" g2="ecircumflex" k="143" /> +<hkern g1="T" g2="edieresis" k="143" /> +<hkern g1="T" g2="ograve" k="143" /> +<hkern g1="T" g2="oacute" k="143" /> +<hkern g1="T" g2="ocircumflex" k="143" /> +<hkern g1="T" g2="otilde" k="143" /> +<hkern g1="T" g2="odieresis" k="143" /> +<hkern g1="T" g2="oslash" k="143" /> +<hkern g1="T" g2="ugrave" k="102" /> +<hkern g1="T" g2="uacute" k="102" /> +<hkern g1="T" g2="ucircumflex" k="102" /> +<hkern g1="T" g2="udieresis" k="102" /> +<hkern g1="T" g2="yacute" k="41" /> +<hkern g1="T" g2="OE" k="41" /> +<hkern g1="T" g2="oe" k="143" /> +<hkern g1="T" g2="endash" k="82" /> +<hkern g1="T" g2="emdash" k="82" /> +<hkern g1="T" g2="quotesinglbase" k="123" /> +<hkern g1="T" g2="quotedblbase" k="123" /> +<hkern g1="U" g2="comma" k="41" /> +<hkern g1="U" g2="period" k="41" /> +<hkern g1="U" g2="A" k="20" /> +<hkern g1="U" g2="Agrave" k="20" /> +<hkern g1="U" g2="Aacute" k="20" /> +<hkern g1="U" g2="Acircumflex" k="20" /> +<hkern g1="U" g2="Atilde" k="20" /> +<hkern g1="U" g2="Adieresis" k="20" /> +<hkern g1="U" g2="Aring" k="20" /> +<hkern g1="U" g2="quotesinglbase" k="41" /> +<hkern g1="U" g2="quotedblbase" k="41" /> +<hkern g1="V" g2="comma" k="102" /> +<hkern g1="V" g2="period" k="102" /> +<hkern g1="V" g2="question" k="-41" /> +<hkern g1="V" g2="A" k="82" /> +<hkern g1="V" g2="C" k="20" /> +<hkern g1="V" g2="G" k="20" /> +<hkern g1="V" g2="O" k="20" /> +<hkern g1="V" g2="Q" k="20" /> +<hkern g1="V" g2="a" k="41" /> +<hkern g1="V" g2="c" k="41" /> +<hkern g1="V" g2="d" k="41" /> +<hkern g1="V" g2="e" k="41" /> +<hkern g1="V" g2="g" k="20" /> +<hkern g1="V" g2="m" k="20" /> +<hkern g1="V" g2="n" k="20" /> +<hkern g1="V" g2="o" k="41" /> +<hkern g1="V" g2="p" k="20" /> +<hkern g1="V" g2="q" k="41" /> +<hkern g1="V" g2="r" k="20" /> +<hkern g1="V" g2="s" k="20" /> +<hkern g1="V" g2="u" k="20" /> +<hkern g1="V" g2="Agrave" k="82" /> +<hkern g1="V" g2="Aacute" k="82" /> +<hkern g1="V" g2="Acircumflex" k="82" /> +<hkern g1="V" g2="Atilde" k="82" /> +<hkern g1="V" g2="Adieresis" k="82" /> +<hkern g1="V" g2="Aring" k="82" /> +<hkern g1="V" g2="Ccedilla" k="20" /> +<hkern g1="V" g2="Ograve" k="20" /> +<hkern g1="V" g2="Oacute" k="20" /> +<hkern g1="V" g2="Ocircumflex" k="20" /> +<hkern g1="V" g2="Otilde" k="20" /> +<hkern g1="V" g2="Odieresis" k="20" /> +<hkern g1="V" g2="Oslash" k="20" /> +<hkern g1="V" g2="agrave" k="41" /> +<hkern g1="V" g2="aacute" k="41" /> +<hkern g1="V" g2="acircumflex" k="41" /> +<hkern g1="V" g2="atilde" k="41" /> +<hkern g1="V" g2="adieresis" k="41" /> +<hkern g1="V" g2="aring" k="41" /> +<hkern g1="V" g2="ae" k="41" /> +<hkern g1="V" g2="ccedilla" k="41" /> +<hkern g1="V" g2="egrave" k="41" /> +<hkern g1="V" g2="eacute" k="41" /> +<hkern g1="V" g2="ecircumflex" k="41" /> +<hkern g1="V" g2="edieresis" k="41" /> +<hkern g1="V" g2="ograve" k="41" /> +<hkern g1="V" g2="oacute" k="41" /> +<hkern g1="V" g2="ocircumflex" k="41" /> +<hkern g1="V" g2="otilde" k="41" /> +<hkern g1="V" g2="odieresis" k="41" /> +<hkern g1="V" g2="oslash" k="41" /> +<hkern g1="V" g2="ugrave" k="20" /> +<hkern g1="V" g2="uacute" k="20" /> +<hkern g1="V" g2="ucircumflex" k="20" /> +<hkern g1="V" g2="udieresis" k="20" /> +<hkern g1="V" g2="OE" k="20" /> +<hkern g1="V" g2="oe" k="41" /> +<hkern g1="V" g2="quotesinglbase" k="102" /> +<hkern g1="V" g2="quotedblbase" k="102" /> +<hkern g1="W" g2="comma" k="102" /> +<hkern g1="W" g2="period" k="102" /> +<hkern g1="W" g2="question" k="-41" /> +<hkern g1="W" g2="A" k="82" /> +<hkern g1="W" g2="C" k="20" /> +<hkern g1="W" g2="G" k="20" /> +<hkern g1="W" g2="O" k="20" /> +<hkern g1="W" g2="Q" k="20" /> +<hkern g1="W" g2="a" k="41" /> +<hkern g1="W" g2="c" k="41" /> +<hkern g1="W" g2="d" k="41" /> +<hkern g1="W" g2="e" k="41" /> +<hkern g1="W" g2="g" k="20" /> +<hkern g1="W" g2="m" k="20" /> +<hkern g1="W" g2="n" k="20" /> +<hkern g1="W" g2="o" k="41" /> +<hkern g1="W" g2="p" k="20" /> +<hkern g1="W" g2="q" k="41" /> +<hkern g1="W" g2="r" k="20" /> +<hkern g1="W" g2="s" k="20" /> +<hkern g1="W" g2="u" k="20" /> +<hkern g1="W" g2="Agrave" k="82" /> +<hkern g1="W" g2="Aacute" k="82" /> +<hkern g1="W" g2="Acircumflex" k="82" /> +<hkern g1="W" g2="Atilde" k="82" /> +<hkern g1="W" g2="Adieresis" k="82" /> +<hkern g1="W" g2="Aring" k="82" /> +<hkern g1="W" g2="Ccedilla" k="20" /> +<hkern g1="W" g2="Ograve" k="20" /> +<hkern g1="W" g2="Oacute" k="20" /> +<hkern g1="W" g2="Ocircumflex" k="20" /> +<hkern g1="W" g2="Otilde" k="20" /> +<hkern g1="W" g2="Odieresis" k="20" /> +<hkern g1="W" g2="Oslash" k="20" /> +<hkern g1="W" g2="agrave" k="41" /> +<hkern g1="W" g2="aacute" k="41" /> +<hkern g1="W" g2="acircumflex" k="41" /> +<hkern g1="W" g2="atilde" k="41" /> +<hkern g1="W" g2="adieresis" k="41" /> +<hkern g1="W" g2="aring" k="41" /> +<hkern g1="W" g2="ae" k="41" /> +<hkern g1="W" g2="ccedilla" k="41" /> +<hkern g1="W" g2="egrave" k="41" /> +<hkern g1="W" g2="eacute" k="41" /> +<hkern g1="W" g2="ecircumflex" k="41" /> +<hkern g1="W" g2="edieresis" k="41" /> +<hkern g1="W" g2="ograve" k="41" /> +<hkern g1="W" g2="oacute" k="41" /> +<hkern g1="W" g2="ocircumflex" k="41" /> +<hkern g1="W" g2="otilde" k="41" /> +<hkern g1="W" g2="odieresis" k="41" /> +<hkern g1="W" g2="oslash" k="41" /> +<hkern g1="W" g2="ugrave" k="20" /> +<hkern g1="W" g2="uacute" k="20" /> +<hkern g1="W" g2="ucircumflex" k="20" /> +<hkern g1="W" g2="udieresis" k="20" /> +<hkern g1="W" g2="OE" k="20" /> +<hkern g1="W" g2="oe" k="41" /> +<hkern g1="W" g2="quotesinglbase" k="102" /> +<hkern g1="W" g2="quotedblbase" k="102" /> +<hkern g1="X" g2="C" k="41" /> +<hkern g1="X" g2="G" k="41" /> +<hkern g1="X" g2="O" k="41" /> +<hkern g1="X" g2="Q" k="41" /> +<hkern g1="X" g2="Ccedilla" k="41" /> +<hkern g1="X" g2="Ograve" k="41" /> +<hkern g1="X" g2="Oacute" k="41" /> +<hkern g1="X" g2="Ocircumflex" k="41" /> +<hkern g1="X" g2="Otilde" k="41" /> +<hkern g1="X" g2="Odieresis" k="41" /> +<hkern g1="X" g2="Oslash" k="41" /> +<hkern g1="X" g2="OE" k="41" /> +<hkern g1="Y" g2="comma" k="123" /> +<hkern g1="Y" g2="period" k="123" /> +<hkern g1="Y" g2="question" k="-41" /> +<hkern g1="Y" g2="A" k="123" /> +<hkern g1="Y" g2="C" k="41" /> +<hkern g1="Y" g2="G" k="41" /> +<hkern g1="Y" g2="O" k="41" /> +<hkern g1="Y" g2="Q" k="41" /> +<hkern g1="Y" g2="a" k="102" /> +<hkern g1="Y" g2="c" k="102" /> +<hkern g1="Y" g2="d" k="102" /> +<hkern g1="Y" g2="e" k="102" /> +<hkern g1="Y" g2="g" k="41" /> +<hkern g1="Y" g2="m" k="61" /> +<hkern g1="Y" g2="n" k="61" /> +<hkern g1="Y" g2="o" k="102" /> +<hkern g1="Y" g2="p" k="61" /> +<hkern g1="Y" g2="q" k="102" /> +<hkern g1="Y" g2="r" k="61" /> +<hkern g1="Y" g2="s" k="82" /> +<hkern g1="Y" g2="u" k="61" /> +<hkern g1="Y" g2="z" k="41" /> +<hkern g1="Y" g2="Agrave" k="123" /> +<hkern g1="Y" g2="Aacute" k="123" /> +<hkern g1="Y" g2="Acircumflex" k="123" /> +<hkern g1="Y" g2="Atilde" k="123" /> +<hkern g1="Y" g2="Adieresis" k="123" /> +<hkern g1="Y" g2="Aring" k="123" /> +<hkern g1="Y" g2="Ccedilla" k="41" /> +<hkern g1="Y" g2="Ograve" k="41" /> +<hkern g1="Y" g2="Oacute" k="41" /> +<hkern g1="Y" g2="Ocircumflex" k="41" /> +<hkern g1="Y" g2="Otilde" k="41" /> +<hkern g1="Y" g2="Odieresis" k="41" /> +<hkern g1="Y" g2="Oslash" k="41" /> +<hkern g1="Y" g2="agrave" k="102" /> +<hkern g1="Y" g2="aacute" k="102" /> +<hkern g1="Y" g2="acircumflex" k="102" /> +<hkern g1="Y" g2="atilde" k="102" /> +<hkern g1="Y" g2="adieresis" k="102" /> +<hkern g1="Y" g2="aring" k="102" /> +<hkern g1="Y" g2="ae" k="102" /> +<hkern g1="Y" g2="ccedilla" k="102" /> +<hkern g1="Y" g2="egrave" k="102" /> +<hkern g1="Y" g2="eacute" k="102" /> +<hkern g1="Y" g2="ecircumflex" k="102" /> +<hkern g1="Y" g2="edieresis" k="102" /> +<hkern g1="Y" g2="ograve" k="102" /> +<hkern g1="Y" g2="oacute" k="102" /> +<hkern g1="Y" g2="ocircumflex" k="102" /> +<hkern g1="Y" g2="otilde" k="102" /> +<hkern g1="Y" g2="odieresis" k="102" /> +<hkern g1="Y" g2="oslash" k="102" /> +<hkern g1="Y" g2="ugrave" k="61" /> +<hkern g1="Y" g2="uacute" k="61" /> +<hkern g1="Y" g2="ucircumflex" k="61" /> +<hkern g1="Y" g2="udieresis" k="61" /> +<hkern g1="Y" g2="OE" k="41" /> +<hkern g1="Y" g2="oe" k="102" /> +<hkern g1="Y" g2="quotesinglbase" k="123" /> +<hkern g1="Y" g2="quotedblbase" k="123" /> +<hkern g1="Z" g2="C" k="20" /> +<hkern g1="Z" g2="G" k="20" /> +<hkern g1="Z" g2="O" k="20" /> +<hkern g1="Z" g2="Q" k="20" /> +<hkern g1="Z" g2="Ccedilla" k="20" /> +<hkern g1="Z" g2="Ograve" k="20" /> +<hkern g1="Z" g2="Oacute" k="20" /> +<hkern g1="Z" g2="Ocircumflex" k="20" /> +<hkern g1="Z" g2="Otilde" k="20" /> +<hkern g1="Z" g2="Odieresis" k="20" /> +<hkern g1="Z" g2="Oslash" k="20" /> +<hkern g1="Z" g2="OE" k="20" /> +<hkern g1="bracketleft" g2="J" k="-184" /> +<hkern g1="a" g2="quotedbl" k="20" /> +<hkern g1="a" g2="quotesingle" k="20" /> +<hkern g1="a" g2="quoteright" k="20" /> +<hkern g1="a" g2="quotedblright" k="20" /> +<hkern g1="b" g2="quotedbl" k="20" /> +<hkern g1="b" g2="quotesingle" k="20" /> +<hkern g1="b" g2="v" k="41" /> +<hkern g1="b" g2="w" k="41" /> +<hkern g1="b" g2="x" k="41" /> +<hkern g1="b" g2="y" k="41" /> +<hkern g1="b" g2="z" k="20" /> +<hkern g1="b" g2="yacute" k="41" /> +<hkern g1="b" g2="quoteright" k="20" /> +<hkern g1="b" g2="quotedblright" k="20" /> +<hkern g1="c" g2="quotedbl" k="-41" /> +<hkern g1="c" g2="quotesingle" k="-41" /> +<hkern g1="c" g2="quoteright" k="-41" /> +<hkern g1="c" g2="quotedblright" k="-41" /> +<hkern g1="e" g2="quotedbl" k="20" /> +<hkern g1="e" g2="quotesingle" k="20" /> +<hkern g1="e" g2="v" k="41" /> +<hkern g1="e" g2="w" k="41" /> +<hkern g1="e" g2="x" k="41" /> +<hkern g1="e" g2="y" k="41" /> +<hkern g1="e" g2="z" k="20" /> +<hkern g1="e" g2="yacute" k="41" /> +<hkern g1="e" g2="quoteright" k="20" /> +<hkern g1="e" g2="quotedblright" k="20" /> +<hkern g1="f" g2="quotedbl" k="-123" /> +<hkern g1="f" g2="quotesingle" k="-123" /> +<hkern g1="f" g2="quoteright" k="-123" /> +<hkern g1="f" g2="quotedblright" k="-123" /> +<hkern g1="h" g2="quotedbl" k="20" /> +<hkern g1="h" g2="quotesingle" k="20" /> +<hkern g1="h" g2="quoteright" k="20" /> +<hkern g1="h" g2="quotedblright" k="20" /> +<hkern g1="k" g2="c" k="41" /> +<hkern g1="k" g2="d" k="41" /> +<hkern g1="k" g2="e" k="41" /> +<hkern g1="k" g2="o" k="41" /> +<hkern g1="k" g2="q" k="41" /> +<hkern g1="k" g2="agrave" k="41" /> +<hkern g1="k" g2="ccedilla" k="41" /> +<hkern g1="k" g2="egrave" k="41" /> +<hkern g1="k" g2="eacute" k="41" /> +<hkern g1="k" g2="ecircumflex" k="41" /> +<hkern g1="k" g2="edieresis" k="41" /> +<hkern g1="k" g2="ograve" k="41" /> +<hkern g1="k" g2="oacute" k="41" /> +<hkern g1="k" g2="ocircumflex" k="41" /> +<hkern g1="k" g2="otilde" k="41" /> +<hkern g1="k" g2="odieresis" k="41" /> +<hkern g1="k" g2="oslash" k="41" /> +<hkern g1="k" g2="oe" k="41" /> +<hkern g1="m" g2="quotedbl" k="20" /> +<hkern g1="m" g2="quotesingle" k="20" /> +<hkern g1="m" g2="quoteright" k="20" /> +<hkern g1="m" g2="quotedblright" k="20" /> +<hkern g1="n" g2="quotedbl" k="20" /> +<hkern g1="n" g2="quotesingle" k="20" /> +<hkern g1="n" g2="quoteright" k="20" /> +<hkern g1="n" g2="quotedblright" k="20" /> +<hkern g1="o" g2="quotedbl" k="20" /> +<hkern g1="o" g2="quotesingle" k="20" /> +<hkern g1="o" g2="v" k="41" /> +<hkern g1="o" g2="w" k="41" /> +<hkern g1="o" g2="x" k="41" /> +<hkern g1="o" g2="y" k="41" /> +<hkern g1="o" g2="z" k="20" /> +<hkern g1="o" g2="yacute" k="41" /> +<hkern g1="o" g2="quoteright" k="20" /> +<hkern g1="o" g2="quotedblright" k="20" /> +<hkern g1="p" g2="quotedbl" k="20" /> +<hkern g1="p" g2="quotesingle" k="20" /> +<hkern g1="p" g2="v" k="41" /> +<hkern g1="p" g2="w" k="41" /> +<hkern g1="p" g2="x" k="41" /> +<hkern g1="p" g2="y" k="41" /> +<hkern g1="p" g2="z" k="20" /> +<hkern g1="p" g2="yacute" k="41" /> +<hkern g1="p" g2="quoteright" k="20" /> +<hkern g1="p" g2="quotedblright" k="20" /> +<hkern g1="r" g2="quotedbl" k="-82" /> +<hkern g1="r" g2="quotesingle" k="-82" /> +<hkern g1="r" g2="a" k="41" /> +<hkern g1="r" g2="c" k="41" /> +<hkern g1="r" g2="d" k="41" /> +<hkern g1="r" g2="e" k="41" /> +<hkern g1="r" g2="g" k="20" /> +<hkern g1="r" g2="o" k="41" /> +<hkern g1="r" g2="q" k="41" /> +<hkern g1="r" g2="agrave" k="41" /> +<hkern g1="r" g2="aacute" k="41" /> +<hkern g1="r" g2="acircumflex" k="41" /> +<hkern g1="r" g2="atilde" k="41" /> +<hkern g1="r" g2="adieresis" k="41" /> +<hkern g1="r" g2="aring" k="41" /> +<hkern g1="r" g2="ae" k="41" /> +<hkern g1="r" g2="ccedilla" k="41" /> +<hkern g1="r" g2="egrave" k="41" /> +<hkern g1="r" g2="eacute" k="41" /> +<hkern g1="r" g2="ecircumflex" k="41" /> +<hkern g1="r" g2="edieresis" k="41" /> +<hkern g1="r" g2="ograve" k="41" /> +<hkern g1="r" g2="oacute" k="41" /> +<hkern g1="r" g2="ocircumflex" k="41" /> +<hkern g1="r" g2="otilde" k="41" /> +<hkern g1="r" g2="odieresis" k="41" /> +<hkern g1="r" g2="oslash" k="41" /> +<hkern g1="r" g2="oe" k="41" /> +<hkern g1="r" g2="quoteright" k="-82" /> +<hkern g1="r" g2="quotedblright" k="-82" /> +<hkern g1="t" g2="quotedbl" k="-41" /> +<hkern g1="t" g2="quotesingle" k="-41" /> +<hkern g1="t" g2="quoteright" k="-41" /> +<hkern g1="t" g2="quotedblright" k="-41" /> +<hkern g1="v" g2="quotedbl" k="-82" /> +<hkern g1="v" g2="quotesingle" k="-82" /> +<hkern g1="v" g2="comma" k="82" /> +<hkern g1="v" g2="period" k="82" /> +<hkern g1="v" g2="question" k="-41" /> +<hkern g1="v" g2="quoteright" k="-82" /> +<hkern g1="v" g2="quotesinglbase" k="82" /> +<hkern g1="v" g2="quotedblright" k="-82" /> +<hkern g1="v" g2="quotedblbase" k="82" /> +<hkern g1="w" g2="quotedbl" k="-82" /> +<hkern g1="w" g2="quotesingle" k="-82" /> +<hkern g1="w" g2="comma" k="82" /> +<hkern g1="w" g2="period" k="82" /> +<hkern g1="w" g2="question" k="-41" /> +<hkern g1="w" g2="quoteright" k="-82" /> +<hkern g1="w" g2="quotesinglbase" k="82" /> +<hkern g1="w" g2="quotedblright" k="-82" /> +<hkern g1="w" g2="quotedblbase" k="82" /> +<hkern g1="x" g2="c" k="41" /> +<hkern g1="x" g2="d" k="41" /> +<hkern g1="x" g2="e" k="41" /> +<hkern g1="x" g2="o" k="41" /> +<hkern g1="x" g2="q" k="41" /> +<hkern g1="x" g2="agrave" k="41" /> +<hkern g1="x" g2="ccedilla" k="41" /> +<hkern g1="x" g2="egrave" k="41" /> +<hkern g1="x" g2="eacute" k="41" /> +<hkern g1="x" g2="ecircumflex" k="41" /> +<hkern g1="x" g2="edieresis" k="41" /> +<hkern g1="x" g2="ograve" k="41" /> +<hkern g1="x" g2="oacute" k="41" /> +<hkern g1="x" g2="ocircumflex" k="41" /> +<hkern g1="x" g2="otilde" k="41" /> +<hkern g1="x" g2="odieresis" k="41" /> +<hkern g1="x" g2="oslash" k="41" /> +<hkern g1="x" g2="oe" k="41" /> +<hkern g1="y" g2="quotedbl" k="-82" /> +<hkern g1="y" g2="quotesingle" k="-82" /> +<hkern g1="y" g2="comma" k="82" /> +<hkern g1="y" g2="period" k="82" /> +<hkern g1="y" g2="question" k="-41" /> +<hkern g1="y" g2="quoteright" k="-82" /> +<hkern g1="y" g2="quotesinglbase" k="82" /> +<hkern g1="y" g2="quotedblright" k="-82" /> +<hkern g1="y" g2="quotedblbase" k="82" /> +<hkern g1="braceleft" g2="J" k="-184" /> +<hkern g1="Agrave" g2="quotedbl" k="143" /> +<hkern g1="Agrave" g2="quotesingle" k="143" /> +<hkern g1="Agrave" g2="C" k="41" /> +<hkern g1="Agrave" g2="G" k="41" /> +<hkern g1="Agrave" g2="J" k="-266" /> +<hkern g1="Agrave" g2="O" k="41" /> +<hkern g1="Agrave" g2="Q" k="41" /> +<hkern g1="Agrave" g2="T" k="143" /> +<hkern g1="Agrave" g2="V" k="82" /> +<hkern g1="Agrave" g2="W" k="82" /> +<hkern g1="Agrave" g2="Y" k="123" /> +<hkern g1="Agrave" g2="Ccedilla" k="41" /> +<hkern g1="Agrave" g2="Ograve" k="41" /> +<hkern g1="Agrave" g2="Oacute" k="41" /> +<hkern g1="Agrave" g2="Ocircumflex" k="41" /> +<hkern g1="Agrave" g2="Otilde" k="41" /> +<hkern g1="Agrave" g2="Odieresis" k="41" /> +<hkern g1="Agrave" g2="Oslash" k="41" /> +<hkern g1="Agrave" g2="Yacute" k="123" /> +<hkern g1="Agrave" g2="OE" k="41" /> +<hkern g1="Agrave" g2="quoteright" k="143" /> +<hkern g1="Agrave" g2="quotedblright" k="143" /> +<hkern g1="Aacute" g2="quotedbl" k="143" /> +<hkern g1="Aacute" g2="quotesingle" k="143" /> +<hkern g1="Aacute" g2="C" k="41" /> +<hkern g1="Aacute" g2="G" k="41" /> +<hkern g1="Aacute" g2="J" k="-266" /> +<hkern g1="Aacute" g2="O" k="41" /> +<hkern g1="Aacute" g2="Q" k="41" /> +<hkern g1="Aacute" g2="T" k="143" /> +<hkern g1="Aacute" g2="V" k="82" /> +<hkern g1="Aacute" g2="W" k="82" /> +<hkern g1="Aacute" g2="Y" k="123" /> +<hkern g1="Aacute" g2="Ccedilla" k="41" /> +<hkern g1="Aacute" g2="Ograve" k="41" /> +<hkern g1="Aacute" g2="Oacute" k="41" /> +<hkern g1="Aacute" g2="Ocircumflex" k="41" /> +<hkern g1="Aacute" g2="Otilde" k="41" /> +<hkern g1="Aacute" g2="Odieresis" k="41" /> +<hkern g1="Aacute" g2="Oslash" k="41" /> +<hkern g1="Aacute" g2="Yacute" k="123" /> +<hkern g1="Aacute" g2="OE" k="41" /> +<hkern g1="Aacute" g2="quoteright" k="143" /> +<hkern g1="Aacute" g2="quotedblright" k="143" /> +<hkern g1="Acircumflex" g2="quotedbl" k="143" /> +<hkern g1="Acircumflex" g2="quotesingle" k="143" /> +<hkern g1="Acircumflex" g2="C" k="41" /> +<hkern g1="Acircumflex" g2="G" k="41" /> +<hkern g1="Acircumflex" g2="J" k="-266" /> +<hkern g1="Acircumflex" g2="O" k="41" /> +<hkern g1="Acircumflex" g2="Q" k="41" /> +<hkern g1="Acircumflex" g2="T" k="143" /> +<hkern g1="Acircumflex" g2="V" k="82" /> +<hkern g1="Acircumflex" g2="W" k="82" /> +<hkern g1="Acircumflex" g2="Y" k="123" /> +<hkern g1="Acircumflex" g2="Ccedilla" k="41" /> +<hkern g1="Acircumflex" g2="Ograve" k="41" /> +<hkern g1="Acircumflex" g2="Oacute" k="41" /> +<hkern g1="Acircumflex" g2="Ocircumflex" k="41" /> +<hkern g1="Acircumflex" g2="Otilde" k="41" /> +<hkern g1="Acircumflex" g2="Odieresis" k="41" /> +<hkern g1="Acircumflex" g2="Oslash" k="41" /> +<hkern g1="Acircumflex" g2="Yacute" k="123" /> +<hkern g1="Acircumflex" g2="OE" k="41" /> +<hkern g1="Acircumflex" g2="quoteright" k="143" /> +<hkern g1="Acircumflex" g2="quotedblright" k="143" /> +<hkern g1="Atilde" g2="quotedbl" k="143" /> +<hkern g1="Atilde" g2="quotesingle" k="143" /> +<hkern g1="Atilde" g2="C" k="41" /> +<hkern g1="Atilde" g2="G" k="41" /> +<hkern g1="Atilde" g2="J" k="-266" /> +<hkern g1="Atilde" g2="O" k="41" /> +<hkern g1="Atilde" g2="Q" k="41" /> +<hkern g1="Atilde" g2="T" k="143" /> +<hkern g1="Atilde" g2="V" k="82" /> +<hkern g1="Atilde" g2="W" k="82" /> +<hkern g1="Atilde" g2="Y" k="123" /> +<hkern g1="Atilde" g2="Ccedilla" k="41" /> +<hkern g1="Atilde" g2="Ograve" k="41" /> +<hkern g1="Atilde" g2="Oacute" k="41" /> +<hkern g1="Atilde" g2="Ocircumflex" k="41" /> +<hkern g1="Atilde" g2="Otilde" k="41" /> +<hkern g1="Atilde" g2="Odieresis" k="41" /> +<hkern g1="Atilde" g2="Oslash" k="41" /> +<hkern g1="Atilde" g2="Yacute" k="123" /> +<hkern g1="Atilde" g2="OE" k="41" /> +<hkern g1="Atilde" g2="quoteright" k="143" /> +<hkern g1="Atilde" g2="quotedblright" k="143" /> +<hkern g1="Adieresis" g2="quotedbl" k="143" /> +<hkern g1="Adieresis" g2="quotesingle" k="143" /> +<hkern g1="Adieresis" g2="C" k="41" /> +<hkern g1="Adieresis" g2="G" k="41" /> +<hkern g1="Adieresis" g2="J" k="-266" /> +<hkern g1="Adieresis" g2="O" k="41" /> +<hkern g1="Adieresis" g2="Q" k="41" /> +<hkern g1="Adieresis" g2="T" k="143" /> +<hkern g1="Adieresis" g2="V" k="82" /> +<hkern g1="Adieresis" g2="W" k="82" /> +<hkern g1="Adieresis" g2="Y" k="123" /> +<hkern g1="Adieresis" g2="Ccedilla" k="41" /> +<hkern g1="Adieresis" g2="Ograve" k="41" /> +<hkern g1="Adieresis" g2="Oacute" k="41" /> +<hkern g1="Adieresis" g2="Ocircumflex" k="41" /> +<hkern g1="Adieresis" g2="Otilde" k="41" /> +<hkern g1="Adieresis" g2="Odieresis" k="41" /> +<hkern g1="Adieresis" g2="Oslash" k="41" /> +<hkern g1="Adieresis" g2="Yacute" k="123" /> +<hkern g1="Adieresis" g2="OE" k="41" /> +<hkern g1="Adieresis" g2="quoteright" k="143" /> +<hkern g1="Adieresis" g2="quotedblright" k="143" /> +<hkern g1="Aring" g2="quotedbl" k="143" /> +<hkern g1="Aring" g2="quotesingle" k="143" /> +<hkern g1="Aring" g2="C" k="41" /> +<hkern g1="Aring" g2="G" k="41" /> +<hkern g1="Aring" g2="J" k="-266" /> +<hkern g1="Aring" g2="O" k="41" /> +<hkern g1="Aring" g2="Q" k="41" /> +<hkern g1="Aring" g2="T" k="143" /> +<hkern g1="Aring" g2="V" k="82" /> +<hkern g1="Aring" g2="W" k="82" /> +<hkern g1="Aring" g2="Y" k="123" /> +<hkern g1="Aring" g2="Ccedilla" k="41" /> +<hkern g1="Aring" g2="Ograve" k="41" /> +<hkern g1="Aring" g2="Oacute" k="41" /> +<hkern g1="Aring" g2="Ocircumflex" k="41" /> +<hkern g1="Aring" g2="Otilde" k="41" /> +<hkern g1="Aring" g2="Odieresis" k="41" /> +<hkern g1="Aring" g2="Oslash" k="41" /> +<hkern g1="Aring" g2="Yacute" k="123" /> +<hkern g1="Aring" g2="OE" k="41" /> +<hkern g1="Aring" g2="quoteright" k="143" /> +<hkern g1="Aring" g2="quotedblright" k="143" /> +<hkern g1="AE" g2="J" k="-123" /> +<hkern g1="Ccedilla" g2="C" k="41" /> +<hkern g1="Ccedilla" g2="G" k="41" /> +<hkern g1="Ccedilla" g2="O" k="41" /> +<hkern g1="Ccedilla" g2="Q" k="41" /> +<hkern g1="Ccedilla" g2="Ccedilla" k="41" /> +<hkern g1="Ccedilla" g2="Ograve" k="41" /> +<hkern g1="Ccedilla" g2="Oacute" k="41" /> +<hkern g1="Ccedilla" g2="Ocircumflex" k="41" /> +<hkern g1="Ccedilla" g2="Otilde" k="41" /> +<hkern g1="Ccedilla" g2="Odieresis" k="41" /> +<hkern g1="Ccedilla" g2="Oslash" k="41" /> +<hkern g1="Ccedilla" g2="OE" k="41" /> +<hkern g1="Egrave" g2="J" k="-123" /> +<hkern g1="Eacute" g2="J" k="-123" /> +<hkern g1="Ecircumflex" g2="J" k="-123" /> +<hkern g1="Edieresis" g2="J" k="-123" /> +<hkern g1="Eth" g2="comma" k="82" /> +<hkern g1="Eth" g2="period" k="82" /> +<hkern g1="Eth" g2="A" k="41" /> +<hkern g1="Eth" g2="T" k="61" /> +<hkern g1="Eth" g2="V" k="20" /> +<hkern g1="Eth" g2="W" k="20" /> +<hkern g1="Eth" g2="X" k="41" /> +<hkern g1="Eth" g2="Y" k="20" /> +<hkern g1="Eth" g2="Z" k="20" /> +<hkern g1="Eth" g2="Agrave" k="41" /> +<hkern g1="Eth" g2="Aacute" k="41" /> +<hkern g1="Eth" g2="Acircumflex" k="41" /> +<hkern g1="Eth" g2="Atilde" k="41" /> +<hkern g1="Eth" g2="Adieresis" k="41" /> +<hkern g1="Eth" g2="Aring" k="41" /> +<hkern g1="Eth" g2="Yacute" k="20" /> +<hkern g1="Eth" g2="quotesinglbase" k="82" /> +<hkern g1="Eth" g2="quotedblbase" k="82" /> +<hkern g1="Ograve" g2="comma" k="82" /> +<hkern g1="Ograve" g2="period" k="82" /> +<hkern g1="Ograve" g2="A" k="41" /> +<hkern g1="Ograve" g2="T" k="61" /> +<hkern g1="Ograve" g2="V" k="20" /> +<hkern g1="Ograve" g2="W" k="20" /> +<hkern g1="Ograve" g2="X" k="41" /> +<hkern g1="Ograve" g2="Y" k="20" /> +<hkern g1="Ograve" g2="Z" k="20" /> +<hkern g1="Ograve" g2="Agrave" k="41" /> +<hkern g1="Ograve" g2="Aacute" k="41" /> +<hkern g1="Ograve" g2="Acircumflex" k="41" /> +<hkern g1="Ograve" g2="Atilde" k="41" /> +<hkern g1="Ograve" g2="Adieresis" k="41" /> +<hkern g1="Ograve" g2="Aring" k="41" /> +<hkern g1="Ograve" g2="Yacute" k="20" /> +<hkern g1="Ograve" g2="quotesinglbase" k="82" /> +<hkern g1="Ograve" g2="quotedblbase" k="82" /> +<hkern g1="Oacute" g2="comma" k="82" /> +<hkern g1="Oacute" g2="period" k="82" /> +<hkern g1="Oacute" g2="A" k="41" /> +<hkern g1="Oacute" g2="T" k="61" /> +<hkern g1="Oacute" g2="V" k="20" /> +<hkern g1="Oacute" g2="W" k="20" /> +<hkern g1="Oacute" g2="X" k="41" /> +<hkern g1="Oacute" g2="Y" k="20" /> +<hkern g1="Oacute" g2="Z" k="20" /> +<hkern g1="Oacute" g2="Agrave" k="41" /> +<hkern g1="Oacute" g2="Aacute" k="41" /> +<hkern g1="Oacute" g2="Acircumflex" k="41" /> +<hkern g1="Oacute" g2="Atilde" k="41" /> +<hkern g1="Oacute" g2="Adieresis" k="41" /> +<hkern g1="Oacute" g2="Aring" k="41" /> +<hkern g1="Oacute" g2="Yacute" k="20" /> +<hkern g1="Oacute" g2="quotesinglbase" k="82" /> +<hkern g1="Oacute" g2="quotedblbase" k="82" /> +<hkern g1="Ocircumflex" g2="comma" k="82" /> +<hkern g1="Ocircumflex" g2="period" k="82" /> +<hkern g1="Ocircumflex" g2="A" k="41" /> +<hkern g1="Ocircumflex" g2="T" k="61" /> +<hkern g1="Ocircumflex" g2="V" k="20" /> +<hkern g1="Ocircumflex" g2="W" k="20" /> +<hkern g1="Ocircumflex" g2="X" k="41" /> +<hkern g1="Ocircumflex" g2="Y" k="20" /> +<hkern g1="Ocircumflex" g2="Z" k="20" /> +<hkern g1="Ocircumflex" g2="Agrave" k="41" /> +<hkern g1="Ocircumflex" g2="Aacute" k="41" /> +<hkern g1="Ocircumflex" g2="Acircumflex" k="41" /> +<hkern g1="Ocircumflex" g2="Atilde" k="41" /> +<hkern g1="Ocircumflex" g2="Adieresis" k="41" /> +<hkern g1="Ocircumflex" g2="Aring" k="41" /> +<hkern g1="Ocircumflex" g2="Yacute" k="20" /> +<hkern g1="Ocircumflex" g2="quotesinglbase" k="82" /> +<hkern g1="Ocircumflex" g2="quotedblbase" k="82" /> +<hkern g1="Otilde" g2="comma" k="82" /> +<hkern g1="Otilde" g2="period" k="82" /> +<hkern g1="Otilde" g2="A" k="41" /> +<hkern g1="Otilde" g2="T" k="61" /> +<hkern g1="Otilde" g2="V" k="20" /> +<hkern g1="Otilde" g2="W" k="20" /> +<hkern g1="Otilde" g2="X" k="41" /> +<hkern g1="Otilde" g2="Y" k="20" /> +<hkern g1="Otilde" g2="Z" k="20" /> +<hkern g1="Otilde" g2="Agrave" k="41" /> +<hkern g1="Otilde" g2="Aacute" k="41" /> +<hkern g1="Otilde" g2="Acircumflex" k="41" /> +<hkern g1="Otilde" g2="Atilde" k="41" /> +<hkern g1="Otilde" g2="Adieresis" k="41" /> +<hkern g1="Otilde" g2="Aring" k="41" /> +<hkern g1="Otilde" g2="Yacute" k="20" /> +<hkern g1="Otilde" g2="quotesinglbase" k="82" /> +<hkern g1="Otilde" g2="quotedblbase" k="82" /> +<hkern g1="Odieresis" g2="comma" k="82" /> +<hkern g1="Odieresis" g2="period" k="82" /> +<hkern g1="Odieresis" g2="A" k="41" /> +<hkern g1="Odieresis" g2="T" k="61" /> +<hkern g1="Odieresis" g2="V" k="20" /> +<hkern g1="Odieresis" g2="W" k="20" /> +<hkern g1="Odieresis" g2="X" k="41" /> +<hkern g1="Odieresis" g2="Y" k="20" /> +<hkern g1="Odieresis" g2="Z" k="20" /> +<hkern g1="Odieresis" g2="Agrave" k="41" /> +<hkern g1="Odieresis" g2="Aacute" k="41" /> +<hkern g1="Odieresis" g2="Acircumflex" k="41" /> +<hkern g1="Odieresis" g2="Atilde" k="41" /> +<hkern g1="Odieresis" g2="Adieresis" k="41" /> +<hkern g1="Odieresis" g2="Aring" k="41" /> +<hkern g1="Odieresis" g2="Yacute" k="20" /> +<hkern g1="Odieresis" g2="quotesinglbase" k="82" /> +<hkern g1="Odieresis" g2="quotedblbase" k="82" /> +<hkern g1="Oslash" g2="comma" k="82" /> +<hkern g1="Oslash" g2="period" k="82" /> +<hkern g1="Oslash" g2="A" k="41" /> +<hkern g1="Oslash" g2="T" k="61" /> +<hkern g1="Oslash" g2="V" k="20" /> +<hkern g1="Oslash" g2="W" k="20" /> +<hkern g1="Oslash" g2="X" k="41" /> +<hkern g1="Oslash" g2="Y" k="20" /> +<hkern g1="Oslash" g2="Z" k="20" /> +<hkern g1="Oslash" g2="Agrave" k="41" /> +<hkern g1="Oslash" g2="Aacute" k="41" /> +<hkern g1="Oslash" g2="Acircumflex" k="41" /> +<hkern g1="Oslash" g2="Atilde" k="41" /> +<hkern g1="Oslash" g2="Adieresis" k="41" /> +<hkern g1="Oslash" g2="Aring" k="41" /> +<hkern g1="Oslash" g2="Yacute" k="20" /> +<hkern g1="Oslash" g2="quotesinglbase" k="82" /> +<hkern g1="Oslash" g2="quotedblbase" k="82" /> +<hkern g1="Ugrave" g2="comma" k="41" /> +<hkern g1="Ugrave" g2="period" k="41" /> +<hkern g1="Ugrave" g2="A" k="20" /> +<hkern g1="Ugrave" g2="Agrave" k="20" /> +<hkern g1="Ugrave" g2="Aacute" k="20" /> +<hkern g1="Ugrave" g2="Acircumflex" k="20" /> +<hkern g1="Ugrave" g2="Atilde" k="20" /> +<hkern g1="Ugrave" g2="Adieresis" k="20" /> +<hkern g1="Ugrave" g2="Aring" k="20" /> +<hkern g1="Ugrave" g2="quotesinglbase" k="41" /> +<hkern g1="Ugrave" g2="quotedblbase" k="41" /> +<hkern g1="Uacute" g2="comma" k="41" /> +<hkern g1="Uacute" g2="period" k="41" /> +<hkern g1="Uacute" g2="A" k="20" /> +<hkern g1="Uacute" g2="Agrave" k="20" /> +<hkern g1="Uacute" g2="Aacute" k="20" /> +<hkern g1="Uacute" g2="Acircumflex" k="20" /> +<hkern g1="Uacute" g2="Atilde" k="20" /> +<hkern g1="Uacute" g2="Adieresis" k="20" /> +<hkern g1="Uacute" g2="Aring" k="20" /> +<hkern g1="Uacute" g2="quotesinglbase" k="41" /> +<hkern g1="Uacute" g2="quotedblbase" k="41" /> +<hkern g1="Ucircumflex" g2="comma" k="41" /> +<hkern g1="Ucircumflex" g2="period" k="41" /> +<hkern g1="Ucircumflex" g2="A" k="20" /> +<hkern g1="Ucircumflex" g2="Agrave" k="20" /> +<hkern g1="Ucircumflex" g2="Aacute" k="20" /> +<hkern g1="Ucircumflex" g2="Acircumflex" k="20" /> +<hkern g1="Ucircumflex" g2="Atilde" k="20" /> +<hkern g1="Ucircumflex" g2="Adieresis" k="20" /> +<hkern g1="Ucircumflex" g2="Aring" k="20" /> +<hkern g1="Ucircumflex" g2="quotesinglbase" k="41" /> +<hkern g1="Ucircumflex" g2="quotedblbase" k="41" /> +<hkern g1="Udieresis" g2="comma" k="41" /> +<hkern g1="Udieresis" g2="period" k="41" /> +<hkern g1="Udieresis" g2="A" k="20" /> +<hkern g1="Udieresis" g2="Agrave" k="20" /> +<hkern g1="Udieresis" g2="Aacute" k="20" /> +<hkern g1="Udieresis" g2="Acircumflex" k="20" /> +<hkern g1="Udieresis" g2="Atilde" k="20" /> +<hkern g1="Udieresis" g2="Adieresis" k="20" /> +<hkern g1="Udieresis" g2="Aring" k="20" /> +<hkern g1="Udieresis" g2="quotesinglbase" k="41" /> +<hkern g1="Udieresis" g2="quotedblbase" k="41" /> +<hkern g1="Yacute" g2="comma" k="123" /> +<hkern g1="Yacute" g2="period" k="123" /> +<hkern g1="Yacute" g2="question" k="-41" /> +<hkern g1="Yacute" g2="A" k="123" /> +<hkern g1="Yacute" g2="C" k="41" /> +<hkern g1="Yacute" g2="G" k="41" /> +<hkern g1="Yacute" g2="O" k="41" /> +<hkern g1="Yacute" g2="Q" k="41" /> +<hkern g1="Yacute" g2="a" k="102" /> +<hkern g1="Yacute" g2="c" k="102" /> +<hkern g1="Yacute" g2="d" k="102" /> +<hkern g1="Yacute" g2="e" k="102" /> +<hkern g1="Yacute" g2="g" k="41" /> +<hkern g1="Yacute" g2="m" k="61" /> +<hkern g1="Yacute" g2="n" k="61" /> +<hkern g1="Yacute" g2="o" k="102" /> +<hkern g1="Yacute" g2="p" k="61" /> +<hkern g1="Yacute" g2="q" k="102" /> +<hkern g1="Yacute" g2="r" k="61" /> +<hkern g1="Yacute" g2="s" k="82" /> +<hkern g1="Yacute" g2="u" k="61" /> +<hkern g1="Yacute" g2="z" k="41" /> +<hkern g1="Yacute" g2="Agrave" k="123" /> +<hkern g1="Yacute" g2="Aacute" k="123" /> +<hkern g1="Yacute" g2="Acircumflex" k="123" /> +<hkern g1="Yacute" g2="Atilde" k="123" /> +<hkern g1="Yacute" g2="Adieresis" k="123" /> +<hkern g1="Yacute" g2="Aring" k="123" /> +<hkern g1="Yacute" g2="Ccedilla" k="41" /> +<hkern g1="Yacute" g2="Ograve" k="41" /> +<hkern g1="Yacute" g2="Oacute" k="41" /> +<hkern g1="Yacute" g2="Ocircumflex" k="41" /> +<hkern g1="Yacute" g2="Otilde" k="41" /> +<hkern g1="Yacute" g2="Odieresis" k="41" /> +<hkern g1="Yacute" g2="Oslash" k="41" /> +<hkern g1="Yacute" g2="agrave" k="102" /> +<hkern g1="Yacute" g2="aacute" k="102" /> +<hkern g1="Yacute" g2="acircumflex" k="102" /> +<hkern g1="Yacute" g2="atilde" k="102" /> +<hkern g1="Yacute" g2="adieresis" k="102" /> +<hkern g1="Yacute" g2="aring" k="102" /> +<hkern g1="Yacute" g2="ae" k="102" /> +<hkern g1="Yacute" g2="ccedilla" k="102" /> +<hkern g1="Yacute" g2="egrave" k="102" /> +<hkern g1="Yacute" g2="eacute" k="102" /> +<hkern g1="Yacute" g2="ecircumflex" k="102" /> +<hkern g1="Yacute" g2="edieresis" k="102" /> +<hkern g1="Yacute" g2="ograve" k="102" /> +<hkern g1="Yacute" g2="oacute" k="102" /> +<hkern g1="Yacute" g2="ocircumflex" k="102" /> +<hkern g1="Yacute" g2="otilde" k="102" /> +<hkern g1="Yacute" g2="odieresis" k="102" /> +<hkern g1="Yacute" g2="oslash" k="102" /> +<hkern g1="Yacute" g2="ugrave" k="61" /> +<hkern g1="Yacute" g2="uacute" k="61" /> +<hkern g1="Yacute" g2="ucircumflex" k="61" /> +<hkern g1="Yacute" g2="udieresis" k="61" /> +<hkern g1="Yacute" g2="OE" k="41" /> +<hkern g1="Yacute" g2="oe" k="102" /> +<hkern g1="Yacute" g2="quotesinglbase" k="123" /> +<hkern g1="Yacute" g2="quotedblbase" k="123" /> +<hkern g1="Thorn" g2="comma" k="266" /> +<hkern g1="Thorn" g2="period" k="266" /> +<hkern g1="Thorn" g2="A" k="102" /> +<hkern g1="Thorn" g2="X" k="41" /> +<hkern g1="Thorn" g2="Z" k="20" /> +<hkern g1="Thorn" g2="Agrave" k="102" /> +<hkern g1="Thorn" g2="Aacute" k="102" /> +<hkern g1="Thorn" g2="Acircumflex" k="102" /> +<hkern g1="Thorn" g2="Atilde" k="102" /> +<hkern g1="Thorn" g2="Adieresis" k="102" /> +<hkern g1="Thorn" g2="Aring" k="102" /> +<hkern g1="Thorn" g2="quotesinglbase" k="266" /> +<hkern g1="Thorn" g2="quotedblbase" k="266" /> +<hkern g1="agrave" g2="quotedbl" k="20" /> +<hkern g1="agrave" g2="quotesingle" k="20" /> +<hkern g1="agrave" g2="quoteright" k="20" /> +<hkern g1="agrave" g2="quotedblright" k="20" /> +<hkern g1="aacute" g2="quotedbl" k="20" /> +<hkern g1="aacute" g2="quotesingle" k="20" /> +<hkern g1="aacute" g2="quoteright" k="20" /> +<hkern g1="aacute" g2="quotedblright" k="20" /> +<hkern g1="acircumflex" g2="quotedbl" k="20" /> +<hkern g1="acircumflex" g2="quotesingle" k="20" /> +<hkern g1="acircumflex" g2="quoteright" k="20" /> +<hkern g1="acircumflex" g2="quotedblright" k="20" /> +<hkern g1="atilde" g2="quotedbl" k="20" /> +<hkern g1="atilde" g2="quotesingle" k="20" /> +<hkern g1="atilde" g2="quoteright" k="20" /> +<hkern g1="atilde" g2="quotedblright" k="20" /> +<hkern g1="adieresis" g2="quotedbl" k="20" /> +<hkern g1="adieresis" g2="quotesingle" k="20" /> +<hkern g1="adieresis" g2="quoteright" k="20" /> +<hkern g1="adieresis" g2="quotedblright" k="20" /> +<hkern g1="aring" g2="quotedbl" k="20" /> +<hkern g1="aring" g2="quotesingle" k="20" /> +<hkern g1="aring" g2="quoteright" k="20" /> +<hkern g1="aring" g2="quotedblright" k="20" /> +<hkern g1="egrave" g2="quotedbl" k="20" /> +<hkern g1="egrave" g2="quotesingle" k="20" /> +<hkern g1="egrave" g2="v" k="41" /> +<hkern g1="egrave" g2="w" k="41" /> +<hkern g1="egrave" g2="x" k="41" /> +<hkern g1="egrave" g2="y" k="41" /> +<hkern g1="egrave" g2="z" k="20" /> +<hkern g1="egrave" g2="yacute" k="41" /> +<hkern g1="egrave" g2="quoteright" k="20" /> +<hkern g1="egrave" g2="quotedblright" k="20" /> +<hkern g1="eacute" g2="quotedbl" k="20" /> +<hkern g1="eacute" g2="quotesingle" k="20" /> +<hkern g1="eacute" g2="v" k="41" /> +<hkern g1="eacute" g2="w" k="41" /> +<hkern g1="eacute" g2="x" k="41" /> +<hkern g1="eacute" g2="y" k="41" /> +<hkern g1="eacute" g2="z" k="20" /> +<hkern g1="eacute" g2="yacute" k="41" /> +<hkern g1="eacute" g2="quoteright" k="20" /> +<hkern g1="eacute" g2="quotedblright" k="20" /> +<hkern g1="ecircumflex" g2="quotedbl" k="20" /> +<hkern g1="ecircumflex" g2="quotesingle" k="20" /> +<hkern g1="ecircumflex" g2="v" k="41" /> +<hkern g1="ecircumflex" g2="w" k="41" /> +<hkern g1="ecircumflex" g2="x" k="41" /> +<hkern g1="ecircumflex" g2="y" k="41" /> +<hkern g1="ecircumflex" g2="z" k="20" /> +<hkern g1="ecircumflex" g2="yacute" k="41" /> +<hkern g1="ecircumflex" g2="quoteright" k="20" /> +<hkern g1="ecircumflex" g2="quotedblright" k="20" /> +<hkern g1="edieresis" g2="quotedbl" k="20" /> +<hkern g1="edieresis" g2="quotesingle" k="20" /> +<hkern g1="edieresis" g2="v" k="41" /> +<hkern g1="edieresis" g2="w" k="41" /> +<hkern g1="edieresis" g2="x" k="41" /> +<hkern g1="edieresis" g2="y" k="41" /> +<hkern g1="edieresis" g2="z" k="20" /> +<hkern g1="edieresis" g2="yacute" k="41" /> +<hkern g1="edieresis" g2="quoteright" k="20" /> +<hkern g1="edieresis" g2="quotedblright" k="20" /> +<hkern g1="eth" g2="quotedbl" k="20" /> +<hkern g1="eth" g2="quotesingle" k="20" /> +<hkern g1="eth" g2="v" k="41" /> +<hkern g1="eth" g2="w" k="41" /> +<hkern g1="eth" g2="x" k="41" /> +<hkern g1="eth" g2="y" k="41" /> +<hkern g1="eth" g2="z" k="20" /> +<hkern g1="eth" g2="yacute" k="41" /> +<hkern g1="eth" g2="quoteright" k="20" /> +<hkern g1="eth" g2="quotedblright" k="20" /> +<hkern g1="ograve" g2="quotedbl" k="20" /> +<hkern g1="ograve" g2="quotesingle" k="20" /> +<hkern g1="ograve" g2="v" k="41" /> +<hkern g1="ograve" g2="w" k="41" /> +<hkern g1="ograve" g2="x" k="41" /> +<hkern g1="ograve" g2="y" k="41" /> +<hkern g1="ograve" g2="z" k="20" /> +<hkern g1="ograve" g2="yacute" k="41" /> +<hkern g1="ograve" g2="quoteright" k="20" /> +<hkern g1="ograve" g2="quotedblright" k="20" /> +<hkern g1="oacute" g2="quotedbl" k="20" /> +<hkern g1="oacute" g2="quotesingle" k="20" /> +<hkern g1="oacute" g2="v" k="41" /> +<hkern g1="oacute" g2="w" k="41" /> +<hkern g1="oacute" g2="x" k="41" /> +<hkern g1="oacute" g2="y" k="41" /> +<hkern g1="oacute" g2="z" k="20" /> +<hkern g1="oacute" g2="yacute" k="41" /> +<hkern g1="oacute" g2="quoteright" k="20" /> +<hkern g1="oacute" g2="quotedblright" k="20" /> +<hkern g1="ocircumflex" g2="quotedbl" k="20" /> +<hkern g1="ocircumflex" g2="quotesingle" k="20" /> +<hkern g1="ocircumflex" g2="v" k="41" /> +<hkern g1="ocircumflex" g2="w" k="41" /> +<hkern g1="ocircumflex" g2="x" k="41" /> +<hkern g1="ocircumflex" g2="y" k="41" /> +<hkern g1="ocircumflex" g2="z" k="20" /> +<hkern g1="ocircumflex" g2="yacute" k="41" /> +<hkern g1="ocircumflex" g2="quoteright" k="20" /> +<hkern g1="ocircumflex" g2="quotedblright" k="20" /> +<hkern g1="odieresis" g2="quotedbl" k="41" /> +<hkern g1="odieresis" g2="quotesingle" k="41" /> +<hkern g1="odieresis" g2="quoteright" k="41" /> +<hkern g1="odieresis" g2="quotedblright" k="41" /> +<hkern g1="oslash" g2="quotedbl" k="20" /> +<hkern g1="oslash" g2="quotesingle" k="20" /> +<hkern g1="oslash" g2="v" k="41" /> +<hkern g1="oslash" g2="w" k="41" /> +<hkern g1="oslash" g2="x" k="41" /> +<hkern g1="oslash" g2="y" k="41" /> +<hkern g1="oslash" g2="z" k="20" /> +<hkern g1="oslash" g2="yacute" k="41" /> +<hkern g1="oslash" g2="quoteright" k="20" /> +<hkern g1="oslash" g2="quotedblright" k="20" /> +<hkern g1="yacute" g2="quotedbl" k="-82" /> +<hkern g1="yacute" g2="quotesingle" k="-82" /> +<hkern g1="yacute" g2="comma" k="82" /> +<hkern g1="yacute" g2="period" k="82" /> +<hkern g1="yacute" g2="question" k="-41" /> +<hkern g1="yacute" g2="quoteright" k="-82" /> +<hkern g1="yacute" g2="quotesinglbase" k="82" /> +<hkern g1="yacute" g2="quotedblright" k="-82" /> +<hkern g1="yacute" g2="quotedblbase" k="82" /> +<hkern g1="thorn" g2="quotedbl" k="20" /> +<hkern g1="thorn" g2="quotesingle" k="20" /> +<hkern g1="thorn" g2="v" k="41" /> +<hkern g1="thorn" g2="w" k="41" /> +<hkern g1="thorn" g2="x" k="41" /> +<hkern g1="thorn" g2="y" k="41" /> +<hkern g1="thorn" g2="z" k="20" /> +<hkern g1="thorn" g2="yacute" k="41" /> +<hkern g1="thorn" g2="quoteright" k="20" /> +<hkern g1="thorn" g2="quotedblright" k="20" /> +<hkern g1="ydieresis" g2="quotedbl" k="-82" /> +<hkern g1="ydieresis" g2="quotesingle" k="-82" /> +<hkern g1="ydieresis" g2="comma" k="82" /> +<hkern g1="ydieresis" g2="period" k="82" /> +<hkern g1="ydieresis" g2="question" k="-41" /> +<hkern g1="ydieresis" g2="quoteright" k="-82" /> +<hkern g1="ydieresis" g2="quotesinglbase" k="82" /> +<hkern g1="ydieresis" g2="quotedblright" k="-82" /> +<hkern g1="ydieresis" g2="quotedblbase" k="82" /> +<hkern g1="OE" g2="J" k="-123" /> +</font> +</defs> +</svg> diff --git a/client/css/fonts/Open-Sans-700/Open-Sans-700.ttf b/client/css/fonts/Open-Sans-700/Open-Sans-700.ttf new file mode 100755 index 00000000..974a7c5e Binary files /dev/null and b/client/css/fonts/Open-Sans-700/Open-Sans-700.ttf differ diff --git a/client/css/fonts/Open-Sans-700/Open-Sans-700.woff b/client/css/fonts/Open-Sans-700/Open-Sans-700.woff new file mode 100755 index 00000000..ca2f1c27 Binary files /dev/null and b/client/css/fonts/Open-Sans-700/Open-Sans-700.woff differ diff --git a/client/css/fonts/Open-Sans-700/Open-Sans-700.woff2 b/client/css/fonts/Open-Sans-700/Open-Sans-700.woff2 new file mode 100755 index 00000000..51c75cad Binary files /dev/null and b/client/css/fonts/Open-Sans-700/Open-Sans-700.woff2 differ diff --git a/client/css/fonts/Open-Sans-regular/LICENSE.txt b/client/css/fonts/Open-Sans-regular/LICENSE.txt new file mode 100755 index 00000000..d6456956 --- /dev/null +++ b/client/css/fonts/Open-Sans-regular/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/client/css/fonts/Open-Sans-regular/Open-Sans-regular.eot b/client/css/fonts/Open-Sans-regular/Open-Sans-regular.eot new file mode 100755 index 00000000..1d98e6ea Binary files /dev/null and b/client/css/fonts/Open-Sans-regular/Open-Sans-regular.eot differ diff --git a/client/css/fonts/Open-Sans-regular/Open-Sans-regular.svg b/client/css/fonts/Open-Sans-regular/Open-Sans-regular.svg new file mode 100755 index 00000000..052c59ff --- /dev/null +++ b/client/css/fonts/Open-Sans-regular/Open-Sans-regular.svg @@ -0,0 +1,1637 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg xmlns="http://www.w3.org/2000/svg"> +<defs > +<font id="OpenSans" horiz-adv-x="1206" ><font-face + font-family="Open Sans" + units-per-em="2048" + panose-1="2 11 6 6 3 5 4 2 2 4" + ascent="2189" + descent="-600" + alphabetic="0" /> +<glyph unicode=" " glyph-name="space" horiz-adv-x="532" /> +<glyph unicode="!" glyph-name="exclam" horiz-adv-x="547" d="M326 403H221L170 1462H377L326 403ZM152 106Q152 242 272 242Q330 242 361 207T393 106Q393 42 361 7T272 -29Q220 -29 186 2T152 106Z" /> +<glyph unicode=""" glyph-name="quotedbl" horiz-adv-x="821" d="M319 1462L279 934H174L133 1462H319ZM688 1462L647 934H543L502 1462H688Z" /> +<glyph unicode="#" glyph-name="numbersign" horiz-adv-x="1323" d="M981 899L915 559H1198V430H891L807 0H670L754 430H451L369 0H233L313 430H51V559H338L406 899H129V1026H428L510 1462H649L567 1026H872L956 1462H1090L1006 1026H1270V899H981ZM475 559H778L844 +899H541L475 559Z" /> +<glyph unicode="$" glyph-name="dollar" horiz-adv-x="1171" d="M1036 449Q1036 313 934 225T649 113V-119H520V104Q408 104 303 121T131 170V326Q214 289 322 266T520 242V682Q315 747 233 833T150 1055Q150 1186 251 1270T520 1372V1554H649V1374Q833 1369 1004 +1300L952 1169Q803 1228 649 1239V805Q806 755 884 708T999 599T1036 449ZM866 436Q866 508 822 552T649 641V252Q866 282 866 436ZM319 1057Q319 981 364 935T520 848V1235Q421 1219 370 1173T319 1057Z" /> +<glyph unicode="%" glyph-name="percent" horiz-adv-x="1686" d="M242 1026Q242 856 279 771T399 686Q563 686 563 1026Q563 1364 399 1364Q316 1364 279 1280T242 1026ZM700 1026Q700 798 624 682T399 565Q259 565 182 684T104 1026Q104 1253 178 1368T399 1483Q544 +1483 622 1364T700 1026ZM1122 440Q1122 269 1159 185T1280 100Q1364 100 1404 183T1444 440Q1444 611 1404 693T1280 776Q1196 776 1159 694T1122 440ZM1581 440Q1581 213 1505 97T1280 -20Q1138 -20 1062 99T985 440Q985 667 1059 782T1280 897Q1422 897 1501 +780T1581 440ZM1323 1462L512 0H365L1176 1462H1323Z" /> +<glyph unicode="&" glyph-name="ampersand" horiz-adv-x="1495" d="M414 1171Q414 1102 450 1040T573 889Q702 964 752 1027T803 1174Q803 1251 752 1299T614 1348Q525 1348 470 1300T414 1171ZM569 129Q810 129 969 283L532 707Q421 639 375 595T307 499T285 +383Q285 266 362 198T569 129ZM113 379Q113 509 182 609T432 811Q347 906 317 955T268 1057T250 1167Q250 1317 348 1401T621 1485Q783 1485 876 1402T969 1169Q969 1062 901 972T676 788L1083 397Q1139 459 1172 542T1229 725H1397Q1329 439 1192 291L1491 0H1262L1077 +178Q959 72 837 26T565 -20Q350 -20 232 86T113 379Z" /> +<glyph unicode="'" glyph-name="quotesingle" horiz-adv-x="453" d="M319 1462L279 934H174L133 1462H319Z" /> +<glyph unicode="(" glyph-name="parenleft" horiz-adv-x="606" d="M82 561Q82 826 159 1057T383 1462H545Q401 1269 329 1038T256 563Q256 323 330 94T543 -324H383Q236 -154 159 73T82 561Z" /> +<glyph unicode=")" glyph-name="parenright" horiz-adv-x="606" d="M524 561Q524 298 447 71T223 -324H63Q202 -136 276 93T350 563Q350 807 278 1038T61 1462H223Q370 1287 447 1056T524 561Z" /> +<glyph unicode="*" glyph-name="asterisk" horiz-adv-x="1130" d="M657 1556L614 1161L1012 1272L1038 1090L657 1059L905 733L733 639L557 1001L397 639L221 733L463 1059L86 1090L115 1272L506 1161L463 1556H657Z" /> +<glyph unicode="+" glyph-name="plus" horiz-adv-x="1171" d="M653 791H1065V653H653V227H514V653H104V791H514V1219H653V791Z" /> +<glyph unicode="," glyph-name="comma" horiz-adv-x="502" d="M350 238L365 215Q339 115 290 -17T188 -264H63Q90 -160 122 -7T168 238H350Z" /> +<glyph unicode="-" glyph-name="hyphen" horiz-adv-x="659" d="M84 473V625H575V473H84Z" /> +<glyph unicode="." glyph-name="period" horiz-adv-x="545" d="M152 106Q152 173 182 207T270 242Q328 242 360 208T393 106Q393 41 360 6T270 -29Q219 -29 186 2T152 106Z" /> +<glyph unicode="/" glyph-name="slash" horiz-adv-x="752" d="M731 1462L186 0H20L565 1462H731Z" /> +<glyph unicode="0" glyph-name="zero" horiz-adv-x="1171" d="M1069 733Q1069 354 950 167T584 -20Q348 -20 225 171T102 733Q102 1115 221 1300T584 1485Q822 1485 945 1292T1069 733ZM270 733Q270 414 345 269T584 123Q750 123 824 270T899 733Q899 1048 825 +1194T584 1341Q420 1341 345 1197T270 733Z" /> +<glyph unicode="1" glyph-name="one" horiz-adv-x="1171" d="M715 0H553V1042Q553 1172 561 1288Q540 1267 514 1244T276 1049L188 1163L575 1462H715V0Z" /> +<glyph unicode="2" glyph-name="two" horiz-adv-x="1171" d="M1061 0H100V143L485 530Q661 708 717 784T801 932T829 1087Q829 1204 758 1272T561 1341Q470 1341 389 1311T207 1202L119 1315Q321 1483 559 1483Q765 1483 882 1378T999 1094Q999 955 921 819T629 +475L309 162V154H1061V0Z" /> +<glyph unicode="3" glyph-name="three" horiz-adv-x="1171" d="M1006 1118Q1006 978 928 889T705 770V762Q881 740 966 650T1051 414Q1051 205 906 93T494 -20Q378 -20 282 -3T94 59V217Q189 170 296 146T500 121Q879 121 879 418Q879 684 461 684H317V827H463Q634 +827 734 902T834 1112Q834 1219 761 1280T561 1341Q465 1341 380 1315T186 1219L102 1331Q192 1402 309 1442T557 1483Q770 1483 888 1386T1006 1118Z" /> +<glyph unicode="4" glyph-name="four" horiz-adv-x="1171" d="M1130 336H913V0H754V336H43V481L737 1470H913V487H1130V336ZM754 487V973Q754 1116 764 1296H756Q708 1200 666 1137L209 487H754Z" /> +<glyph unicode="5" glyph-name="five" horiz-adv-x="1171" d="M557 893Q788 893 920 779T1053 465Q1053 238 909 109T510 -20Q263 -20 133 59V219Q203 174 307 149T512 123Q688 123 785 206T883 446Q883 752 508 752Q413 752 254 723L168 778L223 1462H950V1309H365L328 +870Q443 893 557 893Z" /> +<glyph unicode="6" glyph-name="six" horiz-adv-x="1171" d="M117 625Q117 1056 284 1269T780 1483Q893 1483 958 1464V1321Q881 1346 782 1346Q547 1346 423 1200T287 739H299Q409 911 647 911Q844 911 957 792T1071 469Q1071 241 947 111T610 -20Q383 -20 250 +150T117 625ZM608 121Q750 121 828 210T907 469Q907 614 834 697T616 780Q526 780 451 743T332 641T287 506Q287 403 327 314T440 173T608 121Z" /> +<glyph unicode="7" glyph-name="seven" horiz-adv-x="1171" d="M285 0L891 1309H94V1462H1067V1329L469 0H285Z" /> +<glyph unicode="8" glyph-name="eight" horiz-adv-x="1171" d="M584 1483Q784 1483 901 1390T1018 1133Q1018 1025 951 936T737 774Q915 689 990 596T1065 379Q1065 197 938 89T590 -20Q356 -20 230 82T104 373Q104 624 410 764Q272 842 212 932T152 1135Q152 +1294 269 1388T584 1483ZM268 369Q268 249 351 182T586 115Q735 115 818 185T901 377Q901 474 823 549T551 696Q402 632 335 555T268 369ZM582 1348Q457 1348 386 1288T315 1128Q315 1036 374 970T592 838Q735 898 794 967T854 1128Q854 1229 782 1288T582 1348Z" +/> +<glyph unicode="9" glyph-name="nine" horiz-adv-x="1171" d="M1061 838Q1061 -20 397 -20Q281 -20 213 0V143Q293 117 395 117Q635 117 757 265T891 721H879Q824 638 733 595T528 551Q334 551 220 667T106 991Q106 1219 233 1351T569 1483Q718 1483 829 1407T1001 +1184T1061 838ZM569 1341Q426 1341 348 1249T270 993Q270 849 342 767T561 684Q652 684 728 721T849 822T893 956Q893 1061 852 1150T738 1290T569 1341Z" /> +<glyph unicode=":" glyph-name="colon" horiz-adv-x="545" d="M152 106Q152 173 182 207T270 242Q328 242 360 208T393 106Q393 41 360 6T270 -29Q219 -29 186 2T152 106ZM152 989Q152 1124 270 1124Q393 1124 393 989Q393 924 360 889T270 854Q219 854 186 885T152 989Z" /> +<glyph unicode=";" glyph-name="semicolon" horiz-adv-x="545" d="M350 238L365 215Q339 115 290 -17T188 -264H63Q90 -160 122 -7T168 238H350ZM147 989Q147 1124 266 1124Q389 1124 389 989Q389 924 356 889T266 854Q208 854 178 889T147 989Z" /> +<glyph unicode="<" glyph-name="less" horiz-adv-x="1171" d="M1065 242L104 664V762L1065 1241V1092L283 721L1065 393V242Z" /> +<glyph unicode="=" glyph-name="equal" horiz-adv-x="1171" d="M119 858V995H1049V858H119ZM119 449V586H1049V449H119Z" /> +<glyph unicode=">" glyph-name="greater" horiz-adv-x="1171" d="M104 393L887 719L104 1092V1241L1065 762V664L104 242V393Z" /> +<glyph unicode="?" glyph-name="question" horiz-adv-x="879" d="M289 403V457Q289 574 325 649T459 809Q595 924 630 982T666 1122Q666 1224 601 1279T412 1335Q333 1335 258 1317T86 1249L27 1384Q216 1483 422 1483Q613 1483 719 1389T825 1124Q825 1051 806 +996T748 891T584 731Q483 645 451 588T418 436V403H289ZM240 106Q240 242 360 242Q418 242 449 207T481 106Q481 42 449 7T360 -29Q308 -29 274 2T240 106Z" /> +<glyph unicode="@" glyph-name="at" horiz-adv-x="1841" d="M1720 729Q1720 587 1676 469T1552 286T1368 221Q1282 221 1223 273T1153 406H1145Q1105 319 1031 270T854 221Q704 221 620 323T535 602Q535 806 653 933T963 1061Q1031 1061 1117 1049T1272 1014L1247 +544V522Q1247 344 1380 344Q1471 344 1528 451T1585 731Q1585 912 1511 1048T1301 1257T987 1331Q764 1331 599 1239T347 975T260 578Q260 273 421 109T885 -55Q1095 -55 1321 31V-102Q1129 -186 885 -186Q522 -186 322 13T121 571Q121 831 228 1034T533 1348T987 +1460Q1202 1460 1369 1370T1628 1113T1720 729ZM686 598Q686 344 881 344Q1088 344 1106 657L1120 918Q1048 938 963 938Q833 938 760 848T686 598Z" /> +<glyph unicode="A" glyph-name="A" horiz-adv-x="1296" d="M1120 0L938 465H352L172 0H0L578 1468H721L1296 0H1120ZM885 618L715 1071Q682 1157 647 1282Q625 1186 584 1071L412 618H885Z" /> +<glyph unicode="B" glyph-name="B" horiz-adv-x="1327" d="M201 1462H614Q905 1462 1035 1375T1165 1100Q1165 970 1093 886T881 776V766Q1214 709 1214 416Q1214 220 1082 110T711 0H201V1462ZM371 836H651Q831 836 910 892T989 1083Q989 1206 901 1260T621 1315H371V836ZM371 +692V145H676Q853 145 942 213T1032 428Q1032 564 941 628T662 692H371Z" /> +<glyph unicode="C" glyph-name="C" horiz-adv-x="1292" d="M827 1331Q586 1331 447 1171T307 731Q307 444 441 288T825 131Q978 131 1174 186V37Q1022 -20 799 -20Q476 -20 301 176T125 733Q125 959 209 1129T453 1391T829 1483Q1059 1483 1231 1399L1159 1253Q993 +1331 827 1331Z" /> +<glyph unicode="D" glyph-name="D" horiz-adv-x="1493" d="M1368 745Q1368 383 1172 192T606 0H201V1462H649Q990 1462 1179 1273T1368 745ZM1188 739Q1188 1025 1045 1170T618 1315H371V147H578Q882 147 1035 296T1188 739Z" /> +<glyph unicode="E" glyph-name="E" horiz-adv-x="1139" d="M1016 0H201V1462H1016V1311H371V840H977V690H371V152H1016V0Z" /> +<glyph unicode="F" glyph-name="F" horiz-adv-x="1057" d="M371 0H201V1462H1016V1311H371V776H977V625H371V0Z" /> +<glyph unicode="G" glyph-name="G" horiz-adv-x="1491" d="M844 766H1341V55Q1225 18 1105 -1T827 -20Q495 -20 310 177T125 731Q125 959 216 1130T480 1392T883 1483Q1117 1483 1319 1397L1253 1247Q1055 1331 872 1331Q605 1331 455 1172T305 731Q305 435 449 +282T874 129Q1026 129 1171 164V614H844V766Z" /> +<glyph unicode="H" glyph-name="H" horiz-adv-x="1511" d="M1311 0H1141V688H371V0H201V1462H371V840H1141V1462H1311V0Z" /> +<glyph unicode="I" glyph-name="I" horiz-adv-x="571" d="M201 0V1462H371V0H201Z" /> +<glyph unicode="J" glyph-name="J" horiz-adv-x="547" d="M-12 -385Q-106 -385 -160 -358V-213Q-89 -233 -12 -233Q87 -233 138 -173T190 0V1462H360V14Q360 -176 264 -280T-12 -385Z" /> +<glyph unicode="K" glyph-name="K" horiz-adv-x="1257" d="M1257 0H1057L524 709L371 573V0H201V1462H371V737L1034 1462H1235L647 827L1257 0Z" /> +<glyph unicode="L" glyph-name="L" horiz-adv-x="1063" d="M201 0V1462H371V154H1016V0H201Z" /> +<glyph unicode="M" glyph-name="M" horiz-adv-x="1849" d="M848 0L352 1296H344Q358 1142 358 930V0H201V1462H457L920 256H928L1395 1462H1649V0H1479V942Q1479 1104 1493 1294H1485L985 0H848Z" /> +<glyph unicode="N" glyph-name="N" horiz-adv-x="1544" d="M1343 0H1149L350 1227H342Q358 1011 358 831V0H201V1462H393L1190 240H1198Q1196 267 1189 413T1184 623V1462H1343V0Z" /> +<glyph unicode="O" glyph-name="O" horiz-adv-x="1595" d="M1470 733Q1470 382 1293 181T799 -20Q476 -20 301 177T125 735Q125 1092 301 1288T801 1485Q1116 1485 1293 1285T1470 733ZM305 733Q305 436 431 283T799 129Q1042 129 1166 282T1290 733Q1290 1028 +1167 1180T801 1333Q558 1333 432 1180T305 733Z" /> +<glyph unicode="P" glyph-name="P" horiz-adv-x="1233" d="M1128 1036Q1128 814 977 695T543 575H371V0H201V1462H580Q1128 1462 1128 1036ZM371 721H524Q750 721 851 794T952 1028Q952 1173 857 1244T561 1315H371V721Z" /> +<glyph unicode="Q" glyph-name="Q" horiz-adv-x="1595" d="M1470 733Q1470 452 1357 266T1038 14L1386 -348H1139L854 -18L799 -20Q476 -20 301 177T125 735Q125 1092 301 1288T801 1485Q1116 1485 1293 1285T1470 733ZM305 733Q305 436 431 283T799 129Q1042 +129 1166 282T1290 733Q1290 1028 1167 1180T801 1333Q558 1333 432 1180T305 733Z" /> +<glyph unicode="R" glyph-name="R" horiz-adv-x="1266" d="M371 608V0H201V1462H602Q871 1462 999 1359T1128 1049Q1128 759 834 657L1231 0H1030L676 608H371ZM371 754H604Q784 754 868 825T952 1040Q952 1185 867 1249T592 1313H371V754Z" /> +<glyph unicode="S" glyph-name="S" horiz-adv-x="1124" d="M1026 389Q1026 196 886 88T506 -20Q246 -20 106 47V211Q196 173 302 151T512 129Q682 129 768 193T854 373Q854 449 824 497T722 587T504 680Q300 753 213 853T125 1114Q125 1283 252 1383T588 1483Q806 +1483 989 1403L936 1255Q755 1331 584 1331Q449 1331 373 1273T297 1112Q297 1036 325 988T419 899T623 809Q853 727 939 633T1026 389Z" /> +<glyph unicode="T" glyph-name="T" horiz-adv-x="1133" d="M651 0H481V1311H18V1462H1114V1311H651V0Z" /> +<glyph unicode="U" glyph-name="U" horiz-adv-x="1491" d="M1305 1462V516Q1305 266 1154 123T739 -20Q475 -20 331 124T186 520V1462H356V508Q356 325 456 227T750 129Q935 129 1035 227T1135 510V1462H1305Z" /> +<glyph unicode="V" glyph-name="V" horiz-adv-x="1219" d="M1036 1462H1219L692 0H524L0 1462H180L516 516Q574 353 608 199Q644 361 702 522L1036 1462Z" /> +<glyph unicode="W" glyph-name="W" horiz-adv-x="1896" d="M1477 0H1309L1014 979Q993 1044 967 1143T940 1262Q918 1130 870 973L584 0H416L27 1462H207L438 559Q486 369 508 215Q535 398 588 573L850 1462H1030L1305 565Q1353 410 1386 215Q1405 357 1458 561L1688 +1462H1868L1477 0Z" /> +<glyph unicode="X" glyph-name="X" horiz-adv-x="1182" d="M1174 0H981L588 643L188 0H8L494 764L41 1462H229L592 883L958 1462H1139L686 770L1174 0Z" /> +<glyph unicode="Y" glyph-name="Y" horiz-adv-x="1147" d="M573 731L963 1462H1147L659 567V0H487V559L0 1462H186L573 731Z" /> +<glyph unicode="Z" glyph-name="Z" horiz-adv-x="1169" d="M1087 0H82V133L858 1309H106V1462H1065V1329L289 154H1087V0Z" /> +<glyph unicode="[" glyph-name="bracketleft" horiz-adv-x="674" d="M623 -324H166V1462H623V1321H334V-182H623V-324Z" /> +<glyph unicode="\" glyph-name="backslash" horiz-adv-x="752" d="M186 1462L733 0H567L23 1462H186Z" /> +<glyph unicode="]" glyph-name="bracketright" horiz-adv-x="674" d="M51 -182H340V1321H51V1462H508V-324H51V-182Z" /> +<glyph unicode="^" glyph-name="asciicircum" horiz-adv-x="1110" d="M49 551L483 1473H582L1059 551H907L535 1296L201 551H49Z" /> +<glyph unicode="_" glyph-name="underscore" horiz-adv-x="918" d="M922 -315H-4V-184H922V-315Z" /> +<glyph unicode="`" glyph-name="grave" horiz-adv-x="1182" d="M786 1241H676Q611 1293 522 1389T393 1548V1569H596Q628 1500 685 1410T786 1266V1241Z" /> +<glyph unicode="a" glyph-name="a" horiz-adv-x="1139" d="M850 0L817 156H809Q727 53 646 17T442 -20Q279 -20 187 64T94 303Q94 635 625 651L811 657V725Q811 854 756 915T578 977Q441 977 268 893L217 1020Q298 1064 394 1089T588 1114Q784 1114 878 1027T973 +748V0H850ZM475 117Q630 117 718 202T807 440V539L641 532Q443 525 356 471T268 301Q268 211 322 164T475 117Z" /> +<glyph unicode="b" glyph-name="b" horiz-adv-x="1255" d="M686 1114Q902 1114 1021 967T1141 549Q1141 279 1021 130T686 -20Q579 -20 491 19T342 141H330L295 0H176V1556H342V1178Q342 1051 334 950H342Q458 1114 686 1114ZM662 975Q492 975 417 878T342 549Q342 +318 419 219T666 119Q819 119 894 230T969 551Q969 765 894 870T662 975Z" /> +<glyph unicode="c" glyph-name="c" horiz-adv-x="975" d="M614 -20Q376 -20 246 126T115 541Q115 816 247 966T625 1116Q704 1116 783 1099T907 1059L856 918Q801 940 736 954T621 969Q287 969 287 543Q287 341 368 233T610 125Q747 125 891 184V37Q781 -20 614 -20Z" /> +<glyph unicode="d" glyph-name="d" horiz-adv-x="1255" d="M922 147H913Q798 -20 569 -20Q354 -20 235 127T115 545Q115 816 235 966T569 1116Q792 1116 911 954H924L917 1033L913 1110V1556H1079V0H944L922 147ZM590 119Q760 119 836 211T913 510V545Q913 778 +836 877T588 977Q442 977 365 864T287 543Q287 333 364 226T590 119Z" /> +<glyph unicode="e" glyph-name="e" horiz-adv-x="1149" d="M639 -20Q396 -20 256 128T115 539Q115 804 245 960T596 1116Q802 1116 922 981T1042 623V518H287Q292 325 384 225T645 125Q822 125 995 199V51Q907 13 829 -3T639 -20ZM594 977Q462 977 384 891T291 +653H864Q864 810 794 893T594 977Z" /> +<glyph unicode="f" glyph-name="f" horiz-adv-x="694" d="M670 967H391V0H225V967H29V1042L225 1102V1163Q225 1567 578 1567Q665 1567 782 1532L739 1399Q643 1430 575 1430Q481 1430 436 1368T391 1167V1096H670V967Z" /> +<glyph unicode="g" glyph-name="g" horiz-adv-x="1122" d="M1073 1096V991L870 967Q898 932 920 876T942 748Q942 587 832 491T530 395Q481 395 438 403Q332 347 332 262Q332 217 369 196T496 174H690Q868 174 963 99T1059 -119Q1059 -301 913 -396T487 -492Q272 +-492 156 -412T39 -186Q39 -86 103 -13T283 86Q241 105 213 145T184 238Q184 298 216 343T317 430Q232 465 179 549T125 741Q125 921 233 1018T539 1116Q625 1116 694 1096H1073ZM199 -184Q199 -273 274 -319T489 -365Q698 -365 798 -303T899 -133Q899 -44 844 +-10T637 25H438Q325 25 262 -29T199 -184ZM289 745Q289 630 354 571T535 512Q778 512 778 748Q778 995 532 995Q415 995 352 932T289 745Z" /> +<glyph unicode="h" glyph-name="h" horiz-adv-x="1257" d="M926 0V709Q926 843 865 909T674 975Q501 975 422 881T342 573V0H176V1556H342V1085Q342 1000 334 944H344Q393 1023 483 1068T690 1114Q891 1114 991 1019T1092 715V0H926Z" /> +<glyph unicode="i" glyph-name="i" horiz-adv-x="518" d="M342 0H176V1096H342V0ZM162 1393Q162 1450 190 1476T260 1503Q300 1503 329 1476T358 1393Q358 1337 329 1310T260 1282Q218 1282 190 1309T162 1393Z" /> +<glyph unicode="j" glyph-name="j" horiz-adv-x="518" d="M43 -492Q-52 -492 -111 -467V-332Q-42 -352 25 -352Q103 -352 139 -310T176 -180V1096H342V-168Q342 -492 43 -492ZM162 1393Q162 1450 190 1476T260 1503Q300 1503 329 1476T358 1393Q358 1337 329 1310T260 +1282Q218 1282 190 1309T162 1393Z" /> +<glyph unicode="k" glyph-name="k" horiz-adv-x="1075" d="M340 561Q383 622 471 721L825 1096H1022L578 629L1053 0H852L465 518L340 410V0H176V1556H340V731Q340 676 332 561H340Z" /> +<glyph unicode="l" glyph-name="l" horiz-adv-x="518" d="M342 0H176V1556H342V0Z" /> +<glyph unicode="m" glyph-name="m" horiz-adv-x="1905" d="M1573 0V713Q1573 844 1517 909T1343 975Q1188 975 1114 886T1040 612V0H874V713Q874 844 818 909T643 975Q487 975 415 882T342 575V0H176V1096H311L338 946H346Q393 1026 478 1071T670 1116Q927 1116 +1006 930H1014Q1063 1016 1156 1066T1368 1116Q1554 1116 1646 1021T1739 715V0H1573Z" /> +<glyph unicode="n" glyph-name="n" horiz-adv-x="1257" d="M926 0V709Q926 843 865 909T674 975Q502 975 422 882T342 575V0H176V1096H311L338 946H346Q397 1027 489 1071T694 1116Q892 1116 992 1021T1092 715V0H926Z" /> +<glyph unicode="o" glyph-name="o" horiz-adv-x="1237" d="M1122 549Q1122 281 987 131T614 -20Q467 -20 353 49T177 247T115 549Q115 817 249 966T621 1116Q851 1116 986 963T1122 549ZM287 549Q287 339 371 229T618 119Q781 119 865 228T950 549Q950 758 866 +866T616 975Q453 975 370 868T287 549Z" /> +<glyph unicode="p" glyph-name="p" horiz-adv-x="1255" d="M686 -20Q579 -20 491 19T342 141H330Q342 45 342 -41V-492H176V1096H311L334 946H342Q406 1036 491 1076T686 1116Q904 1116 1022 967T1141 549Q1141 279 1021 130T686 -20ZM662 975Q494 975 419 882T342 +586V549Q342 318 419 219T666 119Q808 119 888 234T969 551Q969 756 889 865T662 975Z" /> +<glyph unicode="q" glyph-name="q" horiz-adv-x="1255" d="M590 119Q756 119 832 208T913 508V545Q913 775 835 876T588 977Q442 977 365 864T287 543Q287 336 363 228T590 119ZM565 -20Q353 -20 234 129T115 545Q115 814 235 965T569 1116Q794 1116 915 946H924L948 +1096H1079V-492H913V-23Q913 77 924 147H911Q796 -20 565 -20Z" /> +<glyph unicode="r" glyph-name="r" horiz-adv-x="836" d="M676 1116Q749 1116 807 1104L784 950Q716 965 664 965Q531 965 437 857T342 588V0H176V1096H313L332 893H340Q401 1000 487 1058T676 1116Z" /> +<glyph unicode="s" glyph-name="s" horiz-adv-x="977" d="M883 299Q883 146 769 63T449 -20Q231 -20 109 49V203Q188 163 278 140T453 117Q583 117 653 158T723 285Q723 349 668 394T451 502Q298 559 234 601T138 698T106 827Q106 961 215 1038T514 1116Q691 1116 +860 1044L801 909Q636 977 502 977Q384 977 324 940T264 838Q264 794 286 763T359 704T551 623Q746 552 814 480T883 299Z" /> +<glyph unicode="t" glyph-name="t" horiz-adv-x="723" d="M530 117Q574 117 615 123T680 137V10Q653 -3 601 -11T506 -20Q188 -20 188 315V967H31V1047L188 1116L258 1350H354V1096H672V967H354V322Q354 223 401 170T530 117Z" /> +<glyph unicode="u" glyph-name="u" horiz-adv-x="1257" d="M332 1096V385Q332 251 393 185T584 119Q756 119 835 213T915 520V1096H1081V0H944L920 147H911Q860 66 770 23T563 -20Q363 -20 264 75T164 379V1096H332Z" /> +<glyph unicode="v" glyph-name="v" horiz-adv-x="1026" d="M416 0L0 1096H178L414 446Q494 218 508 150H516Q527 203 585 369T848 1096H1026L610 0H416Z" /> +<glyph unicode="w" glyph-name="w" horiz-adv-x="1593" d="M1071 0L870 643Q851 702 799 911H791Q751 736 721 641L514 0H322L23 1096H197Q303 683 358 467T422 176H430Q441 233 465 323T508 467L709 1096H889L1085 467Q1141 295 1161 178H1169Q1173 214 1190 +289T1399 1096H1571L1268 0H1071Z" /> +<glyph unicode="x" glyph-name="x" horiz-adv-x="1073" d="M440 561L59 1096H248L537 676L825 1096H1012L631 561L1032 0H844L537 444L227 0H39L440 561Z" /> +<glyph unicode="y" glyph-name="y" horiz-adv-x="1032" d="M2 1096H180L420 471Q499 257 518 162H526Q539 213 580 336T852 1096H1030L559 -152Q489 -337 396 -414T166 -492Q90 -492 16 -475V-342Q71 -354 139 -354Q310 -354 383 -162L444 -6L2 1096Z" /> +<glyph unicode="z" glyph-name="z" horiz-adv-x="958" d="M877 0H82V113L680 967H119V1096H862V967L272 129H877V0Z" /> +<glyph unicode="{" glyph-name="braceleft" horiz-adv-x="776" d="M475 12Q475 -90 533 -136T705 -184V-324Q515 -322 411 -237T307 2V305Q307 409 244 453T61 498V639Q191 641 249 687T307 829V1135Q307 1290 415 1376T705 1462V1323Q475 1317 475 1124V829Q475 +614 252 575V563Q475 524 475 309V12Z" /> +<glyph unicode="|" glyph-name="bar" horiz-adv-x="1128" d="M494 1556H635V-496H494V1556Z" /> +<glyph unicode="}" glyph-name="braceright" horiz-adv-x="776" d="M522 575Q299 614 299 829V1124Q299 1317 72 1323V1462Q256 1462 361 1375T467 1135V829Q467 732 526 687T715 639V498Q593 498 530 454T467 305V2Q467 -151 365 -236T72 -324V-184Q183 -182 +241 -136T299 12V309Q299 423 354 483T522 563V575Z" /> +<glyph unicode="~" glyph-name="asciitilde" horiz-adv-x="1171" d="M338 713Q285 713 222 680T104 592V743Q204 852 348 852Q416 852 472 838T618 786Q684 758 733 745T829 731Q883 731 947 763T1065 852V702Q963 592 821 592Q749 592 686 608T551 657Q476 689 +431 701T338 713Z" /> +<glyph unicode=" " glyph-name="nbspace" horiz-adv-x="532" /> +<glyph unicode="¡" glyph-name="exclamdown" horiz-adv-x="547" d="M219 684H324L375 -373H168L219 684ZM393 983Q393 848 272 848Q212 848 182 883T152 983Q152 1046 183 1082T272 1118Q323 1118 358 1086T393 983Z" /> +<glyph unicode="¢" glyph-name="cent" horiz-adv-x="1171" d="M971 240Q866 186 719 180V-20H586V186Q383 218 287 354T190 741Q190 1249 586 1311V1483H721V1319Q796 1316 867 1300T987 1260L938 1120Q805 1171 696 1171Q524 1171 443 1066T362 743Q362 +531 441 430T688 328Q829 328 971 387V240Z" /> +<glyph unicode="£" glyph-name="sterling" horiz-adv-x="1171" d="M682 1481Q872 1481 1042 1397L981 1264Q827 1341 684 1341Q561 1341 499 1279T436 1077V782H858V655H436V434Q436 334 404 266T297 154H1092V0H63V141Q268 188 268 432V655H70V782H268V1098Q268 +1276 380 1378T682 1481Z" /> +<glyph unicode="¤" glyph-name="currency" horiz-adv-x="1171" d="M184 723Q184 845 258 952L123 1092L217 1184L352 1051Q456 1124 586 1124Q713 1124 815 1051L952 1184L1047 1092L913 954Q987 841 987 723Q987 592 913 489L1044 354L952 262L815 395Q713 +324 586 324Q452 324 352 397L217 264L125 356L258 492Q184 599 184 723ZM313 723Q313 611 391 531T586 451Q702 451 781 530T860 723Q860 837 780 918T586 999Q470 999 392 917T313 723Z" /> +<glyph unicode="¥" glyph-name="yen" horiz-adv-x="1171" d="M584 735L963 1462H1137L721 692H983V565H666V395H983V268H666V0H502V268H186V395H502V565H186V692H442L31 1462H209L584 735Z" /> +<glyph unicode="¦" glyph-name="brokenbar" horiz-adv-x="1128" d="M494 1556H635V780H494V1556ZM494 281H635V-496H494V281Z" /> +<glyph unicode="§" glyph-name="section" horiz-adv-x="1057" d="M139 809Q139 895 182 963T303 1069Q229 1109 187 1164T145 1305Q145 1426 248 1495T549 1565Q643 1565 722 1551T899 1497L846 1366Q748 1405 681 1418T537 1432Q421 1432 363 1403T305 1309Q305 +1249 366 1207T582 1110Q768 1042 843 967T918 784Q918 694 877 624T762 512Q915 431 915 285Q915 145 798 69T469 -8Q251 -8 123 57V205Q201 168 298 146T477 123Q611 123 681 161T752 270Q752 316 728 345T650 403T481 475Q339 527 272 572T172 674T139 809ZM285 +829Q285 752 351 700T584 586L633 567Q770 647 770 758Q770 841 697 897T438 1010Q370 991 328 941T285 829Z" /> +<glyph unicode="¨" glyph-name="dieresis" horiz-adv-x="1182" d="M309 1393Q309 1445 335 1468T399 1491Q437 1491 464 1468T492 1393Q492 1343 465 1319T399 1294Q362 1294 336 1318T309 1393ZM690 1393Q690 1445 716 1468T780 1491Q817 1491 844 1468T872 +1393Q872 1343 845 1319T780 1294Q743 1294 717 1318T690 1393Z" /> +<glyph unicode="©" glyph-name="copyright" horiz-adv-x="1704" d="M893 1059Q768 1059 701 972T633 731Q633 563 696 482T891 401Q977 401 1102 446V322Q1054 302 1004 288T883 274Q689 274 585 394T481 731Q481 940 591 1063T893 1186Q1021 1186 1139 1126L1081 +1008Q973 1059 893 1059ZM100 731Q100 931 200 1106T475 1382T852 1483Q1052 1483 1227 1383T1503 1108T1604 731Q1604 534 1507 361T1235 84T852 -20Q645 -20 470 83T198 360T100 731ZM205 731Q205 558 292 408T529 171T852 84Q1026 84 1175 171T1411 406T1499 +731Q1499 905 1412 1054T1177 1290T852 1378Q678 1378 529 1291T293 1056T205 731Z" /> +<glyph unicode="ª" glyph-name="ordfeminine" horiz-adv-x="725" d="M532 801L508 885Q416 788 276 788Q181 788 126 837T70 989Q70 1091 147 1143T389 1202L506 1206V1245Q506 1378 358 1378Q258 1378 154 1327L111 1423Q225 1479 358 1479Q488 1479 556 +1427T625 1253V801H532ZM193 989Q193 889 305 889Q506 889 506 1069V1118L408 1114Q296 1110 245 1082T193 989Z" /> +<glyph unicode="«" glyph-name="guillemotleft" horiz-adv-x="1018" d="M82 551L424 958L543 889L254 539L543 188L424 117L82 524V551ZM477 551L821 958L938 889L651 539L938 188L821 117L477 524V551Z" /> +<glyph unicode="¬" glyph-name="logicalnot" horiz-adv-x="1171" d="M1065 791V264H928V653H104V791H1065Z" /> +<glyph unicode="­" glyph-name="uni00AD" horiz-adv-x="659" d="M84 473V625H575V473H84Z" /> +<glyph unicode="®" glyph-name="registered" horiz-adv-x="1704" d="M723 762H831Q911 762 959 803T1008 909Q1008 984 965 1016T829 1049H723V762ZM1157 913Q1157 833 1115 772T995 680L1233 285H1065L858 639H723V285H575V1176H836Q1002 1176 1079 1111T1157 +913ZM100 731Q100 931 200 1106T475 1382T852 1483Q1052 1483 1227 1383T1503 1108T1604 731Q1604 534 1507 361T1235 84T852 -20Q645 -20 470 83T198 360T100 731ZM205 731Q205 558 292 408T529 171T852 84Q1026 84 1175 171T1411 406T1499 731Q1499 905 1412 +1054T1177 1290T852 1378Q678 1378 529 1291T293 1056T205 731Z" /> +<glyph unicode="¯" glyph-name="overscore" horiz-adv-x="1024" d="M1030 1556H-6V1683H1030V1556Z" /> +<glyph unicode="°" glyph-name="degree" horiz-adv-x="877" d="M127 1171Q127 1301 217 1392T438 1483Q568 1483 659 1393T750 1171Q750 1087 709 1016T595 902T438 860Q308 860 218 950T127 1171ZM242 1171Q242 1089 300 1032T440 975Q520 975 577 1031T635 +1171Q635 1255 579 1311T440 1368Q357 1368 300 1311T242 1171Z" /> +<glyph unicode="±" glyph-name="plusminus" horiz-adv-x="1171" d="M653 791H1065V653H653V227H514V653H104V791H514V1219H653V791ZM104 1V139H1065V1H104Z" /> +<glyph unicode="²" glyph-name="twosuperior" horiz-adv-x="711" d="M653 586H49V690L285 920Q374 1006 415 1054T472 1141T489 1233Q489 1301 449 1335T346 1370Q294 1370 245 1351T127 1282L61 1370Q192 1481 344 1481Q476 1481 549 1416T623 1239Q623 +1159 579 1084T387 870L213 705H653V586Z" /> +<glyph unicode="³" glyph-name="threesuperior" horiz-adv-x="711" d="M627 1255Q627 1175 586 1124T477 1049Q653 1002 653 840Q653 712 561 641T301 569Q149 569 33 625V748Q180 680 303 680Q514 680 514 842Q514 987 283 987H166V1094H285Q388 1094 437 +1133T487 1241Q487 1302 447 1336T340 1370Q274 1370 218 1349T106 1292L37 1382Q100 1427 170 1454T334 1481Q470 1481 548 1422T627 1255Z" /> +<glyph unicode="´" glyph-name="acute" horiz-adv-x="1182" d="M393 1266Q441 1328 496 1416T584 1569H786V1548Q742 1483 655 1388T504 1241H393V1266Z" /> +<glyph unicode="µ" glyph-name="mu" horiz-adv-x="1268" d="M342 381Q342 119 596 119Q767 119 846 213T926 520V1096H1092V0H956L930 147H920Q809 -20 580 -20Q430 -20 342 72H332Q342 -12 342 -172V-492H176V1096H342V381Z" /> +<glyph unicode="¶" glyph-name="paragraph" horiz-adv-x="1341" d="M1120 -260H1006V1452H793V-260H678V559Q616 541 532 541Q316 541 215 666T113 1042Q113 1302 222 1429T563 1556H1120V-260Z" /> +<glyph unicode="·" glyph-name="middot" horiz-adv-x="545" d="M152 723Q152 789 183 823T270 858Q328 858 360 824T393 723Q393 658 360 623T270 588Q219 588 186 619T152 723Z" /> +<glyph unicode="¸" glyph-name="cedilla" horiz-adv-x="465" d="M436 -289Q436 -386 360 -439T133 -492Q82 -492 37 -483V-377Q82 -385 141 -385Q220 -385 260 -365T301 -291Q301 -248 262 -222T113 -178L201 0H311L256 -115Q436 -154 436 -289Z" /> +<glyph unicode="¹" glyph-name="onesuperior" horiz-adv-x="711" d="M338 1462H481V586H348V1165Q348 1256 354 1346Q332 1324 305 1302T143 1184L76 1280L338 1462Z" /> +<glyph unicode="º" glyph-name="ordmasculine" horiz-adv-x="768" d="M702 1135Q702 971 617 880T381 788Q235 788 151 881T66 1135Q66 1298 150 1388T385 1479Q537 1479 619 1388T702 1135ZM188 1135Q188 1013 233 952T383 891Q488 891 534 952T580 1135Q580 +1258 534 1317T383 1376Q280 1376 234 1317T188 1135Z" /> +<glyph unicode="»" glyph-name="guillemotright" horiz-adv-x="1018" d="M936 524L592 117L475 188L762 539L475 889L592 958L936 551V524ZM541 524L197 117L80 188L367 539L80 889L197 958L541 551V524Z" /> +<glyph unicode="¼" glyph-name="onequarter" horiz-adv-x="1597" d="M1298 1462L395 0H252L1155 1462H1298ZM593 1462H736V586H603V1165Q603 1256 609 1346Q587 1324 560 1302T398 1184L331 1280L593 1462ZM1489 203H1364V1H1219V203H817V304L1225 883H1364V320H1489V203ZM1219 +320V515Q1219 649 1225 724Q1220 712 1208 693T1181 651T1151 606T1125 566L957 320H1219Z" /> +<glyph unicode="½" glyph-name="onehalf" horiz-adv-x="1597" d="M1230 1462L327 0H184L1087 1462H1230ZM564 1462H707V586H574V1165Q574 1256 580 1346Q558 1324 531 1302T369 1184L302 1280L564 1462ZM1499 1H895V105L1131 335Q1220 421 1261 469T1318 +556T1335 648Q1335 716 1295 750T1192 785Q1140 785 1091 766T973 697L907 785Q1038 896 1190 896Q1322 896 1395 831T1469 654Q1469 574 1425 499T1233 285L1059 120H1499V1Z" /> +<glyph unicode="¾" glyph-name="threequarters" horiz-adv-x="1597" d="M876 1255Q876 1175 835 1124T726 1049Q902 1002 902 840Q902 712 810 641T550 569Q398 569 282 625V748Q429 680 552 680Q763 680 763 842Q763 987 532 987H415V1094H534Q637 1094 +686 1133T736 1241Q736 1302 696 1336T589 1370Q523 1370 467 1349T355 1292L286 1382Q349 1427 419 1454T583 1481Q719 1481 797 1422T876 1255ZM1390 1462L487 0H344L1247 1462H1390ZM1569 203H1444V1H1299V203H897V304L1305 883H1444V320H1569V203ZM1299 320V515Q1299 +649 1305 724Q1300 712 1288 693T1261 651T1231 606T1205 566L1037 320H1299Z" /> +<glyph unicode="¿" glyph-name="questiondown" horiz-adv-x="879" d="M590 684V633Q590 511 553 437T418 279Q297 173 267 136T224 60T211 -35Q211 -135 277 -191T465 -248Q545 -248 620 -229T793 -162L852 -297Q655 -393 457 -393Q267 -393 159 -300T51 +-37Q51 33 68 85T118 182T194 268T293 356Q394 444 426 502T459 653V684H590ZM639 983Q639 848 518 848Q459 848 428 882T397 983Q397 1047 430 1082T518 1118Q569 1118 604 1086T639 983Z" /> +<glyph unicode="À" glyph-name="Agrave" horiz-adv-x="1296" d="M1120 0L938 465H352L172 0H0L578 1468H721L1296 0H1120ZM885 618L715 1071Q682 1157 647 1282Q625 1186 584 1071L412 618H885ZM724 1579H614Q549 1631 460 1727T331 1886V1907H534Q566 1838 +623 1748T724 1604V1579Z" /> +<glyph unicode="Á" glyph-name="Aacute" horiz-adv-x="1296" d="M1120 0L938 465H352L172 0H0L578 1468H721L1296 0H1120ZM885 618L715 1071Q682 1157 647 1282Q625 1186 584 1071L412 618H885ZM526 1604Q574 1666 629 1754T717 1907H919V1886Q875 1821 788 +1726T637 1579H526V1604Z" /> +<glyph unicode="Â" glyph-name="Acircumflex" horiz-adv-x="1296" d="M1120 0L938 465H352L172 0H0L578 1468H721L1296 0H1120ZM885 618L715 1071Q682 1157 647 1282Q625 1186 584 1071L412 618H885ZM303 1602Q430 1738 481 1802T555 1907H721Q743 1865 797 +1799T977 1602V1579H858Q770 1634 637 1765Q501 1631 418 1579H303V1602Z" /> +<glyph unicode="Ã" glyph-name="Atilde" horiz-adv-x="1296" d="M1120 0L938 465H352L172 0H0L578 1468H721L1296 0H1120ZM885 618L715 1071Q682 1157 647 1282Q625 1186 584 1071L412 618H885ZM792 1581Q749 1581 708 1599T628 1640T552 1681T481 1700Q431 +1700 406 1670T366 1579H268Q281 1700 338 1768T487 1837Q533 1837 576 1819T658 1778T733 1737T801 1718Q850 1718 874 1747T913 1839H1012Q999 1718 943 1650T792 1581Z" /> +<glyph unicode="Ä" glyph-name="Adieresis" horiz-adv-x="1296" d="M1120 0L938 465H352L172 0H0L578 1468H721L1296 0H1120ZM885 618L715 1071Q682 1157 647 1282Q625 1186 584 1071L412 618H885ZM364 1731Q364 1783 390 1806T454 1829Q492 1829 519 1806T547 +1731Q547 1681 520 1657T454 1632Q417 1632 391 1656T364 1731ZM745 1731Q745 1783 771 1806T835 1829Q872 1829 899 1806T927 1731Q927 1681 900 1657T835 1632Q798 1632 772 1656T745 1731Z" /> +<glyph unicode="Å" glyph-name="Aring" horiz-adv-x="1296" d="M1120 0L938 465H352L172 0H0L578 1468H721L1296 0H1120ZM885 618L715 1071Q682 1157 647 1282Q625 1186 584 1071L412 618H885ZM870 1587Q870 1489 809 1430T645 1370Q544 1370 484 1428T424 +1585Q424 1683 484 1740T645 1798Q746 1798 808 1739T870 1587ZM762 1585Q762 1641 729 1671T645 1702Q594 1702 561 1672T528 1585Q528 1529 558 1499T645 1468Q697 1468 729 1498T762 1585Z" /> +<glyph unicode="Æ" glyph-name="AE" horiz-adv-x="1788" d="M1665 0H915V465H401L174 0H-2L696 1462H1665V1311H1085V840H1626V690H1085V152H1665V0ZM469 618H915V1311H797L469 618Z" /> +<glyph unicode="Ç" glyph-name="Ccedilla" horiz-adv-x="1292" d="M827 1331Q586 1331 447 1171T307 731Q307 444 441 288T825 131Q978 131 1174 186V37Q1022 -20 799 -20Q476 -20 301 176T125 733Q125 959 209 1129T453 1391T829 1483Q1059 1483 1231 1399L1159 +1253Q993 1331 827 1331ZM950 -289Q950 -386 874 -439T647 -492Q596 -492 551 -483V-377Q596 -385 655 -385Q734 -385 774 -365T815 -291Q815 -248 776 -222T627 -178L715 0H825L770 -115Q950 -154 950 -289Z" /> +<glyph unicode="È" glyph-name="Egrave" horiz-adv-x="1139" d="M1016 0H201V1462H1016V1311H371V840H977V690H371V152H1016V0ZM713 1579H603Q538 1631 449 1727T320 1886V1907H523Q555 1838 612 1748T713 1604V1579Z" /> +<glyph unicode="É" glyph-name="Eacute" horiz-adv-x="1139" d="M1016 0H201V1462H1016V1311H371V840H977V690H371V152H1016V0ZM456 1604Q504 1666 559 1754T647 1907H849V1886Q805 1821 718 1726T567 1579H456V1604Z" /> +<glyph unicode="Ê" glyph-name="Ecircumflex" horiz-adv-x="1139" d="M1016 0H201V1462H1016V1311H371V840H977V690H371V152H1016V0ZM263 1602Q390 1738 441 1802T515 1907H681Q703 1865 757 1799T937 1602V1579H818Q730 1634 597 1765Q461 1631 378 1579H263V1602Z" /> +<glyph unicode="Ë" glyph-name="Edieresis" horiz-adv-x="1139" d="M1016 0H201V1462H1016V1311H371V840H977V690H371V152H1016V0ZM327 1731Q327 1783 353 1806T417 1829Q455 1829 482 1806T510 1731Q510 1681 483 1657T417 1632Q380 1632 354 1656T327 1731ZM708 +1731Q708 1783 734 1806T798 1829Q835 1829 862 1806T890 1731Q890 1681 863 1657T798 1632Q761 1632 735 1656T708 1731Z" /> +<glyph unicode="Ì" glyph-name="Igrave" horiz-adv-x="571" d="M201 0V1462H371V0H201ZM398 1579H288Q223 1631 134 1727T5 1886V1907H208Q240 1838 297 1748T398 1604V1579Z" /> +<glyph unicode="Í" glyph-name="Iacute" horiz-adv-x="571" d="M201 0V1462H371V0H201ZM179 1604Q227 1666 282 1754T370 1907H572V1886Q528 1821 441 1726T290 1579H179V1604Z" /> +<glyph unicode="Î" glyph-name="Icircumflex" horiz-adv-x="571" d="M201 0V1462H371V0H201ZM-57 1602Q70 1738 121 1802T195 1907H361Q383 1865 437 1799T617 1602V1579H498Q410 1634 277 1765Q141 1631 58 1579H-57V1602Z" /> +<glyph unicode="Ï" glyph-name="Idieresis" horiz-adv-x="571" d="M201 0V1462H371V0H201ZM5 1731Q5 1783 31 1806T95 1829Q133 1829 160 1806T188 1731Q188 1681 161 1657T95 1632Q58 1632 32 1656T5 1731ZM386 1731Q386 1783 412 1806T476 1829Q513 1829 +540 1806T568 1731Q568 1681 541 1657T476 1632Q439 1632 413 1656T386 1731Z" /> +<glyph unicode="Ð" glyph-name="Eth" horiz-adv-x="1479" d="M1352 745Q1352 383 1156 192T590 0H201V649H47V799H201V1462H635Q972 1462 1162 1275T1352 745ZM1171 739Q1171 1315 602 1315H371V799H750V649H371V147H561Q1171 147 1171 739Z" /> +<glyph unicode="Ñ" glyph-name="Ntilde" horiz-adv-x="1544" d="M1343 0H1149L350 1227H342Q358 1011 358 831V0H201V1462H393L1190 240H1198Q1196 267 1189 413T1184 623V1462H1343V0ZM935 1581Q892 1581 851 1599T771 1640T695 1681T624 1700Q574 1700 +549 1670T509 1579H411Q424 1700 481 1768T630 1837Q676 1837 719 1819T801 1778T876 1737T944 1718Q993 1718 1017 1747T1056 1839H1155Q1142 1718 1086 1650T935 1581Z" /> +<glyph unicode="Ò" glyph-name="Ograve" horiz-adv-x="1595" d="M1470 733Q1470 382 1293 181T799 -20Q476 -20 301 177T125 735Q125 1092 301 1288T801 1485Q1116 1485 1293 1285T1470 733ZM305 733Q305 436 431 283T799 129Q1042 129 1166 282T1290 733Q1290 +1028 1167 1180T801 1333Q558 1333 432 1180T305 733ZM907 1579H797Q732 1631 643 1727T514 1886V1907H717Q749 1838 806 1748T907 1604V1579Z" /> +<glyph unicode="Ó" glyph-name="Oacute" horiz-adv-x="1595" d="M1470 733Q1470 382 1293 181T799 -20Q476 -20 301 177T125 735Q125 1092 301 1288T801 1485Q1116 1485 1293 1285T1470 733ZM305 733Q305 436 431 283T799 129Q1042 129 1166 282T1290 733Q1290 +1028 1167 1180T801 1333Q558 1333 432 1180T305 733ZM659 1604Q707 1666 762 1754T850 1907H1052V1886Q1008 1821 921 1726T770 1579H659V1604Z" /> +<glyph unicode="Ô" glyph-name="Ocircumflex" horiz-adv-x="1595" d="M1470 733Q1470 382 1293 181T799 -20Q476 -20 301 177T125 735Q125 1092 301 1288T801 1485Q1116 1485 1293 1285T1470 733ZM305 733Q305 436 431 283T799 129Q1042 129 1166 282T1290 +733Q1290 1028 1167 1180T801 1333Q558 1333 432 1180T305 733ZM448 1602Q575 1738 626 1802T700 1907H866Q888 1865 942 1799T1122 1602V1579H1003Q915 1634 782 1765Q646 1631 563 1579H448V1602Z" /> +<glyph unicode="Õ" glyph-name="Otilde" horiz-adv-x="1595" d="M1470 733Q1470 382 1293 181T799 -20Q476 -20 301 177T125 735Q125 1092 301 1288T801 1485Q1116 1485 1293 1285T1470 733ZM305 733Q305 436 431 283T799 129Q1042 129 1166 282T1290 733Q1290 +1028 1167 1180T801 1333Q558 1333 432 1180T305 733ZM942 1581Q899 1581 858 1599T778 1640T702 1681T631 1700Q581 1700 556 1670T516 1579H418Q431 1700 488 1768T637 1837Q683 1837 726 1819T808 1778T883 1737T951 1718Q1000 1718 1024 1747T1063 1839H1162Q1149 +1718 1093 1650T942 1581Z" /> +<glyph unicode="Ö" glyph-name="Odieresis" horiz-adv-x="1595" d="M1470 733Q1470 382 1293 181T799 -20Q476 -20 301 177T125 735Q125 1092 301 1288T801 1485Q1116 1485 1293 1285T1470 733ZM305 733Q305 436 431 283T799 129Q1042 129 1166 282T1290 +733Q1290 1028 1167 1180T801 1333Q558 1333 432 1180T305 733ZM522 1731Q522 1783 548 1806T612 1829Q650 1829 677 1806T705 1731Q705 1681 678 1657T612 1632Q575 1632 549 1656T522 1731ZM903 1731Q903 1783 929 1806T993 1829Q1030 1829 1057 1806T1085 1731Q1085 +1681 1058 1657T993 1632Q956 1632 930 1656T903 1731Z" /> +<glyph unicode="×" glyph-name="multiply" horiz-adv-x="1171" d="M940 1176L1036 1077L684 723L1034 371L938 272L584 623L236 272L135 371L485 723L133 1075L233 1176L586 821L940 1176Z" /> +<glyph unicode="Ø" glyph-name="Oslash" horiz-adv-x="1595" d="M1470 733Q1470 382 1293 181T799 -20Q564 -20 416 80L315 -61L195 18L303 172Q125 370 125 735Q125 1092 301 1288T801 1485Q1010 1485 1167 1391L1264 1526L1384 1446L1278 1298Q1470 1096 +1470 733ZM1290 733Q1290 1005 1180 1159L508 211Q623 129 799 129Q1042 129 1166 282T1290 733ZM305 733Q305 471 406 317L1075 1260Q969 1333 801 1333Q558 1333 432 1180T305 733Z" /> +<glyph unicode="Ù" glyph-name="Ugrave" horiz-adv-x="1491" d="M1305 1462V516Q1305 266 1154 123T739 -20Q475 -20 331 124T186 520V1462H356V508Q356 325 456 227T750 129Q935 129 1035 227T1135 510V1462H1305ZM856 1579H746Q681 1631 592 1727T463 1886V1907H666Q698 +1838 755 1748T856 1604V1579Z" /> +<glyph unicode="Ú" glyph-name="Uacute" horiz-adv-x="1491" d="M1305 1462V516Q1305 266 1154 123T739 -20Q475 -20 331 124T186 520V1462H356V508Q356 325 456 227T750 129Q935 129 1035 227T1135 510V1462H1305ZM600 1604Q648 1666 703 1754T791 1907H993V1886Q949 +1821 862 1726T711 1579H600V1604Z" /> +<glyph unicode="Û" glyph-name="Ucircumflex" horiz-adv-x="1491" d="M1305 1462V516Q1305 266 1154 123T739 -20Q475 -20 331 124T186 520V1462H356V508Q356 325 456 227T750 129Q935 129 1035 227T1135 510V1462H1305ZM393 1602Q520 1738 571 1802T645 +1907H811Q833 1865 887 1799T1067 1602V1579H948Q860 1634 727 1765Q591 1631 508 1579H393V1602Z" /> +<glyph unicode="Ü" glyph-name="Udieresis" horiz-adv-x="1491" d="M1305 1462V516Q1305 266 1154 123T739 -20Q475 -20 331 124T186 520V1462H356V508Q356 325 456 227T750 129Q935 129 1035 227T1135 510V1462H1305ZM461 1731Q461 1783 487 1806T551 1829Q589 +1829 616 1806T644 1731Q644 1681 617 1657T551 1632Q514 1632 488 1656T461 1731ZM842 1731Q842 1783 868 1806T932 1829Q969 1829 996 1806T1024 1731Q1024 1681 997 1657T932 1632Q895 1632 869 1656T842 1731Z" /> +<glyph unicode="Ý" glyph-name="Yacute" horiz-adv-x="1147" d="M573 731L963 1462H1147L659 567V0H487V559L0 1462H186L573 731ZM442 1604Q490 1666 545 1754T633 1907H835V1886Q791 1821 704 1726T553 1579H442V1604Z" /> +<glyph unicode="Þ" glyph-name="Thorn" horiz-adv-x="1251" d="M1145 784Q1145 557 994 438T555 319H371V0H201V1462H371V1206H586Q867 1206 1006 1103T1145 784ZM371 465H539Q765 465 866 536T967 772Q967 921 872 990T575 1059H371V465Z" /> +<glyph unicode="ß" glyph-name="germandbls" horiz-adv-x="1274" d="M1049 1266Q1049 1131 906 1016Q818 946 790 913T762 846Q762 814 775 793T824 744T938 664Q1078 569 1129 491T1180 311Q1180 151 1083 66T807 -20Q619 -20 512 49V203Q575 164 653 141T803 +117Q1018 117 1018 299Q1018 374 977 427T825 551Q698 633 650 694T602 840Q602 903 636 956T742 1062Q817 1119 849 1164T881 1262Q881 1342 813 1384T618 1427Q342 1427 342 1204V0H176V1202Q176 1380 286 1473T618 1567Q824 1567 936 1489T1049 1266Z" /> +<glyph unicode="à" glyph-name="agrave" horiz-adv-x="1139" d="M850 0L817 156H809Q727 53 646 17T442 -20Q279 -20 187 64T94 303Q94 635 625 651L811 657V725Q811 854 756 915T578 977Q441 977 268 893L217 1020Q298 1064 394 1089T588 1114Q784 1114 +878 1027T973 748V0H850ZM475 117Q630 117 718 202T807 440V539L641 532Q443 525 356 471T268 301Q268 211 322 164T475 117ZM928 1241H818Q753 1293 664 1389T535 1548V1569H738Q770 1500 827 1410T928 1266V1241Z" /> +<glyph unicode="á" glyph-name="aacute" horiz-adv-x="1139" d="M850 0L817 156H809Q727 53 646 17T442 -20Q279 -20 187 64T94 303Q94 635 625 651L811 657V725Q811 854 756 915T578 977Q441 977 268 893L217 1020Q298 1064 394 1089T588 1114Q784 1114 +878 1027T973 748V0H850ZM475 117Q630 117 718 202T807 440V539L641 532Q443 525 356 471T268 301Q268 211 322 164T475 117ZM436 1266Q484 1328 539 1416T627 1569H829V1548Q785 1483 698 1388T547 1241H436V1266Z" /> +<glyph unicode="â" glyph-name="acircumflex" horiz-adv-x="1139" d="M850 0L817 156H809Q727 53 646 17T442 -20Q279 -20 187 64T94 303Q94 635 625 651L811 657V725Q811 854 756 915T578 977Q441 977 268 893L217 1020Q298 1064 394 1089T588 1114Q784 +1114 878 1027T973 748V0H850ZM475 117Q630 117 718 202T807 440V539L641 532Q443 525 356 471T268 301Q268 211 322 164T475 117ZM484 1264Q611 1400 662 1464T736 1569H902Q924 1527 978 1461T1158 1264V1241H1039Q951 1296 818 1427Q682 1293 599 1241H484V1264Z" +/> +<glyph unicode="ã" glyph-name="atilde" horiz-adv-x="1139" d="M850 0L817 156H809Q727 53 646 17T442 -20Q279 -20 187 64T94 303Q94 635 625 651L811 657V725Q811 854 756 915T578 977Q441 977 268 893L217 1020Q298 1064 394 1089T588 1114Q784 1114 +878 1027T973 748V0H850ZM475 117Q630 117 718 202T807 440V539L641 532Q443 525 356 471T268 301Q268 211 322 164T475 117ZM977 1243Q934 1243 893 1261T813 1302T737 1343T666 1362Q616 1362 591 1332T551 1241H453Q466 1362 523 1430T672 1499Q718 1499 761 +1481T843 1440T918 1399T986 1380Q1035 1380 1059 1409T1098 1501H1197Q1184 1380 1128 1312T977 1243Z" /> +<glyph unicode="ä" glyph-name="adieresis" horiz-adv-x="1139" d="M850 0L817 156H809Q727 53 646 17T442 -20Q279 -20 187 64T94 303Q94 635 625 651L811 657V725Q811 854 756 915T578 977Q441 977 268 893L217 1020Q298 1064 394 1089T588 1114Q784 1114 +878 1027T973 748V0H850ZM475 117Q630 117 718 202T807 440V539L641 532Q443 525 356 471T268 301Q268 211 322 164T475 117ZM535 1393Q535 1445 561 1468T625 1491Q663 1491 690 1468T718 1393Q718 1343 691 1319T625 1294Q588 1294 562 1318T535 1393ZM916 1393Q916 +1445 942 1468T1006 1491Q1043 1491 1070 1468T1098 1393Q1098 1343 1071 1319T1006 1294Q969 1294 943 1318T916 1393Z" /> +<glyph unicode="å" glyph-name="aring" horiz-adv-x="1139" d="M850 0L817 156H809Q727 53 646 17T442 -20Q279 -20 187 64T94 303Q94 635 625 651L811 657V725Q811 854 756 915T578 977Q441 977 268 893L217 1020Q298 1064 394 1089T588 1114Q784 1114 878 +1027T973 748V0H850ZM475 117Q630 117 718 202T807 440V539L641 532Q443 525 356 471T268 301Q268 211 322 164T475 117ZM1060 1458Q1060 1360 999 1301T835 1241Q734 1241 674 1299T614 1456Q614 1554 674 1611T835 1669Q936 1669 998 1610T1060 1458ZM952 1456Q952 +1512 919 1542T835 1573Q784 1573 751 1543T718 1456Q718 1400 748 1370T835 1339Q887 1339 919 1369T952 1456Z" /> +<glyph unicode="æ" glyph-name="ae" horiz-adv-x="1757" d="M94 303Q94 464 218 553T596 651L780 657V725Q780 854 722 915T545 977Q401 977 238 893L186 1020Q260 1061 359 1087T557 1114Q687 1114 769 1071T893 932Q946 1020 1031 1068T1227 1116Q1419 +1116 1535 983T1651 627V520H950Q958 125 1272 125Q1363 125 1441 142T1604 199V51Q1518 13 1444 -3T1268 -20Q979 -20 854 213Q773 86 675 33T442 -20Q279 -20 187 65T94 303ZM268 301Q268 206 321 162T463 117Q608 117 692 201T776 440V539L618 532Q432 524 350 +470T268 301ZM1225 977Q1104 977 1035 894T954 653H1473Q1473 809 1409 893T1225 977Z" /> +<glyph unicode="ç" glyph-name="ccedilla" horiz-adv-x="975" d="M614 -20Q376 -20 246 126T115 541Q115 816 247 966T625 1116Q704 1116 783 1099T907 1059L856 918Q801 940 736 954T621 969Q287 969 287 543Q287 341 368 233T610 125Q747 125 891 184V37Q781 +-20 614 -20ZM762 -289Q762 -386 686 -439T459 -492Q408 -492 363 -483V-377Q408 -385 467 -385Q546 -385 586 -365T627 -291Q627 -248 588 -222T439 -178L527 0H637L582 -115Q762 -154 762 -289Z" /> +<glyph unicode="è" glyph-name="egrave" horiz-adv-x="1149" d="M639 -20Q396 -20 256 128T115 539Q115 804 245 960T596 1116Q802 1116 922 981T1042 623V518H287Q292 325 384 225T645 125Q822 125 995 199V51Q907 13 829 -3T639 -20ZM594 977Q462 977 384 +891T291 653H864Q864 810 794 893T594 977ZM967 1241H857Q792 1293 703 1389T574 1548V1569H777Q809 1500 866 1410T967 1266V1241Z" /> +<glyph unicode="é" glyph-name="eacute" horiz-adv-x="1149" d="M639 -20Q396 -20 256 128T115 539Q115 804 245 960T596 1116Q802 1116 922 981T1042 623V518H287Q292 325 384 225T645 125Q822 125 995 199V51Q907 13 829 -3T639 -20ZM594 977Q462 977 384 +891T291 653H864Q864 810 794 893T594 977ZM471 1266Q519 1328 574 1416T662 1569H864V1548Q820 1483 733 1388T582 1241H471V1266Z" /> +<glyph unicode="ê" glyph-name="ecircumflex" horiz-adv-x="1149" d="M639 -20Q396 -20 256 128T115 539Q115 804 245 960T596 1116Q802 1116 922 981T1042 623V518H287Q292 325 384 225T645 125Q822 125 995 199V51Q907 13 829 -3T639 -20ZM594 977Q462 +977 384 891T291 653H864Q864 810 794 893T594 977ZM515 1264Q642 1400 693 1464T767 1569H933Q955 1527 1009 1461T1189 1264V1241H1070Q982 1296 849 1427Q713 1293 630 1241H515V1264Z" /> +<glyph unicode="ë" glyph-name="edieresis" horiz-adv-x="1149" d="M639 -20Q396 -20 256 128T115 539Q115 804 245 960T596 1116Q802 1116 922 981T1042 623V518H287Q292 325 384 225T645 125Q822 125 995 199V51Q907 13 829 -3T639 -20ZM594 977Q462 977 +384 891T291 653H864Q864 810 794 893T594 977ZM319 1393Q319 1445 345 1468T409 1491Q447 1491 474 1468T502 1393Q502 1343 475 1319T409 1294Q372 1294 346 1318T319 1393ZM700 1393Q700 1445 726 1468T790 1491Q827 1491 854 1468T882 1393Q882 1343 855 1319T790 +1294Q753 1294 727 1318T700 1393Z" /> +<glyph unicode="ì" glyph-name="igrave" horiz-adv-x="518" d="M342 0H176V1096H342V0ZM355 1241H245Q180 1293 91 1389T-38 1548V1569H165Q197 1500 254 1410T355 1266V1241Z" /> +<glyph unicode="í" glyph-name="iacute" horiz-adv-x="518" d="M342 0H176V1096H342V0ZM169 1266Q217 1328 272 1416T360 1569H562V1548Q518 1483 431 1388T280 1241H169V1266Z" /> +<glyph unicode="î" glyph-name="icircumflex" horiz-adv-x="518" d="M342 0H176V1096H342V0ZM-77 1264Q50 1400 101 1464T175 1569H341Q363 1527 417 1461T597 1264V1241H478Q390 1296 257 1427Q121 1293 38 1241H-77V1264Z" /> +<glyph unicode="ï" glyph-name="idieresis" horiz-adv-x="518" d="M342 0H176V1096H342V0ZM-20 1393Q-20 1445 6 1468T70 1491Q108 1491 135 1468T163 1393Q163 1343 136 1319T70 1294Q33 1294 7 1318T-20 1393ZM361 1393Q361 1445 387 1468T451 1491Q488 +1491 515 1468T543 1393Q543 1343 516 1319T451 1294Q414 1294 388 1318T361 1393Z" /> +<glyph unicode="ð" glyph-name="eth" horiz-adv-x="1221" d="M1122 563Q1122 282 992 131T614 -20Q392 -20 253 114T113 475Q113 705 244 836T596 967Q822 967 922 846L930 850Q873 1064 668 1255L397 1100L324 1208L557 1341Q465 1403 371 1452L440 1569Q596 +1496 698 1421L936 1559L1012 1452L805 1333Q957 1190 1039 991T1122 563ZM954 512Q954 659 864 744T618 829Q281 829 281 469Q281 302 368 211T618 119Q793 119 873 219T954 512Z" /> +<glyph unicode="ñ" glyph-name="ntilde" horiz-adv-x="1257" d="M926 0V709Q926 843 865 909T674 975Q502 975 422 882T342 575V0H176V1096H311L338 946H346Q397 1027 489 1071T694 1116Q892 1116 992 1021T1092 715V0H926ZM802 1243Q759 1243 718 1261T638 +1302T562 1343T491 1362Q441 1362 416 1332T376 1241H278Q291 1362 348 1430T497 1499Q543 1499 586 1481T668 1440T743 1399T811 1380Q860 1380 884 1409T923 1501H1022Q1009 1380 953 1312T802 1243Z" /> +<glyph unicode="ò" glyph-name="ograve" horiz-adv-x="1237" d="M1122 549Q1122 281 987 131T614 -20Q467 -20 353 49T177 247T115 549Q115 817 249 966T621 1116Q851 1116 986 963T1122 549ZM287 549Q287 339 371 229T618 119Q781 119 865 228T950 549Q950 +758 866 866T616 975Q453 975 370 868T287 549ZM998 1241H888Q823 1293 734 1389T605 1548V1569H808Q840 1500 897 1410T998 1266V1241Z" /> +<glyph unicode="ó" glyph-name="oacute" horiz-adv-x="1237" d="M1122 549Q1122 281 987 131T614 -20Q467 -20 353 49T177 247T115 549Q115 817 249 966T621 1116Q851 1116 986 963T1122 549ZM287 549Q287 339 371 229T618 119Q781 119 865 228T950 549Q950 +758 866 866T616 975Q453 975 370 868T287 549ZM479 1266Q527 1328 582 1416T670 1569H872V1548Q828 1483 741 1388T590 1241H479V1266Z" /> +<glyph unicode="ô" glyph-name="ocircumflex" horiz-adv-x="1237" d="M1122 549Q1122 281 987 131T614 -20Q467 -20 353 49T177 247T115 549Q115 817 249 966T621 1116Q851 1116 986 963T1122 549ZM287 549Q287 339 371 229T618 119Q781 119 865 228T950 +549Q950 758 866 866T616 975Q453 975 370 868T287 549ZM282 1264Q409 1400 460 1464T534 1569H700Q722 1527 776 1461T956 1264V1241H837Q749 1296 616 1427Q480 1293 397 1241H282V1264Z" /> +<glyph unicode="õ" glyph-name="otilde" horiz-adv-x="1237" d="M1122 549Q1122 281 987 131T614 -20Q467 -20 353 49T177 247T115 549Q115 817 249 966T621 1116Q851 1116 986 963T1122 549ZM287 549Q287 339 371 229T618 119Q781 119 865 228T950 549Q950 +758 866 866T616 975Q453 975 370 868T287 549ZM1029 1243Q986 1243 945 1261T865 1302T789 1343T718 1362Q668 1362 643 1332T603 1241H505Q518 1362 575 1430T724 1499Q770 1499 813 1481T895 1440T970 1399T1038 1380Q1087 1380 1111 1409T1150 1501H1249Q1236 +1380 1180 1312T1029 1243Z" /> +<glyph unicode="ö" glyph-name="odieresis" horiz-adv-x="1237" d="M1122 549Q1122 281 987 131T614 -20Q467 -20 353 49T177 247T115 549Q115 817 249 966T621 1116Q851 1116 986 963T1122 549ZM287 549Q287 339 371 229T618 119Q781 119 865 228T950 549Q950 +758 866 866T616 975Q453 975 370 868T287 549ZM336 1393Q336 1445 362 1468T426 1491Q464 1491 491 1468T519 1393Q519 1343 492 1319T426 1294Q389 1294 363 1318T336 1393ZM717 1393Q717 1445 743 1468T807 1491Q844 1491 871 1468T899 1393Q899 1343 872 1319T807 +1294Q770 1294 744 1318T717 1393Z" /> +<glyph unicode="÷" glyph-name="divide" horiz-adv-x="1171" d="M104 653V791H1065V653H104ZM471 373Q471 433 500 463T584 494Q636 494 665 463T694 373Q694 316 665 284T584 252Q532 252 502 283T471 373ZM471 1071Q471 1131 500 1161T584 1192Q636 1192 +665 1161T694 1071Q694 1014 665 982T584 950Q532 950 502 981T471 1071Z" /> +<glyph unicode="ø" glyph-name="oslash" horiz-adv-x="1237" d="M1122 549Q1122 281 987 131T614 -20Q460 -20 348 49L264 -68L150 10L244 141Q115 293 115 549Q115 817 249 966T621 1116Q775 1116 891 1040L975 1159L1092 1083L995 950Q1122 798 1122 549ZM287 +549Q287 378 340 276L805 922Q730 975 616 975Q453 975 370 868T287 549ZM950 549Q950 713 899 813L434 170Q505 119 618 119Q781 119 865 228T950 549Z" /> +<glyph unicode="ù" glyph-name="ugrave" horiz-adv-x="1257" d="M332 1096V385Q332 251 393 185T584 119Q756 119 835 213T915 520V1096H1081V0H944L920 147H911Q860 66 770 23T563 -20Q363 -20 264 75T164 379V1096H332ZM982 1241H872Q807 1293 718 1389T589 +1548V1569H792Q824 1500 881 1410T982 1266V1241Z" /> +<glyph unicode="ú" glyph-name="uacute" horiz-adv-x="1257" d="M332 1096V385Q332 251 393 185T584 119Q756 119 835 213T915 520V1096H1081V0H944L920 147H911Q860 66 770 23T563 -20Q363 -20 264 75T164 379V1096H332ZM506 1266Q554 1328 609 1416T697 +1569H899V1548Q855 1483 768 1388T617 1241H506V1266Z" /> +<glyph unicode="û" glyph-name="ucircumflex" horiz-adv-x="1257" d="M332 1096V385Q332 251 393 185T584 119Q756 119 835 213T915 520V1096H1081V0H944L920 147H911Q860 66 770 23T563 -20Q363 -20 264 75T164 379V1096H332ZM286 1264Q413 1400 464 1464T538 +1569H704Q726 1527 780 1461T960 1264V1241H841Q753 1296 620 1427Q484 1293 401 1241H286V1264Z" /> +<glyph unicode="ü" glyph-name="udieresis" horiz-adv-x="1257" d="M332 1096V385Q332 251 393 185T584 119Q756 119 835 213T915 520V1096H1081V0H944L920 147H911Q860 66 770 23T563 -20Q363 -20 264 75T164 379V1096H332ZM342 1393Q342 1445 368 1468T432 +1491Q470 1491 497 1468T525 1393Q525 1343 498 1319T432 1294Q395 1294 369 1318T342 1393ZM723 1393Q723 1445 749 1468T813 1491Q850 1491 877 1468T905 1393Q905 1343 878 1319T813 1294Q776 1294 750 1318T723 1393Z" /> +<glyph unicode="ý" glyph-name="yacute" horiz-adv-x="1032" d="M2 1096H180L420 471Q499 257 518 162H526Q539 213 580 336T852 1096H1030L559 -152Q489 -337 396 -414T166 -492Q90 -492 16 -475V-342Q71 -354 139 -354Q310 -354 383 -162L444 -6L2 1096ZM411 +1266Q459 1328 514 1416T602 1569H804V1548Q760 1483 673 1388T522 1241H411V1266Z" /> +<glyph unicode="þ" glyph-name="thorn" horiz-adv-x="1255" d="M344 948Q410 1037 495 1076T686 1116Q901 1116 1021 966T1141 549Q1141 281 1021 131T686 -20Q464 -20 342 141H330L334 107Q342 30 342 -33V-492H176V1556H342V1090Q342 1038 336 948H344ZM664 +975Q496 975 420 883T342 590V549Q342 318 419 219T666 119Q969 119 969 551Q969 766 895 870T664 975Z" /> +<glyph unicode="ÿ" glyph-name="ydieresis" horiz-adv-x="1032" d="M2 1096H180L420 471Q499 257 518 162H526Q539 213 580 336T852 1096H1030L559 -152Q489 -337 396 -414T166 -492Q90 -492 16 -475V-342Q71 -354 139 -354Q310 -354 383 -162L444 -6L2 1096ZM490 +1393Q490 1445 516 1468T580 1491Q618 1491 645 1468T673 1393Q673 1343 646 1319T580 1294Q543 1294 517 1318T490 1393ZM871 1393Q871 1445 897 1468T961 1491Q998 1491 1025 1468T1053 1393Q1053 1343 1026 1319T961 1294Q924 1294 898 1318T871 1393Z" /> +<glyph unicode="–" glyph-name="endash" horiz-adv-x="1024" d="M82 473V625H942V473H82Z" /> +<glyph unicode="—" glyph-name="emdash" horiz-adv-x="2048" d="M82 473V625H1966V473H82Z" /> +<glyph unicode="‘" glyph-name="quoteleft" horiz-adv-x="348" d="M37 961L25 983Q47 1073 96 1207T201 1462H324Q258 1208 221 961H37Z" /> +<glyph unicode="’" glyph-name="quoteright" horiz-adv-x="348" d="M309 1462L324 1440Q298 1340 249 1208T147 961H25Q95 1246 127 1462H309Z" /> +<glyph unicode="‚" glyph-name="quotesinglbase" horiz-adv-x="502" d="M350 238L365 215Q339 115 290 -17T188 -264H63Q90 -160 122 -7T168 238H350Z" /> +<glyph unicode="“" glyph-name="quotedblleft" horiz-adv-x="717" d="M406 961L391 983Q447 1198 569 1462H692Q662 1347 633 1203T590 961H406ZM37 961L25 983Q47 1073 96 1207T201 1462H324Q258 1208 221 961H37Z" /> +<glyph unicode="”" glyph-name="quotedblright" horiz-adv-x="717" d="M309 1462L324 1440Q298 1340 249 1208T147 961H25Q95 1246 127 1462H309ZM678 1462L692 1440Q668 1349 620 1216T516 961H391Q417 1061 450 1215T496 1462H678Z" /> +<glyph unicode="„" glyph-name="quotedblbase" horiz-adv-x="829" d="M309 238L324 216Q298 116 249 -16T147 -263H25Q95 22 127 238H309ZM678 238L692 216Q668 125 620 -8T516 -263H391Q417 -163 450 -9T496 238H678Z" /> +<glyph unicode="•" glyph-name="bullet" horiz-adv-x="770" d="M164 748Q164 869 220 932T385 995Q490 995 548 933T606 748Q606 629 549 565T385 500Q278 500 221 565T164 748Z" /> +<glyph unicode="‹" glyph-name="guilsinglleft" horiz-adv-x="623" d="M82 551L424 958L543 889L254 539L543 188L424 117L82 524V551Z" /> +<glyph unicode="›" glyph-name="guilsinglright" horiz-adv-x="623" d="M541 524L197 117L80 188L367 539L80 889L197 958L541 551V524Z" /> +<hkern g1="quotedbl" g2="A" k="143" /> +<hkern g1="quotedbl" g2="T" k="-41" /> +<hkern g1="quotedbl" g2="V" k="-41" /> +<hkern g1="quotedbl" g2="W" k="-41" /> +<hkern g1="quotedbl" g2="Y" k="-20" /> +<hkern g1="quotedbl" g2="a" k="82" /> +<hkern g1="quotedbl" g2="c" k="123" /> +<hkern g1="quotedbl" g2="d" k="123" /> +<hkern g1="quotedbl" g2="e" k="123" /> +<hkern g1="quotedbl" g2="g" k="61" /> +<hkern g1="quotedbl" g2="m" k="61" /> +<hkern g1="quotedbl" g2="n" k="61" /> +<hkern g1="quotedbl" g2="o" k="123" /> +<hkern g1="quotedbl" g2="p" k="61" /> +<hkern g1="quotedbl" g2="q" k="123" /> +<hkern g1="quotedbl" g2="r" k="61" /> +<hkern g1="quotedbl" g2="s" k="61" /> +<hkern g1="quotedbl" g2="u" k="61" /> +<hkern g1="quotedbl" g2="Agrave" k="143" /> +<hkern g1="quotedbl" g2="Aacute" k="143" /> +<hkern g1="quotedbl" g2="Acircumflex" k="143" /> +<hkern g1="quotedbl" g2="Atilde" k="143" /> +<hkern g1="quotedbl" g2="Adieresis" k="143" /> +<hkern g1="quotedbl" g2="Aring" k="143" /> +<hkern g1="quotedbl" g2="Yacute" k="-20" /> +<hkern g1="quotedbl" g2="agrave" k="123" /> +<hkern g1="quotedbl" g2="aacute" k="82" /> +<hkern g1="quotedbl" g2="acircumflex" k="82" /> +<hkern g1="quotedbl" g2="atilde" k="82" /> +<hkern g1="quotedbl" g2="adieresis" k="82" /> +<hkern g1="quotedbl" g2="aring" k="82" /> +<hkern g1="quotedbl" g2="ae" k="82" /> +<hkern g1="quotedbl" g2="ccedilla" k="123" /> +<hkern g1="quotedbl" g2="egrave" k="123" /> +<hkern g1="quotedbl" g2="eacute" k="123" /> +<hkern g1="quotedbl" g2="ecircumflex" k="123" /> +<hkern g1="quotedbl" g2="edieresis" k="123" /> +<hkern g1="quotedbl" g2="ograve" k="123" /> +<hkern g1="quotedbl" g2="oacute" k="123" /> +<hkern g1="quotedbl" g2="ocircumflex" k="123" /> +<hkern g1="quotedbl" g2="otilde" k="123" /> +<hkern g1="quotedbl" g2="odieresis" k="123" /> +<hkern g1="quotedbl" g2="oslash" k="123" /> +<hkern g1="quotedbl" g2="ugrave" k="61" /> +<hkern g1="quotedbl" g2="uacute" k="61" /> +<hkern g1="quotedbl" g2="ucircumflex" k="61" /> +<hkern g1="quotedbl" g2="udieresis" k="61" /> +<hkern g1="quotedbl" g2="oe" k="123" /> +<hkern g1="quotesingle" g2="A" k="143" /> +<hkern g1="quotesingle" g2="T" k="-41" /> +<hkern g1="quotesingle" g2="V" k="-41" /> +<hkern g1="quotesingle" g2="W" k="-41" /> +<hkern g1="quotesingle" g2="Y" k="-20" /> +<hkern g1="quotesingle" g2="a" k="82" /> +<hkern g1="quotesingle" g2="c" k="123" /> +<hkern g1="quotesingle" g2="d" k="123" /> +<hkern g1="quotesingle" g2="e" k="123" /> +<hkern g1="quotesingle" g2="g" k="61" /> +<hkern g1="quotesingle" g2="m" k="61" /> +<hkern g1="quotesingle" g2="n" k="61" /> +<hkern g1="quotesingle" g2="o" k="123" /> +<hkern g1="quotesingle" g2="p" k="61" /> +<hkern g1="quotesingle" g2="q" k="123" /> +<hkern g1="quotesingle" g2="r" k="61" /> +<hkern g1="quotesingle" g2="s" k="61" /> +<hkern g1="quotesingle" g2="u" k="61" /> +<hkern g1="quotesingle" g2="Agrave" k="143" /> +<hkern g1="quotesingle" g2="Aacute" k="143" /> +<hkern g1="quotesingle" g2="Acircumflex" k="143" /> +<hkern g1="quotesingle" g2="Atilde" k="143" /> +<hkern g1="quotesingle" g2="Adieresis" k="143" /> +<hkern g1="quotesingle" g2="Aring" k="143" /> +<hkern g1="quotesingle" g2="Yacute" k="-20" /> +<hkern g1="quotesingle" g2="agrave" k="123" /> +<hkern g1="quotesingle" g2="aacute" k="82" /> +<hkern g1="quotesingle" g2="acircumflex" k="82" /> +<hkern g1="quotesingle" g2="atilde" k="82" /> +<hkern g1="quotesingle" g2="adieresis" k="82" /> +<hkern g1="quotesingle" g2="aring" k="82" /> +<hkern g1="quotesingle" g2="ae" k="82" /> +<hkern g1="quotesingle" g2="ccedilla" k="123" /> +<hkern g1="quotesingle" g2="egrave" k="123" /> +<hkern g1="quotesingle" g2="eacute" k="123" /> +<hkern g1="quotesingle" g2="ecircumflex" k="123" /> +<hkern g1="quotesingle" g2="edieresis" k="123" /> +<hkern g1="quotesingle" g2="ograve" k="123" /> +<hkern g1="quotesingle" g2="oacute" k="123" /> +<hkern g1="quotesingle" g2="ocircumflex" k="123" /> +<hkern g1="quotesingle" g2="otilde" k="123" /> +<hkern g1="quotesingle" g2="odieresis" k="123" /> +<hkern g1="quotesingle" g2="oslash" k="123" /> +<hkern g1="quotesingle" g2="ugrave" k="61" /> +<hkern g1="quotesingle" g2="uacute" k="61" /> +<hkern g1="quotesingle" g2="ucircumflex" k="61" /> +<hkern g1="quotesingle" g2="udieresis" k="61" /> +<hkern g1="quotesingle" g2="oe" k="123" /> +<hkern g1="parenleft" g2="J" k="-184" /> +<hkern g1="comma" g2="C" k="102" /> +<hkern g1="comma" g2="G" k="102" /> +<hkern g1="comma" g2="O" k="102" /> +<hkern g1="comma" g2="Q" k="102" /> +<hkern g1="comma" g2="T" k="143" /> +<hkern g1="comma" g2="U" k="41" /> +<hkern g1="comma" g2="V" k="123" /> +<hkern g1="comma" g2="W" k="123" /> +<hkern g1="comma" g2="Y" k="123" /> +<hkern g1="comma" g2="Ccedilla" k="102" /> +<hkern g1="comma" g2="Ograve" k="102" /> +<hkern g1="comma" g2="Oacute" k="102" /> +<hkern g1="comma" g2="Ocircumflex" k="102" /> +<hkern g1="comma" g2="Otilde" k="102" /> +<hkern g1="comma" g2="Odieresis" k="102" /> +<hkern g1="comma" g2="Oslash" k="102" /> +<hkern g1="comma" g2="Ugrave" k="41" /> +<hkern g1="comma" g2="Uacute" k="41" /> +<hkern g1="comma" g2="Ucircumflex" k="41" /> +<hkern g1="comma" g2="Udieresis" k="41" /> +<hkern g1="comma" g2="Yacute" k="123" /> +<hkern g1="comma" g2="OE" k="102" /> +<hkern g1="hyphen" g2="T" k="82" /> +<hkern g1="period" g2="C" k="102" /> +<hkern g1="period" g2="G" k="102" /> +<hkern g1="period" g2="O" k="102" /> +<hkern g1="period" g2="Q" k="102" /> +<hkern g1="period" g2="T" k="143" /> +<hkern g1="period" g2="U" k="41" /> +<hkern g1="period" g2="V" k="123" /> +<hkern g1="period" g2="W" k="123" /> +<hkern g1="period" g2="Y" k="123" /> +<hkern g1="period" g2="Ccedilla" k="102" /> +<hkern g1="period" g2="Ograve" k="102" /> +<hkern g1="period" g2="Oacute" k="102" /> +<hkern g1="period" g2="Ocircumflex" k="102" /> +<hkern g1="period" g2="Otilde" k="102" /> +<hkern g1="period" g2="Odieresis" k="102" /> +<hkern g1="period" g2="Oslash" k="102" /> +<hkern g1="period" g2="Ugrave" k="41" /> +<hkern g1="period" g2="Uacute" k="41" /> +<hkern g1="period" g2="Ucircumflex" k="41" /> +<hkern g1="period" g2="Udieresis" k="41" /> +<hkern g1="period" g2="Yacute" k="123" /> +<hkern g1="period" g2="OE" k="102" /> +<hkern g1="A" g2="quotedbl" k="143" /> +<hkern g1="A" g2="quotesingle" k="143" /> +<hkern g1="A" g2="C" k="41" /> +<hkern g1="A" g2="G" k="41" /> +<hkern g1="A" g2="J" k="-266" /> +<hkern g1="A" g2="O" k="41" /> +<hkern g1="A" g2="Q" k="41" /> +<hkern g1="A" g2="T" k="143" /> +<hkern g1="A" g2="V" k="82" /> +<hkern g1="A" g2="W" k="82" /> +<hkern g1="A" g2="Y" k="123" /> +<hkern g1="A" g2="Ccedilla" k="41" /> +<hkern g1="A" g2="Ograve" k="41" /> +<hkern g1="A" g2="Oacute" k="41" /> +<hkern g1="A" g2="Ocircumflex" k="41" /> +<hkern g1="A" g2="Otilde" k="41" /> +<hkern g1="A" g2="Odieresis" k="41" /> +<hkern g1="A" g2="Oslash" k="41" /> +<hkern g1="A" g2="Yacute" k="123" /> +<hkern g1="A" g2="OE" k="41" /> +<hkern g1="A" g2="quoteright" k="143" /> +<hkern g1="A" g2="quotedblright" k="143" /> +<hkern g1="B" g2="comma" k="82" /> +<hkern g1="B" g2="period" k="82" /> +<hkern g1="B" g2="A" k="41" /> +<hkern g1="B" g2="T" k="61" /> +<hkern g1="B" g2="V" k="20" /> +<hkern g1="B" g2="W" k="20" /> +<hkern g1="B" g2="X" k="41" /> +<hkern g1="B" g2="Y" k="20" /> +<hkern g1="B" g2="Z" k="20" /> +<hkern g1="B" g2="Agrave" k="41" /> +<hkern g1="B" g2="Aacute" k="41" /> +<hkern g1="B" g2="Acircumflex" k="41" /> +<hkern g1="B" g2="Atilde" k="41" /> +<hkern g1="B" g2="Adieresis" k="41" /> +<hkern g1="B" g2="Aring" k="41" /> +<hkern g1="B" g2="Yacute" k="20" /> +<hkern g1="B" g2="quotesinglbase" k="82" /> +<hkern g1="B" g2="quotedblbase" k="82" /> +<hkern g1="C" g2="C" k="41" /> +<hkern g1="C" g2="G" k="41" /> +<hkern g1="C" g2="O" k="41" /> +<hkern g1="C" g2="Q" k="41" /> +<hkern g1="C" g2="Ccedilla" k="41" /> +<hkern g1="C" g2="Ograve" k="41" /> +<hkern g1="C" g2="Oacute" k="41" /> +<hkern g1="C" g2="Ocircumflex" k="41" /> +<hkern g1="C" g2="Otilde" k="41" /> +<hkern g1="C" g2="Odieresis" k="41" /> +<hkern g1="C" g2="Oslash" k="41" /> +<hkern g1="C" g2="OE" k="41" /> +<hkern g1="D" g2="comma" k="82" /> +<hkern g1="D" g2="period" k="82" /> +<hkern g1="D" g2="A" k="41" /> +<hkern g1="D" g2="T" k="61" /> +<hkern g1="D" g2="V" k="20" /> +<hkern g1="D" g2="W" k="20" /> +<hkern g1="D" g2="X" k="41" /> +<hkern g1="D" g2="Y" k="20" /> +<hkern g1="D" g2="Z" k="20" /> +<hkern g1="D" g2="Agrave" k="41" /> +<hkern g1="D" g2="Aacute" k="41" /> +<hkern g1="D" g2="Acircumflex" k="41" /> +<hkern g1="D" g2="Atilde" k="41" /> +<hkern g1="D" g2="Adieresis" k="41" /> +<hkern g1="D" g2="Aring" k="41" /> +<hkern g1="D" g2="Yacute" k="20" /> +<hkern g1="D" g2="quotesinglbase" k="82" /> +<hkern g1="D" g2="quotedblbase" k="82" /> +<hkern g1="E" g2="J" k="-123" /> +<hkern g1="F" g2="comma" k="123" /> +<hkern g1="F" g2="period" k="123" /> +<hkern g1="F" g2="question" k="-41" /> +<hkern g1="F" g2="A" k="41" /> +<hkern g1="F" g2="Agrave" k="41" /> +<hkern g1="F" g2="Aacute" k="41" /> +<hkern g1="F" g2="Acircumflex" k="41" /> +<hkern g1="F" g2="Atilde" k="41" /> +<hkern g1="F" g2="Adieresis" k="41" /> +<hkern g1="F" g2="Aring" k="41" /> +<hkern g1="F" g2="quotesinglbase" k="123" /> +<hkern g1="F" g2="quotedblbase" k="123" /> +<hkern g1="K" g2="C" k="41" /> +<hkern g1="K" g2="G" k="41" /> +<hkern g1="K" g2="O" k="41" /> +<hkern g1="K" g2="Q" k="41" /> +<hkern g1="K" g2="Ccedilla" k="41" /> +<hkern g1="K" g2="Ograve" k="41" /> +<hkern g1="K" g2="Oacute" k="41" /> +<hkern g1="K" g2="Ocircumflex" k="41" /> +<hkern g1="K" g2="Otilde" k="41" /> +<hkern g1="K" g2="Odieresis" k="41" /> +<hkern g1="K" g2="Oslash" k="41" /> +<hkern g1="K" g2="OE" k="41" /> +<hkern g1="L" g2="quotedbl" k="164" /> +<hkern g1="L" g2="quotesingle" k="164" /> +<hkern g1="L" g2="C" k="41" /> +<hkern g1="L" g2="G" k="41" /> +<hkern g1="L" g2="O" k="41" /> +<hkern g1="L" g2="Q" k="41" /> +<hkern g1="L" g2="T" k="41" /> +<hkern g1="L" g2="U" k="20" /> +<hkern g1="L" g2="V" k="41" /> +<hkern g1="L" g2="W" k="41" /> +<hkern g1="L" g2="Y" k="61" /> +<hkern g1="L" g2="Ccedilla" k="41" /> +<hkern g1="L" g2="Ograve" k="41" /> +<hkern g1="L" g2="Oacute" k="41" /> +<hkern g1="L" g2="Ocircumflex" k="41" /> +<hkern g1="L" g2="Otilde" k="41" /> +<hkern g1="L" g2="Odieresis" k="41" /> +<hkern g1="L" g2="Oslash" k="41" /> +<hkern g1="L" g2="Ugrave" k="20" /> +<hkern g1="L" g2="Uacute" k="20" /> +<hkern g1="L" g2="Ucircumflex" k="20" /> +<hkern g1="L" g2="Udieresis" k="20" /> +<hkern g1="L" g2="Yacute" k="61" /> +<hkern g1="L" g2="OE" k="41" /> +<hkern g1="L" g2="quoteright" k="164" /> +<hkern g1="L" g2="quotedblright" k="164" /> +<hkern g1="O" g2="comma" k="82" /> +<hkern g1="O" g2="period" k="82" /> +<hkern g1="O" g2="A" k="41" /> +<hkern g1="O" g2="T" k="61" /> +<hkern g1="O" g2="V" k="20" /> +<hkern g1="O" g2="W" k="20" /> +<hkern g1="O" g2="X" k="41" /> +<hkern g1="O" g2="Y" k="20" /> +<hkern g1="O" g2="Z" k="20" /> +<hkern g1="O" g2="Agrave" k="41" /> +<hkern g1="O" g2="Aacute" k="41" /> +<hkern g1="O" g2="Acircumflex" k="41" /> +<hkern g1="O" g2="Atilde" k="41" /> +<hkern g1="O" g2="Adieresis" k="41" /> +<hkern g1="O" g2="Aring" k="41" /> +<hkern g1="O" g2="Yacute" k="20" /> +<hkern g1="O" g2="quotesinglbase" k="82" /> +<hkern g1="O" g2="quotedblbase" k="82" /> +<hkern g1="P" g2="comma" k="266" /> +<hkern g1="P" g2="period" k="266" /> +<hkern g1="P" g2="A" k="102" /> +<hkern g1="P" g2="X" k="41" /> +<hkern g1="P" g2="Z" k="20" /> +<hkern g1="P" g2="Agrave" k="102" /> +<hkern g1="P" g2="Aacute" k="102" /> +<hkern g1="P" g2="Acircumflex" k="102" /> +<hkern g1="P" g2="Atilde" k="102" /> +<hkern g1="P" g2="Adieresis" k="102" /> +<hkern g1="P" g2="Aring" k="102" /> +<hkern g1="P" g2="quotesinglbase" k="266" /> +<hkern g1="P" g2="quotedblbase" k="266" /> +<hkern g1="Q" g2="comma" k="82" /> +<hkern g1="Q" g2="period" k="82" /> +<hkern g1="Q" g2="A" k="41" /> +<hkern g1="Q" g2="T" k="61" /> +<hkern g1="Q" g2="V" k="20" /> +<hkern g1="Q" g2="W" k="20" /> +<hkern g1="Q" g2="X" k="41" /> +<hkern g1="Q" g2="Y" k="20" /> +<hkern g1="Q" g2="Z" k="20" /> +<hkern g1="Q" g2="Agrave" k="41" /> +<hkern g1="Q" g2="Aacute" k="41" /> +<hkern g1="Q" g2="Acircumflex" k="41" /> +<hkern g1="Q" g2="Atilde" k="41" /> +<hkern g1="Q" g2="Adieresis" k="41" /> +<hkern g1="Q" g2="Aring" k="41" /> +<hkern g1="Q" g2="Yacute" k="20" /> +<hkern g1="Q" g2="quotesinglbase" k="82" /> +<hkern g1="Q" g2="quotedblbase" k="82" /> +<hkern g1="T" g2="comma" k="123" /> +<hkern g1="T" g2="hyphen" k="82" /> +<hkern g1="T" g2="period" k="123" /> +<hkern g1="T" g2="question" k="-41" /> +<hkern g1="T" g2="A" k="143" /> +<hkern g1="T" g2="C" k="41" /> +<hkern g1="T" g2="G" k="41" /> +<hkern g1="T" g2="O" k="41" /> +<hkern g1="T" g2="Q" k="41" /> +<hkern g1="T" g2="T" k="-41" /> +<hkern g1="T" g2="a" k="164" /> +<hkern g1="T" g2="c" k="143" /> +<hkern g1="T" g2="d" k="143" /> +<hkern g1="T" g2="e" k="143" /> +<hkern g1="T" g2="g" k="143" /> +<hkern g1="T" g2="m" k="102" /> +<hkern g1="T" g2="n" k="102" /> +<hkern g1="T" g2="o" k="143" /> +<hkern g1="T" g2="p" k="102" /> +<hkern g1="T" g2="q" k="143" /> +<hkern g1="T" g2="r" k="102" /> +<hkern g1="T" g2="s" k="123" /> +<hkern g1="T" g2="u" k="102" /> +<hkern g1="T" g2="v" k="41" /> +<hkern g1="T" g2="w" k="41" /> +<hkern g1="T" g2="x" k="41" /> +<hkern g1="T" g2="y" k="41" /> +<hkern g1="T" g2="z" k="82" /> +<hkern g1="T" g2="Agrave" k="143" /> +<hkern g1="T" g2="Aacute" k="143" /> +<hkern g1="T" g2="Acircumflex" k="143" /> +<hkern g1="T" g2="Atilde" k="143" /> +<hkern g1="T" g2="Adieresis" k="143" /> +<hkern g1="T" g2="Aring" k="143" /> +<hkern g1="T" g2="Ccedilla" k="41" /> +<hkern g1="T" g2="Ograve" k="41" /> +<hkern g1="T" g2="Oacute" k="41" /> +<hkern g1="T" g2="Ocircumflex" k="41" /> +<hkern g1="T" g2="Otilde" k="41" /> +<hkern g1="T" g2="Odieresis" k="41" /> +<hkern g1="T" g2="Oslash" k="41" /> +<hkern g1="T" g2="agrave" k="143" /> +<hkern g1="T" g2="aacute" k="164" /> +<hkern g1="T" g2="acircumflex" k="164" /> +<hkern g1="T" g2="atilde" k="164" /> +<hkern g1="T" g2="adieresis" k="164" /> +<hkern g1="T" g2="aring" k="164" /> +<hkern g1="T" g2="ae" k="164" /> +<hkern g1="T" g2="ccedilla" k="143" /> +<hkern g1="T" g2="egrave" k="143" /> +<hkern g1="T" g2="eacute" k="143" /> +<hkern g1="T" g2="ecircumflex" k="143" /> +<hkern g1="T" g2="edieresis" k="143" /> +<hkern g1="T" g2="ograve" k="143" /> +<hkern g1="T" g2="oacute" k="143" /> +<hkern g1="T" g2="ocircumflex" k="143" /> +<hkern g1="T" g2="otilde" k="143" /> +<hkern g1="T" g2="odieresis" k="143" /> +<hkern g1="T" g2="oslash" k="143" /> +<hkern g1="T" g2="ugrave" k="102" /> +<hkern g1="T" g2="uacute" k="102" /> +<hkern g1="T" g2="ucircumflex" k="102" /> +<hkern g1="T" g2="udieresis" k="102" /> +<hkern g1="T" g2="yacute" k="41" /> +<hkern g1="T" g2="OE" k="41" /> +<hkern g1="T" g2="oe" k="143" /> +<hkern g1="T" g2="endash" k="82" /> +<hkern g1="T" g2="emdash" k="82" /> +<hkern g1="T" g2="quotesinglbase" k="123" /> +<hkern g1="T" g2="quotedblbase" k="123" /> +<hkern g1="U" g2="comma" k="41" /> +<hkern g1="U" g2="period" k="41" /> +<hkern g1="U" g2="A" k="20" /> +<hkern g1="U" g2="Agrave" k="20" /> +<hkern g1="U" g2="Aacute" k="20" /> +<hkern g1="U" g2="Acircumflex" k="20" /> +<hkern g1="U" g2="Atilde" k="20" /> +<hkern g1="U" g2="Adieresis" k="20" /> +<hkern g1="U" g2="Aring" k="20" /> +<hkern g1="U" g2="quotesinglbase" k="41" /> +<hkern g1="U" g2="quotedblbase" k="41" /> +<hkern g1="V" g2="comma" k="102" /> +<hkern g1="V" g2="period" k="102" /> +<hkern g1="V" g2="question" k="-41" /> +<hkern g1="V" g2="A" k="82" /> +<hkern g1="V" g2="C" k="20" /> +<hkern g1="V" g2="G" k="20" /> +<hkern g1="V" g2="O" k="20" /> +<hkern g1="V" g2="Q" k="20" /> +<hkern g1="V" g2="a" k="41" /> +<hkern g1="V" g2="c" k="41" /> +<hkern g1="V" g2="d" k="41" /> +<hkern g1="V" g2="e" k="41" /> +<hkern g1="V" g2="g" k="20" /> +<hkern g1="V" g2="m" k="20" /> +<hkern g1="V" g2="n" k="20" /> +<hkern g1="V" g2="o" k="41" /> +<hkern g1="V" g2="p" k="20" /> +<hkern g1="V" g2="q" k="41" /> +<hkern g1="V" g2="r" k="20" /> +<hkern g1="V" g2="s" k="20" /> +<hkern g1="V" g2="u" k="20" /> +<hkern g1="V" g2="Agrave" k="82" /> +<hkern g1="V" g2="Aacute" k="82" /> +<hkern g1="V" g2="Acircumflex" k="82" /> +<hkern g1="V" g2="Atilde" k="82" /> +<hkern g1="V" g2="Adieresis" k="82" /> +<hkern g1="V" g2="Aring" k="82" /> +<hkern g1="V" g2="Ccedilla" k="20" /> +<hkern g1="V" g2="Ograve" k="20" /> +<hkern g1="V" g2="Oacute" k="20" /> +<hkern g1="V" g2="Ocircumflex" k="20" /> +<hkern g1="V" g2="Otilde" k="20" /> +<hkern g1="V" g2="Odieresis" k="20" /> +<hkern g1="V" g2="Oslash" k="20" /> +<hkern g1="V" g2="agrave" k="41" /> +<hkern g1="V" g2="aacute" k="41" /> +<hkern g1="V" g2="acircumflex" k="41" /> +<hkern g1="V" g2="atilde" k="41" /> +<hkern g1="V" g2="adieresis" k="41" /> +<hkern g1="V" g2="aring" k="41" /> +<hkern g1="V" g2="ae" k="41" /> +<hkern g1="V" g2="ccedilla" k="41" /> +<hkern g1="V" g2="egrave" k="41" /> +<hkern g1="V" g2="eacute" k="41" /> +<hkern g1="V" g2="ecircumflex" k="41" /> +<hkern g1="V" g2="edieresis" k="41" /> +<hkern g1="V" g2="ograve" k="41" /> +<hkern g1="V" g2="oacute" k="41" /> +<hkern g1="V" g2="ocircumflex" k="41" /> +<hkern g1="V" g2="otilde" k="41" /> +<hkern g1="V" g2="odieresis" k="41" /> +<hkern g1="V" g2="oslash" k="41" /> +<hkern g1="V" g2="ugrave" k="20" /> +<hkern g1="V" g2="uacute" k="20" /> +<hkern g1="V" g2="ucircumflex" k="20" /> +<hkern g1="V" g2="udieresis" k="20" /> +<hkern g1="V" g2="OE" k="20" /> +<hkern g1="V" g2="oe" k="41" /> +<hkern g1="V" g2="quotesinglbase" k="102" /> +<hkern g1="V" g2="quotedblbase" k="102" /> +<hkern g1="W" g2="comma" k="102" /> +<hkern g1="W" g2="period" k="102" /> +<hkern g1="W" g2="question" k="-41" /> +<hkern g1="W" g2="A" k="82" /> +<hkern g1="W" g2="C" k="20" /> +<hkern g1="W" g2="G" k="20" /> +<hkern g1="W" g2="O" k="20" /> +<hkern g1="W" g2="Q" k="20" /> +<hkern g1="W" g2="a" k="41" /> +<hkern g1="W" g2="c" k="41" /> +<hkern g1="W" g2="d" k="41" /> +<hkern g1="W" g2="e" k="41" /> +<hkern g1="W" g2="g" k="20" /> +<hkern g1="W" g2="m" k="20" /> +<hkern g1="W" g2="n" k="20" /> +<hkern g1="W" g2="o" k="41" /> +<hkern g1="W" g2="p" k="20" /> +<hkern g1="W" g2="q" k="41" /> +<hkern g1="W" g2="r" k="20" /> +<hkern g1="W" g2="s" k="20" /> +<hkern g1="W" g2="u" k="20" /> +<hkern g1="W" g2="Agrave" k="82" /> +<hkern g1="W" g2="Aacute" k="82" /> +<hkern g1="W" g2="Acircumflex" k="82" /> +<hkern g1="W" g2="Atilde" k="82" /> +<hkern g1="W" g2="Adieresis" k="82" /> +<hkern g1="W" g2="Aring" k="82" /> +<hkern g1="W" g2="Ccedilla" k="20" /> +<hkern g1="W" g2="Ograve" k="20" /> +<hkern g1="W" g2="Oacute" k="20" /> +<hkern g1="W" g2="Ocircumflex" k="20" /> +<hkern g1="W" g2="Otilde" k="20" /> +<hkern g1="W" g2="Odieresis" k="20" /> +<hkern g1="W" g2="Oslash" k="20" /> +<hkern g1="W" g2="agrave" k="41" /> +<hkern g1="W" g2="aacute" k="41" /> +<hkern g1="W" g2="acircumflex" k="41" /> +<hkern g1="W" g2="atilde" k="41" /> +<hkern g1="W" g2="adieresis" k="41" /> +<hkern g1="W" g2="aring" k="41" /> +<hkern g1="W" g2="ae" k="41" /> +<hkern g1="W" g2="ccedilla" k="41" /> +<hkern g1="W" g2="egrave" k="41" /> +<hkern g1="W" g2="eacute" k="41" /> +<hkern g1="W" g2="ecircumflex" k="41" /> +<hkern g1="W" g2="edieresis" k="41" /> +<hkern g1="W" g2="ograve" k="41" /> +<hkern g1="W" g2="oacute" k="41" /> +<hkern g1="W" g2="ocircumflex" k="41" /> +<hkern g1="W" g2="otilde" k="41" /> +<hkern g1="W" g2="odieresis" k="41" /> +<hkern g1="W" g2="oslash" k="41" /> +<hkern g1="W" g2="ugrave" k="20" /> +<hkern g1="W" g2="uacute" k="20" /> +<hkern g1="W" g2="ucircumflex" k="20" /> +<hkern g1="W" g2="udieresis" k="20" /> +<hkern g1="W" g2="OE" k="20" /> +<hkern g1="W" g2="oe" k="41" /> +<hkern g1="W" g2="quotesinglbase" k="102" /> +<hkern g1="W" g2="quotedblbase" k="102" /> +<hkern g1="X" g2="C" k="41" /> +<hkern g1="X" g2="G" k="41" /> +<hkern g1="X" g2="O" k="41" /> +<hkern g1="X" g2="Q" k="41" /> +<hkern g1="X" g2="Ccedilla" k="41" /> +<hkern g1="X" g2="Ograve" k="41" /> +<hkern g1="X" g2="Oacute" k="41" /> +<hkern g1="X" g2="Ocircumflex" k="41" /> +<hkern g1="X" g2="Otilde" k="41" /> +<hkern g1="X" g2="Odieresis" k="41" /> +<hkern g1="X" g2="Oslash" k="41" /> +<hkern g1="X" g2="OE" k="41" /> +<hkern g1="Y" g2="comma" k="123" /> +<hkern g1="Y" g2="period" k="123" /> +<hkern g1="Y" g2="question" k="-41" /> +<hkern g1="Y" g2="A" k="123" /> +<hkern g1="Y" g2="C" k="41" /> +<hkern g1="Y" g2="G" k="41" /> +<hkern g1="Y" g2="O" k="41" /> +<hkern g1="Y" g2="Q" k="41" /> +<hkern g1="Y" g2="a" k="102" /> +<hkern g1="Y" g2="c" k="102" /> +<hkern g1="Y" g2="d" k="102" /> +<hkern g1="Y" g2="e" k="102" /> +<hkern g1="Y" g2="g" k="41" /> +<hkern g1="Y" g2="m" k="61" /> +<hkern g1="Y" g2="n" k="61" /> +<hkern g1="Y" g2="o" k="102" /> +<hkern g1="Y" g2="p" k="61" /> +<hkern g1="Y" g2="q" k="102" /> +<hkern g1="Y" g2="r" k="61" /> +<hkern g1="Y" g2="s" k="82" /> +<hkern g1="Y" g2="u" k="61" /> +<hkern g1="Y" g2="z" k="41" /> +<hkern g1="Y" g2="Agrave" k="123" /> +<hkern g1="Y" g2="Aacute" k="123" /> +<hkern g1="Y" g2="Acircumflex" k="123" /> +<hkern g1="Y" g2="Atilde" k="123" /> +<hkern g1="Y" g2="Adieresis" k="123" /> +<hkern g1="Y" g2="Aring" k="123" /> +<hkern g1="Y" g2="Ccedilla" k="41" /> +<hkern g1="Y" g2="Ograve" k="41" /> +<hkern g1="Y" g2="Oacute" k="41" /> +<hkern g1="Y" g2="Ocircumflex" k="41" /> +<hkern g1="Y" g2="Otilde" k="41" /> +<hkern g1="Y" g2="Odieresis" k="41" /> +<hkern g1="Y" g2="Oslash" k="41" /> +<hkern g1="Y" g2="agrave" k="102" /> +<hkern g1="Y" g2="aacute" k="102" /> +<hkern g1="Y" g2="acircumflex" k="102" /> +<hkern g1="Y" g2="atilde" k="102" /> +<hkern g1="Y" g2="adieresis" k="102" /> +<hkern g1="Y" g2="aring" k="102" /> +<hkern g1="Y" g2="ae" k="102" /> +<hkern g1="Y" g2="ccedilla" k="102" /> +<hkern g1="Y" g2="egrave" k="102" /> +<hkern g1="Y" g2="eacute" k="102" /> +<hkern g1="Y" g2="ecircumflex" k="102" /> +<hkern g1="Y" g2="edieresis" k="102" /> +<hkern g1="Y" g2="ograve" k="102" /> +<hkern g1="Y" g2="oacute" k="102" /> +<hkern g1="Y" g2="ocircumflex" k="102" /> +<hkern g1="Y" g2="otilde" k="102" /> +<hkern g1="Y" g2="odieresis" k="102" /> +<hkern g1="Y" g2="oslash" k="102" /> +<hkern g1="Y" g2="ugrave" k="61" /> +<hkern g1="Y" g2="uacute" k="61" /> +<hkern g1="Y" g2="ucircumflex" k="61" /> +<hkern g1="Y" g2="udieresis" k="61" /> +<hkern g1="Y" g2="OE" k="41" /> +<hkern g1="Y" g2="oe" k="102" /> +<hkern g1="Y" g2="quotesinglbase" k="123" /> +<hkern g1="Y" g2="quotedblbase" k="123" /> +<hkern g1="Z" g2="C" k="20" /> +<hkern g1="Z" g2="G" k="20" /> +<hkern g1="Z" g2="O" k="20" /> +<hkern g1="Z" g2="Q" k="20" /> +<hkern g1="Z" g2="Ccedilla" k="20" /> +<hkern g1="Z" g2="Ograve" k="20" /> +<hkern g1="Z" g2="Oacute" k="20" /> +<hkern g1="Z" g2="Ocircumflex" k="20" /> +<hkern g1="Z" g2="Otilde" k="20" /> +<hkern g1="Z" g2="Odieresis" k="20" /> +<hkern g1="Z" g2="Oslash" k="20" /> +<hkern g1="Z" g2="OE" k="20" /> +<hkern g1="bracketleft" g2="J" k="-184" /> +<hkern g1="a" g2="quotedbl" k="20" /> +<hkern g1="a" g2="quotesingle" k="20" /> +<hkern g1="a" g2="quoteright" k="20" /> +<hkern g1="a" g2="quotedblright" k="20" /> +<hkern g1="b" g2="quotedbl" k="20" /> +<hkern g1="b" g2="quotesingle" k="20" /> +<hkern g1="b" g2="v" k="41" /> +<hkern g1="b" g2="w" k="41" /> +<hkern g1="b" g2="x" k="41" /> +<hkern g1="b" g2="y" k="41" /> +<hkern g1="b" g2="z" k="20" /> +<hkern g1="b" g2="yacute" k="41" /> +<hkern g1="b" g2="quoteright" k="20" /> +<hkern g1="b" g2="quotedblright" k="20" /> +<hkern g1="c" g2="quotedbl" k="-41" /> +<hkern g1="c" g2="quotesingle" k="-41" /> +<hkern g1="c" g2="quoteright" k="-41" /> +<hkern g1="c" g2="quotedblright" k="-41" /> +<hkern g1="e" g2="quotedbl" k="20" /> +<hkern g1="e" g2="quotesingle" k="20" /> +<hkern g1="e" g2="v" k="41" /> +<hkern g1="e" g2="w" k="41" /> +<hkern g1="e" g2="x" k="41" /> +<hkern g1="e" g2="y" k="41" /> +<hkern g1="e" g2="z" k="20" /> +<hkern g1="e" g2="yacute" k="41" /> +<hkern g1="e" g2="quoteright" k="20" /> +<hkern g1="e" g2="quotedblright" k="20" /> +<hkern g1="f" g2="quotedbl" k="-123" /> +<hkern g1="f" g2="quotesingle" k="-123" /> +<hkern g1="f" g2="quoteright" k="-123" /> +<hkern g1="f" g2="quotedblright" k="-123" /> +<hkern g1="h" g2="quotedbl" k="20" /> +<hkern g1="h" g2="quotesingle" k="20" /> +<hkern g1="h" g2="quoteright" k="20" /> +<hkern g1="h" g2="quotedblright" k="20" /> +<hkern g1="k" g2="c" k="41" /> +<hkern g1="k" g2="d" k="41" /> +<hkern g1="k" g2="e" k="41" /> +<hkern g1="k" g2="o" k="41" /> +<hkern g1="k" g2="q" k="41" /> +<hkern g1="k" g2="agrave" k="41" /> +<hkern g1="k" g2="ccedilla" k="41" /> +<hkern g1="k" g2="egrave" k="41" /> +<hkern g1="k" g2="eacute" k="41" /> +<hkern g1="k" g2="ecircumflex" k="41" /> +<hkern g1="k" g2="edieresis" k="41" /> +<hkern g1="k" g2="ograve" k="41" /> +<hkern g1="k" g2="oacute" k="41" /> +<hkern g1="k" g2="ocircumflex" k="41" /> +<hkern g1="k" g2="otilde" k="41" /> +<hkern g1="k" g2="odieresis" k="41" /> +<hkern g1="k" g2="oslash" k="41" /> +<hkern g1="k" g2="oe" k="41" /> +<hkern g1="m" g2="quotedbl" k="20" /> +<hkern g1="m" g2="quotesingle" k="20" /> +<hkern g1="m" g2="quoteright" k="20" /> +<hkern g1="m" g2="quotedblright" k="20" /> +<hkern g1="n" g2="quotedbl" k="20" /> +<hkern g1="n" g2="quotesingle" k="20" /> +<hkern g1="n" g2="quoteright" k="20" /> +<hkern g1="n" g2="quotedblright" k="20" /> +<hkern g1="o" g2="quotedbl" k="20" /> +<hkern g1="o" g2="quotesingle" k="20" /> +<hkern g1="o" g2="v" k="41" /> +<hkern g1="o" g2="w" k="41" /> +<hkern g1="o" g2="x" k="41" /> +<hkern g1="o" g2="y" k="41" /> +<hkern g1="o" g2="z" k="20" /> +<hkern g1="o" g2="yacute" k="41" /> +<hkern g1="o" g2="quoteright" k="20" /> +<hkern g1="o" g2="quotedblright" k="20" /> +<hkern g1="p" g2="quotedbl" k="20" /> +<hkern g1="p" g2="quotesingle" k="20" /> +<hkern g1="p" g2="v" k="41" /> +<hkern g1="p" g2="w" k="41" /> +<hkern g1="p" g2="x" k="41" /> +<hkern g1="p" g2="y" k="41" /> +<hkern g1="p" g2="z" k="20" /> +<hkern g1="p" g2="yacute" k="41" /> +<hkern g1="p" g2="quoteright" k="20" /> +<hkern g1="p" g2="quotedblright" k="20" /> +<hkern g1="r" g2="quotedbl" k="-82" /> +<hkern g1="r" g2="quotesingle" k="-82" /> +<hkern g1="r" g2="a" k="41" /> +<hkern g1="r" g2="c" k="41" /> +<hkern g1="r" g2="d" k="41" /> +<hkern g1="r" g2="e" k="41" /> +<hkern g1="r" g2="g" k="20" /> +<hkern g1="r" g2="o" k="41" /> +<hkern g1="r" g2="q" k="41" /> +<hkern g1="r" g2="agrave" k="41" /> +<hkern g1="r" g2="aacute" k="41" /> +<hkern g1="r" g2="acircumflex" k="41" /> +<hkern g1="r" g2="atilde" k="41" /> +<hkern g1="r" g2="adieresis" k="41" /> +<hkern g1="r" g2="aring" k="41" /> +<hkern g1="r" g2="ae" k="41" /> +<hkern g1="r" g2="ccedilla" k="41" /> +<hkern g1="r" g2="egrave" k="41" /> +<hkern g1="r" g2="eacute" k="41" /> +<hkern g1="r" g2="ecircumflex" k="41" /> +<hkern g1="r" g2="edieresis" k="41" /> +<hkern g1="r" g2="ograve" k="41" /> +<hkern g1="r" g2="oacute" k="41" /> +<hkern g1="r" g2="ocircumflex" k="41" /> +<hkern g1="r" g2="otilde" k="41" /> +<hkern g1="r" g2="odieresis" k="41" /> +<hkern g1="r" g2="oslash" k="41" /> +<hkern g1="r" g2="oe" k="41" /> +<hkern g1="r" g2="quoteright" k="-82" /> +<hkern g1="r" g2="quotedblright" k="-82" /> +<hkern g1="t" g2="quotedbl" k="-41" /> +<hkern g1="t" g2="quotesingle" k="-41" /> +<hkern g1="t" g2="quoteright" k="-41" /> +<hkern g1="t" g2="quotedblright" k="-41" /> +<hkern g1="v" g2="quotedbl" k="-82" /> +<hkern g1="v" g2="quotesingle" k="-82" /> +<hkern g1="v" g2="comma" k="82" /> +<hkern g1="v" g2="period" k="82" /> +<hkern g1="v" g2="question" k="-41" /> +<hkern g1="v" g2="quoteright" k="-82" /> +<hkern g1="v" g2="quotesinglbase" k="82" /> +<hkern g1="v" g2="quotedblright" k="-82" /> +<hkern g1="v" g2="quotedblbase" k="82" /> +<hkern g1="w" g2="quotedbl" k="-82" /> +<hkern g1="w" g2="quotesingle" k="-82" /> +<hkern g1="w" g2="comma" k="82" /> +<hkern g1="w" g2="period" k="82" /> +<hkern g1="w" g2="question" k="-41" /> +<hkern g1="w" g2="quoteright" k="-82" /> +<hkern g1="w" g2="quotesinglbase" k="82" /> +<hkern g1="w" g2="quotedblright" k="-82" /> +<hkern g1="w" g2="quotedblbase" k="82" /> +<hkern g1="x" g2="c" k="41" /> +<hkern g1="x" g2="d" k="41" /> +<hkern g1="x" g2="e" k="41" /> +<hkern g1="x" g2="o" k="41" /> +<hkern g1="x" g2="q" k="41" /> +<hkern g1="x" g2="agrave" k="41" /> +<hkern g1="x" g2="ccedilla" k="41" /> +<hkern g1="x" g2="egrave" k="41" /> +<hkern g1="x" g2="eacute" k="41" /> +<hkern g1="x" g2="ecircumflex" k="41" /> +<hkern g1="x" g2="edieresis" k="41" /> +<hkern g1="x" g2="ograve" k="41" /> +<hkern g1="x" g2="oacute" k="41" /> +<hkern g1="x" g2="ocircumflex" k="41" /> +<hkern g1="x" g2="otilde" k="41" /> +<hkern g1="x" g2="odieresis" k="41" /> +<hkern g1="x" g2="oslash" k="41" /> +<hkern g1="x" g2="oe" k="41" /> +<hkern g1="y" g2="quotedbl" k="-82" /> +<hkern g1="y" g2="quotesingle" k="-82" /> +<hkern g1="y" g2="comma" k="82" /> +<hkern g1="y" g2="period" k="82" /> +<hkern g1="y" g2="question" k="-41" /> +<hkern g1="y" g2="quoteright" k="-82" /> +<hkern g1="y" g2="quotesinglbase" k="82" /> +<hkern g1="y" g2="quotedblright" k="-82" /> +<hkern g1="y" g2="quotedblbase" k="82" /> +<hkern g1="braceleft" g2="J" k="-184" /> +<hkern g1="Agrave" g2="quotedbl" k="143" /> +<hkern g1="Agrave" g2="quotesingle" k="143" /> +<hkern g1="Agrave" g2="C" k="41" /> +<hkern g1="Agrave" g2="G" k="41" /> +<hkern g1="Agrave" g2="J" k="-266" /> +<hkern g1="Agrave" g2="O" k="41" /> +<hkern g1="Agrave" g2="Q" k="41" /> +<hkern g1="Agrave" g2="T" k="143" /> +<hkern g1="Agrave" g2="V" k="82" /> +<hkern g1="Agrave" g2="W" k="82" /> +<hkern g1="Agrave" g2="Y" k="123" /> +<hkern g1="Agrave" g2="Ccedilla" k="41" /> +<hkern g1="Agrave" g2="Ograve" k="41" /> +<hkern g1="Agrave" g2="Oacute" k="41" /> +<hkern g1="Agrave" g2="Ocircumflex" k="41" /> +<hkern g1="Agrave" g2="Otilde" k="41" /> +<hkern g1="Agrave" g2="Odieresis" k="41" /> +<hkern g1="Agrave" g2="Oslash" k="41" /> +<hkern g1="Agrave" g2="Yacute" k="123" /> +<hkern g1="Agrave" g2="OE" k="41" /> +<hkern g1="Agrave" g2="quoteright" k="143" /> +<hkern g1="Agrave" g2="quotedblright" k="143" /> +<hkern g1="Aacute" g2="quotedbl" k="143" /> +<hkern g1="Aacute" g2="quotesingle" k="143" /> +<hkern g1="Aacute" g2="C" k="41" /> +<hkern g1="Aacute" g2="G" k="41" /> +<hkern g1="Aacute" g2="J" k="-266" /> +<hkern g1="Aacute" g2="O" k="41" /> +<hkern g1="Aacute" g2="Q" k="41" /> +<hkern g1="Aacute" g2="T" k="143" /> +<hkern g1="Aacute" g2="V" k="82" /> +<hkern g1="Aacute" g2="W" k="82" /> +<hkern g1="Aacute" g2="Y" k="123" /> +<hkern g1="Aacute" g2="Ccedilla" k="41" /> +<hkern g1="Aacute" g2="Ograve" k="41" /> +<hkern g1="Aacute" g2="Oacute" k="41" /> +<hkern g1="Aacute" g2="Ocircumflex" k="41" /> +<hkern g1="Aacute" g2="Otilde" k="41" /> +<hkern g1="Aacute" g2="Odieresis" k="41" /> +<hkern g1="Aacute" g2="Oslash" k="41" /> +<hkern g1="Aacute" g2="Yacute" k="123" /> +<hkern g1="Aacute" g2="OE" k="41" /> +<hkern g1="Aacute" g2="quoteright" k="143" /> +<hkern g1="Aacute" g2="quotedblright" k="143" /> +<hkern g1="Acircumflex" g2="quotedbl" k="143" /> +<hkern g1="Acircumflex" g2="quotesingle" k="143" /> +<hkern g1="Acircumflex" g2="C" k="41" /> +<hkern g1="Acircumflex" g2="G" k="41" /> +<hkern g1="Acircumflex" g2="J" k="-266" /> +<hkern g1="Acircumflex" g2="O" k="41" /> +<hkern g1="Acircumflex" g2="Q" k="41" /> +<hkern g1="Acircumflex" g2="T" k="143" /> +<hkern g1="Acircumflex" g2="V" k="82" /> +<hkern g1="Acircumflex" g2="W" k="82" /> +<hkern g1="Acircumflex" g2="Y" k="123" /> +<hkern g1="Acircumflex" g2="Ccedilla" k="41" /> +<hkern g1="Acircumflex" g2="Ograve" k="41" /> +<hkern g1="Acircumflex" g2="Oacute" k="41" /> +<hkern g1="Acircumflex" g2="Ocircumflex" k="41" /> +<hkern g1="Acircumflex" g2="Otilde" k="41" /> +<hkern g1="Acircumflex" g2="Odieresis" k="41" /> +<hkern g1="Acircumflex" g2="Oslash" k="41" /> +<hkern g1="Acircumflex" g2="Yacute" k="123" /> +<hkern g1="Acircumflex" g2="OE" k="41" /> +<hkern g1="Acircumflex" g2="quoteright" k="143" /> +<hkern g1="Acircumflex" g2="quotedblright" k="143" /> +<hkern g1="Atilde" g2="quotedbl" k="143" /> +<hkern g1="Atilde" g2="quotesingle" k="143" /> +<hkern g1="Atilde" g2="C" k="41" /> +<hkern g1="Atilde" g2="G" k="41" /> +<hkern g1="Atilde" g2="J" k="-266" /> +<hkern g1="Atilde" g2="O" k="41" /> +<hkern g1="Atilde" g2="Q" k="41" /> +<hkern g1="Atilde" g2="T" k="143" /> +<hkern g1="Atilde" g2="V" k="82" /> +<hkern g1="Atilde" g2="W" k="82" /> +<hkern g1="Atilde" g2="Y" k="123" /> +<hkern g1="Atilde" g2="Ccedilla" k="41" /> +<hkern g1="Atilde" g2="Ograve" k="41" /> +<hkern g1="Atilde" g2="Oacute" k="41" /> +<hkern g1="Atilde" g2="Ocircumflex" k="41" /> +<hkern g1="Atilde" g2="Otilde" k="41" /> +<hkern g1="Atilde" g2="Odieresis" k="41" /> +<hkern g1="Atilde" g2="Oslash" k="41" /> +<hkern g1="Atilde" g2="Yacute" k="123" /> +<hkern g1="Atilde" g2="OE" k="41" /> +<hkern g1="Atilde" g2="quoteright" k="143" /> +<hkern g1="Atilde" g2="quotedblright" k="143" /> +<hkern g1="Adieresis" g2="quotedbl" k="143" /> +<hkern g1="Adieresis" g2="quotesingle" k="143" /> +<hkern g1="Adieresis" g2="C" k="41" /> +<hkern g1="Adieresis" g2="G" k="41" /> +<hkern g1="Adieresis" g2="J" k="-266" /> +<hkern g1="Adieresis" g2="O" k="41" /> +<hkern g1="Adieresis" g2="Q" k="41" /> +<hkern g1="Adieresis" g2="T" k="143" /> +<hkern g1="Adieresis" g2="V" k="82" /> +<hkern g1="Adieresis" g2="W" k="82" /> +<hkern g1="Adieresis" g2="Y" k="123" /> +<hkern g1="Adieresis" g2="Ccedilla" k="41" /> +<hkern g1="Adieresis" g2="Ograve" k="41" /> +<hkern g1="Adieresis" g2="Oacute" k="41" /> +<hkern g1="Adieresis" g2="Ocircumflex" k="41" /> +<hkern g1="Adieresis" g2="Otilde" k="41" /> +<hkern g1="Adieresis" g2="Odieresis" k="41" /> +<hkern g1="Adieresis" g2="Oslash" k="41" /> +<hkern g1="Adieresis" g2="Yacute" k="123" /> +<hkern g1="Adieresis" g2="OE" k="41" /> +<hkern g1="Adieresis" g2="quoteright" k="143" /> +<hkern g1="Adieresis" g2="quotedblright" k="143" /> +<hkern g1="Aring" g2="quotedbl" k="143" /> +<hkern g1="Aring" g2="quotesingle" k="143" /> +<hkern g1="Aring" g2="C" k="41" /> +<hkern g1="Aring" g2="G" k="41" /> +<hkern g1="Aring" g2="J" k="-266" /> +<hkern g1="Aring" g2="O" k="41" /> +<hkern g1="Aring" g2="Q" k="41" /> +<hkern g1="Aring" g2="T" k="143" /> +<hkern g1="Aring" g2="V" k="82" /> +<hkern g1="Aring" g2="W" k="82" /> +<hkern g1="Aring" g2="Y" k="123" /> +<hkern g1="Aring" g2="Ccedilla" k="41" /> +<hkern g1="Aring" g2="Ograve" k="41" /> +<hkern g1="Aring" g2="Oacute" k="41" /> +<hkern g1="Aring" g2="Ocircumflex" k="41" /> +<hkern g1="Aring" g2="Otilde" k="41" /> +<hkern g1="Aring" g2="Odieresis" k="41" /> +<hkern g1="Aring" g2="Oslash" k="41" /> +<hkern g1="Aring" g2="Yacute" k="123" /> +<hkern g1="Aring" g2="OE" k="41" /> +<hkern g1="Aring" g2="quoteright" k="143" /> +<hkern g1="Aring" g2="quotedblright" k="143" /> +<hkern g1="AE" g2="J" k="-123" /> +<hkern g1="Ccedilla" g2="C" k="41" /> +<hkern g1="Ccedilla" g2="G" k="41" /> +<hkern g1="Ccedilla" g2="O" k="41" /> +<hkern g1="Ccedilla" g2="Q" k="41" /> +<hkern g1="Ccedilla" g2="Ccedilla" k="41" /> +<hkern g1="Ccedilla" g2="Ograve" k="41" /> +<hkern g1="Ccedilla" g2="Oacute" k="41" /> +<hkern g1="Ccedilla" g2="Ocircumflex" k="41" /> +<hkern g1="Ccedilla" g2="Otilde" k="41" /> +<hkern g1="Ccedilla" g2="Odieresis" k="41" /> +<hkern g1="Ccedilla" g2="Oslash" k="41" /> +<hkern g1="Ccedilla" g2="OE" k="41" /> +<hkern g1="Egrave" g2="J" k="-123" /> +<hkern g1="Eacute" g2="J" k="-123" /> +<hkern g1="Ecircumflex" g2="J" k="-123" /> +<hkern g1="Edieresis" g2="J" k="-123" /> +<hkern g1="Eth" g2="comma" k="82" /> +<hkern g1="Eth" g2="period" k="82" /> +<hkern g1="Eth" g2="A" k="41" /> +<hkern g1="Eth" g2="T" k="61" /> +<hkern g1="Eth" g2="V" k="20" /> +<hkern g1="Eth" g2="W" k="20" /> +<hkern g1="Eth" g2="X" k="41" /> +<hkern g1="Eth" g2="Y" k="20" /> +<hkern g1="Eth" g2="Z" k="20" /> +<hkern g1="Eth" g2="Agrave" k="41" /> +<hkern g1="Eth" g2="Aacute" k="41" /> +<hkern g1="Eth" g2="Acircumflex" k="41" /> +<hkern g1="Eth" g2="Atilde" k="41" /> +<hkern g1="Eth" g2="Adieresis" k="41" /> +<hkern g1="Eth" g2="Aring" k="41" /> +<hkern g1="Eth" g2="Yacute" k="20" /> +<hkern g1="Eth" g2="quotesinglbase" k="82" /> +<hkern g1="Eth" g2="quotedblbase" k="82" /> +<hkern g1="Ograve" g2="comma" k="82" /> +<hkern g1="Ograve" g2="period" k="82" /> +<hkern g1="Ograve" g2="A" k="41" /> +<hkern g1="Ograve" g2="T" k="61" /> +<hkern g1="Ograve" g2="V" k="20" /> +<hkern g1="Ograve" g2="W" k="20" /> +<hkern g1="Ograve" g2="X" k="41" /> +<hkern g1="Ograve" g2="Y" k="20" /> +<hkern g1="Ograve" g2="Z" k="20" /> +<hkern g1="Ograve" g2="Agrave" k="41" /> +<hkern g1="Ograve" g2="Aacute" k="41" /> +<hkern g1="Ograve" g2="Acircumflex" k="41" /> +<hkern g1="Ograve" g2="Atilde" k="41" /> +<hkern g1="Ograve" g2="Adieresis" k="41" /> +<hkern g1="Ograve" g2="Aring" k="41" /> +<hkern g1="Ograve" g2="Yacute" k="20" /> +<hkern g1="Ograve" g2="quotesinglbase" k="82" /> +<hkern g1="Ograve" g2="quotedblbase" k="82" /> +<hkern g1="Oacute" g2="comma" k="82" /> +<hkern g1="Oacute" g2="period" k="82" /> +<hkern g1="Oacute" g2="A" k="41" /> +<hkern g1="Oacute" g2="T" k="61" /> +<hkern g1="Oacute" g2="V" k="20" /> +<hkern g1="Oacute" g2="W" k="20" /> +<hkern g1="Oacute" g2="X" k="41" /> +<hkern g1="Oacute" g2="Y" k="20" /> +<hkern g1="Oacute" g2="Z" k="20" /> +<hkern g1="Oacute" g2="Agrave" k="41" /> +<hkern g1="Oacute" g2="Aacute" k="41" /> +<hkern g1="Oacute" g2="Acircumflex" k="41" /> +<hkern g1="Oacute" g2="Atilde" k="41" /> +<hkern g1="Oacute" g2="Adieresis" k="41" /> +<hkern g1="Oacute" g2="Aring" k="41" /> +<hkern g1="Oacute" g2="Yacute" k="20" /> +<hkern g1="Oacute" g2="quotesinglbase" k="82" /> +<hkern g1="Oacute" g2="quotedblbase" k="82" /> +<hkern g1="Ocircumflex" g2="comma" k="82" /> +<hkern g1="Ocircumflex" g2="period" k="82" /> +<hkern g1="Ocircumflex" g2="A" k="41" /> +<hkern g1="Ocircumflex" g2="T" k="61" /> +<hkern g1="Ocircumflex" g2="V" k="20" /> +<hkern g1="Ocircumflex" g2="W" k="20" /> +<hkern g1="Ocircumflex" g2="X" k="41" /> +<hkern g1="Ocircumflex" g2="Y" k="20" /> +<hkern g1="Ocircumflex" g2="Z" k="20" /> +<hkern g1="Ocircumflex" g2="Agrave" k="41" /> +<hkern g1="Ocircumflex" g2="Aacute" k="41" /> +<hkern g1="Ocircumflex" g2="Acircumflex" k="41" /> +<hkern g1="Ocircumflex" g2="Atilde" k="41" /> +<hkern g1="Ocircumflex" g2="Adieresis" k="41" /> +<hkern g1="Ocircumflex" g2="Aring" k="41" /> +<hkern g1="Ocircumflex" g2="Yacute" k="20" /> +<hkern g1="Ocircumflex" g2="quotesinglbase" k="82" /> +<hkern g1="Ocircumflex" g2="quotedblbase" k="82" /> +<hkern g1="Otilde" g2="comma" k="82" /> +<hkern g1="Otilde" g2="period" k="82" /> +<hkern g1="Otilde" g2="A" k="41" /> +<hkern g1="Otilde" g2="T" k="61" /> +<hkern g1="Otilde" g2="V" k="20" /> +<hkern g1="Otilde" g2="W" k="20" /> +<hkern g1="Otilde" g2="X" k="41" /> +<hkern g1="Otilde" g2="Y" k="20" /> +<hkern g1="Otilde" g2="Z" k="20" /> +<hkern g1="Otilde" g2="Agrave" k="41" /> +<hkern g1="Otilde" g2="Aacute" k="41" /> +<hkern g1="Otilde" g2="Acircumflex" k="41" /> +<hkern g1="Otilde" g2="Atilde" k="41" /> +<hkern g1="Otilde" g2="Adieresis" k="41" /> +<hkern g1="Otilde" g2="Aring" k="41" /> +<hkern g1="Otilde" g2="Yacute" k="20" /> +<hkern g1="Otilde" g2="quotesinglbase" k="82" /> +<hkern g1="Otilde" g2="quotedblbase" k="82" /> +<hkern g1="Odieresis" g2="comma" k="82" /> +<hkern g1="Odieresis" g2="period" k="82" /> +<hkern g1="Odieresis" g2="A" k="41" /> +<hkern g1="Odieresis" g2="T" k="61" /> +<hkern g1="Odieresis" g2="V" k="20" /> +<hkern g1="Odieresis" g2="W" k="20" /> +<hkern g1="Odieresis" g2="X" k="41" /> +<hkern g1="Odieresis" g2="Y" k="20" /> +<hkern g1="Odieresis" g2="Z" k="20" /> +<hkern g1="Odieresis" g2="Agrave" k="41" /> +<hkern g1="Odieresis" g2="Aacute" k="41" /> +<hkern g1="Odieresis" g2="Acircumflex" k="41" /> +<hkern g1="Odieresis" g2="Atilde" k="41" /> +<hkern g1="Odieresis" g2="Adieresis" k="41" /> +<hkern g1="Odieresis" g2="Aring" k="41" /> +<hkern g1="Odieresis" g2="Yacute" k="20" /> +<hkern g1="Odieresis" g2="quotesinglbase" k="82" /> +<hkern g1="Odieresis" g2="quotedblbase" k="82" /> +<hkern g1="Oslash" g2="comma" k="82" /> +<hkern g1="Oslash" g2="period" k="82" /> +<hkern g1="Oslash" g2="A" k="41" /> +<hkern g1="Oslash" g2="T" k="61" /> +<hkern g1="Oslash" g2="V" k="20" /> +<hkern g1="Oslash" g2="W" k="20" /> +<hkern g1="Oslash" g2="X" k="41" /> +<hkern g1="Oslash" g2="Y" k="20" /> +<hkern g1="Oslash" g2="Z" k="20" /> +<hkern g1="Oslash" g2="Agrave" k="41" /> +<hkern g1="Oslash" g2="Aacute" k="41" /> +<hkern g1="Oslash" g2="Acircumflex" k="41" /> +<hkern g1="Oslash" g2="Atilde" k="41" /> +<hkern g1="Oslash" g2="Adieresis" k="41" /> +<hkern g1="Oslash" g2="Aring" k="41" /> +<hkern g1="Oslash" g2="Yacute" k="20" /> +<hkern g1="Oslash" g2="quotesinglbase" k="82" /> +<hkern g1="Oslash" g2="quotedblbase" k="82" /> +<hkern g1="Ugrave" g2="comma" k="41" /> +<hkern g1="Ugrave" g2="period" k="41" /> +<hkern g1="Ugrave" g2="A" k="20" /> +<hkern g1="Ugrave" g2="Agrave" k="20" /> +<hkern g1="Ugrave" g2="Aacute" k="20" /> +<hkern g1="Ugrave" g2="Acircumflex" k="20" /> +<hkern g1="Ugrave" g2="Atilde" k="20" /> +<hkern g1="Ugrave" g2="Adieresis" k="20" /> +<hkern g1="Ugrave" g2="Aring" k="20" /> +<hkern g1="Ugrave" g2="quotesinglbase" k="41" /> +<hkern g1="Ugrave" g2="quotedblbase" k="41" /> +<hkern g1="Uacute" g2="comma" k="41" /> +<hkern g1="Uacute" g2="period" k="41" /> +<hkern g1="Uacute" g2="A" k="20" /> +<hkern g1="Uacute" g2="Agrave" k="20" /> +<hkern g1="Uacute" g2="Aacute" k="20" /> +<hkern g1="Uacute" g2="Acircumflex" k="20" /> +<hkern g1="Uacute" g2="Atilde" k="20" /> +<hkern g1="Uacute" g2="Adieresis" k="20" /> +<hkern g1="Uacute" g2="Aring" k="20" /> +<hkern g1="Uacute" g2="quotesinglbase" k="41" /> +<hkern g1="Uacute" g2="quotedblbase" k="41" /> +<hkern g1="Ucircumflex" g2="comma" k="41" /> +<hkern g1="Ucircumflex" g2="period" k="41" /> +<hkern g1="Ucircumflex" g2="A" k="20" /> +<hkern g1="Ucircumflex" g2="Agrave" k="20" /> +<hkern g1="Ucircumflex" g2="Aacute" k="20" /> +<hkern g1="Ucircumflex" g2="Acircumflex" k="20" /> +<hkern g1="Ucircumflex" g2="Atilde" k="20" /> +<hkern g1="Ucircumflex" g2="Adieresis" k="20" /> +<hkern g1="Ucircumflex" g2="Aring" k="20" /> +<hkern g1="Ucircumflex" g2="quotesinglbase" k="41" /> +<hkern g1="Ucircumflex" g2="quotedblbase" k="41" /> +<hkern g1="Udieresis" g2="comma" k="41" /> +<hkern g1="Udieresis" g2="period" k="41" /> +<hkern g1="Udieresis" g2="A" k="20" /> +<hkern g1="Udieresis" g2="Agrave" k="20" /> +<hkern g1="Udieresis" g2="Aacute" k="20" /> +<hkern g1="Udieresis" g2="Acircumflex" k="20" /> +<hkern g1="Udieresis" g2="Atilde" k="20" /> +<hkern g1="Udieresis" g2="Adieresis" k="20" /> +<hkern g1="Udieresis" g2="Aring" k="20" /> +<hkern g1="Udieresis" g2="quotesinglbase" k="41" /> +<hkern g1="Udieresis" g2="quotedblbase" k="41" /> +<hkern g1="Yacute" g2="comma" k="123" /> +<hkern g1="Yacute" g2="period" k="123" /> +<hkern g1="Yacute" g2="question" k="-41" /> +<hkern g1="Yacute" g2="A" k="123" /> +<hkern g1="Yacute" g2="C" k="41" /> +<hkern g1="Yacute" g2="G" k="41" /> +<hkern g1="Yacute" g2="O" k="41" /> +<hkern g1="Yacute" g2="Q" k="41" /> +<hkern g1="Yacute" g2="a" k="102" /> +<hkern g1="Yacute" g2="c" k="102" /> +<hkern g1="Yacute" g2="d" k="102" /> +<hkern g1="Yacute" g2="e" k="102" /> +<hkern g1="Yacute" g2="g" k="41" /> +<hkern g1="Yacute" g2="m" k="61" /> +<hkern g1="Yacute" g2="n" k="61" /> +<hkern g1="Yacute" g2="o" k="102" /> +<hkern g1="Yacute" g2="p" k="61" /> +<hkern g1="Yacute" g2="q" k="102" /> +<hkern g1="Yacute" g2="r" k="61" /> +<hkern g1="Yacute" g2="s" k="82" /> +<hkern g1="Yacute" g2="u" k="61" /> +<hkern g1="Yacute" g2="z" k="41" /> +<hkern g1="Yacute" g2="Agrave" k="123" /> +<hkern g1="Yacute" g2="Aacute" k="123" /> +<hkern g1="Yacute" g2="Acircumflex" k="123" /> +<hkern g1="Yacute" g2="Atilde" k="123" /> +<hkern g1="Yacute" g2="Adieresis" k="123" /> +<hkern g1="Yacute" g2="Aring" k="123" /> +<hkern g1="Yacute" g2="Ccedilla" k="41" /> +<hkern g1="Yacute" g2="Ograve" k="41" /> +<hkern g1="Yacute" g2="Oacute" k="41" /> +<hkern g1="Yacute" g2="Ocircumflex" k="41" /> +<hkern g1="Yacute" g2="Otilde" k="41" /> +<hkern g1="Yacute" g2="Odieresis" k="41" /> +<hkern g1="Yacute" g2="Oslash" k="41" /> +<hkern g1="Yacute" g2="agrave" k="102" /> +<hkern g1="Yacute" g2="aacute" k="102" /> +<hkern g1="Yacute" g2="acircumflex" k="102" /> +<hkern g1="Yacute" g2="atilde" k="102" /> +<hkern g1="Yacute" g2="adieresis" k="102" /> +<hkern g1="Yacute" g2="aring" k="102" /> +<hkern g1="Yacute" g2="ae" k="102" /> +<hkern g1="Yacute" g2="ccedilla" k="102" /> +<hkern g1="Yacute" g2="egrave" k="102" /> +<hkern g1="Yacute" g2="eacute" k="102" /> +<hkern g1="Yacute" g2="ecircumflex" k="102" /> +<hkern g1="Yacute" g2="edieresis" k="102" /> +<hkern g1="Yacute" g2="ograve" k="102" /> +<hkern g1="Yacute" g2="oacute" k="102" /> +<hkern g1="Yacute" g2="ocircumflex" k="102" /> +<hkern g1="Yacute" g2="otilde" k="102" /> +<hkern g1="Yacute" g2="odieresis" k="102" /> +<hkern g1="Yacute" g2="oslash" k="102" /> +<hkern g1="Yacute" g2="ugrave" k="61" /> +<hkern g1="Yacute" g2="uacute" k="61" /> +<hkern g1="Yacute" g2="ucircumflex" k="61" /> +<hkern g1="Yacute" g2="udieresis" k="61" /> +<hkern g1="Yacute" g2="OE" k="41" /> +<hkern g1="Yacute" g2="oe" k="102" /> +<hkern g1="Yacute" g2="quotesinglbase" k="123" /> +<hkern g1="Yacute" g2="quotedblbase" k="123" /> +<hkern g1="Thorn" g2="comma" k="266" /> +<hkern g1="Thorn" g2="period" k="266" /> +<hkern g1="Thorn" g2="A" k="102" /> +<hkern g1="Thorn" g2="X" k="41" /> +<hkern g1="Thorn" g2="Z" k="20" /> +<hkern g1="Thorn" g2="Agrave" k="102" /> +<hkern g1="Thorn" g2="Aacute" k="102" /> +<hkern g1="Thorn" g2="Acircumflex" k="102" /> +<hkern g1="Thorn" g2="Atilde" k="102" /> +<hkern g1="Thorn" g2="Adieresis" k="102" /> +<hkern g1="Thorn" g2="Aring" k="102" /> +<hkern g1="Thorn" g2="quotesinglbase" k="266" /> +<hkern g1="Thorn" g2="quotedblbase" k="266" /> +<hkern g1="agrave" g2="quotedbl" k="20" /> +<hkern g1="agrave" g2="quotesingle" k="20" /> +<hkern g1="agrave" g2="quoteright" k="20" /> +<hkern g1="agrave" g2="quotedblright" k="20" /> +<hkern g1="aacute" g2="quotedbl" k="20" /> +<hkern g1="aacute" g2="quotesingle" k="20" /> +<hkern g1="aacute" g2="quoteright" k="20" /> +<hkern g1="aacute" g2="quotedblright" k="20" /> +<hkern g1="acircumflex" g2="quotedbl" k="20" /> +<hkern g1="acircumflex" g2="quotesingle" k="20" /> +<hkern g1="acircumflex" g2="quoteright" k="20" /> +<hkern g1="acircumflex" g2="quotedblright" k="20" /> +<hkern g1="atilde" g2="quotedbl" k="20" /> +<hkern g1="atilde" g2="quotesingle" k="20" /> +<hkern g1="atilde" g2="quoteright" k="20" /> +<hkern g1="atilde" g2="quotedblright" k="20" /> +<hkern g1="adieresis" g2="quotedbl" k="20" /> +<hkern g1="adieresis" g2="quotesingle" k="20" /> +<hkern g1="adieresis" g2="quoteright" k="20" /> +<hkern g1="adieresis" g2="quotedblright" k="20" /> +<hkern g1="aring" g2="quotedbl" k="20" /> +<hkern g1="aring" g2="quotesingle" k="20" /> +<hkern g1="aring" g2="quoteright" k="20" /> +<hkern g1="aring" g2="quotedblright" k="20" /> +<hkern g1="egrave" g2="quotedbl" k="20" /> +<hkern g1="egrave" g2="quotesingle" k="20" /> +<hkern g1="egrave" g2="v" k="41" /> +<hkern g1="egrave" g2="w" k="41" /> +<hkern g1="egrave" g2="x" k="41" /> +<hkern g1="egrave" g2="y" k="41" /> +<hkern g1="egrave" g2="z" k="20" /> +<hkern g1="egrave" g2="yacute" k="41" /> +<hkern g1="egrave" g2="quoteright" k="20" /> +<hkern g1="egrave" g2="quotedblright" k="20" /> +<hkern g1="eacute" g2="quotedbl" k="20" /> +<hkern g1="eacute" g2="quotesingle" k="20" /> +<hkern g1="eacute" g2="v" k="41" /> +<hkern g1="eacute" g2="w" k="41" /> +<hkern g1="eacute" g2="x" k="41" /> +<hkern g1="eacute" g2="y" k="41" /> +<hkern g1="eacute" g2="z" k="20" /> +<hkern g1="eacute" g2="yacute" k="41" /> +<hkern g1="eacute" g2="quoteright" k="20" /> +<hkern g1="eacute" g2="quotedblright" k="20" /> +<hkern g1="ecircumflex" g2="quotedbl" k="20" /> +<hkern g1="ecircumflex" g2="quotesingle" k="20" /> +<hkern g1="ecircumflex" g2="v" k="41" /> +<hkern g1="ecircumflex" g2="w" k="41" /> +<hkern g1="ecircumflex" g2="x" k="41" /> +<hkern g1="ecircumflex" g2="y" k="41" /> +<hkern g1="ecircumflex" g2="z" k="20" /> +<hkern g1="ecircumflex" g2="yacute" k="41" /> +<hkern g1="ecircumflex" g2="quoteright" k="20" /> +<hkern g1="ecircumflex" g2="quotedblright" k="20" /> +<hkern g1="edieresis" g2="quotedbl" k="20" /> +<hkern g1="edieresis" g2="quotesingle" k="20" /> +<hkern g1="edieresis" g2="v" k="41" /> +<hkern g1="edieresis" g2="w" k="41" /> +<hkern g1="edieresis" g2="x" k="41" /> +<hkern g1="edieresis" g2="y" k="41" /> +<hkern g1="edieresis" g2="z" k="20" /> +<hkern g1="edieresis" g2="yacute" k="41" /> +<hkern g1="edieresis" g2="quoteright" k="20" /> +<hkern g1="edieresis" g2="quotedblright" k="20" /> +<hkern g1="eth" g2="quotedbl" k="20" /> +<hkern g1="eth" g2="quotesingle" k="20" /> +<hkern g1="eth" g2="v" k="41" /> +<hkern g1="eth" g2="w" k="41" /> +<hkern g1="eth" g2="x" k="41" /> +<hkern g1="eth" g2="y" k="41" /> +<hkern g1="eth" g2="z" k="20" /> +<hkern g1="eth" g2="yacute" k="41" /> +<hkern g1="eth" g2="quoteright" k="20" /> +<hkern g1="eth" g2="quotedblright" k="20" /> +<hkern g1="ograve" g2="quotedbl" k="20" /> +<hkern g1="ograve" g2="quotesingle" k="20" /> +<hkern g1="ograve" g2="v" k="41" /> +<hkern g1="ograve" g2="w" k="41" /> +<hkern g1="ograve" g2="x" k="41" /> +<hkern g1="ograve" g2="y" k="41" /> +<hkern g1="ograve" g2="z" k="20" /> +<hkern g1="ograve" g2="yacute" k="41" /> +<hkern g1="ograve" g2="quoteright" k="20" /> +<hkern g1="ograve" g2="quotedblright" k="20" /> +<hkern g1="oacute" g2="quotedbl" k="20" /> +<hkern g1="oacute" g2="quotesingle" k="20" /> +<hkern g1="oacute" g2="v" k="41" /> +<hkern g1="oacute" g2="w" k="41" /> +<hkern g1="oacute" g2="x" k="41" /> +<hkern g1="oacute" g2="y" k="41" /> +<hkern g1="oacute" g2="z" k="20" /> +<hkern g1="oacute" g2="yacute" k="41" /> +<hkern g1="oacute" g2="quoteright" k="20" /> +<hkern g1="oacute" g2="quotedblright" k="20" /> +<hkern g1="ocircumflex" g2="quotedbl" k="20" /> +<hkern g1="ocircumflex" g2="quotesingle" k="20" /> +<hkern g1="ocircumflex" g2="v" k="41" /> +<hkern g1="ocircumflex" g2="w" k="41" /> +<hkern g1="ocircumflex" g2="x" k="41" /> +<hkern g1="ocircumflex" g2="y" k="41" /> +<hkern g1="ocircumflex" g2="z" k="20" /> +<hkern g1="ocircumflex" g2="yacute" k="41" /> +<hkern g1="ocircumflex" g2="quoteright" k="20" /> +<hkern g1="ocircumflex" g2="quotedblright" k="20" /> +<hkern g1="odieresis" g2="quotedbl" k="41" /> +<hkern g1="odieresis" g2="quotesingle" k="41" /> +<hkern g1="odieresis" g2="quoteright" k="41" /> +<hkern g1="odieresis" g2="quotedblright" k="41" /> +<hkern g1="oslash" g2="quotedbl" k="20" /> +<hkern g1="oslash" g2="quotesingle" k="20" /> +<hkern g1="oslash" g2="v" k="41" /> +<hkern g1="oslash" g2="w" k="41" /> +<hkern g1="oslash" g2="x" k="41" /> +<hkern g1="oslash" g2="y" k="41" /> +<hkern g1="oslash" g2="z" k="20" /> +<hkern g1="oslash" g2="yacute" k="41" /> +<hkern g1="oslash" g2="quoteright" k="20" /> +<hkern g1="oslash" g2="quotedblright" k="20" /> +<hkern g1="yacute" g2="quotedbl" k="-82" /> +<hkern g1="yacute" g2="quotesingle" k="-82" /> +<hkern g1="yacute" g2="comma" k="82" /> +<hkern g1="yacute" g2="period" k="82" /> +<hkern g1="yacute" g2="question" k="-41" /> +<hkern g1="yacute" g2="quoteright" k="-82" /> +<hkern g1="yacute" g2="quotesinglbase" k="82" /> +<hkern g1="yacute" g2="quotedblright" k="-82" /> +<hkern g1="yacute" g2="quotedblbase" k="82" /> +<hkern g1="thorn" g2="quotedbl" k="20" /> +<hkern g1="thorn" g2="quotesingle" k="20" /> +<hkern g1="thorn" g2="v" k="41" /> +<hkern g1="thorn" g2="w" k="41" /> +<hkern g1="thorn" g2="x" k="41" /> +<hkern g1="thorn" g2="y" k="41" /> +<hkern g1="thorn" g2="z" k="20" /> +<hkern g1="thorn" g2="yacute" k="41" /> +<hkern g1="thorn" g2="quoteright" k="20" /> +<hkern g1="thorn" g2="quotedblright" k="20" /> +<hkern g1="ydieresis" g2="quotedbl" k="-82" /> +<hkern g1="ydieresis" g2="quotesingle" k="-82" /> +<hkern g1="ydieresis" g2="comma" k="82" /> +<hkern g1="ydieresis" g2="period" k="82" /> +<hkern g1="ydieresis" g2="question" k="-41" /> +<hkern g1="ydieresis" g2="quoteright" k="-82" /> +<hkern g1="ydieresis" g2="quotesinglbase" k="82" /> +<hkern g1="ydieresis" g2="quotedblright" k="-82" /> +<hkern g1="ydieresis" g2="quotedblbase" k="82" /> +<hkern g1="OE" g2="J" k="-123" /> +</font> +</defs> +</svg> diff --git a/client/css/fonts/Open-Sans-regular/Open-Sans-regular.ttf b/client/css/fonts/Open-Sans-regular/Open-Sans-regular.ttf new file mode 100755 index 00000000..0dae9c3b Binary files /dev/null and b/client/css/fonts/Open-Sans-regular/Open-Sans-regular.ttf differ diff --git a/client/css/fonts/Open-Sans-regular/Open-Sans-regular.woff b/client/css/fonts/Open-Sans-regular/Open-Sans-regular.woff new file mode 100755 index 00000000..ac2b2c65 Binary files /dev/null and b/client/css/fonts/Open-Sans-regular/Open-Sans-regular.woff differ diff --git a/client/css/fonts/Open-Sans-regular/Open-Sans-regular.woff2 b/client/css/fonts/Open-Sans-regular/Open-Sans-regular.woff2 new file mode 100755 index 00000000..402dfd77 Binary files /dev/null and b/client/css/fonts/Open-Sans-regular/Open-Sans-regular.woff2 differ diff --git a/client/css/fonts/inconsolatag.ttf b/client/css/fonts/inconsolatag.ttf new file mode 100644 index 00000000..1a212c65 Binary files /dev/null and b/client/css/fonts/inconsolatag.ttf differ diff --git a/client/css/fonts/inconsolatag.woff b/client/css/fonts/inconsolatag.woff new file mode 100644 index 00000000..d5ac16fb Binary files /dev/null and b/client/css/fonts/inconsolatag.woff differ diff --git a/client/css/style.css b/client/css/style.css index 86bc5f81..a9449a68 100644 --- a/client/css/style.css +++ b/client/css/style.css @@ -1,653 +1,334 @@ -@import "../../node_modules/normalize.css/normalize.css"; -@import "fontawesome.css"; -@import "../../node_modules/primer-tooltips/build/build.css"; - -:root { - /* Main text color */ - --body-color: #222; - - /* Secondary text color, dimmed. Make sure to keep contrast WCAG 2.0 AA compliant on var(--window-bg-color) */ - --body-color-muted: #767676; - - /* Background color of the whole page */ - --body-bg-color: #415364; - - /* Main button color. Applies to border, text, and background on hover */ - --button-color: #84ce88; - --button-text-color-hover: #fff; - - /* Color for sidebar overlay and other things that dim the viewport when something else is on top */ - --overlay-bg-color: rgb(0 0 0 / 50%); - - /* Links and link-looking buttons */ - --link-color: #50a656; - - /* Background color of the main window */ - --window-bg-color: #fff; - - /* Text color for <h2> and <h3> headings in windows */ - --window-heading-color: #6c797a; - - /* Color of the date marker, text and separator */ - --date-marker-color: rgb(0 107 59 / 50%); - - /* Color of the unread message marker, text and separator */ - --unread-marker-color: rgb(231 76 60 / 50%); - - /* Background and left-border color of highlight messages */ - --highlight-bg-color: #efe8dc; - --highlight-border-color: #b08c4f; - - /* Color of the progress bar that appears as a file is being uploaded to the server. Defaults to button color */ - --upload-progressbar-color: var(--button-color); +@font-face { + font-family: "Lato"; + font-weight: 400; + font-style: normal; + src: url("fonts/Lato-regular/Lato-regular.eot"); + src: + url("fonts/Lato-regular/Lato-regular.eot?#iefix") format("embedded-opentype"), + local("Lato Regular"), + local("Lato-regular"), + url("fonts/Lato-regular/Lato-regular.woff2") format("woff2"), + url("fonts/Lato-regular/Lato-regular.woff") format("woff"), + url("fonts/Lato-regular/Lato-regular.ttf") format("truetype"), + url("fonts/Lato-regular/Lato-regular.svg#Lato") format("svg"); } -::placeholder { - color: rgb(0 0 0 / 35%); - opacity: 1; /* fix opacity in Firefox */ +@font-face { + font-family: "Lato"; + font-weight: 700; + font-style: normal; + src: url("fonts/Lato-700/Lato-700.eot"); + src: + url("fonts/Lato-700/Lato-700.eot?#iefix") format("embedded-opentype"), + local("Lato Bold"), + local("Lato-700"), + url("fonts/Lato-700/Lato-700.woff2") format("woff2"), + url("fonts/Lato-700/Lato-700.woff") format("woff"), + url("fonts/Lato-700/Lato-700.ttf") format("truetype"), + url("fonts/Lato-700/Lato-700.svg#Lato") format("svg"); } -html { - box-sizing: border-box; - -webkit-tap-highlight-color: transparent; /* remove tap highlight on touch devices */ +@font-face { + font-family: "Open Sans"; + font-weight: 300; + font-style: normal; + src: url("fonts/Open-Sans-300/Open-Sans-300.eot"); + src: + url("fonts/Open-Sans-300/Open-Sans-300.eot?#iefix") format("embedded-opentype"), + local("Open Sans Light"), + local("Open-Sans-300"), + url("fonts/Open-Sans-300/Open-Sans-300.woff2") format("woff2"), + url("fonts/Open-Sans-300/Open-Sans-300.woff") format("woff"), + url("fonts/Open-Sans-300/Open-Sans-300.ttf") format("truetype"), + url("fonts/Open-Sans-300/Open-Sans-300.svg#OpenSans") format("svg"); } -*, -*::before, -*::after { - box-sizing: inherit; +@font-face { + font-family: "Open Sans"; + font-weight: 400; + font-style: normal; + src: url("fonts/Open-Sans-regular/Open-Sans-regular.eot"); + src: + url("fonts/Open-Sans-regular/Open-Sans-regular.eot?#iefix") format("embedded-opentype"), + local("Open Sans"), + local("Open-Sans-regular"), + url("fonts/Open-Sans-regular/Open-Sans-regular.woff2") format("woff2"), + url("fonts/Open-Sans-regular/Open-Sans-regular.woff") format("woff"), + url("fonts/Open-Sans-regular/Open-Sans-regular.ttf") format("truetype"), + url("fonts/Open-Sans-regular/Open-Sans-regular.svg#OpenSans") format("svg"); } -input, -button, -select, -textarea { - font: inherit; - color: inherit; +@font-face { + font-family: "Open Sans"; + font-weight: 700; + font-style: normal; + src: url("fonts/Open-Sans-700/Open-Sans-700.eot"); + src: + url("fonts/Open-Sans-700/Open-Sans-700.eot?#iefix") format("embedded-opentype"), + local("Open Sans Bold"), + local("Open-Sans-700"), + url("fonts/Open-Sans-700/Open-Sans-700.woff2") format("woff2"), + url("fonts/Open-Sans-700/Open-Sans-700.woff") format("woff"), + url("fonts/Open-Sans-700/Open-Sans-700.ttf") format("truetype"), + url("fonts/Open-Sans-700/Open-Sans-700.svg#OpenSans") format("svg"); } -img { - vertical-align: middle; -} - -.sr-only { - position: absolute; - width: 1px; - height: 1px; - margin: -1px; - padding: 0; - overflow: hidden; - clip: rect(0, 0, 0, 0); - border: 0; -} - -abbr[title] { - cursor: help; +@font-face { + font-family: "FontAwesome"; + src: url("../fonts/fontawesome-webfont.eot?v=4.6.3"); + src: url("../fonts/fontawesome-webfont.eot?#iefix&v=4.6.3") format("embedded-opentype"), url("../fonts/fontawesome-webfont.woff2?v=4.6.3") format("woff2"), url("../fonts/fontawesome-webfont.woff?v=4.6.3") format("woff"), url("../fonts/fontawesome-webfont.ttf?v=4.6.3") format("truetype"), url("../fonts/fontawesome-webfont.svg?v=4.6.3#fontawesomeregular") format("svg"); + font-weight: normal; + font-style: normal; } html, body { height: 100%; - overscroll-behavior: none; /* prevent overscroll navigation actions */ } body { - background: var(--body-bg-color); - color: var(--body-color); - font: 16px -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; + background: #455164; + color: #222; + font: 16px Lato, sans-serif; margin: 0; - user-select: none; - cursor: default; - touch-action: none; - - /** - * Disable pull-to-refresh on mobile that conflicts with scrolling the message list. - * See http://stackoverflow.com/a/29313685/1935861 - */ - overflow: hidden; /* iOS Safari requires overflow rather than overflow-y */ } -body.force-no-select * { - user-select: none !important; -} - -a, -a:hover, -a:focus { - color: var(--link-color); - text-decoration: none; +a { + transition: opacity .2s; } a:hover { - text-decoration: underline; -} - -a:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; + text-decoration: none; + opacity: .8; } h1, -h2, -h3 { +h2 { font: inherit; line-height: inherit; margin: 0; } +h1.title { + margin-bottom: 10px; +} + +input { + outline: 0; +} + button { border: none; background: none; margin: 0; outline: none; padding: 0; - user-select: inherit; - cursor: pointer; -} - -code, -pre, -#chat .msg[data-type="monospace_block"] .text, -.irc-monospace, -textarea#user-specified-css-input { - font-family: Consolas, Menlo, Monaco, "Lucida Console", "DejaVu Sans Mono", "Courier New", monospace; -} - -code, -.irc-monospace { - font-size: 13px; - padding: 2px 4px; - color: #e74c3c; - background-color: #f9f2f4; - border-radius: 2px; -} - -pre { - display: block; - padding: 9.5px; - margin: 0 0 10px; - font-size: 13px; - line-height: 1.4286; - color: #333; - word-break: break-all; - word-wrap: break-word; - background-color: #f5f5f5; - border-radius: 4px; -} - -kbd { - display: inline-block; - font-family: inherit; - line-height: 1em; - min-width: 28px; /* Ensure 1-char keys have the same width */ - margin: 0 1px; - padding: 4px 6px; - color: #444; - text-align: center; - text-shadow: 0 1px 0 #fff; - background-color: white; - background-image: linear-gradient(180deg, rgb(0 0 0 / 5%), transparent); - border: 1px solid #bbb; - border-radius: 4px; - box-shadow: 0 2px 0 #bbb, inset 0 1px 1px #fff, inset 0 -1px 3px #ccc; -} - -p { - margin: 0 0 10px; } .btn { - border: 2px solid var(--button-color); + border: 2px solid #84ce88; border-radius: 3px; - color: var(--button-color); + color: #84ce88; display: inline-block; - font-size: 12px; - font-weight: bold; + font: bold 12px Lato, sans-serif; letter-spacing: 1px; margin-bottom: 10px; padding: 9px 17px; text-transform: uppercase; - transition: background 0.2s, border-color 0.2s, color 0.2s, box-shadow 0.2s; + transition: background .2s, border-color .2s, color .2s; word-spacing: 3px; - cursor: pointer; /* This is useful for `<button>` elements */ -} - -.btn-small { - padding: 5px 13px; } .btn:disabled, -.btn:hover, -.btn:focus { - background: var(--button-color); - color: var(--button-text-color-hover); - opacity: 1; -} - -.input:focus, -.btn:active, -.btn:focus { - outline: 0; - box-shadow: 0 0 0 3px rgb(132 206 136 / 50%); +.btn:hover { + background: #84ce88; + color: #fff; } .btn:active { - opacity: 0.8; + box-shadow: none; + opacity: .8; } .btn:disabled { - opacity: 0.6; -} - -.btn-sm { - padding: 4px 8px; - border-width: 1px; - letter-spacing: 0; - word-spacing: 0; - text-transform: none; + opacity: .6; } .container { - padding: 0 15px; - margin-bottom: 20px; - width: 480px; - align-self: center; - touch-action: pan-y; + margin: 80px auto; + max-width: 480px; + overflow: hidden; + overflow-y: auto; + -webkit-overflow-scrolling: touch; + padding: 0 30px; } -#js-copy-hack, -#loading pre, -#help .container, -#changelog .container, -.header .title, -.header .topic, -#chat .messages { - user-select: text; - cursor: text; +::-moz-placeholder { + color: rgba(0, 0, 0, .35); + opacity: 1; } -#js-copy-hack { - position: absolute; - left: -999999px; +::-webkit-input-placeholder { + color: rgba(0, 0, 0, .35); } -#chat #js-copy-hack .msg[data-type="condensed"]:not(.closed) .msg, -#chat #js-copy-hack > .msg { - display: block; -} - -.only-copy { - font-size: 0; - opacity: 0; - width: 0.01px; /* Must be non-zero to be the first selected character on Firefox */ - display: inline-block; +:-ms-input-placeholder { + color: rgba(0, 0, 0, .35) !important; } /* Icons */ -#viewport .lt::before, -#viewport .rt::before, -#chat button.mentions::before, -#chat button.close::before, -#chat button.menu::before, -#chat button.search::before, -.channel-list-item::before, +#viewport .lt:before, +#viewport .rt:before, +#chat button.menu:before, +#sidebar .chan:before, +#chat .title:before, #footer .icon, -#chat .count::before, -#connect .extra-help, -#settings .extra-help, -#settings #play::before, -#settings .settings-menu .icon::before, -#form #upload::before, -#form #submit::before, -#chat .msg[data-type="away"] .from::before, -#chat .msg[data-type="back"] .from::before, -#chat .msg[data-type="invite"] .from::before, -#chat .msg[data-type="join"] .from::before, -#chat .msg[data-type="kick"] .from::before, -#chat .msg[data-type="login"] .from::before, -#chat .msg[data-type="logout"] .from::before, -#chat .msg[data-type="part"] .from::before, -#chat .msg[data-type="quit"] .from::before, -#chat .msg[data-type="topic"] .from::before, -#chat .msg[data-type="mode_channel"] .from::before, -#chat .msg[data-type="mode_user"] .from::before, -#chat .msg[data-type="mode"] .from::before, -#chat .msg[data-command="motd"] .from::before, -#chat .msg[data-command="help"] .from::before, -#chat .msg[data-command="info"] .from::before, -#chat .msg[data-type="ctcp"] .from::before, -#chat .msg[data-type="ctcp_request"] .from::before, -#chat .msg[data-type="whois"] .from::before, -#chat .msg[data-type="nick"] .from::before, -#chat .msg[data-type="chghost"] .from::before, -#chat .msg[data-type="action"] .from::before, -#chat .msg[data-type="plugin"] .from::before, -#chat .msg[data-type="raw"] .from::before, -#chat .msg-statusmsg span::before, -#chat .msg-shown-in-active span::before, -#chat .toggle-button::after, -#chat .toggle-content .more-caret::before, -#chat .scroll-down-arrow::after, -#chat .topic-container .save-topic span::before, -#version-checker::before, -.context-menu-item::before, -#help .website-link::before, -#help .documentation-link::before, -#help .report-issue-link::before, -#image-viewer .previous-image-btn::before, -#image-viewer .next-image-btn::before, -#image-viewer .open-btn::before, -.channel-list-item .not-secure-icon::before, -.channel-list-item .not-connected-icon::before, -.channel-list-item .parted-channel-icon::before, -.jump-to-input::before, -.password-container .reveal-password span, -#sidebar .collapse-network-icon::before { +#chat .count:before, +#settings #play:before, +#form #submit:before, +#chat .invite .from:before, +#chat .join .from:before, +#chat .kick .from:before, +#chat .part .from:before, +#chat .quit .from:before, +#chat .topic .from:before, +#chat .mode .from:before, +#chat .ctcp .from:before, +#chat .whois .from:before, +#chat .nick .from:before, +#chat .action .from:before, +.context-menu-item:before { font: normal normal normal 14px/1 FontAwesome; font-size: inherit; /* Can't have font-size inherit on line above, so need to override */ -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } -#viewport .lt::before { content: "\f0c9"; /* http://fontawesome.io/icon/bars/ */ } -#viewport .rt::before { content: "\f0c0"; /* https://fontawesome.com/icons/users?style=solid */ } -#chat button.menu::before { content: "\f142"; /* http://fontawesome.io/icon/ellipsis-v/ */ } -#chat button.mentions::before { content: "\f1fa"; /* https://fontawesome.com/icons/at?style=solid */ } -#chat button.search::before { content: "\f002"; /* https://fontawesome.com/icons/search?style=solid */ } -#chat button.close::before { content: "\f00d"; /* https://fontawesome.com/icons/times?style=solid */ } +#viewport .lt:before { content: "\f0c9"; /* http://fontawesome.io/icon/bars/ */ } +#viewport .rt:before { content: "\f0c0"; /* http://fontawesome.io/icon/users/ */ } +#chat button.menu:before { content: "\f142"; /* http://fontawesome.io/icon/ellipsis-v/ */ } -.context-menu-join::before { content: "\f067"; /* http://fontawesome.io/icon/plus/ */ } -.context-menu-user::before { content: "\f007"; /* http://fontawesome.io/icon/user/ */ } -.context-menu-close::before { content: "\f00d"; /* http://fontawesome.io/icon/times/ */ } -.context-menu-list::before { content: "\f03a"; /* http://fontawesome.io/icon/list/ */ } -.context-menu-disconnect::before { content: "\f127"; /* https://fontawesome.com/icons/unlink?style=solid */ } -.context-menu-connect::before { content: "\f0c1"; /* https://fontawesome.com/icons/link?style=solid */ } -.context-menu-action-whois::before { content: "\f05a"; /* http://fontawesome.io/icon/info-circle/ */ } -.context-menu-action-ignore::before { content: "\f506"; /* https://fontawesome.com/icons/user-slash?style=solid */ } -.context-menu-action-kick::before { content: "\f05e"; /* http://fontawesome.io/icon/ban/ */ } -.context-menu-action-set-mode::before { content: "\f067"; /* http://fontawesome.io/icon/plus/ */ } -.context-menu-action-revoke-mode::before { content: "\f068"; /* http://fontawesome.io/icon/minus/ */ } -.context-menu-network::before { content: "\f233"; /* https://fontawesome.com/icons/server?style=solid */ } -.context-menu-edit::before { content: "\f303"; /* https://fontawesome.com/icons/pencil-alt?style=solid */ } -.context-menu-clear-history::before { content: "\f1f8"; /* https://fontawesome.com/icons/trash?style=solid */ } -.context-menu-mute::before { content: "\f6a9"; /* https://fontawesome.com/v5.15/icons/volume-mute?style=solid */ } +.context-menu-user:before { content: "\f007"; /* http://fontawesome.io/icon/user/ */ } +.context-menu-chan:before { content: "\f0f6"; /* http://fontawesome.io/icon/file-text-o/ */ } +.context-menu-close:before { content: "\f00d"; /* http://fontawesome.io/icon/times/ */ } -.channel-list-item .not-secure-icon::before { - content: "\f071"; /* https://fontawesome.com/icons/exclamation-triangle?style=solid */ -} +#sidebar .chan.lobby:before, +#chat .lobby .title:before { content: "\f0a0"; /* http://fontawesome.io/icon/hdd-o/ */ } -.channel-list-item .not-connected-icon::before, -.channel-list-item .parted-channel-icon::before { - content: "\f127"; /* https://fontawesome.com/icons/unlink?style=solid */ -} +#sidebar .chan.query:before, +#chat .query .title:before { content: "\f0e6"; /* http://fontawesome.io/icon/comments-o/ */ } -.context-menu-query::before, -.context-menu-action-query::before, -.channel-list-item[data-type="query"]::before { - content: "\f075"; /* https://fontawesome.com/icons/comment?style=solid */ -} +#sidebar .chan.channel:before, +#chat .channel .title:before { content: "\f0f6"; /* http://fontawesome.io/icon/file-text-o/ */ } -.context-menu-chan::before, -.channel-list-item[data-type="channel"]::before { content: "\f086"; /* http://fontawesome.io/icon/comments/ */ } +#footer .sign-in:before { content: "\f023"; /* http://fontawesome.io/icon/lock/ */ } +#footer .connect:before { content: "\f067"; /* http://fontawesome.io/icon/plus/ */ } +#footer .settings:before { content: "\f013"; /* http://fontawesome.io/icon/cog/ */ } +#footer .sign-out:before { content: "\f011"; /* http://fontawesome.io/icon/power-off/ */ } -.channel-list-item[data-type="special"]::before { content: "\f03a"; /* http://fontawesome.io/icon/list/ */ } +#form #submit:before { content: "\f1d8"; /* http://fontawesome.io/icon/paper-plane/ */ } -.channel-list-item.has-draft:not(.active):not([data-type="lobby"])::before { - content: "\f304"; /* https://fontawesome.com/icons/pen?style=solid */ -} - -#footer .connect::before { content: "\f067"; /* http://fontawesome.io/icon/plus/ */ } - -#footer .settings::before { content: "\f013"; /* http://fontawesome.io/icon/cog/ */ } - -#footer .help::before { content: "\f059"; /* http://fontawesome.io/icon/question/ */ } - -#form #upload::before { content: "\f0c6"; /* https://fontawesome.com/icons/paperclip?style=solid */ } -#form #submit::before { content: "\f1d8"; /* http://fontawesome.io/icon/paper-plane/ */ } - -#chat .msg[data-type="away"] .from::before, -#chat .msg[data-type="back"] .from::before { - content: "\f017"; /* https://fontawesome.com/icons/clock?style=solid */ - color: #7f8c8d; -} - -#help .website-link::before, -#help .documentation-link::before, -#help .report-issue-link::before { - display: inline-block; - margin-right: 5px; - - /* These 2 directives are loosely taken from .fa-fw */ - width: 1.35em; - text-align: center; -} - -#help .website-link::before { content: "\f0ac"; /* http://fontawesome.io/icon/globe/ */ } -#help .documentation-link::before { content: "\f19d"; /* http://fontawesome.io/icon/graduation-cap/ */ } -#help .report-issue-link::before { content: "\f188"; /* http://fontawesome.io/icon/bug/ */ } - -#chat .msg[data-type="invite"] .from::before { - content: "\f0e0"; /* https://fontawesome.com/icons/envelope?style=solid */ +#chat .invite .from:before { + content: "\f003"; /* http://fontawesome.io/icon/envelope-o/ */ color: #2ecc40; } -#chat .msg[data-type="login"] .from::before { - content: "\f007"; /* https://fontawesome.com/icons/user?style=solid */ - color: #2ecc40; -} - -#chat .msg[data-type="logout"] .from::before { - content: "\f007"; /* https://fontawesome.com/icons/user?style=solid */ - color: #ff4136; -} - -#chat .msg[data-type="part"] .from::before, -#chat .msg[data-type="quit"] .from::before { - content: "\f2f5"; /* https://fontawesome.com/icons/sign-out-alt?style=solid */ +#chat .part .from:before, +#chat .quit .from:before { + content: "\f08b"; /* http://fontawesome.io/icon/sign-out/ */ color: #ff4136; display: inline-block; transform: rotate(180deg); } -#chat .msg[data-type="topic"] .from::before { +#chat .topic .from:before { content: "\f0a1"; /* http://fontawesome.io/icon/bullhorn/ */ color: #2ecc40; } -#chat .msg[data-type="mode_channel"] .from::before, -#chat .msg[data-type="mode_user"] .from::before, -#chat .msg[data-type="mode"] .from::before { +#chat .mode .from:before { content: "\f05a"; /* http://fontawesome.io/icon/info-circle/ */ color: #2ecc40; } -#chat .msg[data-command="motd"] .from::before { - content: "\f02e"; /* https://fontawesome.com/icons/bookmark?style=solid */ - color: var(--body-color-muted); +#chat .ctcp .from:before { + content: "\f0f6"; /* http://fontawesome.io/icon/file-text-o/ */ } -#chat .msg[data-command="help"] .from::before { - content: "\f059"; /* https://fontawesome.com/icons/question-circle?style=solid */ - color: var(--body-color-muted); -} - -#chat .msg[data-command="info"] .from::before { - content: "\f05a"; /* https://fontawesome.com/icons/info-circle?style=solid */ - color: var(--body-color-muted); -} - -#chat .msg[data-type="ctcp"] .from::before, -#chat .msg[data-type="ctcp_request"] .from::before { - content: "\f15c"; /* https://fontawesome.com/icons/file-alt?style=solid */ - color: var(--body-color-muted); -} - -#chat .msg[data-type="whois"] .from::before { +#chat .whois .from:before { content: "\f007"; /* http://fontawesome.io/icon/user/ */ color: #2ecc40; } -#chat .msg[data-type="nick"] .from::before, -#chat .msg[data-type="chghost"] .from::before { +#chat .nick .from:before { content: "\f007"; /* http://fontawesome.io/icon/user/ */ color: #2ecc40; } -#chat .msg[data-type="join"] .from::before { - content: "\f2f6"; /* https://fontawesome.com/icons/sign-in-alt?style=solid */ +#chat .join .from:before { + content: "\f090"; /* http://fontawesome.io/icon/sign-in/ */ color: #2ecc40; } -#chat .msg[data-type="kick"] .from::before { +#chat .kick .from:before { content: "\f05e"; /* http://fontawesome.io/icon/ban/ */ color: #ff4136; } -#chat .msg[data-type="raw"] .from::before { - content: "\f101"; /* https://fontawesome.com/icons/angle-double-right?style=solid */ -} - -#chat .msg.self[data-type="raw"] .from::before { - content: "\f359"; /* https://fontawesome.com/icons/arrow-alt-circle-left?style=solid */ - color: #2ecc40; -} - -#chat .msg[data-type="action"] .from::before { +#chat .action .from:before { content: "\f005"; /* http://fontawesome.io/icon/star/ */ } -#chat .msg[data-type="plugin"] .from::before { - content: "\f1e6"; /* http://fontawesome.io/icon/plug/ */ - transform: rotate(45deg); - display: inline-block; - padding: 1px; -} - -#chat .msg-statusmsg, -#chat .msg-shown-in-active { - cursor: help; - margin-right: 5px; -} - -#chat .msg-statusmsg span::before, -#chat .msg-shown-in-active span::before { - font-size: 10px; - content: "\f06e"; /* https://fontawesome.com/icons/eye?style=solid */ -} - -#chat .msg-statusmsg { - border-radius: 2px; - padding: 2px 4px; - background-color: #ff9e18; - color: #222; -} - -#chat .toggle-button { - display: inline-block; - transition: opacity 0.2s, transform 0.2s; - - /* These 2 directives are loosely taken from .fa-fw */ - width: 1.35em; - text-align: center; -} - -#chat .toggle-button::after { - content: "\f0da"; /* http://fontawesome.io/icon/caret-right/ */ -} - -#chat .count::before { +#chat .count:before { color: #cfcfcf; content: "\f002"; /* http://fontawesome.io/icon/search/ */ position: absolute; - right: 13px; - line-height: 45px; + right: 18px; + font-size: 14px; + line-height: 50px; } -#connect .extra-help::before, -#settings .extra-help::before { - content: "\f059"; /* http://fontawesome.io/icon/question-circle/ */ -} - -#settings #play::before { +#settings #play:before { content: "\f028"; /* http://fontawesome.io/icon/volume-up/ */ margin-right: 9px; } -#image-viewer .previous-image-btn::before { - content: "\f104"; /* http://fontawesome.io/icon/angle-left/ */ -} - -#image-viewer .next-image-btn::before { - content: "\f105"; /* http://fontawesome.io/icon/angle-right/ */ -} - -#image-viewer .open-btn::before { - content: "\f35d"; /* https://fontawesome.com/icons/external-link-alt?style=solid */ -} - /* End icons */ -#app { +#wrap { height: 100%; - width: 100%; + overflow: hidden; } #viewport { - display: flex; height: 100%; -} - -#form button, -.header button, -.reveal-password span { - transition: opacity 0.2s; -} - -#form button:hover, -.header button:hover, -.reveal-password span:hover { - opacity: 0.6; + transition: all .4s; + -webkit-transform: translateZ(0); + transform: translateZ(0); + -webkit-perspective: 1000; + perspective: 1000; } #viewport .lt, #viewport .rt, -#chat button.mentions, -#chat button.search, -#chat button.menu, -#chat button.close { - color: #607992; - display: flex; +#chat button.menu { + color: #ccc; + display: none; + float: left; font-size: 14px; line-height: 1; height: 36px; + margin: 6px 12px 0 -12px; width: 36px; - flex-shrink: 0; } -#viewport .lt::before, -#viewport .rt::before, -#chat button.mentions::before, -#chat button.search::before, -#chat button.menu::before, -#chat button.close::before { - width: 36px; - line-height: 36px; /* Fix alignment in Microsoft Edge */ -} - -/* Channel list button stays fixed when scrolling... */ #viewport .lt { - position: fixed; -} - -/* ... Except on chat windows, relative to include the notification dot */ -#viewport #chat .lt { position: relative; } /* Notification dot on the top right corner of the menu icon */ -#viewport .lt::after { +#viewport .lt:after { content: ""; position: absolute; top: 9px; @@ -656,1221 +337,812 @@ p { width: 10px; height: 10px; border-radius: 50%; - border: 2px solid var(--window-bg-color); + border: 2px solid white; opacity: 0; - transition: opacity 0.2s; - background-clip: padding-box; /* Fix border-radius bleeding color */ + transition: opacity .2s; } -#viewport.notified .lt::after { +#viewport .lt.notified:after { opacity: 1; } -#viewport.userlist-open #chat .userlist { - display: flex; +#viewport .rt { + display: block; + float: right; + margin: 6px -12px 0 0; +} + +#chat button.menu { + display: block; + float: right; + margin: 6px -8px 0 12px; +} + +#viewport.rt #chat .sidebar { + -webkit-transform: translate3d(180px, 0, 0); + transform: translate3d(180px, 0, 0); } #sidebar { - display: none; - flex-direction: column; - width: 220px; - max-height: 100%; - will-change: transform; - color: #b7c5d1; /* same as .channel-list-item color */ -} - -#viewport.menu-open #sidebar { - display: flex; -} - -#sidebar .scrollable-area { - overflow-x: auto; - flex-grow: 1; - touch-action: pan-y; - scrollbar-width: thin; - overscroll-behavior: contain; + bottom: 52px; + left: 0; + overflow: auto; + overflow-x: hidden; -webkit-overflow-scrolling: touch; + position: absolute; + top: 0; + width: 220px; } -#sidebar .logo-container { - text-align: center; -} - -#sidebar .logo, -#sidebar .logo-inverted { - height: 45px; -} - -#sidebar .logo { - display: none; -} - -.channel-list-item, -#sidebar .empty { +#sidebar button, +#sidebar .chan, +#sidebar .sign-out { + border: 1px solid transparent; + border-radius: 2px; + color: #99a2b4; + cursor: pointer; font-size: 14px; } -.channel-list-item { - display: flex; - padding: 8px 14px; - position: relative; - cursor: pointer; -} - -/* Channels/queries must be white on hover and active */ -#footer button:hover, -#footer button.active, -.channel-list-item:hover, -.channel-list-item.active { +#sidebar button:hover, +#sidebar .chan:hover, +#sidebar .active { color: #fff; } -/* All lobbies/channels/queries and footer buttons must have a half-transparent -background on hover (unless active) */ -.channel-list-item:hover, -#footer button:hover { - background-color: rgb(48 62 74 / 50%); /* #303e4a x 50% alpha */ +#sidebar .networks { + padding: 20px 30px 0; } -/* Darker background and default cursor for active channels */ -#footer button.active, -.channel-list-item.active { - background-color: #303e4a; - cursor: default; +#sidebar .networks:empty { + padding: 0; } -/* Remove background on hovered/active channel when sorting/drag-and-dropping */ -.ui-sortable-ghost, -.ui-sortable-dragging .channel-list-item, -.ui-sortable-dragging, -.ui-sortable-dragging:hover, -.ui-sortable-dragging.active, -.ui-sortable-dragging-touch-cue .channel-list-item, -.ui-sortable-dragging-touch-cue, -.ui-sortable-dragging-touch-cue:hover, -.ui-sortable-dragging-touch-cue.active { - background: transparent; -} - -.ui-sortable-ghost::after, -.ui-sortable-dragging-touch-cue:not(.ui-sortable-dragging)::after { - background: var(--body-bg-color); - border: 1px dashed #99a2b4; - border-radius: 6px; - content: " "; - display: block; - position: absolute; - left: 10px; - top: 0; - bottom: 0; - right: 10px; -} - -.ui-sortable-dragging-touch-cue:not(.ui-sortable-ghost)::after { - background: transparent; -} - -#sidebar .network { - position: relative; - margin-bottom: 20px; - touch-action: pan-y; +#sidebar .network, +#sidebar .network-placeholder { + margin-bottom: 30px; } #sidebar .empty { - flex-grow: 1; + color: #9ca5b4; line-height: 1.6; - padding: 40px 20px; + font-size: 12px; + margin-top: 20px; + padding: 20px 40px; text-align: center; } -.channel-list-item[data-type="lobby"] { +#sidebar .chan, +#sidebar .chan-placeholder { + display: block; + margin: 1px -10px; + padding: 6px 10px 8px 36px; + position: relative; + text-align: left; + transition: color .2s; + width: 180px; +} + +#sidebar .chan-placeholder { + padding-bottom: 10px; +} + +#sidebar .chan:first-child { color: #84ce88; font-size: 15px; font-weight: bold; - padding-left: 0; } -.channel-list-item .lobby-wrap { - display: flex; - flex-grow: 1; - overflow: hidden; -} - -.channel-list-item[data-type="lobby"]:hover, -.channel-list-item[data-type="lobby"].active { +#sidebar .chan:first-child:hover, +#sidebar .chan:first-child.active { color: #c0f8c3; } -.channel-list-item .not-connected-tooltip, -.channel-list-item .not-secure-tooltip, -.channel-list-item .parted-channel-tooltip { - margin: 0 8px; -} - -.channel-list-item.not-secure { - color: #f39c12; -} - -.channel-list-item.not-secure:hover, -.channel-list-item.not-secure.active { - color: #f8c572; -} - -.channel-list-item.not-connected, -.channel-list-item.parted-channel { - color: #e74c3c; -} - -.channel-list-item.not-connected:hover, -.channel-list-item.not-connected.active, -.channel-list-item.parted-channel:hover, -.channel-list-item.parted-channel.active { - color: #f1978e; -} - -.channel-list-item.is-muted { - opacity: 0.5; -} - -.channel-list-item::before { - width: 14px; +#sidebar .chan:before, +#chat .title:before { + float: left; + margin-top: 3px; margin-right: 12px; - line-height: 18px; + text-align: center; } -.channel-list-item .name { +#sidebar .chan:before { + position: absolute; + top: 4px; + left: 10px; +} + +#chat .title:before { + margin-top: 17px; +} + +#sidebar .chan .name { position: relative; - flex-grow: 1; + z-index: 0; + display: block; overflow: hidden; white-space: nowrap; margin-right: 5px; } -.header .topic, -.channel-list-item .name { - mask-image: linear-gradient(to left, transparent, black 20px); +#sidebar .chan .name:after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + width: 20px; + background: linear-gradient(to right, rgba(69, 81, 100, 0) 0%, rgba(69, 81, 100, 1) 100%); + content: " "; } -.channel-list-item .badge, -#sidebar .add-channel-tooltip, -.channel-list-item .close-tooltip { - flex-shrink: 0; - line-height: 1; -} - -.channel-list-item .badge { - background: rgb(255 255 255 / 6%); +#sidebar .badge { + background: rgba(255, 255, 255, .06); border-radius: 3px; color: #afb6c0; font-size: 10px; - padding: 4px 6px; - transition: background-color 0.2s, color 0.2s; + margin-top: 1px; + margin-right: -5px; + margin-left: 5px; + padding: 3px 6px; + float: right; + transition: opacity .2s, background-color .2s, color .2s; } -.channel-list-item .badge:empty { - display: none; -} - -.channel-list-item .badge.highlight { +#sidebar .badge.highlight { background: #fff; color: #49505a; } -.channel-list-item .close { - width: 18px; - height: 18px; - display: none; - transition: opacity 0.2s, background-color 0.2s; +#sidebar .chan.active .badge, +#sidebar .badge:empty { + opacity: 0; } -.channel-list-item .close::before { - font-size: 20px; +#sidebar .close { + border-radius: 3px; + margin-right: 5px; + visibility: hidden; + opacity: 0; + position: absolute; + z-index: 2; + right: 0; + transition: opacity .2s, background-color .2s; +} + +#sidebar .close:before { + font-size: 18px; font-weight: normal; display: inline-block; - line-height: 16px; + line-height: 18px; + width: 18px; + height: 18px; text-align: center; content: "×"; color: #fff; } -.channel-list-item.active .close { - opacity: 0.4; - display: unset; +#sidebar .chan.active .close { + visibility: visible; + opacity: .4; } -.channel-list-item.active .close:hover { +#sidebar .chan.active .close:hover { + background-color: rgba(0, 0, 0, .1); opacity: 1; } -.channel-list-item[data-type="lobby"] .add-channel { - border-radius: 3px; - width: 18px; - height: 18px; - opacity: 0.4; - transition: opacity 0.2s, background-color 0.2s, transform 0.2s; +#sidebar .tse-scrollbar { + top: 2px; + right: 3px; } -.channel-list-item[data-type="lobby"] .add-channel::before { - font-size: 20px; - font-weight: normal; - display: inline-block; - line-height: 16px; - text-align: center; - content: "+"; - color: #fff; -} - -.channel-list-item[data-type="lobby"] .add-channel:hover { - opacity: 1; -} - -.channel-list-item[data-type="lobby"] .add-channel.opened { - /* translateZ(0) enables hardware acceleration, this is to avoid jittering when animating */ - transform: rotate(45deg) translateZ(0); -} - -#sidebar .network .collapse-network { - width: 40px; - opacity: 0.4; - padding-left: 11px; - transition: opacity 0.2s; - flex-shrink: 0; -} - -#sidebar .network .collapse-network-icon { - display: block; - width: 20px; - height: 20px; - transition: transform 0.2s; -} - -#sidebar .network.collapsed .collapse-network-icon { - transform: rotate(-90deg); -} - -#sidebar .network .collapse-network-icon::before { - content: "\f0d7"; /* http://fontawesome.io/icon/caret-down/ */ - color: #fff; -} - -#sidebar .collapse-network:hover { - opacity: 1; +#sidebar, +#footer { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } #footer { + background: rgba(0, 0, 0, .06); + border-radius: 2px; + bottom: 4px; height: 45px; + left: 5px; font-size: 14px; - flex-shrink: 0; - display: flex; - justify-content: center; -} - -#footer button { - color: #b7c5d1; - display: inline-block; - width: 45px; - height: 100%; - border-radius: 5px; -} - -#footer .help.notified::after { - content: "\f021"; + line-height: 45px; position: absolute; - bottom: 10px; - right: 7px; - padding: 2px; - font-size: 10px; - border-radius: 50%; - color: var(--link-color); - background: var(--body-bg-color); + text-align: center; + width: 210px; } -.window li, -.window p, -.window label, -#settings .error { +#footer button.active { + color: #fff; +} + +#footer .icon { + color: #9ca5b4; + display: inline-block; + line-height: 34px; + padding: 0 12px; +} + +.signed-out #footer .sign-in { + display: inline-block; +} + +.signed-out #footer .connect, +.signed-out #footer .sign-out { + display: none; +} + +.public #footer .sign-in, +.public #footer .sign-out { + display: none; +} + +#footer .sign-in { + display: none; +} + +#main { + background: #fff; + border-radius: 2px; + bottom: 4px; + left: 220px; + overflow: hidden; /* Without this, border-radius has no effect */ + position: absolute; + right: 5px; + top: 4px; + display: flex; + flex-direction: column; +} + +.signed-out #main { + left: 5px; +} + +#header { + display: none; + height: 40px; + position: absolute; + top: 0; + width: 100%; +} + +#windows label { font-size: 14px; } -.input { - background-color: white; +#windows .input { border: 1px solid #cdd3da; border-radius: 2px; color: #222; font-size: 14px; margin: 2px 0; margin-bottom: 10px; - padding: 0 10px; - transition: border-color 0.2s, box-shadow 0.2s; + outline: 0; + padding: 8px 10px; + transition: border-color .2s; + -webkit-appearance: none; width: 100%; - height: 35px; - line-height: 35px; } -.input:disabled { - background-color: #ddd; -} - -.input:not(:disabled):hover, -.input:not(:disabled):focus { - border-color: #84ce88; -} - -textarea.input { +#user-specified-css-input { resize: vertical; - min-height: 35px; - padding: 6px 10px; - line-height: 1.5; } -.window { - background: var(--window-bg-color); - display: flex; - flex-direction: column; - flex: 1 1 auto; +#windows .input:hover, +#windows .input:focus { + border-color: #79838c; +} + +#windows .window:before { + background: #f4f4f4; + background-image: linear-gradient(#f4f4f4, #ececec); + border-bottom: 1px solid #d7d7d7; + content: " "; + display: block; + height: 10px; position: relative; + z-index: 10; +} + +#windows .window { + background: #fff; + bottom: 0; + display: none; + left: 0; + position: absolute; + right: 0; + top: 0; overflow-y: auto; - height: 100%; - scrollbar-width: thin; - overscroll-behavior: contain; -webkit-overflow-scrolling: touch; } -#loading, -#chat .chat-view { - /* flexbox does not seem to scroll without doing this */ - position: absolute; - bottom: 0; - left: 0; - right: 0; - top: 0; +#windows .window h1 { + font: 36px Lato; } -.window h1 { - font-size: 36px; -} - -.window h2 { - border-bottom: 1px solid currentcolor; - color: var(--window-heading-color); +#windows .window h2 { + border-bottom: 1px solid #eee; + color: #7f8c8d; font-size: 22px; margin: 30px 0 10px; padding-bottom: 7px; } -.window h2 small { - font-size: 16px; - line-height: 30px; +#windows .active { + display: block; } -.window h3 { - color: var(--window-heading-color); - font-size: 18px; - margin: 20px 0 10px; -} - -.header { - align-items: center; - line-height: 45px; - height: 45px; - padding: 0 6px; - display: flex; - flex-shrink: 0; - overflow: hidden; -} - -#chat .header { +#windows .header { border-bottom: 1px solid #e7e7e7; -} - -.header .title { - font-size: 15px; - padding-left: 6px; - flex-shrink: 1; - white-space: nowrap; + line-height: 50px !important; + height: 48px; + padding: 0 20px; overflow: hidden; - text-overflow: ellipsis; } -.topic-container { - position: relative; - flex-grow: 1; - padding-left: 10px; +#windows .header .title { + font: 14px Lato; } -.header .topic { - color: var(--body-color-muted); +#windows .header .topic { + color: #777; margin-left: 8px; word-break: break-all; - flex-grow: 1; - overflow: hidden; - font-size: 14px; - flex-shrink: 99999999; - min-width: 25px; } -.header .topic.empty { - min-width: 0; +#windows .window .header { + display: none; } -.header .topic-input { - color: inherit; - background: transparent; - border: 1px solid #cdd3da; - border-radius: 2px; - padding-right: 37px; - padding-left: 10px; - width: 100%; - height: 35px; - overflow: hidden; - font-size: 14px; - line-height: normal; - outline: none; -} - -.topic-container .save-topic { +#chat-container, +#chat .chan { position: absolute; - top: 6px; + top: 0; right: 0; + bottom: 0; + left: 0; } -.topic-container .save-topic span { - font-size: 16px; - color: #607992; - width: 35px; - height: 35px; +#windows #chat-container.active { display: flex; - justify-content: center; - align-items: center; - cursor: pointer; - appearance: none; -} - -.topic-container .save-topic span:hover { - opacity: 0.6; + flex-direction: column; } #chat { - overflow: hidden; - flex: 1 0 auto; position: relative; -} - -#chat .chat-view { - display: flex; - flex-direction: column; -} - -#chat .msg[data-type="condensed"] { - flex-wrap: wrap; -} - -#chat .msg[data-type="condensed"] .content { + overflow: hidden; flex: 1; } -/* Ensures expanded status messages always take up the full width */ -#chat .msg[data-type="condensed"] .msg { - flex-basis: 100%; -} - -#chat .condensed-summary .content { - display: block; - cursor: pointer; - user-select: none; -} - -#chat .condensed-summary { - display: flex; -} - -#chat .condensed-summary .content:hover { - text-decoration: underline; -} - -#chat .msg.closed[data-type="condensed"] .msg { +#chat .chan { display: none; } -#chat .condensed-summary .time { - visibility: hidden; +#chat .chan.active { + display: block; } -#form, -.messages .msg, -.userlist { - font-size: 14px; +#chat, +#windows .header { + font: 12px Consolas, Menlo, Monaco, "Lucida Console", "DejaVu Sans Mono", "Courier New", monospace; line-height: 1.4; } -#chat .chat-content { - display: flex; - flex-direction: row-reverse; - flex-grow: 1; - overflow: hidden; - position: relative; +#windows #chat .header { + display: block; +} + +#chat .chat, +#chat .sidebar { + top: 48px; } #chat .chat { + bottom: 0; + left: 0; overflow: auto; - overflow-x: hidden; - display: flex; - flex-grow: 1; - flex-direction: column; - scrollbar-width: thin; - overscroll-behavior: contain; -webkit-overflow-scrolling: touch; - outline: none; + position: absolute; + right: 180px; } -#chat .userlist { +#viewport.rt .chat { + right: 0; +} + +#chat .sidebar { + background: #fff; border-left: 1px solid #e7e7e7; + bottom: 0; + position: absolute; + right: 0; width: 180px; + transition: all .4s; + -webkit-transform: translateZ(0); + transform: translateZ(0); + -webkit-perspective: 1000; + perspective: 1000; +} + +#chat .lobby .chat, +#chat .query .chat { + right: 0; +} + +#chat .lobby .sidebar, +#chat .query .sidebar { display: none; - flex-direction: column; - flex-shrink: 0; - touch-action: pan-y; -} - -/** - * Toggled via JavaScript - */ -#sidebar .join-form { - padding: 0 18px 8px; -} - -#sidebar .join-form .input { - display: block; - margin: 5px auto; -} - -#sidebar .join-form .btn { - display: block; - width: 100%; - margin: auto; } #chat .show-more { + display: none; padding: 10px; - padding-top: 15px; padding-bottom: 0; width: 100%; } -#chat .show-more .btn { +#chat .show-more-button { + background: #f4f4f4; + background-image: linear-gradient(#f4f4f4, #ececec); + border: 1px solid #d7d7d7; + border-bottom-color: #b7b7b7; + border-radius: 2px; + color: #555; + font: 12px Lato, sans-serif; + height: 34px; + line-height: 0; width: 100%; - margin: 0; } -.scroll-down { - position: absolute; - bottom: 16px; - right: 16px; - z-index: 2; - pointer-events: none; - opacity: 0; - transform: translateY(16px); - transition: transform 0.2s, opacity 0.2s; - cursor: pointer; -} - -.scroll-down-shown { +#chat .show-more-button:hover { opacity: 1; - transform: none; - pointer-events: auto; -} - -.scroll-down-arrow { - width: 36px; - height: 36px; - line-height: 34px; - border-radius: 50%; - background: var(--window-bg-color); - color: var(--button-color); - border: 2px solid var(--button-color); - text-align: center; - transition: background 0.2s, color 0.2s; - box-shadow: 0 6px 10px 0 rgb(0 0 0 / 15%); -} - -.scroll-down:hover .scroll-down-arrow { - background: var(--button-color); - color: var(--button-text-color-hover); -} - -.scroll-down-arrow::after { - content: "\f107"; /* https://fontawesome.com/icons/angle-down?style=solid */ -} - -.userlist-open .chat-view[data-type="channel"] .scroll-down { - right: 196px; } #chat .messages { + display: table; + table-layout: fixed; + width: 100%; padding: 10px 0; - touch-action: pan-y; -} - -#chat .chat-view:not([data-type="special"]) .messages { - margin-top: auto; } #chat .msg { word-wrap: break-word; - word-break: break-word; /* Webkit-specific */ - display: flex; - align-items: flex-start; - position: relative; } #chat .unread-marker { position: relative; text-align: center; + opacity: .5; margin: 0 10px; z-index: 0; - font-weight: bold; - font-size: 12px; } -#chat .unread-marker::before { +#chat .unread-marker:before { position: absolute; z-index: -1; content: ""; left: 0; right: 0; top: 50%; - border-top: 1px solid var(--unread-marker-color); + border-top: 1px solid #e74c3c; } -#chat .unread-marker-text::before { +#chat .unread-marker-text:before { content: "New messages"; - background-color: var(--window-bg-color); - color: var(--unread-marker-color); + background-color: white; + color: #e74c3c; padding: 0 10px; + font: bold 12px Lato; } -#chat .date-marker { - position: relative; - text-align: center; - margin: 0 10px; - z-index: 0; - font-weight: bold; - font-size: 12px; +#chat .unread-marker:last-child { + display: none; } -#chat .date-marker::before { - position: absolute; - z-index: -1; - content: ""; - left: 0; - right: 0; - top: 50%; - border-top: 1px solid var(--date-marker-color); -} - -#chat .date-marker-text::before { - content: attr(aria-label); - background-color: var(--window-bg-color); - color: var(--date-marker-color); - padding: 0 10px; -} - -#chat .time, -#chat .from, -#chat .content { - padding: 3px 0; - flex: 0 0 auto; -} - -#chat .time { - color: var(--body-color-muted); - padding-left: 10px; - width: 55px; - font-variant-numeric: tabular-nums; - box-sizing: content-box; /* highlights have a border-left */ -} - -#chat.time-12h .time, -#chat.time-seconds .time { - width: 75px; -} - -#chat.time-seconds.time-12h .time { - width: 90px; -} - -#chat .from { - padding-right: 10px; - text-align: right; - width: 134px; - overflow: hidden; - white-space: nowrap; - position: relative; -} - -#chat .content { - flex: 1 1 auto; - min-width: 0; - padding-left: 10px; - padding-right: 6px; - border-left: 1px solid #f6f6f6; - overflow: hidden; /* Prevents Zalgo text to expand beyond messages */ - text-align: left; /* so RTL text will still be aligned left, not right */ -} - -#chat .msg[data-type="unhandled"] .from { - color: var(--body-color-muted); -} - -#chat .chat-view[data-type="special"] table th { - word-break: normal; -} - -/* Parsed nicks and channels */ - -#chat .user, .inline-channel { cursor: pointer; } -.chat .user:hover, .inline-channel:hover { - text-decoration: underline; + opacity: .6; +} + +#chat .time, +#chat .from, +#chat .text { + display: table-cell; + padding: 2px 0; + vertical-align: top; +} + +#chat .time { + color: #ddd; + text-align: right; + max-width: 46px; + min-width: 46px; +} + +#chat .from { + border-right: 1px solid #f6f6f6; + color: #b1c3ce; + padding-right: 10px; + text-align: right; + max-width: 134px; + min-width: 134px; +} + +#loading a, +#chat a { + color: #50a656; } /* Nicknames */ -.user { +#chat .user { + cursor: pointer; color: #50a656; } -.user.color-1 { color: #107ead; } -.user.color-2 { color: #a86500; } -.user.color-3 { color: #008a3c; } -.user.color-4 { color: #e00096; } -.user.color-5 { color: #f0000c; } -.user.color-6 { color: #000094; } -.user.color-7 { color: #006441; } -.user.color-8 { color: #00566e; } -.user.color-9 { color: #e6006b; } -.user.color-10 { color: #0d8766; } -.user.color-11 { color: #006b3b; } -.user.color-12 { color: #00857e; } -.user.color-13 { color: #00465b; } -.user.color-14 { color: #eb005a; } -.user.color-15 { color: #e62600; } -.user.color-16 { color: #0f8546; } -.user.color-17 { color: #e60067; } -.user.color-18 { color: #eb002b; } -.user.color-19 { color: #eb003f; } -.user.color-20 { color: #007a56; } -.user.color-21 { color: #095092; } -.user.color-22 { color: #000bde; } -.user.color-23 { color: #008577; } -.user.color-24 { color: #00367d; } -.user.color-25 { color: #007e9e; } -.user.color-26 { color: #006119; } -.user.color-27 { color: #007ea8; } -.user.color-28 { color: #3c8500; } -.user.color-29 { color: #e6007e; } -.user.color-30 { color: #c75300; } -.user.color-31 { color: #eb0400; } -.user.color-32 { color: #e60082; } - -#chat .self .content { - color: var(--body-color-muted); +#chat .user:hover { + opacity: .6; } -#chat .msg.channel_list_loading .text { +#chat.colored-nicks .user.color-1 { color: #1396cf; } +#chat.colored-nicks .user.color-2 { color: #ffcf89; } +#chat.colored-nicks .user.color-3 { color: #00dc5f; } +#chat.colored-nicks .user.color-4 { color: #ff5bc8; } +#chat.colored-nicks .user.color-5 { color: #ff0e1b; } +#chat.colored-nicks .user.color-6 { color: #000094; } +#chat.colored-nicks .user.color-7 { color: #006441; } +#chat.colored-nicks .user.color-8 { color: #00566e; } +#chat.colored-nicks .user.color-9 { color: #ff0078; } +#chat.colored-nicks .user.color-10 { color: #15d5a3; } +#chat.colored-nicks .user.color-11 { color: #006b3b; } +#chat.colored-nicks .user.color-12 { color: #00c5ba; } +#chat.colored-nicks .user.color-13 { color: #00465b; } +#chat.colored-nicks .user.color-14 { color: #ffafce; } +#chat.colored-nicks .user.color-15 { color: #ff3b12; } +#chat.colored-nicks .user.color-16 { color: #16cc6a; } +#chat.colored-nicks .user.color-17 { color: #ff0072; } +#chat.colored-nicks .user.color-18 { color: #ff5877; } +#chat.colored-nicks .user.color-19 { color: #ff1753; } +#chat.colored-nicks .user.color-20 { color: #007a56; } +#chat.colored-nicks .user.color-21 { color: #095092; } +#chat.colored-nicks .user.color-22 { color: #000bde; } +#chat.colored-nicks .user.color-23 { color: #00bca9; } +#chat.colored-nicks .user.color-24 { color: #00367d; } +#chat.colored-nicks .user.color-25 { color: #009ec4; } +#chat.colored-nicks .user.color-26 { color: #006119; } +#chat.colored-nicks .user.color-27 { color: #008bb8; } +#chat.colored-nicks .user.color-28 { color: #469c00; } +#chat.colored-nicks .user.color-29 { color: #ff0f95; } +#chat.colored-nicks .user.color-30 { color: #ff7615; } +#chat.colored-nicks .user.color-31 { color: #ff4846; } +#chat.colored-nicks .user.color-32 { color: #ff199b; } + +#chat .text { + padding-left: 10px; + padding-right: 6px; +} + +#chat .self .text { color: #999; - font-style: italic; - padding-left: 20px; } -#chat .msg.channel_list_truncated .text { - color: #f00; - padding-left: 20px; +#chat .msg.motd .text, +#chat .msg.message .text, +#chat .msg.action .action-text, +#chat .msg.notice .text { + white-space: pre-wrap; + overflow: hidden; } -#chat table.channel-list, -#chat table.ban-list, -#chat table.invite-list, -#chat table.ignore-list { - margin: 5px 10px; - width: calc(100% - 30px); -} - -#chat table.channel-list th, -#chat table.ban-list th, -#chat table.invite-list th, -#chat table.ignore-list th, -#chat table.channel-list td, -#chat table.ban-list td, -#chat table.invite-list td { - padding: 5px; - vertical-align: top; - border-bottom: #eee 1px solid; -} - -#chat table.channel-list .channel { - width: 80px; -} - -#chat table.channel-list .channel, -#chat table.channel-list .topic, -#chat table.ban-list .hostmask, -#chat table.ban-list .banned_by, -#chat table.ban-list .banned_at, -#chat table.ignore-list .hostmask, -#chat table.ignore-list .when { - text-align: left; -} - -#chat table.channel-list .users { - text-align: center; - width: 50px; -} - -#chat.hide-motd .msg[data-command="motd"] { +#chat.hide-join .join, +#chat.hide-mode .mode, +#chat.hide-motd .motd, +#chat.hide-nick .nick, +#chat.hide-part .part, +#chat.hide-quit .quit { display: none !important; } -#chat .msg[data-type="monospace_block"] .text { - background: #f6f6f6; - display: inline-block; - border-radius: 4px; - padding: 6px; +#chat .join .text, +#chat .kick .text, +#chat .mode .text, +#chat .nick .text, +#chat .part .text, +#chat .quit .text, +#chat .topic .text, +#chat .topic_set_by .text { + color: #999; } -#chat .msg[data-type="condensed"] .content, -#chat .msg[data-type="away"] .content, -#chat .msg[data-type="back"] .content, -#chat .msg[data-type="join"] .content, -#chat .msg[data-type="kick"] .content, -#chat .msg[data-type="mode"] .content, -#chat .msg[data-type="nick"] .content, -#chat .msg[data-type="chghost"] .content, -#chat .msg[data-type="part"] .content, -#chat .msg[data-type="quit"] .content, -#chat .msg[data-type="topic"] .content, -#chat .msg[data-type="topic_set_by"] .content { - color: var(--body-color-muted); -} - -#chat .msg[data-type="action"] .from, -#chat .msg[data-type="action"] .content, -#chat .msg[data-type="action"] .user { +#chat .action .from, +#chat .action .text, +#chat .action .user { color: #f39c12; } -#chat .msg[data-type="notice"] .time, -#chat .msg[data-type="wallops"] .time, -#chat .msg[data-type="notice"] .content, -#chat .msg[data-type="wallops"] .content, -#chat .msg[data-type="notice"] .user, -#chat .msg[data-type="wallops"] .user { - color: #0074d9; +#chat .notice .time, +#chat .notice .text, +#chat .chan .notice .user { + color: #0074d9 !important; } -#chat .msg[data-type="notice"] .from .user::before { +#chat .notice .user:before { content: "Notice: "; } -#chat .msg[data-type="wallops"] .from .user::before { - content: "Wallops: "; +#chat .error, +#chat .error .from, +#chat .channel .highlight .from, +#chat .channel .highlight .text, +#chat .channel .highlight .user { + color: #f00; } -#chat .msg[data-type="error"], -#chat .msg[data-type="error"] .from { - color: #e74c3c; +#chat .unhandled .from { + color: #eee; } -#chat .chat-view[data-type="channel"] .msg.highlight { - background-color: var(--highlight-bg-color); - border-left: 5px solid var(--highlight-border-color); +#chat .msg.toggle .time { + visibility: hidden; } -#chat .chat-view[data-type="channel"] .msg.highlight .time { - padding-left: 5px; - color: #696969; -} - -#chat .chat-view[data-type="channel"] .msg.highlight .content { - border-left: 1px solid var(--highlight-bg-color); -} - -#chat .preview-size { - margin-left: 5px; - user-select: none; -} - -#chat .toggle-content.opened .more-caret, /* Expand/Collapse link previews */ -#chat .toggle-button.opened, /* Thumbnail toggle */ -#chat .msg:not(.closed)[data-type="condensed"] .toggle-button { /* Expanded status message toggle */ - transform: rotate(90deg); -} - -#chat .preview { - display: flex; /* Fix odd margin added by inline-flex in .toggle-content */ +#chat .toggle-button { + background: #f5f5f5; + border-radius: 2px; + display: inline-block; + color: #666; + height: 1em; + line-height: 0; + padding: 0 6px; } #chat .toggle-content { - background: #f6f6f6; - border-radius: 5px; + background: #f5f5f5; + border-radius: 2px; + display: none; + color: #222; + font: 12px Lato; max-width: 100%; - margin: 0; - margin-top: 6px; - overflow: hidden; - box-shadow: 0 1px 3px rgb(0 0 0 / 20%); - display: inline-flex !important; - align-items: flex-start; - white-space: normal; + padding: 6px 8px; + margin-top: 2px; +} + +#chat .toggle-content a { + color: inherit; } -/* This applies to images of preview-type-image and thumbnails of preview-type-link */ #chat .toggle-content img { max-width: 100%; - max-height: 128px; + max-height: 250px; display: block; - cursor: zoom-in; + margin: 2px 0; } -#chat .toggle-content pre.prefetch-error { - padding: 0; - margin: 0; - color: inherit; - background-color: transparent; -} - -#chat .toggle-content .prefetch-error { - display: none; -} - -#chat .toggle-content.opened .prefetch-error { - display: inline; -} - -/* This applies to thumbnails of preview-type-link only */ #chat .toggle-content .thumb { - max-height: 54px; - max-width: 96px; -} - -#chat .toggle-type-error, -#chat .toggle-content .toggle-text { - padding: 8px 10px; -} - -#chat .toggle-content .toggle-text { - white-space: nowrap; - overflow: hidden; - text-align: initial; -} - -#chat .toggle-content.opened .toggle-text { - white-space: normal; + max-height: 110px; + max-width: 210px; } #chat .toggle-content .head { - display: flex; - align-items: flex-start; font-weight: bold; } -#chat .toggle-type-error, -#chat .toggle-text .body { - color: #717171; +#chat .toggle-content .body { + color: #999; + max-width: 460px; + word-break: normal; + word-wrap: break-word; } -#chat .toggle-text a { - color: inherit; +#chat .toggle-content.show { + display: inline-block !important; } -#chat .toggle-text .overflowable { - text-overflow: ellipsis; - overflow: hidden; - flex-grow: 1; -} - -#chat .toggle-content .more { - color: var(--link-color); - font-weight: normal; - margin-left: 10px; - flex-shrink: 0; -} - -#chat .toggle-content .more:hover { - text-decoration: underline; -} - -#chat .toggle-content .more::after { - content: " " attr(aria-label); -} - -#chat .toggle-content .more-caret { - display: inline-block; - transition: transform 0.2s; -} - -#chat .toggle-content .more-caret::before { - content: "\f0da"; /* https://fontawesome.com/icons/caret-right?style=solid */ -} - -#chat audio { - width: 600px; - max-width: 100%; -} - -#chat .toggle-type-video { - max-width: 640px; -} - -#chat video { - max-width: 100%; - max-height: 240px; -} - -/* Do not display an empty div when there are no previews. Useful for example in -part/quit messages where we don't load previews (adds a blank line otherwise) */ -#chat .preview:empty { - display: none; -} - -#chat .userlist .count { +#chat .count { background: #fafafa; - height: 45px; - flex-shrink: 0; - position: relative; + height: 48px; + left: 0; + position: absolute; + right: 0; + top: 0; } -#chat .userlist .search { - color: var(--body-color); - appearance: none; +#chat .search { + color: #222; border: 0; background: none; font: inherit; outline: 0; - padding: 13px; - padding-right: 30px; + padding: 18px 16px; + position: relative; width: 100%; } -#chat .userlist .names { - flex-grow: 1; +#chat .names { + bottom: 0; overflow: auto; overflow-x: hidden; - padding-bottom: 10px; - width: 100%; - touch-action: pan-y; - scrollbar-width: thin; - overscroll-behavior: contain; -webkit-overflow-scrolling: touch; + padding-bottom: 10px; + position: absolute; + top: 48px; + width: 100%; } #chat .names .user { display: block; line-height: 1.6; padding: 0 16px; - white-space: nowrap; } -#chat .user-mode { - margin-bottom: 15px; -} - -#chat .user-mode::before { - background: var(--window-bg-color); - color: var(--body-color-muted); +#chat .user-mode:before { + content: ""; + border-bottom: 1px solid #eee; display: block; - font-size: 0.85em; line-height: 1.6; - padding: 5px 16px; - position: sticky; - top: 0; + padding: 12px 16px 10px; + margin-bottom: 10px; } -#chat .user-mode.owner::before { +#chat .user-mode.owner:before { content: "Owners"; } -#chat .user-mode.admin::before { +#chat .user-mode.admin:before { content: "Administrators"; } -#chat .user-mode.op::before { +#chat .user-mode.op:before { content: "Operators"; } -#chat .user-mode.half-op::before { +#chat .user-mode.half-op:before { content: "Half-Operators"; } -#chat .user-mode.voice::before { +#chat .user-mode.voice:before { content: "Voiced"; } -#chat .user-mode.normal::before { +#chat .user-mode.normal:before { content: "Users"; } -#chat .user-mode-search::before { - content: "Search Results"; -} - #loading { - display: flex; font-size: 14px; - height: 100%; -} - -#loading .window { - height: initial; - display: flex; - flex-direction: column; + z-index: 1; } #loading p { margin-top: 10px; } -#loading-slow, -#loading-reload { - visibility: hidden; -} - -#loading summary { - outline: none; - cursor: pointer; -} - -#loading pre { - text-align: left; - white-space: normal; -} - -#sign-in .container, -#loading-reload-container, -#loading-status-container { - flex: 1 0 auto; - display: flex; - align-items: center; - justify-content: center; - flex-direction: column; -} - -#loading-reload-container { - flex-grow: 0; -} - -#loading .logo-inverted, -.window .logo-inverted { - display: none; /* In dark themes, inverted logo must be used instead */ +#loading-slow { + display: none; } #sign-in label { display: block; margin-top: 10px; - width: 100%; +} + +#sign-in .remember { + float: left; + font-size: 14px; + margin-top: 12px; +} + +#sign-in .remember input { + float: left; + margin: 3px 10px 0 0; } #sign-in .btn { @@ -1880,112 +1152,67 @@ part/quit messages where we don't load previews (adds a blank line otherwise) */ #sign-in .error { color: #e74c3c; margin-top: 1em; - width: 100%; -} - -#connect .connect-row { - display: flex; -} - -#connect .connect-row > .input, -#connect .connect-row > .input-wrap { - flex-grow: 1; } #connect label { - width: 25%; - flex-shrink: 0; + display: block; margin-top: 11px; } +#connect .port:before { + content: ":"; + margin: 9px 0 0 -17px; + position: absolute; +} + #connect .tls { - width: 100%; - display: block; + float: left; + font-size: 14px; margin-top: 6px; } -#connect .tls input, -#connect input[name="proxyEnabled"] { +#connect .tls input { + float: left; margin: 3px 10px 0 0; } -#connect\:host, -#connect\:proxyHost { - width: 70%; -} - -#connect\:port, -#connect\:proxyPort { - width: 25%; -} - -#connect\:portseparator, -#connect\:proxyPortSeparator { - width: 5%; - text-align: center; - display: inline-block; -} - #connect .btn { - margin-top: 15px; - width: 100%; -} - -#settings .settings-sync-panel { - padding: 10px; - margin-bottom: 16px; - border-radius: 2px; - background-color: #d9edf7; - color: #31708f; -} - -#settings .settings-sync-panel p:last-child { - margin-bottom: 0; -} - -#settings .settings-sync-panel .btn { - color: #007bff; - border-color: #007bff; - margin-bottom: 0; -} - -#settings .settings-sync-panel .btn:hover, -#settings .settings-sync-panel .btn:focus { - background-color: #007bff; - color: #fff; -} - -#settings .settings-sync-panel .btn:active, -#settings .settings-sync-panel .btn:focus { - box-shadow: 0 0 0 3px rgb(0 123 255 / 50%); + float: left; + margin-top: 30px; } #settings .opt { display: block; - padding: 5px 0 5px 1px; + padding: 5px 0 10px 1px; } #settings .opt input { - margin-right: 6px; + float: left; + margin: 4px 10px 0 0; } -#connect .extra-help, -#settings .extra-help { - cursor: help; +#settings .about, +#settings #play { + color: #7f8c8d; } -#settings h2 .extra-help { - font-size: 0.8em; +#settings .about small { + margin-left: 2px; } #settings #play { font-size: 14px; - transition: opacity 0.2s; - color: var(--window-heading-color); + transition: opacity .2s; } #settings #play:hover { - opacity: 0.8; + opacity: .8; +} + +#settings .about { + font-size: 14px; + padding-top: 2px; + line-height: 1.8; } #settings #change-password .error, @@ -2003,282 +1230,83 @@ part/quit messages where we don't load previews (adds a blank line otherwise) */ #settings .error { color: #e74c3c; - margin-top: 0.2em; -} - -.password-container { - position: relative; -} - -.password-container input { - padding-right: 37px; -} - -#sign-in .password-container { - width: 100%; -} - -#sign-in .password-container .reveal-password { - top: 31px; -} - -.password-container .reveal-password { - position: absolute; - top: 2px; - right: 0; - appearance: none; -} - -.password-container .reveal-password span { - font-size: 16px; - color: #607992; - width: 35px; - height: 35px; - display: flex; - justify-content: center; - align-items: center; - cursor: pointer; -} - -.password-container .reveal-password span::before { - content: "\f06e"; /* https://fontawesome.com/icons/eye?style=solid */ -} - -.topic-container .save-topic span::before { - content: "\f00c"; /* https://fontawesome.com/icons/check?style=solid */ -} - -.password-container .reveal-password-visible span::before { - content: "\f070"; /* https://fontawesome.com/icons/eye-slash?style=solid */ - color: #ff4136; -} - -#help .help-version-title { - display: flex; - justify-content: space-between; -} - -#help .help-item { - display: table-row; - font-size: 14px; -} - -#help .help-item .subject, -#help .help-item .description { - display: table-cell; - padding-bottom: 15px; -} - -#help .help-item .subject { - white-space: nowrap; - padding-right: 15px; -} - -#help .help-item .subject.gesture { - font-weight: bold; -} - -#help .help-item .description p { - margin-bottom: 0; -} - -.whois { - display: grid; - grid-template-columns: max-content auto; - margin: 0; -} - -.whois dt { - grid-column-start: 1; - margin-right: 20px; -} - -.whois dd { - grid-column-start: 2; -} - -.changelog-text { - line-height: 1.5; -} - -.changelog-text p { - margin-bottom: 16px; -} - -.window#changelog h3 { - font-size: 20px; - border-bottom: 1px solid currentcolor; - color: var(--window-heading-color); - margin: 30px 0 10px; - padding-bottom: 7px; -} - -.window#chat-container { - /* - Chat has its own scrollbar, so remove the one on parent - This caused a performance issue in Chrome - */ - overflow: hidden; -} - -#version-checker { - display: flex; - align-items: center; - padding: 10px; - margin-bottom: 16px; - border-radius: 2px; - transition: color 0.2s, background-color 0.2s; -} - -#version-checker p, -#version-checker button { - margin-bottom: 0; -} - -#version-checker p { - flex: 1; - padding-top: 6px; - padding-bottom: 6px; -} - -#version-checker::before { - margin-left: 6px; - margin-right: 12px; - font-size: 1.2em; -} - -#version-checker.loading { - background-color: #d9edf7; - color: #31708f; -} - -#version-checker.loading::before { - content: "\f253"; /* https://fontawesome.com/icons/hourglass-end?style=solid */ -} - -#version-checker.new-version, -#version-checker.new-packages { - color: #8a6d3b; - background-color: #fcf8e3; -} - -#version-checker.new-version::before, -#version-checker.new-packages::before { - content: "\f164"; /* https://fontawesome.com/icons/thumbs-up?style=solid */ -} - -#version-checker.error { - color: #a94442; - background-color: #f2dede; -} - -#version-checker.error::before { - content: "\f06a"; /* http://fontawesome.io/icon/exclamation-circle/ */ -} - -#version-checker.up-to-date { - background-color: #dff0d8; - color: #3c763d; -} - -#version-checker.up-to-date::before { - content: "\f00c"; /* http://fontawesome.io/icon/check/ */ -} - -#upload-progressbar { - background: var(--upload-progressbar-color); - box-shadow: 0 0 10px var(--upload-progressbar-color); - width: 0%; - height: 2px; - visibility: hidden; - position: absolute; - top: -1px; /* put it on top of #form's border */ - left: 0; -} - -#upload-progressbar.upload-progressbar-visible { - visibility: visible; - transition: 0.3s width ease-in-out; + margin-top: .2em; } #form { + background: #eee; + border-top: 1px solid #ddd; flex: 0 0 auto; - border: 0; - border-top: 1px solid #e7e7e7; - border-radius: 0; + padding: 5px; +} + +#windows #form .input { + font: 12px Consolas, Menlo, Monaco, "Lucida Console", "DejaVu Sans Mono", "Courier New", monospace; + border: 1px solid #ddd; + border-radius: 2px; margin: 0; - padding: 6px; + padding: 0; background: white; display: flex; align-items: flex-end; - position: relative; -} - -#user-visible-error { - font-size: 14px; - line-height: 1.5; - font-weight: 600; - padding: 10px; - word-spacing: 3px; - text-transform: uppercase; - background: #e74c3c; - color: #fff; - text-align: center; - cursor: pointer; } #form #nick { background: #f6f6f6; color: #666; - font-size: 13px; + font: inherit; + font-size: 11px; margin: 4px; - line-height: 24px; - padding: 0 8px; - border-radius: 2px; - display: none; + line-height: 26px; + height: 24px; + padding: 0 9px; + border-radius: 1px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + flex: 0 0 auto; } -.public #form #nick { - display: block; +#form #nick:empty { + visibility: hidden; +} + +#form #nick:after { + content: ":"; } #form #input { background: transparent; border: none; font: inherit; - min-height: 19px; /* Required when computing input height at char deletion */ - height: 19px; - max-height: 95px; /* min-height/height x number of lines maximum */ - line-height: 19px; /* should match height */ + min-height: 18px; /* Required when computing input height at char deletion */ + height: 18px; + max-height: 90px; + line-height: 1.5; outline: none; margin: 5px; padding: 0; resize: none; flex: 1 0 auto; align-self: center; - touch-action: pan-y; } -#form #upload-input { - display: none; -} - -#form #upload, #form #submit { - color: #607992; + color: #9ca5b4; font-size: 14px; height: 32px; + transition: opacity .2s; width: 32px; flex: 0 0 auto; } -#form #upload[disabled], -#form #submit[disabled] { - opacity: 0.5; +#form #submit:hover { + opacity: .6; } -#mentions-popup-container, #context-menu-container { + display: none; position: absolute; top: 0; left: 0; @@ -2288,290 +1316,267 @@ part/quit messages where we don't load previews (adds a blank line otherwise) */ background: transparent; } -#context-menu-container.passthrough { - pointer-events: none; -} - -#context-menu-container.passthrough > * { - pointer-events: auto; -} - -.mentions-popup, -#context-menu, -.textcomplete-menu { +#context-menu { position: absolute; list-style: none; margin: 0; - padding: 0 6px; - min-width: 180px; + padding: 0; + min-width: 160px; font-size: 14px; background-color: #fff; - box-shadow: 0 3px 12px rgb(0 0 0 / 15%); - border: 1px solid rgb(0 0 0 / 15%); - border-radius: 5px; - outline: 0; + box-shadow: 0 3px 12px rgba(0, 0, 0, .15); + border: 1px solid rgba(0, 0, 0, .15); + border-radius: 2px; } .context-menu-divider { height: 1px; margin: 6px 0; - background-color: rgb(0 0 0 / 10%); + background-color: rgba(0, 0, 0, .1); } -.context-menu-item, -.textcomplete-item { +.context-menu-item { cursor: pointer; display: block; padding: 4px 8px; color: #333; margin-top: 6px; margin-bottom: 6px; - line-height: 1.4; - border-radius: 3px; - white-space: nowrap; } -.context-menu-item.active, -.textcomplete-item:focus, -.textcomplete-item:hover, -.textcomplete-menu .active, -#chat .userlist .user.active { - background-color: rgb(0 0 0 / 10%); +.context-menu-item:hover { + background-color: #f6f6f6; } -.context-menu-item::before, -.textcomplete-item::before { +.context-menu-item:before { width: 20px; display: inline-block; } -.textcomplete-item a { - color: #333; +/** + * Tooltips + * See http://primercss.io/tooltips/ + */ +.tooltipped { + position: relative; } -.textcomplete-item a:hover { +.tooltipped:after { + position: absolute; + z-index: 1000000; + display: inline-block; + visibility: hidden; + opacity: 0; + padding: 5px 8px; + font-size: 12px; + line-height: 1.2; + color: #262c36; + text-align: center; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-wrap: break-word; + white-space: pre; + pointer-events: none; + content: attr(aria-label); + background: #fff; + border-radius: 3px; + -webkit-font-smoothing: subpixel-antialiased; + transition: .2s; +} + +.tooltipped:before { + position: absolute; + z-index: 1000001; + display: inline-block; + visibility: hidden; + opacity: 0; + width: 0; + height: 0; + color: #262c36; + pointer-events: none; + content: ""; + border: 5px solid transparent; + transition: .2s; +} + +.tooltipped:hover:before, +.tooltipped:hover:after, +.tooltipped:active:before, +.tooltipped:active:after, +.tooltipped:focus:before, +.tooltipped:focus:after { + visibility: visible; + opacity: 1; text-decoration: none; } -.emoji { - font-size: 1.4em; - vertical-align: text-top; - line-height: 1; +.tooltipped-s:after, +.tooltipped-se:after, +.tooltipped-sw:after { + top: 100%; + right: 50%; + margin-top: 5px; } -.textcomplete-item .emoji { - width: 32px; - text-align: center; +.tooltipped-s:before, +.tooltipped-se:before, +.tooltipped-sw:before { + top: auto; + right: 50%; + bottom: -5px; + margin-right: -5px; + border-bottom-color: #fff; } -.textcomplete-item .irc-bg { - display: block; +.tooltipped-se:after { + right: auto; + left: 50%; + margin-left: -15px; +} + +.tooltipped-sw:after { + margin-right: -15px; +} + +.tooltipped-n:after, +.tooltipped-ne:after, +.tooltipped-nw:after { + right: 50%; + bottom: 100%; + margin-bottom: 5px; +} + +.tooltipped-n:before, +.tooltipped-ne:before, +.tooltipped-nw:before { + top: -5px; + right: 50%; + bottom: auto; + margin-right: -5px; + border-top-color: #fff; +} + +.tooltipped-ne:after { + right: auto; + left: 50%; + margin-left: -15px; +} + +.tooltipped-nw:after { + margin-right: -15px; +} + +.tooltipped-s:after, +.tooltipped-n:after { + -webkit-transform: translateX(50%); + -ms-transform: translateX(50%); + transform: translateX(50%); +} + +.tooltipped-w:after { + right: 100%; + bottom: 50%; + margin-right: 5px; + -webkit-transform: translateY(50%); + -ms-transform: translateY(50%); + transform: translateY(50%); +} + +.tooltipped-w:before { + top: 50%; + bottom: 50%; + left: -5px; + margin-top: -5px; + border-left-color: #fff; +} + +.tooltipped-e:after { + bottom: 50%; + left: 100%; + margin-left: 5px; + -webkit-transform: translateY(50%); + -ms-transform: translateY(50%); + transform: translateY(50%); +} + +.tooltipped-e:before { + top: 50%; + right: -5px; + bottom: 50%; + margin-top: -5px; + border-right-color: #fff; } /** * IRC Message Styling + * https://github.com/megawac/irc-style-parser * Colours are credit to http://clrs.cc/ */ .irc-fg0 { color: #fff; } -.irc-fg1 { color: #000; } -.irc-fg2 { color: #001f3f; } -.irc-fg3 { color: #2ecc40; } -.irc-fg4 { color: #ff4136; } -.irc-fg5 { color: #85144b; } -.irc-fg6 { color: #b10dc9; } -.irc-fg7 { color: #ff851b; } -.irc-fg8 { color: #ffdc00; } -.irc-fg9 { color: #01ff70; } -.irc-fg10 { color: #39cccc; } -.irc-fg11 { color: #7fdbff; } -.irc-fg12 { color: #0074d9; } -.irc-fg13 { color: #f012be; } -.irc-fg14 { color: #aaa; } -.irc-fg15 { color: #ddd; } -.irc-bg0 { background: #fff; } -.irc-bg1 { background: #000; } -.irc-bg2 { background: #001f3f; } -.irc-bg3 { background: #2ecc40; } -.irc-bg4 { background: #ff4136; } -.irc-bg5 { background: #85144b; } -.irc-bg6 { background: #b10dc9; } -.irc-bg7 { background: #ff851b; } -.irc-bg8 { background: #ffdc00; } -.irc-bg9 { background: #01ff70; } -.irc-bg10 { background: #39cccc; } -.irc-bg11 { background: #7fdbff; } -.irc-bg12 { background: #0074d9; } -.irc-bg13 { background: #f012be; } -.irc-bg14 { background: #aaa; } -.irc-bg15 { background: #ddd; } -/* https://modern.ircdocs.horse/formatting.html#colors-16-98 */ -.irc-fg16 { color: #470000; } -.irc-fg17 { color: #472100; } -.irc-fg18 { color: #474700; } -.irc-fg19 { color: #324700; } -.irc-fg20 { color: #004700; } -.irc-fg21 { color: #00472c; } -.irc-fg22 { color: #004747; } -.irc-fg23 { color: #002747; } -.irc-fg24 { color: #000047; } -.irc-fg25 { color: #2e0047; } -.irc-fg26 { color: #470047; } -.irc-fg27 { color: #47002a; } -.irc-fg28 { color: #740000; } -.irc-fg29 { color: #743a00; } -.irc-fg30 { color: #747400; } -.irc-fg31 { color: #517400; } -.irc-fg32 { color: #007400; } -.irc-fg33 { color: #007449; } -.irc-fg34 { color: #007474; } -.irc-fg35 { color: #004074; } -.irc-fg36 { color: #000074; } -.irc-fg37 { color: #4b0074; } -.irc-fg38 { color: #740074; } -.irc-fg39 { color: #740045; } -.irc-fg40 { color: #b50000; } -.irc-fg41 { color: #b56300; } -.irc-fg42 { color: #b5b500; } -.irc-fg43 { color: #7db500; } -.irc-fg44 { color: #00b500; } -.irc-fg45 { color: #00b571; } -.irc-fg46 { color: #00b5b5; } -.irc-fg47 { color: #0063b5; } -.irc-fg48 { color: #0000b5; } -.irc-fg49 { color: #7500b5; } -.irc-fg50 { color: #b500b5; } -.irc-fg51 { color: #b5006b; } -.irc-fg52 { color: #f00; } -.irc-fg53 { color: #ff8c00; } -.irc-fg54 { color: #ff0; } -.irc-fg55 { color: #b2ff00; } -.irc-fg56 { color: #0f0; } -.irc-fg57 { color: #00ffa0; } -.irc-fg58 { color: #0ff; } -.irc-fg59 { color: #008cff; } -.irc-fg60 { color: #00f; } -.irc-fg61 { color: #a500ff; } -.irc-fg62 { color: #f0f; } -.irc-fg63 { color: #ff0098; } -.irc-fg64 { color: #ff5959; } -.irc-fg65 { color: #ffb459; } -.irc-fg66 { color: #ffff71; } -.irc-fg67 { color: #cfff60; } -.irc-fg68 { color: #6fff6f; } -.irc-fg69 { color: #65ffc9; } -.irc-fg70 { color: #6dffff; } -.irc-fg71 { color: #59b4ff; } -.irc-fg72 { color: #5959ff; } -.irc-fg73 { color: #c459ff; } -.irc-fg74 { color: #f6f; } -.irc-fg75 { color: #ff59bc; } -.irc-fg76 { color: #ff9c9c; } -.irc-fg77 { color: #ffd39c; } -.irc-fg78 { color: #ffff9c; } -.irc-fg79 { color: #e2ff9c; } -.irc-fg80 { color: #9cff9c; } -.irc-fg81 { color: #9cffdb; } -.irc-fg82 { color: #9cffff; } -.irc-fg83 { color: #9cd3ff; } -.irc-fg84 { color: #9c9cff; } -.irc-fg85 { color: #dc9cff; } -.irc-fg86 { color: #ff9cff; } -.irc-fg87 { color: #ff94d3; } -.irc-fg88 { color: #000; } -.irc-fg89 { color: #131313; } -.irc-fg90 { color: #282828; } -.irc-fg91 { color: #363636; } -.irc-fg92 { color: #4d4d4d; } -.irc-fg93 { color: #656565; } -.irc-fg94 { color: #818181; } -.irc-fg95 { color: #9f9f9f; } -.irc-fg96 { color: #bcbcbc; } -.irc-fg97 { color: #e2e2e2; } -.irc-fg98 { color: #fff; } -.irc-bg16 { background-color: #470000; } -.irc-bg17 { background-color: #472100; } -.irc-bg18 { background-color: #474700; } -.irc-bg19 { background-color: #324700; } -.irc-bg20 { background-color: #004700; } -.irc-bg21 { background-color: #00472c; } -.irc-bg22 { background-color: #004747; } -.irc-bg23 { background-color: #002747; } -.irc-bg24 { background-color: #000047; } -.irc-bg25 { background-color: #2e0047; } -.irc-bg26 { background-color: #470047; } -.irc-bg27 { background-color: #47002a; } -.irc-bg28 { background-color: #740000; } -.irc-bg29 { background-color: #743a00; } -.irc-bg30 { background-color: #747400; } -.irc-bg31 { background-color: #517400; } -.irc-bg32 { background-color: #007400; } -.irc-bg33 { background-color: #007449; } -.irc-bg34 { background-color: #007474; } -.irc-bg35 { background-color: #004074; } -.irc-bg36 { background-color: #000074; } -.irc-bg37 { background-color: #4b0074; } -.irc-bg38 { background-color: #740074; } -.irc-bg39 { background-color: #740045; } -.irc-bg40 { background-color: #b50000; } -.irc-bg41 { background-color: #b56300; } -.irc-bg42 { background-color: #b5b500; } -.irc-bg43 { background-color: #7db500; } -.irc-bg44 { background-color: #00b500; } -.irc-bg45 { background-color: #00b571; } -.irc-bg46 { background-color: #00b5b5; } -.irc-bg47 { background-color: #0063b5; } -.irc-bg48 { background-color: #0000b5; } -.irc-bg49 { background-color: #7500b5; } -.irc-bg50 { background-color: #b500b5; } -.irc-bg51 { background-color: #b5006b; } -.irc-bg52 { background-color: #f00; } -.irc-bg53 { background-color: #ff8c00; } -.irc-bg54 { background-color: #ff0; } -.irc-bg55 { background-color: #b2ff00; } -.irc-bg56 { background-color: #0f0; } -.irc-bg57 { background-color: #00ffa0; } -.irc-bg58 { background-color: #0ff; } -.irc-bg59 { background-color: #008cff; } -.irc-bg60 { background-color: #00f; } -.irc-bg61 { background-color: #a500ff; } -.irc-bg62 { background-color: #f0f; } -.irc-bg63 { background-color: #ff0098; } -.irc-bg64 { background-color: #ff5959; } -.irc-bg65 { background-color: #ffb459; } -.irc-bg66 { background-color: #ffff71; } -.irc-bg67 { background-color: #cfff60; } -.irc-bg68 { background-color: #6fff6f; } -.irc-bg69 { background-color: #65ffc9; } -.irc-bg70 { background-color: #6dffff; } -.irc-bg71 { background-color: #59b4ff; } -.irc-bg72 { background-color: #5959ff; } -.irc-bg73 { background-color: #c459ff; } -.irc-bg74 { background-color: #f6f; } -.irc-bg75 { background-color: #ff59bc; } -.irc-bg76 { background-color: #ff9c9c; } -.irc-bg77 { background-color: #ffd39c; } -.irc-bg78 { background-color: #ffff9c; } -.irc-bg79 { background-color: #e2ff9c; } -.irc-bg80 { background-color: #9cff9c; } -.irc-bg81 { background-color: #9cffdb; } -.irc-bg82 { background-color: #9cffff; } -.irc-bg83 { background-color: #9cd3ff; } -.irc-bg84 { background-color: #9c9cff; } -.irc-bg85 { background-color: #dc9cff; } -.irc-bg86 { background-color: #ff9cff; } -.irc-bg87 { background-color: #ff94d3; } -.irc-bg88 { background-color: #000; } -.irc-bg89 { background-color: #131313; } -.irc-bg90 { background-color: #282828; } -.irc-bg91 { background-color: #363636; } -.irc-bg92 { background-color: #4d4d4d; } -.irc-bg93 { background-color: #656565; } -.irc-bg94 { background-color: #818181; } -.irc-bg95 { background-color: #9f9f9f; } -.irc-bg96 { background-color: #bcbcbc; } -.irc-bg97 { background-color: #e2e2e2; } -.irc-bg98 { background-color: #fff; } +.irc-fg1 { color: #000; } + +.irc-fg2 { color: #001f3f; } + +.irc-fg3 { color: #2ecc40; } + +.irc-fg4 { color: #ff4136; } + +.irc-fg5 { color: #85144b; } + +.irc-fg6 { color: #b10dc9; } + +.irc-fg7 { color: #ff851b; } + +.irc-fg8 { color: #ffdc00; } + +.irc-fg9 { color: #01ff70; } + +.irc-fg10 { color: #39cccc; } + +.irc-fg11 { color: #7fdbff; } + +.irc-fg12 { color: #0074d9; } + +.irc-fg13 { color: #f012be; } + +.irc-fg14 { color: #aaa; } + +.irc-fg15 { color: #ddd; } + +.irc-bg0 { background: #fff; } + +.irc-bg1 { background: #000; } + +.irc-bg2 { background: #001f3f; } + +.irc-bg3 { background: #2ecc40; } + +.irc-bg4 { background: #ff4136; } + +.irc-bg5 { background: #85144b; } + +.irc-bg6 { background: #b10dc9; } + +.irc-bg7 { background: #ff851b; } + +.irc-bg8 { background: #ffdc00; } + +.irc-bg9 { background: #01ff70; } + +.irc-bg10 { background: #39cccc; } + +.irc-bg11 { background: #7fdbff; } + +.irc-bg12 { background: #0074d9; } + +.irc-bg13 { background: #f012be; } + +.irc-bg14 { background: #aaa; } + +.irc-bg15 { background: #ddd; } .irc-bold { font-weight: bold; @@ -2581,362 +1586,115 @@ part/quit messages where we don't load previews (adds a blank line otherwise) */ text-decoration: underline; } -.irc-strikethrough { - text-decoration: line-through; -} - -.irc-underline.irc-strikethrough { - text-decoration: underline line-through; -} - .irc-italic { font-style: italic; } -.tooltipped::after { - font-size: 12px; -} - -@media (min-width: 480px) { - /* Fade out for long usernames */ - #chat .from { - padding-left: 10px; - mask-image: linear-gradient(to left, transparent, black 10px); - } -} - @media (max-width: 768px) { - /** - * TODO Replace this with `@media (hover: hover)` when Firefox supports it - * See: - * - http://stackoverflow.com/a/28058919/1935861 - * - http://caniuse.com/#feat=css-media-interaction - * - https://www.w3.org/TR/mediaqueries-4/ - * - https://developer.mozilla.org/en-US/docs/Web/CSS/@media/hover - */ - .tooltipped-no-touch:hover::before, - .tooltipped-no-touch:hover::after { - visibility: hidden; - opacity: 0; + .container { + margin-top: 60px !important; } - #sidebar .logo-container { - margin-top: 5px; - } - - .channel-list-item, - #sidebar .empty, - .window label, - .header .topic, - #settings .error, - #help .help-item, - #loading, - #context-menu, - #form #input, - .textcomplete-menu, - .messages .msg { - font-size: 15px; - } - - #sidebar { - display: flex; - background: var(--body-bg-color); - height: 100%; - position: absolute; - left: -220px; - z-index: 10; - transition: transform 160ms; - transform: translateZ(0); - } - - #sidebar-overlay { - position: fixed; - top: 0; - bottom: 0; - left: 0; - right: 0; - background: var(--overlay-bg-color); - opacity: 0; - visibility: hidden; - transition: opacity 160ms, visibility 160ms; - z-index: 9; - } - - #viewport.menu-open #sidebar-overlay { - opacity: 1; - } - - #viewport.menu-open #sidebar { + #viewport.lt { + -webkit-transform: translate3d(220px, 0, 0); transform: translate3d(220px, 0, 0); } - #viewport.menu-dragging #sidebar-overlay, - #viewport.menu-dragging #sidebar { - transition: none; + #viewport.rt #chat .sidebar { + -webkit-transform: translate3d(-180px, 0, 0); + transform: translate3d(-180px, 0, 0); } - #viewport.menu-open #sidebar, - #viewport.menu-dragging #sidebar { - box-shadow: 0 0 25px 0 rgb(0 0 0 / 50%); + #sidebar { + left: -220px; } - #viewport.menu-open #sidebar-overlay, - #viewport.menu-dragging #sidebar-overlay { - visibility: visible; + #footer { + left: -215px; + width: 215px; } - /* On mobile display, channel list button stays at the top */ - #viewport .lt { - position: relative; + #sidebar .empty:before { + margin-top: 0; } - #chat .userlist { - background-color: var(--window-bg-color); - height: 100%; - position: absolute; + #main { + left: 5px; + right: 5px; + } + + #chat .chat { right: 0; - transform: translateX(180px); - transition: transform 0.2s; - z-index: 1; } - #viewport.userlist-open #chat .userlist { - transform: translateX(0); + #viewport .lt, + #viewport .channel .rt { + display: block; } - #chat .header .title { - padding-left: 6px; + #windows .window .header { + display: block; } - #chat .toggle-content .thumb { - max-height: 58px; - max-width: 104px; + #chat .sidebar { + right: -180px; + } + + #chat .title:before { + display: none; } } @media (max-width: 479px) { .container { - max-width: 100%; - margin: 0; + margin: 40px 0 !important; } - #sign-in .btn { - width: 100%; + #connect .tls { + margin: 20px 0; } - .input { + #windows .input { margin-bottom: 2px; } - #connect .connect-row { - flex-direction: column; - } - - #connect .connect-row > .input, - #connect .connect-row > .input-wrap { - flex-grow: 1; - } - - #help .help-version-title { - flex-direction: column; - } - #chat .messages { display: block; - padding: 5px 0; + padding: 5px 10px; } #chat .msg { display: block; - padding: 2px 10px; - } - - #chat .msg[data-type="condensed"] .msg { padding: 2px 0; } #chat .time, #chat .from, - #chat .content { + #chat .text { border: 0; display: inline; padding: 0; } - #chat .from::after { - /* Add a space because mobile view changes to block display without paddings */ - content: " "; - white-space: pre; - } - - #chat .chat-view[data-type="channel"] .msg.highlight { - padding-left: 5px; - } - - #chat .chat-view[data-type="channel"] .msg.highlight .time { - padding-left: 0; - } - - #chat .condensed-summary .time, - #chat .condensed-summary .from { - display: none; - } - - #help .help-item .subject { - display: inline-block; - padding-bottom: 4px; - } - - #help .help-item .description { - display: block; + #chat .unread-marker { + margin: 0; } } ::-webkit-scrollbar { width: 8px; - background-color: rgb(0 0 0 / 0%); + background-color: rgba(0, 0, 0, 0); } ::-webkit-scrollbar:hover { - background-color: rgb(0 0 0 / 9%); + background-color: rgba(0, 0, 0, .09); } ::-webkit-scrollbar-thumb:vertical { - background: rgb(0 0 0 / 50%); + background: rgba(0, 0, 0, .5); border-radius: 100px; } ::-webkit-scrollbar-thumb:vertical:active { - background: rgb(0 0 0 / 60%); -} - -/* Image viewer and drag-and-drop overlay */ - -#confirm-dialog-overlay, -#upload-overlay, -#image-viewer, -#image-viewer .open-btn, -#image-viewer .close-btn { - /* Vertically and horizontally center stuff */ - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; -} - -#confirm-dialog-overlay, -#upload-overlay, -#image-viewer { - position: fixed; - top: 0; - bottom: 0; - left: 0; - right: 0; - background: var(--overlay-bg-color); - visibility: hidden; - opacity: 0; - transition: opacity 0.2s, visibility 0.2s; - z-index: 999; - user-select: none; -} - -#confirm-dialog-overlay.opened, -#upload-overlay.is-dragover, -#image-viewer.opened { - visibility: visible; - opacity: 1; -} - -#confirm-dialog-overlay, -#image-viewer { - background: rgb(0 0 0 / 90%); -} - -#image-viewer .close-btn, -#image-viewer .open-btn, -#image-viewer .previous-image-btn, -#image-viewer .next-image-btn { - position: fixed; - top: 0; - width: 2em; - font-size: 36px; - color: white; - opacity: 0.6; - transition: 0.2s opacity; -} - -#image-viewer .close-btn { - right: 0; - height: 2em; - z-index: 1002; -} - -#image-viewer .close-btn::before { - content: "×"; -} - -#image-viewer .open-btn { - right: 0; - bottom: 0; - top: auto; - height: 2em; - z-index: 1002; -} - -#image-viewer .previous-image-btn, -#image-viewer .next-image-btn { - bottom: 0; - z-index: 1001; -} - -#image-viewer .previous-image-btn { - left: 0; -} - -#image-viewer .next-image-btn { - right: 0; -} - -#image-viewer .close-btn:hover, -#image-viewer .previous-image-btn:hover, -#image-viewer .next-image-btn:hover { - opacity: 1; -} - -#image-viewer > img { - cursor: grab; - position: absolute; - transform-origin: 50% 50%; - - /* Checkered background for transparent images */ - background-position: 0 0, 10px 10px; - background-size: 20px 20px; - background-image: - linear-gradient(45deg, #eee 25%, rgb(0 0 0 / 0%) 25%, rgb(0 0 0 / 0%) 75%, #eee 75%, #eee 100%), - linear-gradient(45deg, #eee 25%, #fff 25%, #fff 75%, #eee 75%, #eee 100%); -} - -/* Correctly handle multiple successive whitespace characters. - For example: user has quit ( ===> L O L <=== ) */ -#chat .msg[data-type="action"] .content, -#chat .msg[data-type="message"] .content, -#chat .msg[data-type="monospace_block"] .content, -#chat .msg[data-type="notice"] .content, -#chat .ctcp-message, -#chat .part-reason, -#chat .quit-reason, -#chat .new-topic { - white-space: pre-wrap; -} - -#chat table.channel-list .topic, -.header .topic { - white-space: nowrap; -} - -.chat-view[data-type="search-results"] .search-status { - display: flex; - height: 100%; - justify-content: center; - align-items: center; + background: rgba(0, 0, 0, .6); } diff --git a/client/favicon.ico b/client/favicon.ico deleted file mode 100644 index 3aad467d..00000000 Binary files a/client/favicon.ico and /dev/null differ diff --git a/client/img/apple-touch-icon-120x120.png b/client/img/apple-touch-icon-120x120.png new file mode 100644 index 00000000..6d7bf410 Binary files /dev/null and b/client/img/apple-touch-icon-120x120.png differ diff --git a/client/img/favicon-alerted.ico b/client/img/favicon-alerted.ico deleted file mode 100644 index f89ab90b..00000000 Binary files a/client/img/favicon-alerted.ico and /dev/null differ diff --git a/client/img/favicon-notification.png b/client/img/favicon-notification.png new file mode 100644 index 00000000..1eb1e771 Binary files /dev/null and b/client/img/favicon-notification.png differ diff --git a/client/img/favicon.png b/client/img/favicon.png new file mode 100644 index 00000000..3dca950b Binary files /dev/null and b/client/img/favicon.png differ diff --git a/client/img/icon-alerted-black-transparent-bg-72x72px.png b/client/img/icon-alerted-black-transparent-bg-72x72px.png deleted file mode 100644 index ef63b40d..00000000 Binary files a/client/img/icon-alerted-black-transparent-bg-72x72px.png and /dev/null differ diff --git a/client/img/icon-alerted-grey-bg-192x192px.png b/client/img/icon-alerted-grey-bg-192x192px.png deleted file mode 100644 index 2b0586cb..00000000 Binary files a/client/img/icon-alerted-grey-bg-192x192px.png and /dev/null differ diff --git a/client/img/icon-black-transparent-bg.svg b/client/img/icon-black-transparent-bg.svg deleted file mode 100644 index 37e9c7d4..00000000 --- a/client/img/icon-black-transparent-bg.svg +++ /dev/null @@ -1 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><style>.st1{fill:black}</style><path d="M47.1 23.5v17.1c0 .1-.1.3-.2.4l-14.7 8.5c-.1.1-.3.1-.4 0L17.1 41c-.1-.1-.2-.2-.2-.4v-15c0-.1-.1-.3-.2-.4l-4-2.3c-.3-.2-.6 0-.6.4v19c0 .9.5 1.7 1.2 2.1l17.6 10.1c.8.4 1.7.4 2.5 0l17.5-10.1c.8-.4 1.2-1.3 1.2-2.1V21.8c0-.9-.5-1.7-1.2-2.1L33.3 9.6c-.8-.4-1.7-.4-2.5 0l-8.1 4.7c-.3.2-.3.6 0 .7l4.1 2.3c.1.1.3.1.4 0l4.7-2.7c.1-.1.3-.1.4 0L47 23.1c0 .1.1.2.1.4z" fill="black"/><circle class="st1" cx="40.3" cy="32.1" r="2.8"/><circle class="st1" cx="31.5" cy="32.1" r="2.8"/></svg> diff --git a/client/img/logo-64.png b/client/img/logo-64.png new file mode 100644 index 00000000..f7dd344f Binary files /dev/null and b/client/img/logo-64.png differ diff --git a/client/img/logo-dark.svg b/client/img/logo-dark.svg new file mode 100644 index 00000000..dd0d3016 --- /dev/null +++ b/client/img/logo-dark.svg @@ -0,0 +1,7 @@ +<?xml version="1.0"?> +<svg enable-background="new 0 0 512 512" height="512px" id="Layer_1" version="1.1" viewBox="0 0 512 512" width="512px" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <g id="chat_x5F_support"> + <path d="M170.542,357.786c-15.944-2.444-31.341-6.704-46.024-12.779l-5.493-2.272l-44.78,16.973l15.091-33.515 l-8.914-7.281C48.552,292.879,31,258.503,31,222.119C31,145.96,108.141,84,202.96,84c66.491,0,124.284,30.47,152.885,74.937 c6.45,0.715,12.819,1.716,19.08,3.013C346.379,107.298,280.133,69,202.96,69C99.705,69,16,137.554,16,222.119 c0,42.354,20.999,80.691,54.934,108.411l-25.235,56.04l73.085-27.701c18.762,7.762,39.34,13.007,61.07,15.203 C176.34,368.804,173.231,363.368,170.542,357.786z" fill="#818B9E" /> + <path d="M492,303.273c0-72.144-71.411-130.629-159.5-130.629S173,231.128,173,303.273s71.411,130.629,159.5,130.629 c25.834,0,50.229-5.036,71.813-13.965l62.35,23.633l-21.528-47.809C474.085,372.112,492,339.406,492,303.273z M253.5,334.606 c-14.636,0-26.5-11.864-26.5-26.5s11.864-26.5,26.5-26.5c14.636,0,26.5,11.864,26.5,26.5S268.136,334.606,253.5,334.606z M332.5,334.606c-14.636,0-26.5-11.864-26.5-26.5s11.864-26.5,26.5-26.5s26.5,11.864,26.5,26.5S347.136,334.606,332.5,334.606z M411.5,334.606c-14.636,0-26.5-11.864-26.5-26.5s11.864-26.5,26.5-26.5s26.5,11.864,26.5,26.5S426.136,334.606,411.5,334.606z" fill="#455164" /> + </g> +</svg> diff --git a/client/img/logo-grey-bg-120x120px.png b/client/img/logo-grey-bg-120x120px.png deleted file mode 100644 index bd8ae4a1..00000000 Binary files a/client/img/logo-grey-bg-120x120px.png and /dev/null differ diff --git a/client/img/logo-grey-bg-152x152px.png b/client/img/logo-grey-bg-152x152px.png deleted file mode 100644 index 06cc5cc1..00000000 Binary files a/client/img/logo-grey-bg-152x152px.png and /dev/null differ diff --git a/client/img/logo-grey-bg-167x167px.png b/client/img/logo-grey-bg-167x167px.png deleted file mode 100644 index 0dbf4092..00000000 Binary files a/client/img/logo-grey-bg-167x167px.png and /dev/null differ diff --git a/client/img/logo-grey-bg-180x180px.png b/client/img/logo-grey-bg-180x180px.png deleted file mode 100644 index 33c8b5aa..00000000 Binary files a/client/img/logo-grey-bg-180x180px.png and /dev/null differ diff --git a/client/img/logo-grey-bg-192x192px.png b/client/img/logo-grey-bg-192x192px.png deleted file mode 100644 index 57f1a3f8..00000000 Binary files a/client/img/logo-grey-bg-192x192px.png and /dev/null differ diff --git a/client/img/logo-grey-bg-512x512px.png b/client/img/logo-grey-bg-512x512px.png deleted file mode 100644 index e956679f..00000000 Binary files a/client/img/logo-grey-bg-512x512px.png and /dev/null differ diff --git a/client/img/logo-grey-bg.svg b/client/img/logo-grey-bg.svg deleted file mode 100644 index f7737548..00000000 --- a/client/img/logo-grey-bg.svg +++ /dev/null @@ -1 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 386 386"><style>.st1{fill:#ff9e18}.st2{fill:#fff}</style><path fill="#415364" d="M0 0h386v386H0z"/><g transform="translate(0 55)"><path class="st1" d="M320.1 100v76.1c0 .7-.4 1.3-.9 1.6l-65.8 37.7c-.6.3-1.3.3-1.8 0l-66.1-38c-.6-.3-.9-.9-.9-1.6V109c0-.7-.4-1.3-.9-1.6L165.5 97c-1.2-.7-2.8.2-2.8 1.6v84.5c0 3.9 2.1 7.6 5.5 9.5l78.7 45.1c3.4 2 7.6 2 11.1 0l78.4-44.9c3.4-2 5.5-5.6 5.5-9.5V92.7c0-3.9-2.1-7.6-5.5-9.5L258 38.3c-3.4-2-7.6-2-11.1 0l-36.3 20.8c-1.2.7-1.2 2.5 0 3.2l18.2 10.4c.6.3 1.3.3 1.8 0l20.9-12c.6-.3 1.3-.3 1.8 0l65.8 37.7c.7.3 1 .9 1 1.6z"/><ellipse class="st2" cx="289.6" cy="138.4" rx="12.4" ry="12.4"/><ellipse class="st2" cx="249.9" cy="138.4" rx="12.4" ry="12.4"/></g><g transform="translate(0 55)"><path class="st2" d="M64.6 176V99.9c0-.7.4-1.3.9-1.6l65.8-37.7c.6-.3 1.3-.3 1.8 0l66.1 38c.6.3.9.9.9 1.6V167c0 .7.4 1.3.9 1.6l18.1 10.4c1.2.7 2.8-.2 2.8-1.6V92.9c0-3.9-2.1-7.6-5.5-9.5l-78.7-45.1c-3.4-2-7.6-2-11.1 0L48.3 83.1c-3.4 2-5.5 5.6-5.5 9.5v90.6c0 3.9 2.1 7.6 5.5 9.5l78.4 44.9c3.4 2 7.6 2 11.1 0l36.3-20.8c1.2-.7 1.2-2.5 0-3.2l-18.2-10.4c-.6-.3-1.3-.3-1.8 0l-20.9 12c-.6.3-1.3.3-1.8 0l-65.8-37.7c-.6-.2-1-.8-1-1.5z"/><ellipse class="st1" cx="95.2" cy="137.6" rx="12.4" ry="12.4"/><ellipse class="st1" cx="134.9" cy="137.6" rx="12.4" ry="12.4"/></g></svg> \ No newline at end of file diff --git a/client/img/logo-horizontal-transparent-bg-inverted.svg b/client/img/logo-horizontal-transparent-bg-inverted.svg deleted file mode 100644 index 53db68da..00000000 --- a/client/img/logo-horizontal-transparent-bg-inverted.svg +++ /dev/null @@ -1 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 838 276"><style>.st0{fill:#ff9e18}.st1{fill:#fff}</style><path class="st0" d="M319.5 100v76.1c0 .7-.4 1.3-.9 1.6l-65.8 37.7c-.6.3-1.3.3-1.8 0l-66.1-38c-.6-.3-.9-.9-.9-1.6V109c0-.7-.4-1.3-.9-1.6L164.9 97c-1.2-.7-2.8.2-2.8 1.6v84.5c0 3.9 2.1 7.6 5.5 9.5l78.7 45.1c3.4 2 7.6 2 11.1 0l78.4-44.9c3.4-2 5.5-5.6 5.5-9.5V92.7c0-3.9-2.1-7.6-5.5-9.5l-78.4-44.9c-3.4-2-7.6-2-11.1 0L210 59.1c-1.2.7-1.2 2.5 0 3.2l18.2 10.4c.6.3 1.3.3 1.8 0l20.9-12c.6-.3 1.3-.3 1.8 0l65.8 37.7c.7.3 1 .9 1 1.6z"/><ellipse class="st1" cx="288.9" cy="138.4" rx="12.4" ry="12.4"/><ellipse class="st1" cx="249.3" cy="138.4" rx="12.4" ry="12.4"/><path class="st1" d="M64 176V99.9c0-.7.4-1.3.9-1.6l65.8-37.7c.6-.3 1.3-.3 1.8 0l66.1 38c.6.3.9.9.9 1.6V167c0 .7.4 1.3.9 1.6l18.1 10.4c1.2.7 2.8-.2 2.8-1.6V92.9c0-3.9-2.1-7.6-5.5-9.5l-78.7-45.1c-3.4-2-7.6-2-11.1 0L47.7 83.1c-3.4 2-5.5 5.6-5.5 9.5v90.6c0 3.9 2.1 7.6 5.5 9.5l78.4 44.9c3.4 2 7.6 2 11.1 0l36.3-20.8c1.2-.7 1.2-2.5 0-3.2l-18.2-10.4c-.6-.3-1.3-.3-1.8 0l-20.9 12c-.6.3-1.3.3-1.8 0L65 177.5c-.7-.2-1-.8-1-1.5z"/><ellipse class="st0" cx="94.6" cy="137.6" rx="12.4" ry="12.4"/><ellipse class="st0" cx="134.2" cy="137.6" rx="12.4" ry="12.4"/><path class="st0" d="M362.9 121.4h15.2v40.8h11.5v-40.8h15.3v-9.5h-42zm83.6 10.6h-22.1v-20.1h-11.2v50.4h11.2v-20.9h22.1v20.9h11.2v-50.4h-11.2zm54.2-11v-9.1h-34.5v50.4h34.5v-9.1h-23.3v-11.9h21.8v-9.2h-21.8V121z"/><path class="st1" d="M520.6 111.9h-11.4v50.4h33.3v-9.5h-21.9zm65.2 3.1c-3.8-2.1-8.4-3.1-13.6-3.1-5.2 0-9.8 1-13.6 3.1-3.9 2.1-6.9 5-9 8.8-2.1 3.8-3.1 8.3-3.1 13.4s1.1 9.6 3.1 13.4c2.1 3.8 5.1 6.8 9 8.9 3.9 2.1 8.4 3.1 13.6 3.1 5.2 0 9.8-1 13.6-3.1 3.8-2.1 6.8-5 8.9-8.9 2.1-3.8 3.1-8.3 3.1-13.4s-1-9.6-3.1-13.4c-2.1-3.8-5.1-6.7-8.9-8.8zm0 22.2c0 5.3-1.2 9.4-3.6 12.2-2.4 2.8-5.7 4.2-10 4.2s-7.6-1.4-10-4.2c-2.4-2.8-3.6-6.9-3.6-12.2 0-5.3 1.2-9.4 3.6-12.1 2.4-2.7 5.7-4.1 10-4.1 4.2 0 7.6 1.4 10 4.1 2.4 2.7 3.6 6.8 3.6 12.1zm51.9 4.4c0 3.8-.9 6.7-2.6 8.7-1.7 2-4.3 2.9-7.6 2.9s-5.9-1-7.6-2.9c-1.8-2-2.6-4.9-2.6-8.7V112H606v29.1c0 6.9 1.8 12.2 5.5 15.8 3.6 3.6 9 5.4 16 5.4 6.9 0 12.3-1.8 16-5.4 3.7-3.6 5.5-8.9 5.5-15.8V112h-11.3v29.6zm52.4 1.3l-24.3-31h-8.6v50.4h10.9v-31l24.2 30.9.1.1h8.6v-50.4h-10.9zm43.3-.5h9.6v10.1c-2.6.6-5.2.9-7.8.9-9.7 0-14.5-5.3-14.5-16.3 0-10.8 4.5-16 13.8-16 2.5 0 4.8.4 6.9 1.1 2.1.7 4.3 1.9 6.6 3.5l.3.2 3.7-8.2-.2-.2c-2-1.7-4.6-3.1-7.7-4.1-3.1-1-6.4-1.4-10-1.4-5 0-9.5 1-13.3 3.1-3.8 2-6.7 5-8.8 8.7-2.1 3.8-3.1 8.2-3.1 13.3 0 5.2 1 9.7 3.1 13.5 2.1 3.8 5.1 6.7 8.9 8.7 3.8 2 8.4 3 13.6 3 3.4 0 6.7-.3 9.9-1 3.2-.6 6-1.5 8.4-2.7l.2-.1v-24.3h-19.9v8.2zm62.4-21.4v-9.1h-33.9v50.5h33.9v-9.2h-22.9v-11.9h21.5v-9.2h-21.5V121z"/></svg> diff --git a/client/img/logo-horizontal-transparent-bg.svg b/client/img/logo-horizontal-transparent-bg.svg deleted file mode 100644 index ad81b7da..00000000 --- a/client/img/logo-horizontal-transparent-bg.svg +++ /dev/null @@ -1 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 838 276"><style>.st0{fill:#ff9e18}.st1{fill:#415364}</style><path class="st0" d="M319.5 100v76.1c0 .7-.4 1.3-.9 1.6l-65.8 37.7c-.6.3-1.3.3-1.8 0l-66.1-38c-.6-.3-.9-.9-.9-1.6V109c0-.7-.4-1.3-.9-1.6L164.9 97c-1.2-.7-2.8.2-2.8 1.6v84.5c0 3.9 2.1 7.6 5.5 9.5l78.7 45.1c3.4 2 7.6 2 11.1 0l78.4-44.9c3.4-2 5.5-5.6 5.5-9.5V92.7c0-3.9-2.1-7.6-5.5-9.5l-78.4-44.9c-3.4-2-7.6-2-11.1 0L210 59.1c-1.2.7-1.2 2.5 0 3.2l18.2 10.4c.6.3 1.3.3 1.8 0l20.9-12c.6-.3 1.3-.3 1.8 0l65.8 37.7c.7.3 1 .9 1 1.6z"/><ellipse class="st1" cx="288.9" cy="138.4" rx="12.4" ry="12.4"/><ellipse class="st1" cx="249.3" cy="138.4" rx="12.4" ry="12.4"/><path class="st1" d="M64 176V99.9c0-.7.4-1.3.9-1.6l65.8-37.7c.6-.3 1.3-.3 1.8 0l66.1 38c.6.3.9.9.9 1.6V167c0 .7.4 1.3.9 1.6l18.1 10.4c1.2.7 2.8-.2 2.8-1.6V92.9c0-3.9-2.1-7.6-5.5-9.5l-78.7-45.1c-3.4-2-7.6-2-11.1 0L47.7 83.1c-3.4 2-5.5 5.6-5.5 9.5v90.6c0 3.9 2.1 7.6 5.5 9.5l78.4 44.9c3.4 2 7.6 2 11.1 0l36.3-20.8c1.2-.7 1.2-2.5 0-3.2l-18.2-10.4c-.6-.3-1.3-.3-1.8 0l-20.9 12c-.6.3-1.3.3-1.8 0L65 177.5c-.7-.2-1-.8-1-1.5z"/><ellipse class="st0" cx="94.6" cy="137.6" rx="12.4" ry="12.4"/><ellipse class="st0" cx="134.2" cy="137.6" rx="12.4" ry="12.4"/><path class="st0" d="M362.9 121.4h15.2v40.8h11.5v-40.8h15.3v-9.5h-42zm83.6 10.6h-22.1v-20.1h-11.2v50.4h11.2v-20.9h22.1v20.9h11.2v-50.4h-11.2zm54.2-11v-9.1h-34.5v50.4h34.5v-9.1h-23.3v-11.9h21.8v-9.2h-21.8V121z"/><path class="st1" d="M520.6 111.9h-11.4v50.4h33.3v-9.5h-21.9zm65.2 3.1c-3.8-2.1-8.4-3.1-13.6-3.1-5.2 0-9.8 1-13.6 3.1-3.9 2.1-6.9 5-9 8.8-2.1 3.8-3.1 8.3-3.1 13.4s1.1 9.6 3.1 13.4c2.1 3.8 5.1 6.8 9 8.9 3.9 2.1 8.4 3.1 13.6 3.1 5.2 0 9.8-1 13.6-3.1 3.8-2.1 6.8-5 8.9-8.9 2.1-3.8 3.1-8.3 3.1-13.4s-1-9.6-3.1-13.4c-2.1-3.8-5.1-6.7-8.9-8.8zm0 22.2c0 5.3-1.2 9.4-3.6 12.2-2.4 2.8-5.7 4.2-10 4.2s-7.6-1.4-10-4.2c-2.4-2.8-3.6-6.9-3.6-12.2 0-5.3 1.2-9.4 3.6-12.1 2.4-2.7 5.7-4.1 10-4.1 4.2 0 7.6 1.4 10 4.1 2.4 2.7 3.6 6.8 3.6 12.1zm51.9 4.4c0 3.8-.9 6.7-2.6 8.7-1.7 2-4.3 2.9-7.6 2.9s-5.9-1-7.6-2.9c-1.8-2-2.6-4.9-2.6-8.7V112H606v29.1c0 6.9 1.8 12.2 5.5 15.8 3.6 3.6 9 5.4 16 5.4 6.9 0 12.3-1.8 16-5.4 3.7-3.6 5.5-8.9 5.5-15.8V112h-11.3v29.6zm52.4 1.3l-24.3-31h-8.6v50.4h10.9v-31l24.2 30.9.1.1h8.6v-50.4h-10.9zm43.3-.5h9.6v10.1c-2.6.6-5.2.9-7.8.9-9.7 0-14.5-5.3-14.5-16.3 0-10.8 4.5-16 13.8-16 2.5 0 4.8.4 6.9 1.1 2.1.7 4.3 1.9 6.6 3.5l.3.2 3.7-8.2-.2-.2c-2-1.7-4.6-3.1-7.7-4.1-3.1-1-6.4-1.4-10-1.4-5 0-9.5 1-13.3 3.1-3.8 2-6.7 5-8.8 8.7-2.1 3.8-3.1 8.2-3.1 13.3 0 5.2 1 9.7 3.1 13.5 2.1 3.8 5.1 6.7 8.9 8.7 3.8 2 8.4 3 13.6 3 3.4 0 6.7-.3 9.9-1 3.2-.6 6-1.5 8.4-2.7l.2-.1v-24.3h-19.9v8.2zm62.4-21.4v-9.1h-33.9v50.5h33.9v-9.2h-22.9v-11.9h21.5v-9.2h-21.5V121z"/></svg> diff --git a/client/img/logo-transparent-bg-inverted.svg b/client/img/logo-transparent-bg-inverted.svg deleted file mode 100644 index 0c96875b..00000000 --- a/client/img/logo-transparent-bg-inverted.svg +++ /dev/null @@ -1 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 386 276"><style>.st0{fill:#ff9e18}.st1{fill:#fff}</style><path class="st0" d="M320.1 100v76.1c0 .7-.4 1.3-.9 1.6l-65.8 37.7c-.6.3-1.3.3-1.8 0l-66.1-38c-.6-.3-.9-.9-.9-1.6V109c0-.7-.4-1.3-.9-1.6L165.5 97c-1.2-.7-2.8.2-2.8 1.6v84.5c0 3.9 2.1 7.6 5.5 9.5l78.7 45.1c3.4 2 7.6 2 11.1 0l78.4-44.9c3.4-2 5.5-5.6 5.5-9.5V92.7c0-3.9-2.1-7.6-5.5-9.5L258 38.3c-3.4-2-7.6-2-11.1 0l-36.3 20.8c-1.2.7-1.2 2.5 0 3.2l18.2 10.4c.6.3 1.3.3 1.8 0l20.9-12c.6-.3 1.3-.3 1.8 0l65.8 37.7c.7.3 1 .9 1 1.6z"/><ellipse class="st1" cx="289.6" cy="138.4" rx="12.4" ry="12.4"/><ellipse class="st1" cx="249.9" cy="138.4" rx="12.4" ry="12.4"/><path class="st1" d="M64.6 176V99.9c0-.7.4-1.3.9-1.6l65.8-37.7c.6-.3 1.3-.3 1.8 0l66.1 38c.6.3.9.9.9 1.6V167c0 .7.4 1.3.9 1.6l18.1 10.4c1.2.7 2.8-.2 2.8-1.6V92.9c0-3.9-2.1-7.6-5.5-9.5l-78.7-45.1c-3.4-2-7.6-2-11.1 0L48.3 83.1c-3.4 2-5.5 5.6-5.5 9.5v90.6c0 3.9 2.1 7.6 5.5 9.5l78.4 44.9c3.4 2 7.6 2 11.1 0l36.3-20.8c1.2-.7 1.2-2.5 0-3.2l-18.2-10.4c-.6-.3-1.3-.3-1.8 0l-20.9 12c-.6.3-1.3.3-1.8 0l-65.8-37.7c-.6-.2-1-.8-1-1.5z"/><ellipse class="st0" cx="95.2" cy="137.6" rx="12.4" ry="12.4"/><ellipse class="st0" cx="134.9" cy="137.6" rx="12.4" ry="12.4"/></svg> diff --git a/client/img/logo-transparent-bg.svg b/client/img/logo-transparent-bg.svg deleted file mode 100644 index b05918bb..00000000 --- a/client/img/logo-transparent-bg.svg +++ /dev/null @@ -1 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 386 276"><style>.st0{fill:#ff9e18}.st1{fill:#415364}</style><path class="st0" d="M320.1 100v76.1c0 .7-.4 1.3-.9 1.6l-65.8 37.7c-.6.3-1.3.3-1.8 0l-66.1-38c-.6-.3-.9-.9-.9-1.6V109c0-.7-.4-1.3-.9-1.6L165.5 97c-1.2-.7-2.8.2-2.8 1.6v84.5c0 3.9 2.1 7.6 5.5 9.5l78.7 45.1c3.4 2 7.6 2 11.1 0l78.4-44.9c3.4-2 5.5-5.6 5.5-9.5V92.7c0-3.9-2.1-7.6-5.5-9.5L258 38.3c-3.4-2-7.6-2-11.1 0l-36.3 20.8c-1.2.7-1.2 2.5 0 3.2l18.2 10.4c.6.3 1.3.3 1.8 0l20.9-12c.6-.3 1.3-.3 1.8 0l65.8 37.7c.7.3 1 .9 1 1.6z"/><ellipse class="st1" cx="289.6" cy="138.4" rx="12.4" ry="12.4"/><ellipse class="st1" cx="249.9" cy="138.4" rx="12.4" ry="12.4"/><path class="st1" d="M64.6 176V99.9c0-.7.4-1.3.9-1.6l65.8-37.7c.6-.3 1.3-.3 1.8 0l66.1 38c.6.3.9.9.9 1.6V167c0 .7.4 1.3.9 1.6l18.1 10.4c1.2.7 2.8-.2 2.8-1.6V92.9c0-3.9-2.1-7.6-5.5-9.5l-78.7-45.1c-3.4-2-7.6-2-11.1 0L48.3 83.1c-3.4 2-5.5 5.6-5.5 9.5v90.6c0 3.9 2.1 7.6 5.5 9.5l78.4 44.9c3.4 2 7.6 2 11.1 0l36.3-20.8c1.2-.7 1.2-2.5 0-3.2l-18.2-10.4c-.6-.3-1.3-.3-1.8 0l-20.9 12c-.6.3-1.3.3-1.8 0l-65.8-37.7c-.6-.2-1-.8-1-1.5z"/><ellipse class="st0" cx="95.2" cy="137.6" rx="12.4" ry="12.4"/><ellipse class="st0" cx="134.9" cy="137.6" rx="12.4" ry="12.4"/></svg> diff --git a/client/img/logo-vertical-transparent-bg-inverted.svg b/client/img/logo-vertical-transparent-bg-inverted.svg deleted file mode 100644 index 6b8e39e9..00000000 --- a/client/img/logo-vertical-transparent-bg-inverted.svg +++ /dev/null @@ -1 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 412 276"><style>.st0{fill:#ff9e18}.st1{fill:#fff}</style><path class="st0" d="M314.5 75.6v63.7c0 .5-.3 1.1-.8 1.3l-56 31.6c-.5.3-1.1.3-1.6 0l-56.4-31.8c-.5-.3-.8-.8-.8-1.3V83.2c0-.5-.3-1.1-.8-1.3l-15.5-8.7c-1-.6-2.4.1-2.4 1.3v70.8c0 3.3 1.8 6.3 4.7 8L252 191c2.9 1.6 6.5 1.6 9.4 0l66.8-37.6c2.9-1.6 4.7-4.7 4.7-8V69.5c0-3.3-1.8-6.3-4.7-8L261.6 24c-2.9-1.6-6.5-1.6-9.4 0l-30.9 17.4c-1 .6-1 2.1 0 2.7l15.5 8.7c.5.3 1.1.3 1.6 0l17.8-10c.5-.3 1.1-.3 1.6 0l56.1 31.5c.3.2.6.7.6 1.3z"/><ellipse class="st1" cx="288.4" cy="107.7" rx="10.6" ry="10.4"/><ellipse class="st1" cx="254.6" cy="107.7" rx="10.6" ry="10.4"/><path class="st1" d="M96.7 139.2V75.5c0-.5.3-1.1.8-1.3l56-31.6c.5-.3 1.1-.3 1.6 0l56.4 31.8c.5.3.8.8.8 1.3v55.9c0 .5.3 1.1.8 1.3l15.5 8.7c1 .6 2.4-.1 2.4-1.3V69.6c0-3.3-1.8-6.3-4.7-8L159 23.9c-2.9-1.6-6.5-1.6-9.4 0L82.8 61.5c-2.9 1.6-4.7 4.7-4.7 8v75.8c0 3.3 1.8 6.3 4.7 8l66.8 37.6c2.9 1.6 6.5 1.6 9.4 0l30.9-17.4c1-.6 1-2.1 0-2.7l-15.5-8.7c-.5-.3-1.1-.3-1.6 0l-17.8 10c-.5.3-1.1.3-1.6 0l-56.1-31.5c-.3-.3-.6-.8-.6-1.4z"/><ellipse class="st0" cx="122.8" cy="107.1" rx="10.6" ry="10.4"/><ellipse class="st0" cx="156.6" cy="107.1" rx="10.6" ry="10.4"/><path class="st0" d="M21.5 218.9h13V253h9.8v-34.1h13v-8H21.5zm71.3 8.8H74v-16.8h-9.6v42.2H74v-17.5h18.8v17.5h9.5v-42.2h-9.5zm46.2-9.2v-7.6h-29.4v42.2H139v-7.6h-19.9v-10h18.6v-7.7h-18.6v-9.3z"/><path class="st1" d="M156 210.9h-9.8v42.2h28.4v-8H156zm55.5 2.6c-3.3-1.7-7.2-2.6-11.6-2.6-4.4 0-8.3.9-11.6 2.6-3.3 1.7-5.9 4.2-7.6 7.4-1.8 3.2-2.7 6.9-2.7 11.2 0 4.3.9 8.1 2.7 11.3 1.8 3.2 4.3 5.7 7.6 7.4 3.3 1.7 7.2 2.6 11.6 2.6 4.4 0 8.3-.9 11.6-2.6 3.3-1.7 5.8-4.2 7.6-7.4 1.8-3.2 2.6-7 2.6-11.3 0-4.3-.9-8-2.6-11.2-1.8-3.2-4.3-5.7-7.6-7.4zm0 18.5c0 4.4-1 7.9-3.1 10.2-2 2.3-4.9 3.5-8.5 3.5-3.6 0-6.5-1.2-8.5-3.5s-3.1-5.8-3.1-10.2c0-4.4 1-7.8 3.1-10.1 2-2.3 4.9-3.5 8.5-3.5 3.6 0 6.5 1.2 8.5 3.5 2.1 2.3 3.1 5.7 3.1 10.1zm44.2 3.8c0 3.2-.7 5.6-2.2 7.3-1.5 1.6-3.6 2.5-6.4 2.5-2.8 0-5-.8-6.5-2.5-1.5-1.6-2.3-4.1-2.3-7.3V211h-9.6v24.4c0 5.8 1.6 10.2 4.7 13.2s7.7 4.5 13.6 4.5c5.9 0 10.5-1.5 13.6-4.5 3.1-3 4.7-7.5 4.7-13.2V211h-9.7v24.8zm44.7 1l-20.8-25.9h-7.2v42.2h9.2v-26l20.7 25.9.1.1h7.3v-42.2h-9.3zm36.9-.4h8.2v8.4c-2.2.5-4.4.8-6.6.8-8.3 0-12.3-4.5-12.3-13.7 0-9 3.9-13.4 11.8-13.4 2.1 0 4.1.3 5.9.9 1.8.6 3.7 1.6 5.6 2.9l.3.2 3.2-6.9-.2-.1c-1.7-1.5-3.9-2.6-6.5-3.4-2.6-.8-5.5-1.2-8.5-1.2-4.3 0-8.1.9-11.3 2.6-3.2 1.7-5.7 4.2-7.5 7.3-1.8 3.1-2.6 6.9-2.6 11.1 0 4.4.9 8.2 2.6 11.3 1.8 3.1 4.3 5.6 7.6 7.3 3.3 1.7 7.2 2.5 11.6 2.5 2.9 0 5.7-.3 8.4-.8s5.2-1.3 7.2-2.2l.2-.1v-20.3h-17v6.8zm53.2-17.9v-7.6h-28.9v42.2h28.9v-7.6H371v-10h18.3v-7.7H371v-9.3z"/></svg> diff --git a/client/img/logo-vertical-transparent-bg.svg b/client/img/logo-vertical-transparent-bg.svg deleted file mode 100644 index 56025dc6..00000000 --- a/client/img/logo-vertical-transparent-bg.svg +++ /dev/null @@ -1 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 412 276"><style>.st0{fill:#ff9e18}.st1{fill:#415364}</style><path class="st0" d="M314.5 75.6v63.7c0 .5-.3 1.1-.8 1.3l-56 31.6c-.5.3-1.1.3-1.6 0l-56.4-31.8c-.5-.3-.8-.8-.8-1.3V83.2c0-.5-.3-1.1-.8-1.3l-15.5-8.7c-1-.6-2.4.1-2.4 1.3v70.8c0 3.3 1.8 6.3 4.7 8L252 191c2.9 1.6 6.5 1.6 9.4 0l66.8-37.6c2.9-1.6 4.7-4.7 4.7-8V69.5c0-3.3-1.8-6.3-4.7-8L261.6 24c-2.9-1.6-6.5-1.6-9.4 0l-30.9 17.4c-1 .6-1 2.1 0 2.7l15.5 8.7c.5.3 1.1.3 1.6 0l17.8-10c.5-.3 1.1-.3 1.6 0l56.1 31.5c.3.2.6.7.6 1.3z"/><ellipse class="st1" cx="288.4" cy="107.7" rx="10.6" ry="10.4"/><ellipse class="st1" cx="254.6" cy="107.7" rx="10.6" ry="10.4"/><path class="st1" d="M96.7 139.2V75.5c0-.5.3-1.1.8-1.3l56-31.6c.5-.3 1.1-.3 1.6 0l56.4 31.8c.5.3.8.8.8 1.3v55.9c0 .5.3 1.1.8 1.3l15.5 8.7c1 .6 2.4-.1 2.4-1.3V69.6c0-3.3-1.8-6.3-4.7-8L159 23.9c-2.9-1.6-6.5-1.6-9.4 0L82.8 61.5c-2.9 1.6-4.7 4.7-4.7 8v75.8c0 3.3 1.8 6.3 4.7 8l66.8 37.6c2.9 1.6 6.5 1.6 9.4 0l30.9-17.4c1-.6 1-2.1 0-2.7l-15.5-8.7c-.5-.3-1.1-.3-1.6 0l-17.8 10c-.5.3-1.1.3-1.6 0l-56.1-31.5c-.3-.3-.6-.8-.6-1.4z"/><ellipse class="st0" cx="122.8" cy="107.1" rx="10.6" ry="10.4"/><ellipse class="st0" cx="156.6" cy="107.1" rx="10.6" ry="10.4"/><path class="st0" d="M21.5 218.9h13V253h9.8v-34.1h13v-8H21.5zm71.3 8.8H74v-16.8h-9.6v42.2H74v-17.5h18.8v17.5h9.5v-42.2h-9.5zm46.2-9.2v-7.6h-29.4v42.2H139v-7.6h-19.9v-10h18.6v-7.7h-18.6v-9.3z"/><path class="st1" d="M156 210.9h-9.8v42.2h28.4v-8H156zm55.5 2.6c-3.3-1.7-7.2-2.6-11.6-2.6-4.4 0-8.3.9-11.6 2.6-3.3 1.7-5.9 4.2-7.6 7.4-1.8 3.2-2.7 6.9-2.7 11.2 0 4.3.9 8.1 2.7 11.3 1.8 3.2 4.3 5.7 7.6 7.4 3.3 1.7 7.2 2.6 11.6 2.6 4.4 0 8.3-.9 11.6-2.6 3.3-1.7 5.8-4.2 7.6-7.4 1.8-3.2 2.6-7 2.6-11.3 0-4.3-.9-8-2.6-11.2-1.8-3.2-4.3-5.7-7.6-7.4zm0 18.5c0 4.4-1 7.9-3.1 10.2-2 2.3-4.9 3.5-8.5 3.5-3.6 0-6.5-1.2-8.5-3.5s-3.1-5.8-3.1-10.2c0-4.4 1-7.8 3.1-10.1 2-2.3 4.9-3.5 8.5-3.5 3.6 0 6.5 1.2 8.5 3.5 2.1 2.3 3.1 5.7 3.1 10.1zm44.2 3.8c0 3.2-.7 5.6-2.2 7.3-1.5 1.6-3.6 2.5-6.4 2.5-2.8 0-5-.8-6.5-2.5-1.5-1.6-2.3-4.1-2.3-7.3V211h-9.6v24.4c0 5.8 1.6 10.2 4.7 13.2s7.7 4.5 13.6 4.5c5.9 0 10.5-1.5 13.6-4.5 3.1-3 4.7-7.5 4.7-13.2V211h-9.7v24.8zm44.7 1l-20.8-25.9h-7.2v42.2h9.2v-26l20.7 25.9.1.1h7.3v-42.2h-9.3zm36.9-.4h8.2v8.4c-2.2.5-4.4.8-6.6.8-8.3 0-12.3-4.5-12.3-13.7 0-9 3.9-13.4 11.8-13.4 2.1 0 4.1.3 5.9.9 1.8.6 3.7 1.6 5.6 2.9l.3.2 3.2-6.9-.2-.1c-1.7-1.5-3.9-2.6-6.5-3.4-2.6-.8-5.5-1.2-8.5-1.2-4.3 0-8.1.9-11.3 2.6-3.2 1.7-5.7 4.2-7.5 7.3-1.8 3.1-2.6 6.9-2.6 11.1 0 4.4.9 8.2 2.6 11.3 1.8 3.1 4.3 5.6 7.6 7.3 3.3 1.7 7.2 2.5 11.6 2.5 2.9 0 5.7-.3 8.4-.8s5.2-1.3 7.2-2.2l.2-.1v-20.3h-17v6.8zm53.2-17.9v-7.6h-28.9v42.2h28.9v-7.6H371v-10h18.3v-7.7H371v-9.3z"/></svg> diff --git a/client/img/logo.svg b/client/img/logo.svg new file mode 100644 index 00000000..2378f20c --- /dev/null +++ b/client/img/logo.svg @@ -0,0 +1,7 @@ +<?xml version="1.0"?> +<svg enable-background="new 0 0 512 512" height="512px" id="Layer_1" version="1.1" viewBox="0 0 512 512" width="512px" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <g id="chat_x5F_support"> + <path d="M170.542,357.786c-15.944-2.444-31.341-6.704-46.024-12.779l-5.493-2.272l-44.78,16.973l15.091-33.515 l-8.914-7.281C48.552,292.879,31,258.503,31,222.119C31,145.96,108.141,84,202.96,84c66.491,0,124.284,30.47,152.885,74.937 c6.45,0.715,12.819,1.716,19.08,3.013C346.379,107.298,280.133,69,202.96,69C99.705,69,16,137.554,16,222.119 c0,42.354,20.999,80.691,54.934,108.411l-25.235,56.04l73.085-27.701c18.762,7.762,39.34,13.007,61.07,15.203 C176.34,368.804,173.231,363.368,170.542,357.786z" fill="#818B9E" /> + <path d="M492,303.273c0-72.144-71.411-130.629-159.5-130.629S173,231.128,173,303.273s71.411,130.629,159.5,130.629 c25.834,0,50.229-5.036,71.813-13.965l62.35,23.633l-21.528-47.809C474.085,372.112,492,339.406,492,303.273z M253.5,334.606 c-14.636,0-26.5-11.864-26.5-26.5s11.864-26.5,26.5-26.5c14.636,0,26.5,11.864,26.5,26.5S268.136,334.606,253.5,334.606z M332.5,334.606c-14.636,0-26.5-11.864-26.5-26.5s11.864-26.5,26.5-26.5s26.5,11.864,26.5,26.5S347.136,334.606,332.5,334.606z M411.5,334.606c-14.636,0-26.5-11.864-26.5-26.5s11.864-26.5,26.5-26.5s26.5,11.864,26.5,26.5S426.136,334.606,411.5,334.606z" fill="#f2f3f5" /> + </g> +</svg> diff --git a/client/img/touch-icon-192x192.png b/client/img/touch-icon-192x192.png new file mode 100644 index 00000000..976f79cd Binary files /dev/null and b/client/img/touch-icon-192x192.png differ diff --git a/client/index.html b/client/index.html new file mode 100644 index 00000000..edf9ee33 --- /dev/null +++ b/client/index.html @@ -0,0 +1,362 @@ +<!doctype html> +<html> + <head> + + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, user-scalable=no"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <meta name="apple-mobile-web-app-capable" content="yes"> + <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"> + <meta name="mobile-web-app-capable" content="yes"> + <meta name="referrer" content="no-referrer"> + <meta name="theme-color" content="#455164"> + + <title>The Lounge + + + + "> + + + + + + + + "> + +
+
+ +
+ + + + +
+
+
+
+
+
+
+

The Lounge is loading…

+
+
+

Loading the app… Make sure to have JavaScript enabled.

+

This is taking longer than it should, there might be connectivity issues.

+ +
+
+
+
+
+
+
+
+ + + +
+
+
+
+
+
+
+

Sign in to The Lounge

+
+
+ +
+
+ +
+
+ +
+ +
+ +
+
+
+
+
+
+ +
+
+
+
+

+ <%= public ? "The Lounge - " : "" %> + Connect + <%= !displayNetwork && lockNetwork ? "to " + defaults.name : "" %> +

+
+
> +
+

Network settings

+
+
+ +
+
+ +
+
+ +
+
+ > +
+
+
+ > +
+
+
+
+ +
+
+ +
+
+ +
+
+
+
+

User preferences

+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+
+
+ +
+
+
+
+

Settings

+
+
+

Messages

+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+

Visual Aids

+
+
+ +
+ <% if (typeof prefetch === "undefined" || prefetch !== false) { %> +
+

Links and URLs

+
+
+ +
+
+ +
+ <% } %> +
+

Notifications

+
+
+ +
+
+ +
+
+
+ +
+
+ +
+ +
+ +
+ +
+ + <% if (!public) { %> +
+
+
+

Change password

+
+
+ + +
+
+ + +
+
+ + +
+ +
+ +
+
+
+ <% } %> +
+

Custom Stylesheet

+
+
+ +
+
+

About The Lounge

+
+
+

+ <% if (gitCommit) { %> + The Lounge is running from source + (<%= gitCommit %>).
+ <% } else { %> + The Lounge is in version <%= version %> + (See release notes).
+ <% } %> + + Website
+ Documentation
+ Report a bug +

+
+
+
+
+
+
+
+
+ +
+ +
+ + + + + + + + diff --git a/client/index.html.tpl b/client/index.html.tpl deleted file mode 100644 index 7275a84f..00000000 --- a/client/index.html.tpl +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - - - - - - - <% _.forEach(stylesheets, function(css) { %> - - <% }); %> - - - The Lounge - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - " data-transports="<%- JSON.stringify(transports) %>"> -
-
-
-
- - -

The Lounge requires a modern browser with JavaScript enabled.

-
-
-

This is taking longer than it should, there might be connectivity issues.

- -
-
-
- - - - - diff --git a/client/js/auth.ts b/client/js/auth.ts deleted file mode 100644 index 5a764f86..00000000 --- a/client/js/auth.ts +++ /dev/null @@ -1,9 +0,0 @@ -import storage from "./localStorage"; -import location from "./location"; - -export default class Auth { - static signout() { - storage.clear(); - location.reload(); - } -} diff --git a/client/js/autocompletion.ts b/client/js/autocompletion.ts deleted file mode 100644 index ea3593e0..00000000 --- a/client/js/autocompletion.ts +++ /dev/null @@ -1,342 +0,0 @@ -import constants from "./constants"; - -import Mousetrap from "mousetrap"; -import {Textcomplete, StrategyProps} from "@textcomplete/core"; -import {TextareaEditor} from "@textcomplete/textarea"; - -import fuzzy from "fuzzy"; - -import emojiMap from "./helpers/simplemap.json"; -import {store} from "./store"; -import {ChanType} from "../../shared/types/chan"; - -export default enableAutocomplete; - -const emojiSearchTerms = Object.keys(emojiMap); -const emojiStrategy: StrategyProps = { - id: "emoji", - match: /(^|\s):([-+\w:?]{2,}):?$/, - search(term: string, callback: (matches) => void) { - // Trim colon from the matched term, - // as we are unable to get a clean string from match regex - term = term.replace(/:$/, ""); - callback(fuzzyGrep(term, emojiSearchTerms)); - }, - template([string, original]: [string, string]) { - return `${String(emojiMap[original])} ${string}`; - }, - replace([, original]: [string, string]) { - return "$1" + String(emojiMap[original]); - }, - index: 2, -}; - -const nicksStrategy: StrategyProps = { - id: "nicks", - match: /(^|\s)(@([a-zA-Z_[\]\\^{}|`@][a-zA-Z0-9_[\]\\^{}|`-]*)?)$/, - search(term: string, callback: (matches: string[] | string[][]) => void) { - term = term.slice(1); - - if (term[0] === "@") { - // TODO: type - callback(completeNicks(term.slice(1), true).map((val) => ["@" + val[0], "@" + val[1]])); - } else { - callback(completeNicks(term, true)); - } - }, - template([string]: [string, string]) { - return string; - }, - replace([, original]: [string, string]) { - return "$1" + replaceNick(original); - }, - index: 2, -}; - -const chanStrategy: StrategyProps = { - id: "chans", - match: /(^|\s)((?:#|\+|&|![A-Z0-9]{5})(?:[^\s]+)?)$/, - search(term: string, callback: (matches: string[][]) => void) { - callback(completeChans(term)); - }, - template([string]: [string, string]) { - return string; - }, - replace([, original]: [string, string]) { - return "$1" + original; - }, - index: 2, -}; - -const commandStrategy: StrategyProps = { - id: "commands", - match: /^\/(\w*)$/, - search(term: string, callback: (matches: string[][]) => void) { - callback(completeCommands("/" + term)); - }, - template([string]: [string, string]) { - return string; - }, - replace([, original]: [string, string]) { - return original; - }, - index: 1, -}; - -const foregroundColorStrategy: StrategyProps = { - id: "foreground-colors", - match: /\x03(\d{0,2}|[A-Za-z ]{0,10})$/, - search(term: string, callback: (matches: string[][]) => void) { - term = term.toLowerCase(); - - const matchingColorCodes = constants.colorCodeMap - .filter((i) => fuzzy.test(term, i[0]) || fuzzy.test(term, i[1])) - .map((i) => { - if (fuzzy.test(term, i[1])) { - return [ - i[0], - fuzzy.match(term, i[1], { - pre: "", - post: "", - }).rendered, - ]; - } - - return i; - }); - - callback(matchingColorCodes); - }, - template(value: string[]) { - return `${value[1]}`; - }, - replace(value: string) { - return "\x03" + value[0]; - }, - index: 1, -}; - -const backgroundColorStrategy: StrategyProps = { - id: "background-colors", - match: /\x03(\d{2}),(\d{0,2}|[A-Za-z ]{0,10})$/, - search(term: string, callback: (matchingColorCodes: string[][]) => void, match: string[]) { - term = term.toLowerCase(); - const matchingColorCodes = constants.colorCodeMap - .filter((i) => fuzzy.test(term, i[0]) || fuzzy.test(term, i[1])) - .map((pair) => { - if (fuzzy.test(term, pair[1])) { - return [ - pair[0], - fuzzy.match(term, pair[1], { - pre: "", - post: "", - }).rendered, - ]; - } - - return pair; - }) - .map((pair) => pair.concat(match[1])); // Needed to pass fg color to `template`... - - callback(matchingColorCodes); - }, - template(value: string[]) { - return `${value[1]}`; - }, - replace(value: string[]) { - return "\x03$1," + value[0]; - }, - index: 2, -}; - -function enableAutocomplete(input: HTMLTextAreaElement) { - let tabCount = 0; - let lastMatch = ""; - let currentMatches: string[] | string[][] = []; - - input.addEventListener("input", (e) => { - if ((e as CustomEvent).detail === "autocomplete") { - return; - } - - tabCount = 0; - currentMatches = []; - lastMatch = ""; - }); - - Mousetrap(input).bind( - "tab", - (e) => { - if (store.state.isAutoCompleting) { - return; - } - - e.preventDefault(); - - const text = input.value; - - if (tabCount === 0) { - lastMatch = text.substring(0, input.selectionStart).split(/\s/).pop() || ""; - - if (lastMatch.length === 0) { - return; - } - - currentMatches = completeNicks(lastMatch, false); - - if (currentMatches.length === 0) { - return; - } - } - - const position = input.selectionStart - lastMatch.length; - const newMatch = replaceNick( - // TODO: type this properly - String(currentMatches[tabCount % currentMatches.length]), - position - ); - const remainder = text.substring(input.selectionStart); - - input.value = text.substr(0, position) + newMatch + remainder; - - input.selectionStart -= remainder.length; - input.selectionEnd = input.selectionStart; - - // Propagate change to Vue model - input.dispatchEvent( - new CustomEvent("input", { - detail: "autocomplete", - }) - ); - - lastMatch = newMatch; - tabCount++; - }, - "keydown" - ); - - const strategies = [ - emojiStrategy, - nicksStrategy, - chanStrategy, - commandStrategy, - foregroundColorStrategy, - backgroundColorStrategy, - ]; - - const editor = new TextareaEditor(input); - const textcomplete = new Textcomplete(editor, strategies, { - dropdown: { - className: "textcomplete-menu", - placement: "top", - }, - }); - - textcomplete.on("show", () => { - store.commit("isAutoCompleting", true); - }); - - textcomplete.on("hidden", () => { - store.commit("isAutoCompleting", false); - }); - - return { - hide() { - textcomplete.hide(); - }, - destroy() { - textcomplete.destroy(); - store.commit("isAutoCompleting", false); - }, - }; -} - -function replaceNick(original: string, position = 1) { - // If no postfix specified, return autocompleted nick as-is - if (!store.state.settings.nickPostfix) { - return original; - } - - // If there is whitespace in the input already, append space to nick - if (position > 0 && /\s/.test(store.state.activeChannel?.channel.pendingMessage || "")) { - return original + " "; - } - - // If nick is first in the input, append specified postfix - return original + store.state.settings.nickPostfix; -} - -function fuzzyGrep(term: string, array: Array) { - const results = fuzzy.filter(term, array, { - pre: "", - post: "", - }); - return results.map((el) => [el.string, el.original]); -} - -function rawNicks() { - if (!store.state.activeChannel) { - return []; - } - - if (store.state.activeChannel.channel.users.length > 0) { - const users = store.state.activeChannel.channel.users.slice(); - - return users.sort((a, b) => b.lastMessage - a.lastMessage).map((u) => u.nick); - } - - const me = store.state.activeChannel.network.nick; - const otherUser = store.state.activeChannel.channel.name; - - // If this is a query, add their name to autocomplete - if (me !== otherUser && store.state.activeChannel.channel.type === ChanType.QUERY) { - return [otherUser, me]; - } - - // Return our own name by default for anything that isn't a channel or query - return [me]; -} - -function completeNicks(word: string, isFuzzy: boolean) { - const users = rawNicks(); - word = word.toLowerCase(); - - if (isFuzzy) { - return fuzzyGrep(word, users); - } - - return users.filter((w) => !w.toLowerCase().indexOf(word)); -} - -function getCommands() { - let cmds = constants.commands.slice(); - - if (!store.state.settings.searchEnabled) { - cmds = cmds.filter((c) => c !== "/search"); - } - - return cmds; -} - -function completeCommands(word: string) { - const commands = getCommands(); - return fuzzyGrep(word, commands); -} - -function completeChans(word: string) { - const words: string[] = []; - - if (store.state.activeChannel) { - for (const channel of store.state.activeChannel.network.channels) { - // Push all channels that start with the same CHANTYPE - if (channel.type === ChanType.CHANNEL && channel.name[0] === word[0]) { - words.push(channel.name); - } - } - } - - return fuzzyGrep(word, words); -} diff --git a/client/js/chan.ts b/client/js/chan.ts deleted file mode 100644 index f10db4a8..00000000 --- a/client/js/chan.ts +++ /dev/null @@ -1,36 +0,0 @@ -import {ClientChan, ClientMessage} from "./types"; -import {SharedNetworkChan} from "../../shared/types/network"; -import {SharedMsg, MessageType} from "../../shared/types/msg"; -import {ChanType} from "../../shared/types/chan"; - -export function toClientChan(shared: SharedNetworkChan): ClientChan { - const history: string[] = [""].concat( - shared.messages - .filter((m) => m.self && m.text && m.type === MessageType.MESSAGE) - // TS is too stupid to see the nil guard on filter... so we monkey patch it - .map((m): string => (m.text ? m.text : "")) - .reverse() - .slice(0, 99) - ); - // filter the unused vars - const {messages, totalMessages: _, ...props} = shared; - const channel: ClientChan = { - ...props, - editTopic: false, - pendingMessage: "", - inputHistoryPosition: 0, - historyLoading: false, - scrolledToBottom: true, - users: [], - usersOutdated: shared.type === ChanType.CHANNEL ? true : false, - moreHistoryAvailable: shared.totalMessages > shared.messages.length, - inputHistory: history, - messages: sharedMsgToClientMsg(messages), - }; - return channel; -} - -function sharedMsgToClientMsg(shared: SharedMsg[]): ClientMessage[] { - // TODO: this is a stub for now, we will want to populate client specific stuff here - return shared; -} diff --git a/client/js/clipboard.ts b/client/js/clipboard.ts deleted file mode 100644 index 3409b395..00000000 --- a/client/js/clipboard.ts +++ /dev/null @@ -1,34 +0,0 @@ -export default function (chat: HTMLDivElement) { - // Disable in Firefox as it already copies flex text correctly - // @ts-expect-error Property 'InstallTrigger' does not exist on type 'Window & typeof globalThis'.ts(2339) - if (typeof window.InstallTrigger !== "undefined") { - return; - } - - const selection = window.getSelection(); - - if (!selection) { - return; - } - - // If selection does not span multiple elements, do nothing - if (selection.anchorNode === selection.focusNode) { - return; - } - - const range = selection.getRangeAt(0); - const documentFragment = range.cloneContents(); - const div = document.createElement("div"); - - div.id = "js-copy-hack"; - div.appendChild(documentFragment); - chat.appendChild(div); - - selection.selectAllChildren(div); - - window.setTimeout(() => { - chat.removeChild(div); - selection.removeAllRanges(); - selection.addRange(range); - }, 0); -} diff --git a/client/js/commands/collapse.ts b/client/js/commands/collapse.ts deleted file mode 100644 index 5c377c0c..00000000 --- a/client/js/commands/collapse.ts +++ /dev/null @@ -1,36 +0,0 @@ -import socket from "../socket"; -import {store} from "../store"; - -export function input(): boolean { - if (!store.state.activeChannel) { - return false; - } - - const messageIds: number[] = []; - - for (const message of store.state.activeChannel.channel.messages) { - let toggled = false; - - for (const preview of message.previews || []) { - if (preview.shown) { - preview.shown = false; - toggled = true; - } - } - - if (toggled) { - messageIds.push(message.id); - } - } - - // Tell the server we're toggling so it remembers at page reload - if (!document.body.classList.contains("public") && messageIds.length > 0) { - socket.emit("msg:preview:toggle", { - target: store.state.activeChannel?.channel.id, - messageIds: messageIds, - shown: false, - }); - } - - return true; -} diff --git a/client/js/commands/expand.ts b/client/js/commands/expand.ts deleted file mode 100644 index dbea4510..00000000 --- a/client/js/commands/expand.ts +++ /dev/null @@ -1,36 +0,0 @@ -import socket from "../socket"; -import {store} from "../store"; - -export function input(): boolean { - if (!store.state.activeChannel) { - return false; - } - - const messageIds: number[] = []; - - for (const message of store.state.activeChannel.channel.messages) { - let toggled = false; - - for (const preview of message.previews || []) { - if (!preview.shown) { - preview.shown = true; - toggled = true; - } - } - - if (toggled) { - messageIds.push(message.id); - } - } - - // Tell the server we're toggling so it remembers at page reload - if (!document.body.classList.contains("public") && messageIds.length > 0) { - socket.emit("msg:preview:toggle", { - target: store.state.activeChannel?.channel.id, - messageIds: messageIds, - shown: true, - }); - } - - return true; -} diff --git a/client/js/commands/index.ts b/client/js/commands/index.ts deleted file mode 100644 index dd0a0181..00000000 --- a/client/js/commands/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -import {input as collapse} from "./collapse"; -import {input as expand} from "./expand"; -import {input as join} from "./join"; -import {input as search} from "./search"; - -export const commands = { - collapse: collapse, - expand: expand, - join: join, - search: search, -}; diff --git a/client/js/commands/join.ts b/client/js/commands/join.ts deleted file mode 100644 index a66a9291..00000000 --- a/client/js/commands/join.ts +++ /dev/null @@ -1,50 +0,0 @@ -import socket from "../socket"; -import {store} from "../store"; -import {switchToChannel} from "../router"; -import {ChanType} from "../../../shared/types/chan"; - -export function input(args: string[]): boolean { - if (args.length > 0) { - let channels = args[0]; - - if (channels.length > 0) { - const chanTypes = store.state.activeChannel?.network.serverOptions.CHANTYPES; - const channelList = args[0].split(","); - - if (chanTypes && chanTypes.length > 0) { - for (let c = 0; c < channelList.length; c++) { - if (!chanTypes.includes(channelList[c][0])) { - channelList[c] = chanTypes[0] + channelList[c]; - } - } - } - - channels = channelList.join(","); - - const chan = store.getters.findChannelOnCurrentNetwork(channels); - - if (chan) { - switchToChannel(chan); - } else { - if (store.state.activeChannel) { - socket.emit("input", { - text: `/join ${channels} ${args.length > 1 ? args[1] : ""}`, - target: store.state.activeChannel.channel.id, - }); - } - - return true; - } - } - } else if (store.state.activeChannel?.channel.type === ChanType.CHANNEL) { - // If `/join` command is used without any arguments, re-join current channel - socket.emit("input", { - target: store.state.activeChannel.channel.id, - text: `/join ${store.state.activeChannel.channel.name}`, - }); - - return true; - } - - return false; -} diff --git a/client/js/commands/search.ts b/client/js/commands/search.ts deleted file mode 100644 index 5819b845..00000000 --- a/client/js/commands/search.ts +++ /dev/null @@ -1,25 +0,0 @@ -import {store} from "../store"; -import {router} from "../router"; - -export function input(args: string[]): boolean { - if (!store.state.settings.searchEnabled) { - return false; - } - - router - .push({ - name: "SearchResults", - params: { - id: store.state.activeChannel?.channel.id, - }, - query: { - q: args.join(" "), - }, - }) - .catch((e: Error) => { - // eslint-disable-next-line no-console - console.error(`Failed to push SearchResults route: ${e.message}`); - }); - - return true; -} diff --git a/client/js/constants.ts b/client/js/constants.ts deleted file mode 100644 index 725224bd..00000000 --- a/client/js/constants.ts +++ /dev/null @@ -1,33 +0,0 @@ -const colorCodeMap = [ - ["00", "White"], - ["01", "Black"], - ["02", "Blue"], - ["03", "Green"], - ["04", "Red"], - ["05", "Brown"], - ["06", "Magenta"], - ["07", "Orange"], - ["08", "Yellow"], - ["09", "Light Green"], - ["10", "Cyan"], - ["11", "Light Cyan"], - ["12", "Light Blue"], - ["13", "Pink"], - ["14", "Grey"], - ["15", "Light Grey"], -]; - -const timeFormats = { - msgDefault: "HH:mm", - msgWithSeconds: "HH:mm:ss", - msg12h: "hh:mm A", - msg12hWithSeconds: "hh:mm:ss A", -}; - -export default { - colorCodeMap, - commands: [] as string[], - timeFormats, - // Same value as media query in CSS that forces sidebars to become overlays - mobileViewportPixels: 768, -}; diff --git a/client/js/eventbus.ts b/client/js/eventbus.ts deleted file mode 100644 index fe065c40..00000000 --- a/client/js/eventbus.ts +++ /dev/null @@ -1,51 +0,0 @@ -const events = new Map(); - -class EventBus { - /** - * Register an event handler for the given type. - * - * @param {String} type Type of event to listen for. - * @param {Function} handler Function to call in response to given event. - */ - on(type: string, handler: (...evt: any[]) => void) { - if (events.has(type)) { - events.get(type).push(handler); - } else { - events.set(type, [handler]); - } - } - - /** - * Remove an event handler for the given type. - * - * @param {String} type Type of event to unregister `handler` from. - * @param {Function} handler Handler function to remove. - */ - off(type: string, handler: (...evt: any[]) => void) { - if (events.has(type)) { - events.set( - type, - events.get(type).filter((item: (...evt: any[]) => void) => item !== handler) - ); - } - } - - /** - * Invoke all handlers for the given type. - * - * @param {String} type The event type to invoke. - * @param {Any} [evt] Any value (object is recommended and powerful), passed to each handler. - */ - emit(type: string, ...evt: any) { - if (events.has(type)) { - events - .get(type) - .slice() - .map((handler: (...evts: any[]) => void) => { - handler(...evt); - }); - } - } -} - -export default new EventBus(); diff --git a/client/js/helpers/collapseNetwork.ts b/client/js/helpers/collapseNetwork.ts deleted file mode 100644 index 5432bb0e..00000000 --- a/client/js/helpers/collapseNetwork.ts +++ /dev/null @@ -1,16 +0,0 @@ -import storage from "../localStorage"; - -export default (network, isCollapsed) => { - const stored = storage.get("thelounge.networks.collapsed"); - const networks = stored ? new Set(JSON.parse(stored)) : new Set(); - - network.isCollapsed = isCollapsed; - - if (isCollapsed) { - networks.add(network.uuid); - } else { - networks.delete(network.uuid); - } - - storage.set("thelounge.networks.collapsed", JSON.stringify([...networks])); -}; diff --git a/client/js/helpers/colorClass.ts b/client/js/helpers/colorClass.ts deleted file mode 100644 index c9896f70..00000000 --- a/client/js/helpers/colorClass.ts +++ /dev/null @@ -1,15 +0,0 @@ -// Generates a string from "color-1" to "color-32" based on an input string -export default (str: string) => { - let hash = 0; - - for (let i = 0; i < str.length; i++) { - hash += str.charCodeAt(i); - } - - /* - Modulo 32 lets us be case insensitive for ascii - due to A being ascii 65 (100 0001) - while a being ascii 97 (110 0001) - */ - return "color-" + (1 + (hash % 32)).toString(); -}; diff --git a/client/js/helpers/contextMenu.ts b/client/js/helpers/contextMenu.ts deleted file mode 100644 index c21b9918..00000000 --- a/client/js/helpers/contextMenu.ts +++ /dev/null @@ -1,469 +0,0 @@ -import socket from "../socket"; -import eventbus from "../eventbus"; -import type {ClientChan, ClientNetwork, ClientUser} from "../types"; -import {switchToChannel} from "../router"; -import {TypedStore} from "../store"; -import useCloseChannel from "../hooks/use-close-channel"; -import {ChanType} from "../../../shared/types/chan"; - -type BaseContextMenuItem = { - label: string; - type: string; - class: string; -}; - -type ContextMenuItemWithAction = BaseContextMenuItem & { - action: () => void; -}; - -type ContextMenuItemWithLink = BaseContextMenuItem & { - link?: string; -}; - -type ContextMenuDividerItem = { - type: "divider"; -}; - -export type ContextMenuItem = - | ContextMenuItemWithAction - | ContextMenuItemWithLink - | ContextMenuDividerItem; - -export function generateChannelContextMenu( - channel: ClientChan, - network: ClientNetwork -): ContextMenuItem[] { - const closeChannel = useCloseChannel(channel); - - const typeMap = { - lobby: "network", - channel: "chan", - query: "query", - special: "chan", - }; - - const closeMap = { - lobby: "Remove", - channel: "Leave", - query: "Close", - special: "Close", - }; - - let items: ContextMenuItem[] = [ - { - label: channel.name, - type: "item", - class: typeMap[channel.type], - link: `/chan-${channel.id}`, - }, - { - type: "divider", - }, - ]; - - // Add menu items for lobbies - if (channel.type === ChanType.LOBBY) { - items = [ - ...items, - { - label: "Edit this network…", - type: "item", - class: "edit", - link: `/edit-network/${network.uuid}`, - }, - { - label: "Join a channel…", - type: "item", - class: "join", - action: () => (network.isJoinChannelShown = true), - }, - { - label: "List all channels", - type: "item", - class: "list", - action: () => - socket.emit("input", { - target: channel.id, - text: "/list", - }), - }, - { - label: "List ignored users", - type: "item", - class: "list", - action: () => - socket.emit("input", { - target: channel.id, - text: "/ignorelist", - }), - }, - network.status.connected - ? { - label: "Disconnect", - type: "item", - class: "disconnect", - action: () => - socket.emit("input", { - target: channel.id, - text: "/disconnect", - }), - } - : { - label: "Connect", - type: "item", - class: "connect", - action: () => - socket.emit("input", { - target: channel.id, - text: "/connect", - }), - }, - ]; - } - - // Add menu items for channels - if (channel.type === ChanType.CHANNEL) { - items.push({ - label: "Edit topic", - type: "item", - class: "edit", - action() { - channel.editTopic = true; - switchToChannel(channel); - }, - }); - items.push({ - label: "List banned users", - type: "item", - class: "list", - action() { - socket.emit("input", { - target: channel.id, - text: "/banlist", - }); - }, - }); - } - - // Add menu items for queries - if (channel.type === ChanType.QUERY) { - items.push( - { - label: "User information", - type: "item", - class: "action-whois", - action() { - switchToChannel(channel); - socket.emit("input", { - target: channel.id, - text: "/whois " + channel.name, - }); - }, - }, - { - label: "Ignore user", - type: "item", - class: "action-ignore", - action() { - socket.emit("input", { - target: channel.id, - text: "/ignore " + channel.name, - }); - }, - } - ); - } - - if (channel.type === ChanType.CHANNEL || channel.type === ChanType.QUERY) { - items.push({ - label: "Clear history", - type: "item", - class: "clear-history", - action() { - eventbus.emit( - "confirm-dialog", - { - title: "Clear history", - text: `Are you sure you want to clear history for ${channel.name}? This cannot be undone.`, - button: "Clear history", - }, - (result) => { - if (!result) { - return; - } - - socket.emit("history:clear", { - target: channel.id, - }); - } - ); - }, - }); - } - - const humanFriendlyChanTypeMap: Record = { - lobby: "network", - channel: "channel", - query: "conversation", - }; - - // We don't allow the muting of ChanType.SPECIAL channels - const mutableChanTypes = Object.keys(humanFriendlyChanTypeMap); - - if (mutableChanTypes.includes(channel.type)) { - const chanType = humanFriendlyChanTypeMap[channel.type]; - - items.push({ - label: channel.muted ? `Unmute ${chanType}` : `Mute ${chanType}`, - type: "item", - class: "mute", - action() { - socket.emit("mute:change", { - target: channel.id, - setMutedTo: !channel.muted, - }); - }, - }); - } - - // Add close menu item - items.push({ - label: closeMap[channel.type], - type: "item", - class: "close", - action() { - closeChannel(); - }, - }); - - return items; -} - -export function generateInlineChannelContextMenu( - store: TypedStore, - chan: string, - network: ClientNetwork -): ContextMenuItem[] { - const join = () => { - const channel = network.channels.find((c) => c.name === chan); - - if (channel) { - switchToChannel(channel); - } - - if (store.state.activeChannel) { - socket.emit("input", { - target: store.state.activeChannel.channel.id, - text: "/join " + chan, - }); - } else { - // eslint-disable-next-line no-console - console.error("Unable to join channel: activeChannel is undefined"); - } - }; - - const channel = network.channels.find((c) => c.name === chan); - - if (channel) { - return [ - { - label: "Go to channel", - type: "item", - class: "chan", - link: `/chan-${channel.id}`, - }, - ]; - } - - return [ - { - label: "Join channel", - type: "item", - class: "join", - action: join, - }, - ]; -} - -export function generateUserContextMenu( - store: TypedStore, - channel: ClientChan, - network: ClientNetwork, - user: Pick -): ContextMenuItem[] { - const currentChannelUser: ClientUser | Record = channel - ? channel.users.find((u) => u.nick === network.nick) || {} - : {}; - - const whois = () => { - const chan = network.channels.find((c) => c.name === user.nick); - - if (chan) { - switchToChannel(chan); - } - - socket.emit("input", { - target: channel.id, - text: "/whois " + user.nick, - }); - }; - - const items: ContextMenuItem[] = [ - { - label: user.nick, - type: "item", - class: "user", - action: whois, - }, - { - type: "divider", - }, - { - label: "User information", - type: "item", - class: "action-whois", - action: whois, - }, - { - label: "Ignore user", - type: "item", - class: "action-ignore", - action() { - socket.emit("input", { - target: channel.id, - text: "/ignore " + user.nick, - }); - }, - }, - { - label: "Direct messages", - type: "item", - class: "action-query", - action() { - const chan = store.getters.findChannelOnCurrentNetwork(user.nick); - - if (chan) { - switchToChannel(chan); - } - - socket.emit("input", { - target: channel.id, - text: "/query " + user.nick, - }); - }, - }, - ]; - - // Bail because we're in a query or we don't have a special mode. - if (!currentChannelUser.modes || currentChannelUser.modes.length < 1) { - return items; - } - - // Names of the standard modes we are able to change - const modeCharToName = { - "~": "owner", - "&": "admin", - "@": "operator", - "%": "half-op", - "+": "voice", - }; - - // Labels for the mode changes. For example .rev({mode: "a", symbol: "&"}) => 'Revoke admin (-a)' - const modeTextTemplate = { - revoke(m: {symbol: string; mode: string}) { - const name = modeCharToName[m.symbol]; - - if (typeof name !== "string") { - return ""; - } - - const res = name ? `Revoke ${name} (-${m.mode})` : `Mode -${m.mode}`; - return res; - }, - give(m: {symbol: string; mode: string}) { - const name = modeCharToName[m.symbol]; - - if (typeof name !== "string") { - return ""; - } - - const res = name ? `Give ${name} (+${m.mode})` : `Mode +${m.mode}`; - return res; - }, - }; - - const networkModeSymbols = network.serverOptions.PREFIX.symbols; - - /** - * Determine whether the prefix of mode p1 has access to perform actions on p2. - * - * EXAMPLE: - * compare('@', '@') => true - * compare('&', '@') => true - * compare('+', '~') => false - * @param {string} p1 The mode performing an action - * @param {string} p2 The target mode - * - * @return {boolean} whether p1 can perform an action on p2 - */ - function compare(p1: string, p2: string): boolean { - // The modes ~ and @ can perform actions on their own mode. The others on modes below. - return "~@".indexOf(p1) > -1 - ? networkModeSymbols.indexOf(p1) <= networkModeSymbols.indexOf(p2) - : networkModeSymbols.indexOf(p1) < networkModeSymbols.indexOf(p2); - } - - network.serverOptions.PREFIX.prefix.forEach((mode) => { - if (!compare(currentChannelUser.modes[0], mode.symbol)) { - // Our highest mode is below the current mode. Bail. - return; - } - - if (!user.modes.includes(mode.symbol)) { - // The target doesn't already have this mode, therefore we can set it. - items.push({ - label: modeTextTemplate.give(mode), - type: "item", - class: "action-set-mode", - action() { - socket.emit("input", { - target: channel.id, - text: "/mode +" + mode.mode + " " + user.nick, - }); - }, - }); - } else { - items.push({ - label: modeTextTemplate.revoke(mode), - type: "item", - class: "action-revoke-mode", - action() { - socket.emit("input", { - target: channel.id, - text: "/mode -" + mode.mode + " " + user.nick, - }); - }, - }); - } - }); - - // Determine if we are half-op or op depending on the network modes so we can kick. - if (!compare(networkModeSymbols.indexOf("%") > -1 ? "%" : "@", currentChannelUser.modes[0])) { - // Check if the target user has no mode or a mode lower than ours. - if (user.modes.length === 0 || compare(currentChannelUser.modes[0], user.modes[0])) { - items.push({ - label: "Kick", - type: "item", - class: "action-kick", - action() { - socket.emit("input", { - target: channel.id, - text: "/kick " + user.nick, - }); - }, - }); - } - } - - return items; -} diff --git a/client/js/helpers/distance.ts b/client/js/helpers/distance.ts deleted file mode 100644 index 8e9db070..00000000 --- a/client/js/helpers/distance.ts +++ /dev/null @@ -1,5 +0,0 @@ -function distance([x1, y1]: [number, number], [x2, y2]: [number, number]) { - return Math.hypot(x1 - x2, y1 - y2); -} - -export default distance; diff --git a/client/js/helpers/friendlysize.ts b/client/js/helpers/friendlysize.ts deleted file mode 100644 index d29ba73f..00000000 --- a/client/js/helpers/friendlysize.ts +++ /dev/null @@ -1,8 +0,0 @@ -const sizes = ["Bytes", "KiB", "MiB", "GiB", "TiB", "PiB"]; - -export default (size: number) => { - // Loosely inspired from https://stackoverflow.com/a/18650828/1935861 - const i = size > 0 ? Math.floor(Math.log(size) / Math.log(1024)) : 0; - const fixedSize = parseFloat((size / Math.pow(1024, i)).toFixed(1)); - return `${fixedSize} ${sizes[i]}`; -}; diff --git a/client/js/helpers/fullnamemap.json b/client/js/helpers/fullnamemap.json deleted file mode 100644 index e4018c57..00000000 --- a/client/js/helpers/fullnamemap.json +++ /dev/null @@ -1,1872 +0,0 @@ -{ - "😀": "grinning face", - "😃": "grinning face with big eyes", - "😄": "grinning face with smiling eyes", - "😁": "beaming face with smiling eyes", - "😆": "grinning squinting face", - "😅": "grinning face with sweat", - "🤣": "rolling on the floor laughing", - "😂": "face with tears of joy", - "🙂": "slightly smiling face", - "🙃": "upside-down face", - "🫠": "melting face", - "😉": "winking face", - "😊": "smiling face with smiling eyes", - "😇": "smiling face with halo", - "🥰": "smiling face with hearts", - "😍": "smiling face with heart-eyes", - "🤩": "star-struck", - "😘": "face blowing a kiss", - "😗": "kissing face", - "☺": "smiling face", - "😚": "kissing face with closed eyes", - "😙": "kissing face with smiling eyes", - "🥲": "smiling face with tear", - "😋": "face savoring food", - "😛": "face with tongue", - "😜": "winking face with tongue", - "🤪": "zany face", - "😝": "squinting face with tongue", - "🤑": "money-mouth face", - "🤗": "smiling face with open hands", - "🤭": "face with hand over mouth", - "🫢": "face with open eyes and hand over mouth", - "🫣": "face with peeking eye", - "🤫": "shushing face", - "🤔": "thinking face", - "🫡": "saluting face", - "🤐": "zipper-mouth face", - "🤨": "face with raised eyebrow", - "😐": "neutral face", - "😑": "expressionless face", - "😶": "face without mouth", - "🫥": "dotted line face", - "😶‍🌫": "face in clouds", - "😏": "smirking face", - "😒": "unamused face", - "🙄": "face with rolling eyes", - "😬": "grimacing face", - "😮‍💨": "face exhaling", - "🤥": "lying face", - "🫨": "shaking face", - "😌": "relieved face", - "😔": "pensive face", - "😪": "sleepy face", - "🤤": "drooling face", - "😴": "sleeping face", - "😷": "face with medical mask", - "🤒": "face with thermometer", - "🤕": "face with head-bandage", - "🤢": "nauseated face", - "🤮": "face vomiting", - "🤧": "sneezing face", - "🥵": "hot face", - "🥶": "cold face", - "🥴": "woozy face", - "😵": "face with crossed-out eyes", - "😵‍💫": "face with spiral eyes", - "🤯": "exploding head", - "🤠": "cowboy hat face", - "🥳": "partying face", - "🥸": "disguised face", - "😎": "smiling face with sunglasses", - "🤓": "nerd face", - "🧐": "face with monocle", - "😕": "confused face", - "🫤": "face with diagonal mouth", - "😟": "worried face", - "🙁": "slightly frowning face", - "☹": "frowning face", - "😮": "face with open mouth", - "😯": "hushed face", - "😲": "astonished face", - "😳": "flushed face", - "🥺": "pleading face", - "🥹": "face holding back tears", - "😦": "frowning face with open mouth", - "😧": "anguished face", - "😨": "fearful face", - "😰": "anxious face with sweat", - "😥": "sad but relieved face", - "😢": "crying face", - "😭": "loudly crying face", - "😱": "face screaming in fear", - "😖": "confounded face", - "😣": "persevering face", - "😞": "disappointed face", - "😓": "downcast face with sweat", - "😩": "weary face", - "😫": "tired face", - "🥱": "yawning face", - "😤": "face with steam from nose", - "😡": "enraged face", - "😠": "angry face", - "🤬": "face with symbols on mouth", - "😈": "smiling face with horns", - "👿": "angry face with horns", - "💀": "skull", - "☠": "skull and crossbones", - "💩": "pile of poo", - "🤡": "clown face", - "👹": "ogre", - "👺": "goblin", - "👻": "ghost", - "👽": "alien", - "👾": "alien monster", - "🤖": "robot", - "😺": "grinning cat", - "😸": "grinning cat with smiling eyes", - "😹": "cat with tears of joy", - "😻": "smiling cat with heart-eyes", - "😼": "cat with wry smile", - "😽": "kissing cat", - "🙀": "weary cat", - "😿": "crying cat", - "😾": "pouting cat", - "🙈": "see-no-evil monkey", - "🙉": "hear-no-evil monkey", - "🙊": "speak-no-evil monkey", - "💌": "love letter", - "💘": "heart with arrow", - "💝": "heart with ribbon", - "💖": "sparkling heart", - "💗": "growing heart", - "💓": "beating heart", - "💞": "revolving hearts", - "💕": "two hearts", - "💟": "heart decoration", - "❣": "heart exclamation", - "💔": "broken heart", - "❤‍🔥": "heart on fire", - "❤‍🩹": "mending heart", - "❤": "red heart", - "🩷": "pink heart", - "🧡": "orange heart", - "💛": "yellow heart", - "💚": "green heart", - "💙": "blue heart", - "🩵": "light blue heart", - "💜": "purple heart", - "🤎": "brown heart", - "🖤": "black heart", - "🩶": "grey heart", - "🤍": "white heart", - "💋": "kiss mark", - "💯": "hundred points", - "💢": "anger symbol", - "💥": "collision", - "💫": "dizzy", - "💦": "sweat droplets", - "💨": "dashing away", - "🕳": "hole", - "💬": "speech balloon", - "👁‍🗨": "eye in speech bubble", - "🗨": "left speech bubble", - "🗯": "right anger bubble", - "💭": "thought balloon", - "💤": "ZZZ", - "👋": "waving hand", - "🤚": "raised back of hand", - "🖐": "hand with fingers splayed", - "✋": "raised hand", - "🖖": "vulcan salute", - "🫱": "rightwards hand", - "🫲": "leftwards hand", - "🫳": "palm down hand", - "🫴": "palm up hand", - "🫷": "leftwards pushing hand", - "🫸": "rightwards pushing hand", - "👌": "OK hand", - "🤌": "pinched fingers", - "🤏": "pinching hand", - "✌": "victory hand", - "🤞": "crossed fingers", - "🫰": "hand with index finger and thumb crossed", - "🤟": "love-you gesture", - "🤘": "sign of the horns", - "🤙": "call me hand", - "👈": "backhand index pointing left", - "👉": "backhand index pointing right", - "👆": "backhand index pointing up", - "🖕": "middle finger", - "👇": "backhand index pointing down", - "☝": "index pointing up", - "🫵": "index pointing at the viewer", - "👍": "thumbs up", - "👎": "thumbs down", - "✊": "raised fist", - "👊": "oncoming fist", - "🤛": "left-facing fist", - "🤜": "right-facing fist", - "👏": "clapping hands", - "🙌": "raising hands", - "🫶": "heart hands", - "👐": "open hands", - "🤲": "palms up together", - "🤝": "handshake", - "🙏": "folded hands", - "✍": "writing hand", - "💅": "nail polish", - "🤳": "selfie", - "💪": "flexed biceps", - "🦾": "mechanical arm", - "🦿": "mechanical leg", - "🦵": "leg", - "🦶": "foot", - "👂": "ear", - "🦻": "ear with hearing aid", - "👃": "nose", - "🧠": "brain", - "🫀": "anatomical heart", - "🫁": "lungs", - "🦷": "tooth", - "🦴": "bone", - "👀": "eyes", - "👁": "eye", - "👅": "tongue", - "👄": "mouth", - "🫦": "biting lip", - "👶": "baby", - "🧒": "child", - "👦": "boy", - "👧": "girl", - "🧑": "person", - "👱": "person: blond hair", - "👨": "man", - "🧔": "person: beard", - "🧔‍♂": "man: beard", - "🧔‍♀": "woman: beard", - "👨‍🦰": "man: red hair", - "👨‍🦱": "man: curly hair", - "👨‍🦳": "man: white hair", - "👨‍🦲": "man: bald", - "👩": "woman", - "👩‍🦰": "woman: red hair", - "🧑‍🦰": "person: red hair", - "👩‍🦱": "woman: curly hair", - "🧑‍🦱": "person: curly hair", - "👩‍🦳": "woman: white hair", - "🧑‍🦳": "person: white hair", - "👩‍🦲": "woman: bald", - "🧑‍🦲": "person: bald", - "👱‍♀": "woman: blond hair", - "👱‍♂": "man: blond hair", - "🧓": "older person", - "👴": "old man", - "👵": "old woman", - "🙍": "person frowning", - "🙍‍♂": "man frowning", - "🙍‍♀": "woman frowning", - "🙎": "person pouting", - "🙎‍♂": "man pouting", - "🙎‍♀": "woman pouting", - "🙅": "person gesturing NO", - "🙅‍♂": "man gesturing NO", - "🙅‍♀": "woman gesturing NO", - "🙆": "person gesturing OK", - "🙆‍♂": "man gesturing OK", - "🙆‍♀": "woman gesturing OK", - "💁": "person tipping hand", - "💁‍♂": "man tipping hand", - "💁‍♀": "woman tipping hand", - "🙋": "person raising hand", - "🙋‍♂": "man raising hand", - "🙋‍♀": "woman raising hand", - "🧏": "deaf person", - "🧏‍♂": "deaf man", - "🧏‍♀": "deaf woman", - "🙇": "person bowing", - "🙇‍♂": "man bowing", - "🙇‍♀": "woman bowing", - "🤦": "person facepalming", - "🤦‍♂": "man facepalming", - "🤦‍♀": "woman facepalming", - "🤷": "person shrugging", - "🤷‍♂": "man shrugging", - "🤷‍♀": "woman shrugging", - "🧑‍⚕": "health worker", - "👨‍⚕": "man health worker", - "👩‍⚕": "woman health worker", - "🧑‍🎓": "student", - "👨‍🎓": "man student", - "👩‍🎓": "woman student", - "🧑‍🏫": "teacher", - "👨‍🏫": "man teacher", - "👩‍🏫": "woman teacher", - "🧑‍⚖": "judge", - "👨‍⚖": "man judge", - "👩‍⚖": "woman judge", - "🧑‍🌾": "farmer", - "👨‍🌾": "man farmer", - "👩‍🌾": "woman farmer", - "🧑‍🍳": "cook", - "👨‍🍳": "man cook", - "👩‍🍳": "woman cook", - "🧑‍🔧": "mechanic", - "👨‍🔧": "man mechanic", - "👩‍🔧": "woman mechanic", - "🧑‍🏭": "factory worker", - "👨‍🏭": "man factory worker", - "👩‍🏭": "woman factory worker", - "🧑‍💼": "office worker", - "👨‍💼": "man office worker", - "👩‍💼": "woman office worker", - "🧑‍🔬": "scientist", - "👨‍🔬": "man scientist", - "👩‍🔬": "woman scientist", - "🧑‍💻": "technologist", - "👨‍💻": "man technologist", - "👩‍💻": "woman technologist", - "🧑‍🎤": "singer", - "👨‍🎤": "man singer", - "👩‍🎤": "woman singer", - "🧑‍🎨": "artist", - "👨‍🎨": "man artist", - "👩‍🎨": "woman artist", - "🧑‍✈": "pilot", - "👨‍✈": "man pilot", - "👩‍✈": "woman pilot", - "🧑‍🚀": "astronaut", - "👨‍🚀": "man astronaut", - "👩‍🚀": "woman astronaut", - "🧑‍🚒": "firefighter", - "👨‍🚒": "man firefighter", - "👩‍🚒": "woman firefighter", - "👮": "police officer", - "👮‍♂": "man police officer", - "👮‍♀": "woman police officer", - "🕵": "detective", - "🕵‍♂": "man detective", - "🕵‍♀": "woman detective", - "💂": "guard", - "💂‍♂": "man guard", - "💂‍♀": "woman guard", - "🥷": "ninja", - "👷": "construction worker", - "👷‍♂": "man construction worker", - "👷‍♀": "woman construction worker", - "🫅": "person with crown", - "🤴": "prince", - "👸": "princess", - "👳": "person wearing turban", - "👳‍♂": "man wearing turban", - "👳‍♀": "woman wearing turban", - "👲": "person with skullcap", - "🧕": "woman with headscarf", - "🤵": "person in tuxedo", - "🤵‍♂": "man in tuxedo", - "🤵‍♀": "woman in tuxedo", - "👰": "person with veil", - "👰‍♂": "man with veil", - "👰‍♀": "woman with veil", - "🤰": "pregnant woman", - "🫃": "pregnant man", - "🫄": "pregnant person", - "🤱": "breast-feeding", - "👩‍🍼": "woman feeding baby", - "👨‍🍼": "man feeding baby", - "🧑‍🍼": "person feeding baby", - "👼": "baby angel", - "🎅": "Santa Claus", - "🤶": "Mrs. Claus", - "🧑‍🎄": "mx claus", - "🦸": "superhero", - "🦸‍♂": "man superhero", - "🦸‍♀": "woman superhero", - "🦹": "supervillain", - "🦹‍♂": "man supervillain", - "🦹‍♀": "woman supervillain", - "🧙": "mage", - "🧙‍♂": "man mage", - "🧙‍♀": "woman mage", - "🧚": "fairy", - "🧚‍♂": "man fairy", - "🧚‍♀": "woman fairy", - "🧛": "vampire", - "🧛‍♂": "man vampire", - "🧛‍♀": "woman vampire", - "🧜": "merperson", - "🧜‍♂": "merman", - "🧜‍♀": "mermaid", - "🧝": "elf", - "🧝‍♂": "man elf", - "🧝‍♀": "woman elf", - "🧞": "genie", - "🧞‍♂": "man genie", - "🧞‍♀": "woman genie", - "🧟": "zombie", - "🧟‍♂": "man zombie", - "🧟‍♀": "woman zombie", - "🧌": "troll", - "💆": "person getting massage", - "💆‍♂": "man getting massage", - "💆‍♀": "woman getting massage", - "💇": "person getting haircut", - "💇‍♂": "man getting haircut", - "💇‍♀": "woman getting haircut", - "🚶": "person walking", - "🚶‍♂": "man walking", - "🚶‍♀": "woman walking", - "🧍": "person standing", - "🧍‍♂": "man standing", - "🧍‍♀": "woman standing", - "🧎": "person kneeling", - "🧎‍♂": "man kneeling", - "🧎‍♀": "woman kneeling", - "🧑‍🦯": "person with white cane", - "👨‍🦯": "man with white cane", - "👩‍🦯": "woman with white cane", - "🧑‍🦼": "person in motorized wheelchair", - "👨‍🦼": "man in motorized wheelchair", - "👩‍🦼": "woman in motorized wheelchair", - "🧑‍🦽": "person in manual wheelchair", - "👨‍🦽": "man in manual wheelchair", - "👩‍🦽": "woman in manual wheelchair", - "🏃": "person running", - "🏃‍♂": "man running", - "🏃‍♀": "woman running", - "💃": "woman dancing", - "🕺": "man dancing", - "🕴": "person in suit levitating", - "👯": "people with bunny ears", - "👯‍♂": "men with bunny ears", - "👯‍♀": "women with bunny ears", - "🧖": "person in steamy room", - "🧖‍♂": "man in steamy room", - "🧖‍♀": "woman in steamy room", - "🧗": "person climbing", - "🧗‍♂": "man climbing", - "🧗‍♀": "woman climbing", - "🤺": "person fencing", - "🏇": "horse racing", - "⛷": "skier", - "🏂": "snowboarder", - "🏌": "person golfing", - "🏌‍♂": "man golfing", - "🏌‍♀": "woman golfing", - "🏄": "person surfing", - "🏄‍♂": "man surfing", - "🏄‍♀": "woman surfing", - "🚣": "person rowing boat", - "🚣‍♂": "man rowing boat", - "🚣‍♀": "woman rowing boat", - "🏊": "person swimming", - "🏊‍♂": "man swimming", - "🏊‍♀": "woman swimming", - "⛹": "person bouncing ball", - "⛹‍♂": "man bouncing ball", - "⛹‍♀": "woman bouncing ball", - "🏋": "person lifting weights", - "🏋‍♂": "man lifting weights", - "🏋‍♀": "woman lifting weights", - "🚴": "person biking", - "🚴‍♂": "man biking", - "🚴‍♀": "woman biking", - "🚵": "person mountain biking", - "🚵‍♂": "man mountain biking", - "🚵‍♀": "woman mountain biking", - "🤸": "person cartwheeling", - "🤸‍♂": "man cartwheeling", - "🤸‍♀": "woman cartwheeling", - "🤼": "people wrestling", - "🤼‍♂": "men wrestling", - "🤼‍♀": "women wrestling", - "🤽": "person playing water polo", - "🤽‍♂": "man playing water polo", - "🤽‍♀": "woman playing water polo", - "🤾": "person playing handball", - "🤾‍♂": "man playing handball", - "🤾‍♀": "woman playing handball", - "🤹": "person juggling", - "🤹‍♂": "man juggling", - "🤹‍♀": "woman juggling", - "🧘": "person in lotus position", - "🧘‍♂": "man in lotus position", - "🧘‍♀": "woman in lotus position", - "🛀": "person taking bath", - "🛌": "person in bed", - "🧑‍🤝‍🧑": "people holding hands", - "👭": "women holding hands", - "👫": "woman and man holding hands", - "👬": "men holding hands", - "💏": "kiss", - "👩‍❤‍💋‍👨": "kiss: woman, man", - "👨‍❤‍💋‍👨": "kiss: man, man", - "👩‍❤‍💋‍👩": "kiss: woman, woman", - "💑": "couple with heart", - "👩‍❤‍👨": "couple with heart: woman, man", - "👨‍❤‍👨": "couple with heart: man, man", - "👩‍❤‍👩": "couple with heart: woman, woman", - "👪": "family", - "👨‍👩‍👦": "family: man, woman, boy", - "👨‍👩‍👧": "family: man, woman, girl", - "👨‍👩‍👧‍👦": "family: man, woman, girl, boy", - "👨‍👩‍👦‍👦": "family: man, woman, boy, boy", - "👨‍👩‍👧‍👧": "family: man, woman, girl, girl", - "👨‍👨‍👦": "family: man, man, boy", - "👨‍👨‍👧": "family: man, man, girl", - "👨‍👨‍👧‍👦": "family: man, man, girl, boy", - "👨‍👨‍👦‍👦": "family: man, man, boy, boy", - "👨‍👨‍👧‍👧": "family: man, man, girl, girl", - "👩‍👩‍👦": "family: woman, woman, boy", - "👩‍👩‍👧": "family: woman, woman, girl", - "👩‍👩‍👧‍👦": "family: woman, woman, girl, boy", - "👩‍👩‍👦‍👦": "family: woman, woman, boy, boy", - "👩‍👩‍👧‍👧": "family: woman, woman, girl, girl", - "👨‍👦": "family: man, boy", - "👨‍👦‍👦": "family: man, boy, boy", - "👨‍👧": "family: man, girl", - "👨‍👧‍👦": "family: man, girl, boy", - "👨‍👧‍👧": "family: man, girl, girl", - "👩‍👦": "family: woman, boy", - "👩‍👦‍👦": "family: woman, boy, boy", - "👩‍👧": "family: woman, girl", - "👩‍👧‍👦": "family: woman, girl, boy", - "👩‍👧‍👧": "family: woman, girl, girl", - "🗣": "speaking head", - "👤": "bust in silhouette", - "👥": "busts in silhouette", - "🫂": "people hugging", - "👣": "footprints", - "🐵": "monkey face", - "🐒": "monkey", - "🦍": "gorilla", - "🦧": "orangutan", - "🐶": "dog face", - "🐕": "dog", - "🦮": "guide dog", - "🐕‍🦺": "service dog", - "🐩": "poodle", - "🐺": "wolf", - "🦊": "fox", - "🦝": "raccoon", - "🐱": "cat face", - "🐈": "cat", - "🐈‍⬛": "black cat", - "🦁": "lion", - "🐯": "tiger face", - "🐅": "tiger", - "🐆": "leopard", - "🐴": "horse face", - "🫎": "moose", - "🫏": "donkey", - "🐎": "horse", - "🦄": "unicorn", - "🦓": "zebra", - "🦌": "deer", - "🦬": "bison", - "🐮": "cow face", - "🐂": "ox", - "🐃": "water buffalo", - "🐄": "cow", - "🐷": "pig face", - "🐖": "pig", - "🐗": "boar", - "🐽": "pig nose", - "🐏": "ram", - "🐑": "ewe", - "🐐": "goat", - "🐪": "camel", - "🐫": "two-hump camel", - "🦙": "llama", - "🦒": "giraffe", - "🐘": "elephant", - "🦣": "mammoth", - "🦏": "rhinoceros", - "🦛": "hippopotamus", - "🐭": "mouse face", - "🐁": "mouse", - "🐀": "rat", - "🐹": "hamster", - "🐰": "rabbit face", - "🐇": "rabbit", - "🐿": "chipmunk", - "🦫": "beaver", - "🦔": "hedgehog", - "🦇": "bat", - "🐻": "bear", - "🐻‍❄": "polar bear", - "🐨": "koala", - "🐼": "panda", - "🦥": "sloth", - "🦦": "otter", - "🦨": "skunk", - "🦘": "kangaroo", - "🦡": "badger", - "🐾": "paw prints", - "🦃": "turkey", - "🐔": "chicken", - "🐓": "rooster", - "🐣": "hatching chick", - "🐤": "baby chick", - "🐥": "front-facing baby chick", - "🐦": "bird", - "🐧": "penguin", - "🕊": "dove", - "🦅": "eagle", - "🦆": "duck", - "🦢": "swan", - "🦉": "owl", - "🦤": "dodo", - "🪶": "feather", - "🦩": "flamingo", - "🦚": "peacock", - "🦜": "parrot", - "🪽": "wing", - "🐦‍⬛": "black bird", - "🪿": "goose", - "🐸": "frog", - "🐊": "crocodile", - "🐢": "turtle", - "🦎": "lizard", - "🐍": "snake", - "🐲": "dragon face", - "🐉": "dragon", - "🦕": "sauropod", - "🦖": "T-Rex", - "🐳": "spouting whale", - "🐋": "whale", - "🐬": "dolphin", - "🦭": "seal", - "🐟": "fish", - "🐠": "tropical fish", - "🐡": "blowfish", - "🦈": "shark", - "🐙": "octopus", - "🐚": "spiral shell", - "🪸": "coral", - "🪼": "jellyfish", - "🐌": "snail", - "🦋": "butterfly", - "🐛": "bug", - "🐜": "ant", - "🐝": "honeybee", - "🪲": "beetle", - "🐞": "lady beetle", - "🦗": "cricket", - "🪳": "cockroach", - "🕷": "spider", - "🕸": "spider web", - "🦂": "scorpion", - "🦟": "mosquito", - "🪰": "fly", - "🪱": "worm", - "🦠": "microbe", - "💐": "bouquet", - "🌸": "cherry blossom", - "💮": "white flower", - "🪷": "lotus", - "🏵": "rosette", - "🌹": "rose", - "🥀": "wilted flower", - "🌺": "hibiscus", - "🌻": "sunflower", - "🌼": "blossom", - "🌷": "tulip", - "🪻": "hyacinth", - "🌱": "seedling", - "🪴": "potted plant", - "🌲": "evergreen tree", - "🌳": "deciduous tree", - "🌴": "palm tree", - "🌵": "cactus", - "🌾": "sheaf of rice", - "🌿": "herb", - "☘": "shamrock", - "🍀": "four leaf clover", - "🍁": "maple leaf", - "🍂": "fallen leaf", - "🍃": "leaf fluttering in wind", - "🪹": "empty nest", - "🪺": "nest with eggs", - "🍄": "mushroom", - "🍇": "grapes", - "🍈": "melon", - "🍉": "watermelon", - "🍊": "tangerine", - "🍋": "lemon", - "🍌": "banana", - "🍍": "pineapple", - "🥭": "mango", - "🍎": "red apple", - "🍏": "green apple", - "🍐": "pear", - "🍑": "peach", - "🍒": "cherries", - "🍓": "strawberry", - "🫐": "blueberries", - "🥝": "kiwi fruit", - "🍅": "tomato", - "🫒": "olive", - "🥥": "coconut", - "🥑": "avocado", - "🍆": "eggplant", - "🥔": "potato", - "🥕": "carrot", - "🌽": "ear of corn", - "🌶": "hot pepper", - "🫑": "bell pepper", - "🥒": "cucumber", - "🥬": "leafy green", - "🥦": "broccoli", - "🧄": "garlic", - "🧅": "onion", - "🥜": "peanuts", - "🫘": "beans", - "🌰": "chestnut", - "🫚": "ginger root", - "🫛": "pea pod", - "🍞": "bread", - "🥐": "croissant", - "🥖": "baguette bread", - "🫓": "flatbread", - "🥨": "pretzel", - "🥯": "bagel", - "🥞": "pancakes", - "🧇": "waffle", - "🧀": "cheese wedge", - "🍖": "meat on bone", - "🍗": "poultry leg", - "🥩": "cut of meat", - "🥓": "bacon", - "🍔": "hamburger", - "🍟": "french fries", - "🍕": "pizza", - "🌭": "hot dog", - "🥪": "sandwich", - "🌮": "taco", - "🌯": "burrito", - "🫔": "tamale", - "🥙": "stuffed flatbread", - "🧆": "falafel", - "🥚": "egg", - "🍳": "cooking", - "🥘": "shallow pan of food", - "🍲": "pot of food", - "🫕": "fondue", - "🥣": "bowl with spoon", - "🥗": "green salad", - "🍿": "popcorn", - "🧈": "butter", - "🧂": "salt", - "🥫": "canned food", - "🍱": "bento box", - "🍘": "rice cracker", - "🍙": "rice ball", - "🍚": "cooked rice", - "🍛": "curry rice", - "🍜": "steaming bowl", - "🍝": "spaghetti", - "🍠": "roasted sweet potato", - "🍢": "oden", - "🍣": "sushi", - "🍤": "fried shrimp", - "🍥": "fish cake with swirl", - "🥮": "moon cake", - "🍡": "dango", - "🥟": "dumpling", - "🥠": "fortune cookie", - "🥡": "takeout box", - "🦀": "crab", - "🦞": "lobster", - "🦐": "shrimp", - "🦑": "squid", - "🦪": "oyster", - "🍦": "soft ice cream", - "🍧": "shaved ice", - "🍨": "ice cream", - "🍩": "doughnut", - "🍪": "cookie", - "🎂": "birthday cake", - "🍰": "shortcake", - "🧁": "cupcake", - "🥧": "pie", - "🍫": "chocolate bar", - "🍬": "candy", - "🍭": "lollipop", - "🍮": "custard", - "🍯": "honey pot", - "🍼": "baby bottle", - "🥛": "glass of milk", - "☕": "hot beverage", - "🫖": "teapot", - "🍵": "teacup without handle", - "🍶": "sake", - "🍾": "bottle with popping cork", - "🍷": "wine glass", - "🍸": "cocktail glass", - "🍹": "tropical drink", - "🍺": "beer mug", - "🍻": "clinking beer mugs", - "🥂": "clinking glasses", - "🥃": "tumbler glass", - "🫗": "pouring liquid", - "🥤": "cup with straw", - "🧋": "bubble tea", - "🧃": "beverage box", - "🧉": "mate", - "🧊": "ice", - "🥢": "chopsticks", - "🍽": "fork and knife with plate", - "🍴": "fork and knife", - "🥄": "spoon", - "🔪": "kitchen knife", - "🫙": "jar", - "🏺": "amphora", - "🌍": "globe showing Europe-Africa", - "🌎": "globe showing Americas", - "🌏": "globe showing Asia-Australia", - "🌐": "globe with meridians", - "🗺": "world map", - "🗾": "map of Japan", - "🧭": "compass", - "🏔": "snow-capped mountain", - "⛰": "mountain", - "🌋": "volcano", - "🗻": "mount fuji", - "🏕": "camping", - "🏖": "beach with umbrella", - "🏜": "desert", - "🏝": "desert island", - "🏞": "national park", - "🏟": "stadium", - "🏛": "classical building", - "🏗": "building construction", - "🧱": "brick", - "🪨": "rock", - "🪵": "wood", - "🛖": "hut", - "🏘": "houses", - "🏚": "derelict house", - "🏠": "house", - "🏡": "house with garden", - "🏢": "office building", - "🏣": "Japanese post office", - "🏤": "post office", - "🏥": "hospital", - "🏦": "bank", - "🏨": "hotel", - "🏩": "love hotel", - "🏪": "convenience store", - "🏫": "school", - "🏬": "department store", - "🏭": "factory", - "🏯": "Japanese castle", - "🏰": "castle", - "💒": "wedding", - "🗼": "Tokyo tower", - "🗽": "Statue of Liberty", - "⛪": "church", - "🕌": "mosque", - "🛕": "hindu temple", - "🕍": "synagogue", - "⛩": "shinto shrine", - "🕋": "kaaba", - "⛲": "fountain", - "⛺": "tent", - "🌁": "foggy", - "🌃": "night with stars", - "🏙": "cityscape", - "🌄": "sunrise over mountains", - "🌅": "sunrise", - "🌆": "cityscape at dusk", - "🌇": "sunset", - "🌉": "bridge at night", - "♨": "hot springs", - "🎠": "carousel horse", - "🛝": "playground slide", - "🎡": "ferris wheel", - "🎢": "roller coaster", - "💈": "barber pole", - "🎪": "circus tent", - "🚂": "locomotive", - "🚃": "railway car", - "🚄": "high-speed train", - "🚅": "bullet train", - "🚆": "train", - "🚇": "metro", - "🚈": "light rail", - "🚉": "station", - "🚊": "tram", - "🚝": "monorail", - "🚞": "mountain railway", - "🚋": "tram car", - "🚌": "bus", - "🚍": "oncoming bus", - "🚎": "trolleybus", - "🚐": "minibus", - "🚑": "ambulance", - "🚒": "fire engine", - "🚓": "police car", - "🚔": "oncoming police car", - "🚕": "taxi", - "🚖": "oncoming taxi", - "🚗": "automobile", - "🚘": "oncoming automobile", - "🚙": "sport utility vehicle", - "🛻": "pickup truck", - "🚚": "delivery truck", - "🚛": "articulated lorry", - "🚜": "tractor", - "🏎": "racing car", - "🏍": "motorcycle", - "🛵": "motor scooter", - "🦽": "manual wheelchair", - "🦼": "motorized wheelchair", - "🛺": "auto rickshaw", - "🚲": "bicycle", - "🛴": "kick scooter", - "🛹": "skateboard", - "🛼": "roller skate", - "🚏": "bus stop", - "🛣": "motorway", - "🛤": "railway track", - "🛢": "oil drum", - "⛽": "fuel pump", - "🛞": "wheel", - "🚨": "police car light", - "🚥": "horizontal traffic light", - "🚦": "vertical traffic light", - "🛑": "stop sign", - "🚧": "construction", - "⚓": "anchor", - "🛟": "ring buoy", - "⛵": "sailboat", - "🛶": "canoe", - "🚤": "speedboat", - "🛳": "passenger ship", - "⛴": "ferry", - "🛥": "motor boat", - "🚢": "ship", - "✈": "airplane", - "🛩": "small airplane", - "🛫": "airplane departure", - "🛬": "airplane arrival", - "🪂": "parachute", - "💺": "seat", - "🚁": "helicopter", - "🚟": "suspension railway", - "🚠": "mountain cableway", - "🚡": "aerial tramway", - "🛰": "satellite", - "🚀": "rocket", - "🛸": "flying saucer", - "🛎": "bellhop bell", - "🧳": "luggage", - "⌛": "hourglass done", - "⏳": "hourglass not done", - "⌚": "watch", - "⏰": "alarm clock", - "⏱": "stopwatch", - "⏲": "timer clock", - "🕰": "mantelpiece clock", - "🕛": "twelve o’clock", - "🕧": "twelve-thirty", - "🕐": "one o’clock", - "🕜": "one-thirty", - "🕑": "two o’clock", - "🕝": "two-thirty", - "🕒": "three o’clock", - "🕞": "three-thirty", - "🕓": "four o’clock", - "🕟": "four-thirty", - "🕔": "five o’clock", - "🕠": "five-thirty", - "🕕": "six o’clock", - "🕡": "six-thirty", - "🕖": "seven o’clock", - "🕢": "seven-thirty", - "🕗": "eight o’clock", - "🕣": "eight-thirty", - "🕘": "nine o’clock", - "🕤": "nine-thirty", - "🕙": "ten o’clock", - "🕥": "ten-thirty", - "🕚": "eleven o’clock", - "🕦": "eleven-thirty", - "🌑": "new moon", - "🌒": "waxing crescent moon", - "🌓": "first quarter moon", - "🌔": "waxing gibbous moon", - "🌕": "full moon", - "🌖": "waning gibbous moon", - "🌗": "last quarter moon", - "🌘": "waning crescent moon", - "🌙": "crescent moon", - "🌚": "new moon face", - "🌛": "first quarter moon face", - "🌜": "last quarter moon face", - "🌡": "thermometer", - "☀": "sun", - "🌝": "full moon face", - "🌞": "sun with face", - "🪐": "ringed planet", - "⭐": "star", - "🌟": "glowing star", - "🌠": "shooting star", - "🌌": "milky way", - "☁": "cloud", - "⛅": "sun behind cloud", - "⛈": "cloud with lightning and rain", - "🌤": "sun behind small cloud", - "🌥": "sun behind large cloud", - "🌦": "sun behind rain cloud", - "🌧": "cloud with rain", - "🌨": "cloud with snow", - "🌩": "cloud with lightning", - "🌪": "tornado", - "🌫": "fog", - "🌬": "wind face", - "🌀": "cyclone", - "🌈": "rainbow", - "🌂": "closed umbrella", - "☂": "umbrella", - "☔": "umbrella with rain drops", - "⛱": "umbrella on ground", - "⚡": "high voltage", - "❄": "snowflake", - "☃": "snowman", - "⛄": "snowman without snow", - "☄": "comet", - "🔥": "fire", - "💧": "droplet", - "🌊": "water wave", - "🎃": "jack-o-lantern", - "🎄": "Christmas tree", - "🎆": "fireworks", - "🎇": "sparkler", - "🧨": "firecracker", - "✨": "sparkles", - "🎈": "balloon", - "🎉": "party popper", - "🎊": "confetti ball", - "🎋": "tanabata tree", - "🎍": "pine decoration", - "🎎": "Japanese dolls", - "🎏": "carp streamer", - "🎐": "wind chime", - "🎑": "moon viewing ceremony", - "🧧": "red envelope", - "🎀": "ribbon", - "🎁": "wrapped gift", - "🎗": "reminder ribbon", - "🎟": "admission tickets", - "🎫": "ticket", - "🎖": "military medal", - "🏆": "trophy", - "🏅": "sports medal", - "🥇": "1st place medal", - "🥈": "2nd place medal", - "🥉": "3rd place medal", - "⚽": "soccer ball", - "⚾": "baseball", - "🥎": "softball", - "🏀": "basketball", - "🏐": "volleyball", - "🏈": "american football", - "🏉": "rugby football", - "🎾": "tennis", - "🥏": "flying disc", - "🎳": "bowling", - "🏏": "cricket game", - "🏑": "field hockey", - "🏒": "ice hockey", - "🥍": "lacrosse", - "🏓": "ping pong", - "🏸": "badminton", - "🥊": "boxing glove", - "🥋": "martial arts uniform", - "🥅": "goal net", - "⛳": "flag in hole", - "⛸": "ice skate", - "🎣": "fishing pole", - "🤿": "diving mask", - "🎽": "running shirt", - "🎿": "skis", - "🛷": "sled", - "🥌": "curling stone", - "🎯": "bullseye", - "🪀": "yo-yo", - "🪁": "kite", - "🔫": "water pistol", - "🎱": "pool 8 ball", - "🔮": "crystal ball", - "🪄": "magic wand", - "🎮": "video game", - "🕹": "joystick", - "🎰": "slot machine", - "🎲": "game die", - "🧩": "puzzle piece", - "🧸": "teddy bear", - "🪅": "piñata", - "🪩": "mirror ball", - "🪆": "nesting dolls", - "♠": "spade suit", - "♥": "heart suit", - "♦": "diamond suit", - "♣": "club suit", - "♟": "chess pawn", - "🃏": "joker", - "🀄": "mahjong red dragon", - "🎴": "flower playing cards", - "🎭": "performing arts", - "🖼": "framed picture", - "🎨": "artist palette", - "🧵": "thread", - "🪡": "sewing needle", - "🧶": "yarn", - "🪢": "knot", - "👓": "glasses", - "🕶": "sunglasses", - "🥽": "goggles", - "🥼": "lab coat", - "🦺": "safety vest", - "👔": "necktie", - "👕": "t-shirt", - "👖": "jeans", - "🧣": "scarf", - "🧤": "gloves", - "🧥": "coat", - "🧦": "socks", - "👗": "dress", - "👘": "kimono", - "🥻": "sari", - "🩱": "one-piece swimsuit", - "🩲": "briefs", - "🩳": "shorts", - "👙": "bikini", - "👚": "woman’s clothes", - "🪭": "folding hand fan", - "👛": "purse", - "👜": "handbag", - "👝": "clutch bag", - "🛍": "shopping bags", - "🎒": "backpack", - "🩴": "thong sandal", - "👞": "man’s shoe", - "👟": "running shoe", - "🥾": "hiking boot", - "🥿": "flat shoe", - "👠": "high-heeled shoe", - "👡": "woman’s sandal", - "🩰": "ballet shoes", - "👢": "woman’s boot", - "🪮": "hair pick", - "👑": "crown", - "👒": "woman’s hat", - "🎩": "top hat", - "🎓": "graduation cap", - "🧢": "billed cap", - "🪖": "military helmet", - "⛑": "rescue worker’s helmet", - "📿": "prayer beads", - "💄": "lipstick", - "💍": "ring", - "💎": "gem stone", - "🔇": "muted speaker", - "🔈": "speaker low volume", - "🔉": "speaker medium volume", - "🔊": "speaker high volume", - "📢": "loudspeaker", - "📣": "megaphone", - "📯": "postal horn", - "🔔": "bell", - "🔕": "bell with slash", - "🎼": "musical score", - "🎵": "musical note", - "🎶": "musical notes", - "🎙": "studio microphone", - "🎚": "level slider", - "🎛": "control knobs", - "🎤": "microphone", - "🎧": "headphone", - "📻": "radio", - "🎷": "saxophone", - "🪗": "accordion", - "🎸": "guitar", - "🎹": "musical keyboard", - "🎺": "trumpet", - "🎻": "violin", - "🪕": "banjo", - "🥁": "drum", - "🪘": "long drum", - "🪇": "maracas", - "🪈": "flute", - "📱": "mobile phone", - "📲": "mobile phone with arrow", - "☎": "telephone", - "📞": "telephone receiver", - "📟": "pager", - "📠": "fax machine", - "🔋": "battery", - "🪫": "low battery", - "🔌": "electric plug", - "💻": "laptop", - "🖥": "desktop computer", - "🖨": "printer", - "⌨": "keyboard", - "🖱": "computer mouse", - "🖲": "trackball", - "💽": "computer disk", - "💾": "floppy disk", - "💿": "optical disk", - "📀": "dvd", - "🧮": "abacus", - "🎥": "movie camera", - "🎞": "film frames", - "📽": "film projector", - "🎬": "clapper board", - "📺": "television", - "📷": "camera", - "📸": "camera with flash", - "📹": "video camera", - "📼": "videocassette", - "🔍": "magnifying glass tilted left", - "🔎": "magnifying glass tilted right", - "🕯": "candle", - "💡": "light bulb", - "🔦": "flashlight", - "🏮": "red paper lantern", - "🪔": "diya lamp", - "📔": "notebook with decorative cover", - "📕": "closed book", - "📖": "open book", - "📗": "green book", - "📘": "blue book", - "📙": "orange book", - "📚": "books", - "📓": "notebook", - "📒": "ledger", - "📃": "page with curl", - "📜": "scroll", - "📄": "page facing up", - "📰": "newspaper", - "🗞": "rolled-up newspaper", - "📑": "bookmark tabs", - "🔖": "bookmark", - "🏷": "label", - "💰": "money bag", - "🪙": "coin", - "💴": "yen banknote", - "💵": "dollar banknote", - "💶": "euro banknote", - "💷": "pound banknote", - "💸": "money with wings", - "💳": "credit card", - "🧾": "receipt", - "💹": "chart increasing with yen", - "✉": "envelope", - "📧": "e-mail", - "📨": "incoming envelope", - "📩": "envelope with arrow", - "📤": "outbox tray", - "📥": "inbox tray", - "📦": "package", - "📫": "closed mailbox with raised flag", - "📪": "closed mailbox with lowered flag", - "📬": "open mailbox with raised flag", - "📭": "open mailbox with lowered flag", - "📮": "postbox", - "🗳": "ballot box with ballot", - "✏": "pencil", - "✒": "black nib", - "🖋": "fountain pen", - "🖊": "pen", - "🖌": "paintbrush", - "🖍": "crayon", - "📝": "memo", - "💼": "briefcase", - "📁": "file folder", - "📂": "open file folder", - "🗂": "card index dividers", - "📅": "calendar", - "📆": "tear-off calendar", - "🗒": "spiral notepad", - "🗓": "spiral calendar", - "📇": "card index", - "📈": "chart increasing", - "📉": "chart decreasing", - "📊": "bar chart", - "📋": "clipboard", - "📌": "pushpin", - "📍": "round pushpin", - "📎": "paperclip", - "🖇": "linked paperclips", - "📏": "straight ruler", - "📐": "triangular ruler", - "✂": "scissors", - "🗃": "card file box", - "🗄": "file cabinet", - "🗑": "wastebasket", - "🔒": "locked", - "🔓": "unlocked", - "🔏": "locked with pen", - "🔐": "locked with key", - "🔑": "key", - "🗝": "old key", - "🔨": "hammer", - "🪓": "axe", - "⛏": "pick", - "⚒": "hammer and pick", - "🛠": "hammer and wrench", - "🗡": "dagger", - "⚔": "crossed swords", - "💣": "bomb", - "🪃": "boomerang", - "🏹": "bow and arrow", - "🛡": "shield", - "🪚": "carpentry saw", - "🔧": "wrench", - "🪛": "screwdriver", - "🔩": "nut and bolt", - "⚙": "gear", - "🗜": "clamp", - "⚖": "balance scale", - "🦯": "white cane", - "🔗": "link", - "⛓": "chains", - "🪝": "hook", - "🧰": "toolbox", - "🧲": "magnet", - "🪜": "ladder", - "⚗": "alembic", - "🧪": "test tube", - "🧫": "petri dish", - "🧬": "dna", - "🔬": "microscope", - "🔭": "telescope", - "📡": "satellite antenna", - "💉": "syringe", - "🩸": "drop of blood", - "💊": "pill", - "🩹": "adhesive bandage", - "🩼": "crutch", - "🩺": "stethoscope", - "🩻": "x-ray", - "🚪": "door", - "🛗": "elevator", - "🪞": "mirror", - "🪟": "window", - "🛏": "bed", - "🛋": "couch and lamp", - "🪑": "chair", - "🚽": "toilet", - "🪠": "plunger", - "🚿": "shower", - "🛁": "bathtub", - "🪤": "mouse trap", - "🪒": "razor", - "🧴": "lotion bottle", - "🧷": "safety pin", - "🧹": "broom", - "🧺": "basket", - "🧻": "roll of paper", - "🪣": "bucket", - "🧼": "soap", - "🫧": "bubbles", - "🪥": "toothbrush", - "🧽": "sponge", - "🧯": "fire extinguisher", - "🛒": "shopping cart", - "🚬": "cigarette", - "⚰": "coffin", - "🪦": "headstone", - "⚱": "funeral urn", - "🧿": "nazar amulet", - "🪬": "hamsa", - "🗿": "moai", - "🪧": "placard", - "🪪": "identification card", - "🏧": "ATM sign", - "🚮": "litter in bin sign", - "🚰": "potable water", - "♿": "wheelchair symbol", - "🚹": "men’s room", - "🚺": "women’s room", - "🚻": "restroom", - "🚼": "baby symbol", - "🚾": "water closet", - "🛂": "passport control", - "🛃": "customs", - "🛄": "baggage claim", - "🛅": "left luggage", - "⚠": "warning", - "🚸": "children crossing", - "⛔": "no entry", - "🚫": "prohibited", - "🚳": "no bicycles", - "🚭": "no smoking", - "🚯": "no littering", - "🚱": "non-potable water", - "🚷": "no pedestrians", - "📵": "no mobile phones", - "🔞": "no one under eighteen", - "☢": "radioactive", - "☣": "biohazard", - "⬆": "up arrow", - "↗": "up-right arrow", - "➡": "right arrow", - "↘": "down-right arrow", - "⬇": "down arrow", - "↙": "down-left arrow", - "⬅": "left arrow", - "↖": "up-left arrow", - "↕": "up-down arrow", - "↔": "left-right arrow", - "↩": "right arrow curving left", - "↪": "left arrow curving right", - "⤴": "right arrow curving up", - "⤵": "right arrow curving down", - "🔃": "clockwise vertical arrows", - "🔄": "counterclockwise arrows button", - "🔙": "BACK arrow", - "🔚": "END arrow", - "🔛": "ON! arrow", - "🔜": "SOON arrow", - "🔝": "TOP arrow", - "🛐": "place of worship", - "⚛": "atom symbol", - "🕉": "om", - "✡": "star of David", - "☸": "wheel of dharma", - "☯": "yin yang", - "✝": "latin cross", - "☦": "orthodox cross", - "☪": "star and crescent", - "☮": "peace symbol", - "🕎": "menorah", - "🔯": "dotted six-pointed star", - "🪯": "khanda", - "♈": "Aries", - "♉": "Taurus", - "♊": "Gemini", - "♋": "Cancer", - "♌": "Leo", - "♍": "Virgo", - "♎": "Libra", - "♏": "Scorpio", - "♐": "Sagittarius", - "♑": "Capricorn", - "♒": "Aquarius", - "♓": "Pisces", - "⛎": "Ophiuchus", - "🔀": "shuffle tracks button", - "🔁": "repeat button", - "🔂": "repeat single button", - "▶": "play button", - "⏩": "fast-forward button", - "⏭": "next track button", - "⏯": "play or pause button", - "◀": "reverse button", - "⏪": "fast reverse button", - "⏮": "last track button", - "🔼": "upwards button", - "⏫": "fast up button", - "🔽": "downwards button", - "⏬": "fast down button", - "⏸": "pause button", - "⏹": "stop button", - "⏺": "record button", - "⏏": "eject button", - "🎦": "cinema", - "🔅": "dim button", - "🔆": "bright button", - "📶": "antenna bars", - "🛜": "wireless", - "📳": "vibration mode", - "📴": "mobile phone off", - "♀": "female sign", - "♂": "male sign", - "⚧": "transgender symbol", - "✖": "multiply", - "➕": "plus", - "➖": "minus", - "➗": "divide", - "🟰": "heavy equals sign", - "♾": "infinity", - "‼": "double exclamation mark", - "⁉": "exclamation question mark", - "❓": "red question mark", - "❔": "white question mark", - "❕": "white exclamation mark", - "❗": "red exclamation mark", - "〰": "wavy dash", - "💱": "currency exchange", - "💲": "heavy dollar sign", - "⚕": "medical symbol", - "♻": "recycling symbol", - "⚜": "fleur-de-lis", - "🔱": "trident emblem", - "📛": "name badge", - "🔰": "Japanese symbol for beginner", - "⭕": "hollow red circle", - "✅": "check mark button", - "☑": "check box with check", - "✔": "check mark", - "❌": "cross mark", - "❎": "cross mark button", - "➰": "curly loop", - "➿": "double curly loop", - "〽": "part alternation mark", - "✳": "eight-spoked asterisk", - "✴": "eight-pointed star", - "❇": "sparkle", - "©": "copyright", - "®": "registered", - "™": "trade mark", - "#⃣": "keycap: #", - "*⃣": "keycap: *", - "0⃣": "keycap: 0", - "1⃣": "keycap: 1", - "2⃣": "keycap: 2", - "3⃣": "keycap: 3", - "4⃣": "keycap: 4", - "5⃣": "keycap: 5", - "6⃣": "keycap: 6", - "7⃣": "keycap: 7", - "8⃣": "keycap: 8", - "9⃣": "keycap: 9", - "🔟": "keycap: 10", - "🔠": "input latin uppercase", - "🔡": "input latin lowercase", - "🔢": "input numbers", - "🔣": "input symbols", - "🔤": "input latin letters", - "🅰": "A button (blood type)", - "🆎": "AB button (blood type)", - "🅱": "B button (blood type)", - "🆑": "CL button", - "🆒": "COOL button", - "🆓": "FREE button", - "ℹ": "information", - "🆔": "ID button", - "Ⓜ": "circled M", - "🆕": "NEW button", - "🆖": "NG button", - "🅾": "O button (blood type)", - "🆗": "OK button", - "🅿": "P button", - "🆘": "SOS button", - "🆙": "UP! button", - "🆚": "VS button", - "🈁": "Japanese “here” button", - "🈂": "Japanese “service charge” button", - "🈷": "Japanese “monthly amount” button", - "🈶": "Japanese “not free of charge” button", - "🈯": "Japanese “reserved” button", - "🉐": "Japanese “bargain” button", - "🈹": "Japanese “discount” button", - "🈚": "Japanese “free of charge” button", - "🈲": "Japanese “prohibited” button", - "🉑": "Japanese “acceptable” button", - "🈸": "Japanese “application” button", - "🈴": "Japanese “passing grade” button", - "🈳": "Japanese “vacancy” button", - "㊗": "Japanese “congratulations” button", - "㊙": "Japanese “secret” button", - "🈺": "Japanese “open for business” button", - "🈵": "Japanese “no vacancy” button", - "🔴": "red circle", - "🟠": "orange circle", - "🟡": "yellow circle", - "🟢": "green circle", - "🔵": "blue circle", - "🟣": "purple circle", - "🟤": "brown circle", - "⚫": "black circle", - "⚪": "white circle", - "🟥": "red square", - "🟧": "orange square", - "🟨": "yellow square", - "🟩": "green square", - "🟦": "blue square", - "🟪": "purple square", - "🟫": "brown square", - "⬛": "black large square", - "⬜": "white large square", - "◼": "black medium square", - "◻": "white medium square", - "◾": "black medium-small square", - "◽": "white medium-small square", - "▪": "black small square", - "▫": "white small square", - "🔶": "large orange diamond", - "🔷": "large blue diamond", - "🔸": "small orange diamond", - "🔹": "small blue diamond", - "🔺": "red triangle pointed up", - "🔻": "red triangle pointed down", - "💠": "diamond with a dot", - "🔘": "radio button", - "🔳": "white square button", - "🔲": "black square button", - "🏁": "chequered flag", - "🚩": "triangular flag", - "🎌": "crossed flags", - "🏴": "black flag", - "🏳": "white flag", - "🏳‍🌈": "rainbow flag", - "🏳‍⚧": "transgender flag", - "🏴‍☠": "pirate flag", - "🇦🇨": "flag: Ascension Island", - "🇦🇩": "flag: Andorra", - "🇦🇪": "flag: United Arab Emirates", - "🇦🇫": "flag: Afghanistan", - "🇦🇬": "flag: Antigua & Barbuda", - "🇦🇮": "flag: Anguilla", - "🇦🇱": "flag: Albania", - "🇦🇲": "flag: Armenia", - "🇦🇴": "flag: Angola", - "🇦🇶": "flag: Antarctica", - "🇦🇷": "flag: Argentina", - "🇦🇸": "flag: American Samoa", - "🇦🇹": "flag: Austria", - "🇦🇺": "flag: Australia", - "🇦🇼": "flag: Aruba", - "🇦🇽": "flag: Åland Islands", - "🇦🇿": "flag: Azerbaijan", - "🇧🇦": "flag: Bosnia & Herzegovina", - "🇧🇧": "flag: Barbados", - "🇧🇩": "flag: Bangladesh", - "🇧🇪": "flag: Belgium", - "🇧🇫": "flag: Burkina Faso", - "🇧🇬": "flag: Bulgaria", - "🇧🇭": "flag: Bahrain", - "🇧🇮": "flag: Burundi", - "🇧🇯": "flag: Benin", - "🇧🇱": "flag: St. Barthélemy", - "🇧🇲": "flag: Bermuda", - "🇧🇳": "flag: Brunei", - "🇧🇴": "flag: Bolivia", - "🇧🇶": "flag: Caribbean Netherlands", - "🇧🇷": "flag: Brazil", - "🇧🇸": "flag: Bahamas", - "🇧🇹": "flag: Bhutan", - "🇧🇻": "flag: Bouvet Island", - "🇧🇼": "flag: Botswana", - "🇧🇾": "flag: Belarus", - "🇧🇿": "flag: Belize", - "🇨🇦": "flag: Canada", - "🇨🇨": "flag: Cocos (Keeling) Islands", - "🇨🇩": "flag: Congo - Kinshasa", - "🇨🇫": "flag: Central African Republic", - "🇨🇬": "flag: Congo - Brazzaville", - "🇨🇭": "flag: Switzerland", - "🇨🇮": "flag: Côte d’Ivoire", - "🇨🇰": "flag: Cook Islands", - "🇨🇱": "flag: Chile", - "🇨🇲": "flag: Cameroon", - "🇨🇳": "flag: China", - "🇨🇴": "flag: Colombia", - "🇨🇵": "flag: Clipperton Island", - "🇨🇷": "flag: Costa Rica", - "🇨🇺": "flag: Cuba", - "🇨🇻": "flag: Cape Verde", - "🇨🇼": "flag: Curaçao", - "🇨🇽": "flag: Christmas Island", - "🇨🇾": "flag: Cyprus", - "🇨🇿": "flag: Czechia", - "🇩🇪": "flag: Germany", - "🇩🇬": "flag: Diego Garcia", - "🇩🇯": "flag: Djibouti", - "🇩🇰": "flag: Denmark", - "🇩🇲": "flag: Dominica", - "🇩🇴": "flag: Dominican Republic", - "🇩🇿": "flag: Algeria", - "🇪🇦": "flag: Ceuta & Melilla", - "🇪🇨": "flag: Ecuador", - "🇪🇪": "flag: Estonia", - "🇪🇬": "flag: Egypt", - "🇪🇭": "flag: Western Sahara", - "🇪🇷": "flag: Eritrea", - "🇪🇸": "flag: Spain", - "🇪🇹": "flag: Ethiopia", - "🇪🇺": "flag: European Union", - "🇫🇮": "flag: Finland", - "🇫🇯": "flag: Fiji", - "🇫🇰": "flag: Falkland Islands", - "🇫🇲": "flag: Micronesia", - "🇫🇴": "flag: Faroe Islands", - "🇫🇷": "flag: France", - "🇬🇦": "flag: Gabon", - "🇬🇧": "flag: United Kingdom", - "🇬🇩": "flag: Grenada", - "🇬🇪": "flag: Georgia", - "🇬🇫": "flag: French Guiana", - "🇬🇬": "flag: Guernsey", - "🇬🇭": "flag: Ghana", - "🇬🇮": "flag: Gibraltar", - "🇬🇱": "flag: Greenland", - "🇬🇲": "flag: Gambia", - "🇬🇳": "flag: Guinea", - "🇬🇵": "flag: Guadeloupe", - "🇬🇶": "flag: Equatorial Guinea", - "🇬🇷": "flag: Greece", - "🇬🇸": "flag: South Georgia & South Sandwich Islands", - "🇬🇹": "flag: Guatemala", - "🇬🇺": "flag: Guam", - "🇬🇼": "flag: Guinea-Bissau", - "🇬🇾": "flag: Guyana", - "🇭🇰": "flag: Hong Kong SAR China", - "🇭🇲": "flag: Heard & McDonald Islands", - "🇭🇳": "flag: Honduras", - "🇭🇷": "flag: Croatia", - "🇭🇹": "flag: Haiti", - "🇭🇺": "flag: Hungary", - "🇮🇨": "flag: Canary Islands", - "🇮🇩": "flag: Indonesia", - "🇮🇪": "flag: Ireland", - "🇮🇱": "flag: Israel", - "🇮🇲": "flag: Isle of Man", - "🇮🇳": "flag: India", - "🇮🇴": "flag: British Indian Ocean Territory", - "🇮🇶": "flag: Iraq", - "🇮🇷": "flag: Iran", - "🇮🇸": "flag: Iceland", - "🇮🇹": "flag: Italy", - "🇯🇪": "flag: Jersey", - "🇯🇲": "flag: Jamaica", - "🇯🇴": "flag: Jordan", - "🇯🇵": "flag: Japan", - "🇰🇪": "flag: Kenya", - "🇰🇬": "flag: Kyrgyzstan", - "🇰🇭": "flag: Cambodia", - "🇰🇮": "flag: Kiribati", - "🇰🇲": "flag: Comoros", - "🇰🇳": "flag: St. Kitts & Nevis", - "🇰🇵": "flag: North Korea", - "🇰🇷": "flag: South Korea", - "🇰🇼": "flag: Kuwait", - "🇰🇾": "flag: Cayman Islands", - "🇰🇿": "flag: Kazakhstan", - "🇱🇦": "flag: Laos", - "🇱🇧": "flag: Lebanon", - "🇱🇨": "flag: St. Lucia", - "🇱🇮": "flag: Liechtenstein", - "🇱🇰": "flag: Sri Lanka", - "🇱🇷": "flag: Liberia", - "🇱🇸": "flag: Lesotho", - "🇱🇹": "flag: Lithuania", - "🇱🇺": "flag: Luxembourg", - "🇱🇻": "flag: Latvia", - "🇱🇾": "flag: Libya", - "🇲🇦": "flag: Morocco", - "🇲🇨": "flag: Monaco", - "🇲🇩": "flag: Moldova", - "🇲🇪": "flag: Montenegro", - "🇲🇫": "flag: St. Martin", - "🇲🇬": "flag: Madagascar", - "🇲🇭": "flag: Marshall Islands", - "🇲🇰": "flag: North Macedonia", - "🇲🇱": "flag: Mali", - "🇲🇲": "flag: Myanmar (Burma)", - "🇲🇳": "flag: Mongolia", - "🇲🇴": "flag: Macao SAR China", - "🇲🇵": "flag: Northern Mariana Islands", - "🇲🇶": "flag: Martinique", - "🇲🇷": "flag: Mauritania", - "🇲🇸": "flag: Montserrat", - "🇲🇹": "flag: Malta", - "🇲🇺": "flag: Mauritius", - "🇲🇻": "flag: Maldives", - "🇲🇼": "flag: Malawi", - "🇲🇽": "flag: Mexico", - "🇲🇾": "flag: Malaysia", - "🇲🇿": "flag: Mozambique", - "🇳🇦": "flag: Namibia", - "🇳🇨": "flag: New Caledonia", - "🇳🇪": "flag: Niger", - "🇳🇫": "flag: Norfolk Island", - "🇳🇬": "flag: Nigeria", - "🇳🇮": "flag: Nicaragua", - "🇳🇱": "flag: Netherlands", - "🇳🇴": "flag: Norway", - "🇳🇵": "flag: Nepal", - "🇳🇷": "flag: Nauru", - "🇳🇺": "flag: Niue", - "🇳🇿": "flag: New Zealand", - "🇴🇲": "flag: Oman", - "🇵🇦": "flag: Panama", - "🇵🇪": "flag: Peru", - "🇵🇫": "flag: French Polynesia", - "🇵🇬": "flag: Papua New Guinea", - "🇵🇭": "flag: Philippines", - "🇵🇰": "flag: Pakistan", - "🇵🇱": "flag: Poland", - "🇵🇲": "flag: St. Pierre & Miquelon", - "🇵🇳": "flag: Pitcairn Islands", - "🇵🇷": "flag: Puerto Rico", - "🇵🇸": "flag: Palestinian Territories", - "🇵🇹": "flag: Portugal", - "🇵🇼": "flag: Palau", - "🇵🇾": "flag: Paraguay", - "🇶🇦": "flag: Qatar", - "🇷🇪": "flag: Réunion", - "🇷🇴": "flag: Romania", - "🇷🇸": "flag: Serbia", - "🇷🇺": "flag: Russia", - "🇷🇼": "flag: Rwanda", - "🇸🇦": "flag: Saudi Arabia", - "🇸🇧": "flag: Solomon Islands", - "🇸🇨": "flag: Seychelles", - "🇸🇩": "flag: Sudan", - "🇸🇪": "flag: Sweden", - "🇸🇬": "flag: Singapore", - "🇸🇭": "flag: St. Helena", - "🇸🇮": "flag: Slovenia", - "🇸🇯": "flag: Svalbard & Jan Mayen", - "🇸🇰": "flag: Slovakia", - "🇸🇱": "flag: Sierra Leone", - "🇸🇲": "flag: San Marino", - "🇸🇳": "flag: Senegal", - "🇸🇴": "flag: Somalia", - "🇸🇷": "flag: Suriname", - "🇸🇸": "flag: South Sudan", - "🇸🇹": "flag: São Tomé & Príncipe", - "🇸🇻": "flag: El Salvador", - "🇸🇽": "flag: Sint Maarten", - "🇸🇾": "flag: Syria", - "🇸🇿": "flag: Eswatini", - "🇹🇦": "flag: Tristan da Cunha", - "🇹🇨": "flag: Turks & Caicos Islands", - "🇹🇩": "flag: Chad", - "🇹🇫": "flag: French Southern Territories", - "🇹🇬": "flag: Togo", - "🇹🇭": "flag: Thailand", - "🇹🇯": "flag: Tajikistan", - "🇹🇰": "flag: Tokelau", - "🇹🇱": "flag: Timor-Leste", - "🇹🇲": "flag: Turkmenistan", - "🇹🇳": "flag: Tunisia", - "🇹🇴": "flag: Tonga", - "🇹🇷": "flag: Turkey", - "🇹🇹": "flag: Trinidad & Tobago", - "🇹🇻": "flag: Tuvalu", - "🇹🇼": "flag: Taiwan", - "🇹🇿": "flag: Tanzania", - "🇺🇦": "flag: Ukraine", - "🇺🇬": "flag: Uganda", - "🇺🇲": "flag: U.S. Outlying Islands", - "🇺🇳": "flag: United Nations", - "🇺🇸": "flag: United States", - "🇺🇾": "flag: Uruguay", - "🇺🇿": "flag: Uzbekistan", - "🇻🇦": "flag: Vatican City", - "🇻🇨": "flag: St. Vincent & Grenadines", - "🇻🇪": "flag: Venezuela", - "🇻🇬": "flag: British Virgin Islands", - "🇻🇮": "flag: U.S. Virgin Islands", - "🇻🇳": "flag: Vietnam", - "🇻🇺": "flag: Vanuatu", - "🇼🇫": "flag: Wallis & Futuna", - "🇼🇸": "flag: Samoa", - "🇽🇰": "flag: Kosovo", - "🇾🇪": "flag: Yemen", - "🇾🇹": "flag: Mayotte", - "🇿🇦": "flag: South Africa", - "🇿🇲": "flag: Zambia", - "🇿🇼": "flag: Zimbabwe", - "🏴󠁧󠁢󠁥󠁮󠁧󠁿": "flag: England", - "🏴󠁧󠁢󠁳󠁣󠁴󠁿": "flag: Scotland", - "🏴󠁧󠁢󠁷󠁬󠁳󠁿": "flag: Wales" -} diff --git a/client/js/helpers/ircmessageparser/anyIntersection.ts b/client/js/helpers/ircmessageparser/anyIntersection.ts deleted file mode 100644 index cf2fd156..00000000 --- a/client/js/helpers/ircmessageparser/anyIntersection.ts +++ /dev/null @@ -1,15 +0,0 @@ -// Return true if any section of "a" or "b" parts (defined by their start/end - -import {Part} from "./merge"; - -// markers) intersect each other, false otherwise. -function anyIntersection(a: Part, b: Part) { - return ( - (a.start <= b.start && b.start < a.end) || - (a.start < b.end && b.end <= a.end) || - (b.start <= a.start && a.start < b.end) || - (b.start < a.end && a.end <= b.end) - ); -} - -export default anyIntersection; diff --git a/client/js/helpers/ircmessageparser/fill.ts b/client/js/helpers/ircmessageparser/fill.ts deleted file mode 100644 index c9e613f1..00000000 --- a/client/js/helpers/ircmessageparser/fill.ts +++ /dev/null @@ -1,36 +0,0 @@ -// Create plain text entries corresponding to areas of the text that match no -// existing entries. Returns an empty array if all parts of the text have been - -import {Part} from "./merge"; - -// parsed into recognizable entries already. -function fill(existingEntries: Part[], text: string) { - let position = 0; - - // Fill inner parts of the text. For example, if text is `foobarbaz` and both - // `foo` and `baz` have matched into an entry, this will return a dummy entry - // corresponding to `bar`. - const result = existingEntries.reduce((acc, textSegment) => { - if (textSegment.start > position) { - acc.push({ - start: position, - end: textSegment.start, - }); - } - - position = textSegment.end; - return acc; - }, []); - - // Complete the unmatched end of the text with a dummy entry - if (position < text.length) { - result.push({ - start: position, - end: text.length, - }); - } - - return result; -} - -export default fill; diff --git a/client/js/helpers/ircmessageparser/findChannels.ts b/client/js/helpers/ircmessageparser/findChannels.ts deleted file mode 100644 index f55ea586..00000000 --- a/client/js/helpers/ircmessageparser/findChannels.ts +++ /dev/null @@ -1,53 +0,0 @@ -// Escapes the RegExp special characters "^", "$", "", ".", "*", "+", "?", "(", -// ")", "[", "]", "{", "}", and "|" in string. -// See https://lodash.com/docs/#escapeRegExp -import escapeRegExp from "lodash/escapeRegExp"; -import {Part} from "./merge"; - -export type ChannelPart = Part & { - channel: string; -}; - -// escapes a regex in a way that's compatible to shove it in -// a regex char set (meaning it also escapes -) -function escapeRegExpCharSet(raw: string): string { - const escaped: string = escapeRegExp(raw); - return escaped.replace("-", "\\-"); -} - -// Given an array of channel prefixes (such as "#" and "&") and an array of user -// modes (such as "@" and "+"), this function extracts channels and nicks from a -// text. -// It returns an array of objects for each channel found with their start index, -// end index and channel name. -function findChannels(text: string, channelPrefixes: string[], userModes: string[]) { - // `userModePattern` is necessary to ignore user modes in /whois responses. - // For example, a voiced user in #thelounge will have a /whois response of: - // > foo is on the following channels: +#thelounge - // We need to explicitly ignore user modes to parse such channels correctly. - const userModePattern = userModes.map(escapeRegExpCharSet).join(""); - const channelPrefixPattern = channelPrefixes.map(escapeRegExpCharSet).join(""); - const channelPattern = `(?:^|\\s)[${userModePattern}]*([${channelPrefixPattern}][^ \u0007]+)`; - const channelRegExp = new RegExp(channelPattern, "g"); - - const result: ChannelPart[] = []; - let match: RegExpExecArray | null; - - do { - // With global ("g") regexes, calling `exec` multiple times will find - // successive matches in the same string. - match = channelRegExp.exec(text); - - if (match) { - result.push({ - start: match.index + match[0].length - match[1].length, - end: match.index + match[0].length, - channel: match[1], - }); - } - } while (match); - - return result; -} - -export default findChannels; diff --git a/client/js/helpers/ircmessageparser/findEmoji.ts b/client/js/helpers/ircmessageparser/findEmoji.ts deleted file mode 100644 index 7ebc95cc..00000000 --- a/client/js/helpers/ircmessageparser/findEmoji.ts +++ /dev/null @@ -1,25 +0,0 @@ -import emojiRegExp from "emoji-regex"; -import {Part} from "./merge"; - -const regExp = emojiRegExp(); - -export type EmojiPart = Part & { - emoji: string; -}; - -function findEmoji(text: string) { - const result: EmojiPart[] = []; - let match: RegExpExecArray | null; - - while ((match = regExp.exec(text))) { - result.push({ - start: match.index, - end: match.index + match[0].length, - emoji: match[0], - }); - } - - return result; -} - -export default findEmoji; diff --git a/client/js/helpers/ircmessageparser/findNames.ts b/client/js/helpers/ircmessageparser/findNames.ts deleted file mode 100644 index 52b116e3..00000000 --- a/client/js/helpers/ircmessageparser/findNames.ts +++ /dev/null @@ -1,32 +0,0 @@ -import {Part} from "./merge"; - -const nickRegExp = /([\w[\]\\`^{|}-]+)/g; - -export type NamePart = Part & { - nick: string; -}; - -function findNames(text: string, nicks: string[]): NamePart[] { - const result: NamePart[] = []; - - // Return early if we don't have any nicknames to find - if (nicks.length === 0) { - return result; - } - - let match: RegExpExecArray | null; - - while ((match = nickRegExp.exec(text))) { - if (nicks.indexOf(match[1]) > -1) { - result.push({ - start: match.index, - end: match.index + match[1].length, - nick: match[1], - }); - } - } - - return result; -} - -export default findNames; diff --git a/client/js/helpers/ircmessageparser/merge.ts b/client/js/helpers/ircmessageparser/merge.ts deleted file mode 100644 index 707c495d..00000000 --- a/client/js/helpers/ircmessageparser/merge.ts +++ /dev/null @@ -1,83 +0,0 @@ -import anyIntersection from "./anyIntersection"; -import fill from "./fill"; -import {ChannelPart} from "./findChannels"; -import {EmojiPart} from "./findEmoji"; -import {LinkPart} from "../../../../shared/linkify"; -import {NamePart} from "./findNames"; - -export type Part = { - start: number; - end: number; -}; - -type TextPart = Part & { - text: string; -}; - -type Fragment = { - start: number; - end: number; - text: string; -}; - -type PartWithFragments = Part & { - fragments: Fragment[]; -}; - -// Merge text part information within a styling fragment -function assign(textPart: Part, fragment: Fragment) { - const fragStart = fragment.start; - const start = Math.max(fragment.start, textPart.start); - const end = Math.min(fragment.end, textPart.end); - const text = fragment.text.slice(start - fragStart, end - fragStart); - - return Object.assign({}, fragment, {start, end, text}); -} - -function sortParts(a: Part, b: Part) { - return a.start - b.start || b.end - a.end; -} - -export type MergedParts = (TextPart | NamePart | EmojiPart | ChannelPart | LinkPart)[]; - -// Merge the style fragments within the text parts, taking into account -// boundaries and text sections that have not matched to links or channels. -// For example, given a string "foobar" where "foo" and "bar" have been -// identified as parts (channels, links, etc.) and "fo", "ob" and "ar" have 3 -// different styles, the first resulting part will contain fragments "fo" and -// "o", and the second resulting part will contain "b" and "ar". "o" and "b" -// fragments will contain duplicate styling attributes. -function merge( - parts: MergedParts, - styleFragments: Fragment[], - cleanText: string -): PartWithFragments[] { - // Remove overlapping parts - parts = parts.sort(sortParts).reduce((prev, curr) => { - const intersection = prev.some((p) => anyIntersection(p, curr)); - - if (intersection) { - return prev; - } - - return prev.concat([curr]); - }, []); - - // Every section of the original text that has not been captured in a "part" - // is filled with "text" parts, dummy objects with start/end but no extra - // metadata. - - const filled = fill(parts, cleanText) as TextPart[]; - const allParts: MergedParts = [...parts, ...filled].sort(sortParts); // Sort all parts identified based on their position in the original text - - // Distribute the style fragments within the text parts - return allParts.map((part: any) => { - part.fragments = styleFragments - .filter((fragment) => anyIntersection(part, fragment)) - .map((fragment) => assign(part, fragment)); - - return part as PartWithFragments; - }); -} - -export default merge; diff --git a/client/js/helpers/ircmessageparser/parseStyle.ts b/client/js/helpers/ircmessageparser/parseStyle.ts deleted file mode 100644 index ea4d4bd3..00000000 --- a/client/js/helpers/ircmessageparser/parseStyle.ts +++ /dev/null @@ -1,250 +0,0 @@ -// Styling control codes -const BOLD = "\x02"; -const COLOR = "\x03"; -const HEX_COLOR = "\x04"; -const RESET = "\x0f"; -const REVERSE = "\x16"; -const ITALIC = "\x1d"; -const UNDERLINE = "\x1f"; -const STRIKETHROUGH = "\x1e"; -const MONOSPACE = "\x11"; - -export type ParsedStyle = { - bold?: boolean; - textColor?: string; - bgColor?: string; - hexColor?: string; - hexBgColor?: string; - italic?: boolean; - underline?: boolean; - strikethrough?: boolean; - monospace?: boolean; - text: string; - start: number; - end: number; -}; - -// Color code matcher, with format `XX,YY` where both `XX` and `YY` are -// integers, `XX` is the text color and `YY` is an optional background color. -const colorRx = /^(\d{1,2})(?:,(\d{1,2}))?/; - -// 6-char Hex color code matcher -const hexColorRx = /^([0-9a-f]{6})(?:,([0-9a-f]{6}))?/i; - -// Represents all other control codes that to be ignored/filtered from the text -// This regex allows line feed character -const controlCodesRx = /[\u0000-\u0009\u000B-\u001F]/g; - -// Converts a given text into an array of objects, each of them representing a -// similarly styled section of the text. Each object carries the `text`, style -// information (`bold`, `textColor`, `bgcolor`, `italic`, -// `underline`, `strikethrough`, `monospace`), and `start`/`end` cursors. -function parseStyle(text: string) { - const result: ParsedStyle[] = []; - let start = 0; - let position = 0; - - // At any given time, these carry style information since last time a styling - // control code was met. - let colorCodes, - bold, - textColor, - bgColor, - hexColor, - hexBgColor, - italic, - underline, - strikethrough, - monospace; - - const resetStyle = () => { - bold = false; - textColor = undefined; - bgColor = undefined; - hexColor = undefined; - hexBgColor = undefined; - italic = false; - underline = false; - strikethrough = false; - monospace = false; - }; - - resetStyle(); - - // When called, this "closes" the current fragment by adding an entry to the - // `result` array using the styling information set last time a control code - // was met. - const emitFragment = () => { - // Uses the text fragment starting from the last control code position up to - // the current position - const textPart = text.slice(start, position); - - // Filters out all non-style related control codes present in this text - const processedText = textPart.replace(controlCodesRx, " "); - - if (processedText.length) { - // Current fragment starts where the previous one ends, or at 0 if none - const fragmentStart = result.length ? result[result.length - 1].end : 0; - - result.push({ - bold, - textColor, - bgColor, - hexColor, - hexBgColor, - italic, - underline, - strikethrough, - monospace, - text: processedText, - start: fragmentStart, - end: fragmentStart + processedText.length, - }); - } - - // Now that a fragment has been "closed", the next one will start after that - start = position + 1; - }; - - // This loop goes through each character of the given text one by one by - // bumping the `position` cursor. Every time a new special "styling" character - // is met, an object gets created (with `emitFragment()`)information on text - // encountered since the previous styling character. - while (position < text.length) { - switch (text[position]) { - case RESET: - emitFragment(); - resetStyle(); - break; - - // Meeting a BOLD character means that the ongoing text is either going to - // be in bold or that the previous one was in bold and the following one - // must be reset. - // This same behavior applies to COLOR, REVERSE, ITALIC, and UNDERLINE. - case BOLD: - emitFragment(); - bold = !bold; - break; - - case COLOR: - emitFragment(); - - // Go one step further to find the corresponding color - colorCodes = text.slice(position + 1).match(colorRx); - - if (colorCodes) { - textColor = Number(colorCodes[1]); - - if (colorCodes[2]) { - bgColor = Number(colorCodes[2]); - } - - // Color code length is > 1, so bump the current position cursor by as - // much (and reset the start cursor for the current text block as well) - position += colorCodes[0].length; - start = position + 1; - } else { - // If no color codes were found, toggles back to no colors (like BOLD). - textColor = undefined; - bgColor = undefined; - } - - break; - - case HEX_COLOR: - emitFragment(); - - colorCodes = text.slice(position + 1).match(hexColorRx); - - if (colorCodes) { - hexColor = colorCodes[1].toUpperCase(); - - if (colorCodes[2]) { - hexBgColor = colorCodes[2].toUpperCase(); - } - - // Color code length is > 1, so bump the current position cursor by as - // much (and reset the start cursor for the current text block as well) - position += colorCodes[0].length; - start = position + 1; - } else { - // If no color codes were found, toggles back to no colors (like BOLD). - hexColor = undefined; - hexBgColor = undefined; - } - - break; - - case REVERSE: { - emitFragment(); - const tmp = bgColor; - bgColor = textColor; - textColor = tmp; - break; - } - - case ITALIC: - emitFragment(); - italic = !italic; - break; - - case UNDERLINE: - emitFragment(); - underline = !underline; - break; - - case STRIKETHROUGH: - emitFragment(); - strikethrough = !strikethrough; - break; - - case MONOSPACE: - emitFragment(); - monospace = !monospace; - break; - } - - // Evaluate the next character at the next iteration - position += 1; - } - - // The entire text has been parsed, so we finalize the current text fragment. - emitFragment(); - - return result; -} - -const properties = [ - "bold", - "textColor", - "bgColor", - "hexColor", - "hexBgColor", - "italic", - "underline", - "strikethrough", - "monospace", -]; - -function prepare(text: string) { - return ( - parseStyle(text) - // This optimizes fragments by combining them together when all their values - // for the properties defined above are equal. - .reduce((prev: ParsedStyle[], curr) => { - if (prev.length) { - const lastEntry = prev[prev.length - 1]; - - if (properties.every((key) => curr[key] === lastEntry[key])) { - lastEntry.text += curr.text; - lastEntry.end += curr.text.length; - return prev; - } - } - - return prev.concat([curr]); - }, []) - ); -} - -export default prepare; diff --git a/client/js/helpers/isChannelCollapsed.ts b/client/js/helpers/isChannelCollapsed.ts deleted file mode 100644 index 59e0b631..00000000 --- a/client/js/helpers/isChannelCollapsed.ts +++ /dev/null @@ -1,13 +0,0 @@ -import {store} from "../store"; - -export default (network, channel) => { - if (!network.isCollapsed || channel.highlight || channel.type === "lobby") { - return false; - } - - if (store.state.activeChannel && channel === store.state.activeChannel.channel) { - return false; - } - - return true; -}; diff --git a/client/js/helpers/isIgnoredKeybind.ts b/client/js/helpers/isIgnoredKeybind.ts deleted file mode 100644 index 0f0ab513..00000000 --- a/client/js/helpers/isIgnoredKeybind.ts +++ /dev/null @@ -1,13 +0,0 @@ -export default (event: MouseEvent | Mousetrap.ExtendedKeyboardEvent) => { - if ( - (event.target as HTMLElement).tagName !== "TEXTAREA" && - (event.target as HTMLElement).tagName !== "INPUT" - ) { - return false; - } - - // If focus is in a textarea, do not handle keybinds if user has typed anything - // This is done to prevent keyboard layout binds conflicting with ours - // For example alt+shift+left on macos selects a word - return !!(event.target as any).value; -}; diff --git a/client/js/helpers/listenForTwoFingerSwipes.ts b/client/js/helpers/listenForTwoFingerSwipes.ts deleted file mode 100644 index de920e21..00000000 --- a/client/js/helpers/listenForTwoFingerSwipes.ts +++ /dev/null @@ -1,111 +0,0 @@ -import distance from "./distance"; - -// onTwoFingerSwipe will be called with a cardinal direction ("n", "e", "s" or -// "w") as its only argument. -function listenForTwoFingerSwipes(onTwoFingerSwipe) { - let history: { - center: number[]; - timestamp: number; - }[] = []; - - document.body.addEventListener( - "touchmove", - function (event) { - if (event.touches.length !== 2) { - return; - } - - const a = event.touches.item(0); - const b = event.touches.item(1); - - if (!a || !b) { - return; - } - - const timestamp = window.performance.now(); - const center = [(a.screenX + b.screenX) / 2, (a.screenY + b.screenY) / 2]; - - if (history.length > 0) { - const last = history[history.length - 1]; - const centersAreEqual = - last.center[0] === center[0] && last.center[1] === center[1]; - - if (last.timestamp === timestamp || centersAreEqual) { - // Touches with the same timestamps or center don't help us - // see the speed of movement. Ignore them. - return; - } - } - - history.push({timestamp, center}); - }, - {passive: true} - ); - - document.body.addEventListener( - "touchend", - function (event) { - if (event.touches.length >= 2) { - return; - } - - try { - const direction = getSwipe(history); - - if (direction) { - onTwoFingerSwipe(direction); - } - } finally { - history = []; - } - }, - {passive: true} - ); - - document.body.addEventListener( - "touchcancel", - function () { - history = []; - }, - {passive: true} - ); -} - -// Returns the cardinal direction of the swipe or null if there is no swipe. -function getSwipe(hist) { - // Speed is in pixels/millisecond. Must be maintained throughout swipe. - const MIN_SWIPE_SPEED = 0.2; - - if (hist.length < 2) { - return null; - } - - for (let i = 1; i < hist.length; ++i) { - const previous = hist[i - 1]; - const current = hist[i]; - - const speed = - distance(previous.center, current.center) / - Math.abs(previous.timestamp - current.timestamp); - - if (speed < MIN_SWIPE_SPEED) { - return null; - } - } - - return getCardinalDirection(hist[0].center, hist[hist.length - 1].center); -} - -function getCardinalDirection([x1, y1], [x2, y2]) { - // If θ is the angle of the vector then this is tan(θ) - const tangent = (y2 - y1) / (x2 - x1); - - // All values of |tan(-45° to 45°)| are less than 1, same for 145° to 225° - if (Math.abs(tangent) < 1) { - return x1 < x2 ? "e" : "w"; - } - - return y1 < y2 ? "s" : "n"; -} - -export default listenForTwoFingerSwipes; diff --git a/client/js/helpers/localetime.ts b/client/js/helpers/localetime.ts deleted file mode 100644 index 91924f93..00000000 --- a/client/js/helpers/localetime.ts +++ /dev/null @@ -1,3 +0,0 @@ -import dayjs from "dayjs"; - -export default (time: Date | number) => dayjs(time).format("D MMMM YYYY, HH:mm:ss"); diff --git a/client/js/helpers/parse.ts b/client/js/helpers/parse.ts deleted file mode 100644 index 42b71ed4..00000000 --- a/client/js/helpers/parse.ts +++ /dev/null @@ -1,220 +0,0 @@ -// TODO: type -// @ts-nocheck - -import {h as createElement, VNode} from "vue"; -import parseStyle from "./ircmessageparser/parseStyle"; -import findChannels from "./ircmessageparser/findChannels"; -import {findLinks} from "../../../shared/linkify"; -import findEmoji from "./ircmessageparser/findEmoji"; -import findNames from "./ircmessageparser/findNames"; -import merge, {MergedParts} from "./ircmessageparser/merge"; -import emojiMap from "./fullnamemap.json"; -import LinkPreviewToggle from "../../components/LinkPreviewToggle.vue"; -import LinkPreviewFileSize from "../../components/LinkPreviewFileSize.vue"; -import InlineChannel from "../../components/InlineChannel.vue"; -import Username from "../../components/Username.vue"; -import {ClientMessage, ClientNetwork} from "../types"; - -const emojiModifiersRegex = /[\u{1f3fb}-\u{1f3ff}]|\u{fe0f}/gu; - -type Fragment = { - class?: string[]; - text?: string; -}; - -type StyledFragment = Fragment & { - textColor?: string; - bgColor?: string; - hexColor?: string; - hexBgColor?: string; - - bold?: boolean; - italic?: boolean; - underline?: boolean; - monospace?: boolean; - strikethrough?: boolean; -}; - -// Create an HTML `span` with styling information for a given fragment -function createFragment(fragment: StyledFragment): VNode | string | undefined { - const classes: string[] = []; - - if (fragment.bold) { - classes.push("irc-bold"); - } - - if (fragment.textColor !== undefined) { - classes.push("irc-fg" + fragment.textColor); - } - - if (fragment.bgColor !== undefined) { - classes.push("irc-bg" + fragment.bgColor); - } - - if (fragment.italic) { - classes.push("irc-italic"); - } - - if (fragment.underline) { - classes.push("irc-underline"); - } - - if (fragment.strikethrough) { - classes.push("irc-strikethrough"); - } - - if (fragment.monospace) { - classes.push("irc-monospace"); - } - - const data: { - class?: string[]; - style?: Record; - } = { - class: undefined, - style: undefined, - }; - - let hasData = false; - - if (classes.length > 0) { - hasData = true; - data.class = classes; - } - - if (fragment.hexColor) { - hasData = true; - data.style = { - color: `#${fragment.hexColor}`, - }; - - if (fragment.hexBgColor) { - data.style["background-color"] = `#${fragment.hexBgColor}`; - } - } - - return hasData ? createElement("span", data, fragment.text) : fragment.text; -} - -// Transform an IRC message potentially filled with styling control codes, URLs, -// nicknames, and channels into a string of HTML elements to display on the client. -function parse(text: string, message?: ClientMessage, network?: ClientNetwork) { - // Extract the styling information and get the plain text version from it - const styleFragments = parseStyle(text); - const cleanText = styleFragments.map((fragment) => fragment.text).join(""); - - // On the plain text, find channels and URLs, returned as "parts". Parts are - // arrays of objects containing start and end markers, as well as metadata - // depending on what was found (channel or link). - const channelPrefixes = network ? network.serverOptions.CHANTYPES : ["#", "&"]; - const userModes = network - ? network.serverOptions.PREFIX?.prefix?.map((pref) => pref.symbol) - : ["!", "@", "%", "+"]; - const channelParts = findChannels(cleanText, channelPrefixes, userModes); - const linkParts = findLinks(cleanText); - const emojiParts = findEmoji(cleanText); - const nameParts = findNames(cleanText, message ? message.users || [] : []); - - const parts = (channelParts as MergedParts) - .concat(linkParts) - .concat(emojiParts) - .concat(nameParts); - - // Merge the styling information with the channels / URLs / nicks / text objects and - // generate HTML strings with the resulting fragments - return merge(parts, styleFragments, cleanText).map((textPart) => { - const fragments = textPart.fragments.map((fragment) => createFragment(fragment)); - - // Wrap these potentially styled fragments with links and channel buttons - if (textPart.link) { - const preview = - message && - message.previews && - message.previews.find((p) => p.link === textPart.link); - const link = createElement( - "a", - { - href: textPart.link, - dir: preview ? null : "auto", - target: "_blank", - rel: "noopener", - }, - fragments - ); - - if (!preview) { - return link; - } - - const linkEls = [link]; - - if (preview.size > 0) { - linkEls.push( - createElement(LinkPreviewFileSize, { - size: preview.size, - }) - ); - } - - linkEls.push( - createElement(LinkPreviewToggle, { - link: preview, - message: message, - }) - ); - - // We wrap the link, size, and the toggle button into - // to correctly keep the left-to-right order of these elements - return createElement( - "span", - { - dir: "auto", - }, - linkEls - ); - } else if (textPart.channel) { - return createElement( - InlineChannel, - { - channel: textPart.channel, - }, - { - default: () => fragments, - } - ); - } else if (textPart.emoji) { - const emojiWithoutModifiers = textPart.emoji.replace(emojiModifiersRegex, ""); - const title = emojiMap[emojiWithoutModifiers] - ? `Emoji: ${emojiMap[emojiWithoutModifiers]}` - : null; - - return createElement( - "span", - { - class: ["emoji"], - role: "img", - "aria-label": title, - title: title, - }, - fragments - ); - } else if (textPart.nick) { - return createElement( - Username, - { - user: { - nick: textPart.nick, - }, - dir: "auto", - }, - { - default: () => fragments, - } - ); - } - - return fragments; - }); -} - -export default parse; diff --git a/client/js/helpers/parseIrcUri.ts b/client/js/helpers/parseIrcUri.ts deleted file mode 100644 index 05d6d067..00000000 --- a/client/js/helpers/parseIrcUri.ts +++ /dev/null @@ -1,58 +0,0 @@ -export default (stringUri: string) => { - const data = { - name: "", - host: "", - port: "", - join: "", - tls: false, - }; - - try { - // https://tools.ietf.org/html/draft-butcher-irc-url-04 - const uri = new URL(stringUri); - - // Replace protocol with a "special protocol" (that's what it's called in WHATWG spec) - // So that the uri can be properly parsed - if (uri.protocol === "irc:") { - uri.protocol = "http:"; - - if (!uri.port) { - uri.port = "6667"; - } - } else if (uri.protocol === "ircs:") { - uri.protocol = "https:"; - - if (!uri.port) { - uri.port = "6697"; - } - - data.tls = true; - } else { - return; - } - - if (!uri.hostname) { - return {}; - } - - data.host = data.name = uri.hostname; - data.port = uri.port; - - let channel = ""; - - if (uri.pathname.length > 1) { - channel = uri.pathname.substr(1); // Remove slash - } - - if (uri.hash.length > 1) { - channel += uri.hash; - } - - // We don't split channels or append # here because the connect window takes care of that - data.join = channel; - } catch (e) { - // do nothing on invalid uri - } - - return data; -}; diff --git a/client/js/helpers/roundBadgeNumber.ts b/client/js/helpers/roundBadgeNumber.ts deleted file mode 100644 index dd7b6fdc..00000000 --- a/client/js/helpers/roundBadgeNumber.ts +++ /dev/null @@ -1,7 +0,0 @@ -export default (count: number) => { - if (count < 1000) { - return count.toString(); - } - - return (count / 1000).toFixed(2).slice(0, -1) + "k"; -}; diff --git a/client/js/helpers/simplemap.json b/client/js/helpers/simplemap.json deleted file mode 100644 index 01b287f9..00000000 --- a/client/js/helpers/simplemap.json +++ /dev/null @@ -1,1915 +0,0 @@ -{ - "100": "💯", - "1234": "🔢", - "grinning": "😀", - "smiley": "😃", - "smile": "😄", - "grin": "😁", - "laughing": "😆", - "satisfied": "😆", - "sweat_smile": "😅", - "rofl": "🤣", - "joy": "😂", - "slightly_smiling_face": "🙂", - "upside_down_face": "🙃", - "melting_face": "🫠", - "wink": "😉", - "blush": "😊", - "innocent": "😇", - "smiling_face_with_three_hearts": "🥰", - "heart_eyes": "😍", - "star_struck": "🤩", - "kissing_heart": "😘", - "kissing": "😗", - "relaxed": "☺️", - "kissing_closed_eyes": "😚", - "kissing_smiling_eyes": "😙", - "smiling_face_with_tear": "🥲", - "yum": "😋", - "stuck_out_tongue": "😛", - "stuck_out_tongue_winking_eye": "😜", - "zany_face": "🤪", - "stuck_out_tongue_closed_eyes": "😝", - "money_mouth_face": "🤑", - "hugs": "🤗", - "hand_over_mouth": "🤭", - "face_with_open_eyes_and_hand_over_mouth": "🫢", - "face_with_peeking_eye": "🫣", - "shushing_face": "🤫", - "thinking": "🤔", - "saluting_face": "🫡", - "zipper_mouth_face": "🤐", - "raised_eyebrow": "🤨", - "neutral_face": "😐", - "expressionless": "😑", - "no_mouth": "😶", - "dotted_line_face": "🫥", - "face_in_clouds": "😶‍🌫️", - "smirk": "😏", - "unamused": "😒", - "roll_eyes": "🙄", - "grimacing": "😬", - "face_exhaling": "😮‍💨", - "lying_face": "🤥", - "shaking_face": "🫨", - "relieved": "😌", - "pensive": "😔", - "sleepy": "😪", - "drooling_face": "🤤", - "sleeping": "😴", - "mask": "😷", - "face_with_thermometer": "🤒", - "face_with_head_bandage": "🤕", - "nauseated_face": "🤢", - "vomiting_face": "🤮", - "sneezing_face": "🤧", - "hot_face": "🥵", - "cold_face": "🥶", - "woozy_face": "🥴", - "dizzy_face": "😵", - "face_with_spiral_eyes": "😵‍💫", - "exploding_head": "🤯", - "cowboy_hat_face": "🤠", - "partying_face": "🥳", - "disguised_face": "🥸", - "sunglasses": "😎", - "nerd_face": "🤓", - "monocle_face": "🧐", - "confused": "😕", - "face_with_diagonal_mouth": "🫤", - "worried": "😟", - "slightly_frowning_face": "🙁", - "frowning_face": "☹️", - "open_mouth": "😮", - "hushed": "😯", - "astonished": "😲", - "flushed": "😳", - "pleading_face": "🥺", - "face_holding_back_tears": "🥹", - "frowning": "😦", - "anguished": "😧", - "fearful": "😨", - "cold_sweat": "😰", - "disappointed_relieved": "😥", - "cry": "😢", - "sob": "😭", - "scream": "😱", - "confounded": "😖", - "persevere": "😣", - "disappointed": "😞", - "sweat": "😓", - "weary": "😩", - "tired_face": "😫", - "yawning_face": "🥱", - "triumph": "😤", - "rage": "😡", - "pout": "😡", - "angry": "😠", - "cursing_face": "🤬", - "smiling_imp": "😈", - "imp": "👿", - "skull": "💀", - "skull_and_crossbones": "☠️", - "hankey": "💩", - "poop": "💩", - "shit": "💩", - "clown_face": "🤡", - "japanese_ogre": "👹", - "japanese_goblin": "👺", - "ghost": "👻", - "alien": "👽", - "space_invader": "👾", - "robot": "🤖", - "smiley_cat": "😺", - "smile_cat": "😸", - "joy_cat": "😹", - "heart_eyes_cat": "😻", - "smirk_cat": "😼", - "kissing_cat": "😽", - "scream_cat": "🙀", - "crying_cat_face": "😿", - "pouting_cat": "😾", - "see_no_evil": "🙈", - "hear_no_evil": "🙉", - "speak_no_evil": "🙊", - "love_letter": "💌", - "cupid": "💘", - "gift_heart": "💝", - "sparkling_heart": "💖", - "heartpulse": "💗", - "heartbeat": "💓", - "revolving_hearts": "💞", - "two_hearts": "💕", - "heart_decoration": "💟", - "heavy_heart_exclamation": "❣️", - "broken_heart": "💔", - "heart_on_fire": "❤️‍🔥", - "mending_heart": "❤️‍🩹", - "heart": "❤️", - "pink_heart": "🩷", - "orange_heart": "🧡", - "yellow_heart": "💛", - "green_heart": "💚", - "blue_heart": "💙", - "light_blue_heart": "🩵", - "purple_heart": "💜", - "brown_heart": "🤎", - "black_heart": "🖤", - "grey_heart": "🩶", - "white_heart": "🤍", - "kiss": "💋", - "anger": "💢", - "boom": "💥", - "collision": "💥", - "dizzy": "💫", - "sweat_drops": "💦", - "dash": "💨", - "hole": "🕳️", - "speech_balloon": "💬", - "eye_speech_bubble": "👁️‍🗨️", - "left_speech_bubble": "🗨️", - "right_anger_bubble": "🗯️", - "thought_balloon": "💭", - "zzz": "💤", - "wave": "👋", - "raised_back_of_hand": "🤚", - "raised_hand_with_fingers_splayed": "🖐️", - "hand": "✋", - "raised_hand": "✋", - "vulcan_salute": "🖖", - "rightwards_hand": "🫱", - "leftwards_hand": "🫲", - "palm_down_hand": "🫳", - "palm_up_hand": "🫴", - "leftwards_pushing_hand": "🫷", - "rightwards_pushing_hand": "🫸", - "ok_hand": "👌", - "pinched_fingers": "🤌", - "pinching_hand": "🤏", - "v": "✌️", - "crossed_fingers": "🤞", - "hand_with_index_finger_and_thumb_crossed": "🫰", - "love_you_gesture": "🤟", - "metal": "🤘", - "call_me_hand": "🤙", - "point_left": "👈", - "point_right": "👉", - "point_up_2": "👆", - "middle_finger": "🖕", - "fu": "🖕", - "point_down": "👇", - "point_up": "☝️", - "index_pointing_at_the_viewer": "🫵", - "+1": "👍", - "thumbsup": "👍", - "-1": "👎", - "thumbsdown": "👎", - "fist_raised": "✊", - "fist": "✊", - "fist_oncoming": "👊", - "facepunch": "👊", - "punch": "👊", - "fist_left": "🤛", - "fist_right": "🤜", - "clap": "👏", - "raised_hands": "🙌", - "heart_hands": "🫶", - "open_hands": "👐", - "palms_up_together": "🤲", - "handshake": "🤝", - "pray": "🙏", - "writing_hand": "✍️", - "nail_care": "💅", - "selfie": "🤳", - "muscle": "💪", - "mechanical_arm": "🦾", - "mechanical_leg": "🦿", - "leg": "🦵", - "foot": "🦶", - "ear": "👂", - "ear_with_hearing_aid": "🦻", - "nose": "👃", - "brain": "🧠", - "anatomical_heart": "🫀", - "lungs": "🫁", - "tooth": "🦷", - "bone": "🦴", - "eyes": "👀", - "eye": "👁️", - "tongue": "👅", - "lips": "👄", - "biting_lip": "🫦", - "baby": "👶", - "child": "🧒", - "boy": "👦", - "girl": "👧", - "adult": "🧑", - "blond_haired_person": "👱", - "man": "👨", - "bearded_person": "🧔", - "man_beard": "🧔‍♂️", - "woman_beard": "🧔‍♀️", - "red_haired_man": "👨‍🦰", - "curly_haired_man": "👨‍🦱", - "white_haired_man": "👨‍🦳", - "bald_man": "👨‍🦲", - "woman": "👩", - "red_haired_woman": "👩‍🦰", - "person_red_hair": "🧑‍🦰", - "curly_haired_woman": "👩‍🦱", - "person_curly_hair": "🧑‍🦱", - "white_haired_woman": "👩‍🦳", - "person_white_hair": "🧑‍🦳", - "bald_woman": "👩‍🦲", - "person_bald": "🧑‍🦲", - "blond_haired_woman": "👱‍♀️", - "blonde_woman": "👱‍♀️", - "blond_haired_man": "👱‍♂️", - "older_adult": "🧓", - "older_man": "👴", - "older_woman": "👵", - "frowning_person": "🙍", - "frowning_man": "🙍‍♂️", - "frowning_woman": "🙍‍♀️", - "pouting_face": "🙎", - "pouting_man": "🙎‍♂️", - "pouting_woman": "🙎‍♀️", - "no_good": "🙅", - "no_good_man": "🙅‍♂️", - "ng_man": "🙅‍♂️", - "no_good_woman": "🙅‍♀️", - "ng_woman": "🙅‍♀️", - "ok_person": "🙆", - "ok_man": "🙆‍♂️", - "ok_woman": "🙆‍♀️", - "tipping_hand_person": "💁", - "information_desk_person": "💁", - "tipping_hand_man": "💁‍♂️", - "sassy_man": "💁‍♂️", - "tipping_hand_woman": "💁‍♀️", - "sassy_woman": "💁‍♀️", - "raising_hand": "🙋", - "raising_hand_man": "🙋‍♂️", - "raising_hand_woman": "🙋‍♀️", - "deaf_person": "🧏", - "deaf_man": "🧏‍♂️", - "deaf_woman": "🧏‍♀️", - "bow": "🙇", - "bowing_man": "🙇‍♂️", - "bowing_woman": "🙇‍♀️", - "facepalm": "🤦", - "man_facepalming": "🤦‍♂️", - "woman_facepalming": "🤦‍♀️", - "shrug": "🤷", - "man_shrugging": "🤷‍♂️", - "woman_shrugging": "🤷‍♀️", - "health_worker": "🧑‍⚕️", - "man_health_worker": "👨‍⚕️", - "woman_health_worker": "👩‍⚕️", - "student": "🧑‍🎓", - "man_student": "👨‍🎓", - "woman_student": "👩‍🎓", - "teacher": "🧑‍🏫", - "man_teacher": "👨‍🏫", - "woman_teacher": "👩‍🏫", - "judge": "🧑‍⚖️", - "man_judge": "👨‍⚖️", - "woman_judge": "👩‍⚖️", - "farmer": "🧑‍🌾", - "man_farmer": "👨‍🌾", - "woman_farmer": "👩‍🌾", - "cook": "🧑‍🍳", - "man_cook": "👨‍🍳", - "woman_cook": "👩‍🍳", - "mechanic": "🧑‍🔧", - "man_mechanic": "👨‍🔧", - "woman_mechanic": "👩‍🔧", - "factory_worker": "🧑‍🏭", - "man_factory_worker": "👨‍🏭", - "woman_factory_worker": "👩‍🏭", - "office_worker": "🧑‍💼", - "man_office_worker": "👨‍💼", - "woman_office_worker": "👩‍💼", - "scientist": "🧑‍🔬", - "man_scientist": "👨‍🔬", - "woman_scientist": "👩‍🔬", - "technologist": "🧑‍💻", - "man_technologist": "👨‍💻", - "woman_technologist": "👩‍💻", - "singer": "🧑‍🎤", - "man_singer": "👨‍🎤", - "woman_singer": "👩‍🎤", - "artist": "🧑‍🎨", - "man_artist": "👨‍🎨", - "woman_artist": "👩‍🎨", - "pilot": "🧑‍✈️", - "man_pilot": "👨‍✈️", - "woman_pilot": "👩‍✈️", - "astronaut": "🧑‍🚀", - "man_astronaut": "👨‍🚀", - "woman_astronaut": "👩‍🚀", - "firefighter": "🧑‍🚒", - "man_firefighter": "👨‍🚒", - "woman_firefighter": "👩‍🚒", - "police_officer": "👮", - "cop": "👮", - "policeman": "👮‍♂️", - "policewoman": "👮‍♀️", - "detective": "🕵️", - "male_detective": "🕵️‍♂️", - "female_detective": "🕵️‍♀️", - "guard": "💂", - "guardsman": "💂‍♂️", - "guardswoman": "💂‍♀️", - "ninja": "🥷", - "construction_worker": "👷", - "construction_worker_man": "👷‍♂️", - "construction_worker_woman": "👷‍♀️", - "person_with_crown": "🫅", - "prince": "🤴", - "princess": "👸", - "person_with_turban": "👳", - "man_with_turban": "👳‍♂️", - "woman_with_turban": "👳‍♀️", - "man_with_gua_pi_mao": "👲", - "woman_with_headscarf": "🧕", - "person_in_tuxedo": "🤵", - "man_in_tuxedo": "🤵‍♂️", - "woman_in_tuxedo": "🤵‍♀️", - "person_with_veil": "👰", - "man_with_veil": "👰‍♂️", - "woman_with_veil": "👰‍♀️", - "bride_with_veil": "👰‍♀️", - "pregnant_woman": "🤰", - "pregnant_man": "🫃", - "pregnant_person": "🫄", - "breast_feeding": "🤱", - "woman_feeding_baby": "👩‍🍼", - "man_feeding_baby": "👨‍🍼", - "person_feeding_baby": "🧑‍🍼", - "angel": "👼", - "santa": "🎅", - "mrs_claus": "🤶", - "mx_claus": "🧑‍🎄", - "superhero": "🦸", - "superhero_man": "🦸‍♂️", - "superhero_woman": "🦸‍♀️", - "supervillain": "🦹", - "supervillain_man": "🦹‍♂️", - "supervillain_woman": "🦹‍♀️", - "mage": "🧙", - "mage_man": "🧙‍♂️", - "mage_woman": "🧙‍♀️", - "fairy": "🧚", - "fairy_man": "🧚‍♂️", - "fairy_woman": "🧚‍♀️", - "vampire": "🧛", - "vampire_man": "🧛‍♂️", - "vampire_woman": "🧛‍♀️", - "merperson": "🧜", - "merman": "🧜‍♂️", - "mermaid": "🧜‍♀️", - "elf": "🧝", - "elf_man": "🧝‍♂️", - "elf_woman": "🧝‍♀️", - "genie": "🧞", - "genie_man": "🧞‍♂️", - "genie_woman": "🧞‍♀️", - "zombie": "🧟", - "zombie_man": "🧟‍♂️", - "zombie_woman": "🧟‍♀️", - "troll": "🧌", - "massage": "💆", - "massage_man": "💆‍♂️", - "massage_woman": "💆‍♀️", - "haircut": "💇", - "haircut_man": "💇‍♂️", - "haircut_woman": "💇‍♀️", - "walking": "🚶", - "walking_man": "🚶‍♂️", - "walking_woman": "🚶‍♀️", - "standing_person": "🧍", - "standing_man": "🧍‍♂️", - "standing_woman": "🧍‍♀️", - "kneeling_person": "🧎", - "kneeling_man": "🧎‍♂️", - "kneeling_woman": "🧎‍♀️", - "person_with_probing_cane": "🧑‍🦯", - "man_with_probing_cane": "👨‍🦯", - "woman_with_probing_cane": "👩‍🦯", - "person_in_motorized_wheelchair": "🧑‍🦼", - "man_in_motorized_wheelchair": "👨‍🦼", - "woman_in_motorized_wheelchair": "👩‍🦼", - "person_in_manual_wheelchair": "🧑‍🦽", - "man_in_manual_wheelchair": "👨‍🦽", - "woman_in_manual_wheelchair": "👩‍🦽", - "runner": "🏃", - "running": "🏃", - "running_man": "🏃‍♂️", - "running_woman": "🏃‍♀️", - "woman_dancing": "💃", - "dancer": "💃", - "man_dancing": "🕺", - "business_suit_levitating": "🕴️", - "dancers": "👯", - "dancing_men": "👯‍♂️", - "dancing_women": "👯‍♀️", - "sauna_person": "🧖", - "sauna_man": "🧖‍♂️", - "sauna_woman": "🧖‍♀️", - "climbing": "🧗", - "climbing_man": "🧗‍♂️", - "climbing_woman": "🧗‍♀️", - "person_fencing": "🤺", - "horse_racing": "🏇", - "skier": "⛷️", - "snowboarder": "🏂", - "golfing": "🏌️", - "golfing_man": "🏌️‍♂️", - "golfing_woman": "🏌️‍♀️", - "surfer": "🏄", - "surfing_man": "🏄‍♂️", - "surfing_woman": "🏄‍♀️", - "rowboat": "🚣", - "rowing_man": "🚣‍♂️", - "rowing_woman": "🚣‍♀️", - "swimmer": "🏊", - "swimming_man": "🏊‍♂️", - "swimming_woman": "🏊‍♀️", - "bouncing_ball_person": "⛹️", - "bouncing_ball_man": "⛹️‍♂️", - "basketball_man": "⛹️‍♂️", - "bouncing_ball_woman": "⛹️‍♀️", - "basketball_woman": "⛹️‍♀️", - "weight_lifting": "🏋️", - "weight_lifting_man": "🏋️‍♂️", - "weight_lifting_woman": "🏋️‍♀️", - "bicyclist": "🚴", - "biking_man": "🚴‍♂️", - "biking_woman": "🚴‍♀️", - "mountain_bicyclist": "🚵", - "mountain_biking_man": "🚵‍♂️", - "mountain_biking_woman": "🚵‍♀️", - "cartwheeling": "🤸", - "man_cartwheeling": "🤸‍♂️", - "woman_cartwheeling": "🤸‍♀️", - "wrestling": "🤼", - "men_wrestling": "🤼‍♂️", - "women_wrestling": "🤼‍♀️", - "water_polo": "🤽", - "man_playing_water_polo": "🤽‍♂️", - "woman_playing_water_polo": "🤽‍♀️", - "handball_person": "🤾", - "man_playing_handball": "🤾‍♂️", - "woman_playing_handball": "🤾‍♀️", - "juggling_person": "🤹", - "man_juggling": "🤹‍♂️", - "woman_juggling": "🤹‍♀️", - "lotus_position": "🧘", - "lotus_position_man": "🧘‍♂️", - "lotus_position_woman": "🧘‍♀️", - "bath": "🛀", - "sleeping_bed": "🛌", - "people_holding_hands": "🧑‍🤝‍🧑", - "two_women_holding_hands": "👭", - "couple": "👫", - "two_men_holding_hands": "👬", - "couplekiss": "💏", - "couplekiss_man_woman": "👩‍❤️‍💋‍👨", - "couplekiss_man_man": "👨‍❤️‍💋‍👨", - "couplekiss_woman_woman": "👩‍❤️‍💋‍👩", - "couple_with_heart": "💑", - "couple_with_heart_woman_man": "👩‍❤️‍👨", - "couple_with_heart_man_man": "👨‍❤️‍👨", - "couple_with_heart_woman_woman": "👩‍❤️‍👩", - "family": "👪", - "family_man_woman_boy": "👨‍👩‍👦", - "family_man_woman_girl": "👨‍👩‍👧", - "family_man_woman_girl_boy": "👨‍👩‍👧‍👦", - "family_man_woman_boy_boy": "👨‍👩‍👦‍👦", - "family_man_woman_girl_girl": "👨‍👩‍👧‍👧", - "family_man_man_boy": "👨‍👨‍👦", - "family_man_man_girl": "👨‍👨‍👧", - "family_man_man_girl_boy": "👨‍👨‍👧‍👦", - "family_man_man_boy_boy": "👨‍👨‍👦‍👦", - "family_man_man_girl_girl": "👨‍👨‍👧‍👧", - "family_woman_woman_boy": "👩‍👩‍👦", - "family_woman_woman_girl": "👩‍👩‍👧", - "family_woman_woman_girl_boy": "👩‍👩‍👧‍👦", - "family_woman_woman_boy_boy": "👩‍👩‍👦‍👦", - "family_woman_woman_girl_girl": "👩‍👩‍👧‍👧", - "family_man_boy": "👨‍👦", - "family_man_boy_boy": "👨‍👦‍👦", - "family_man_girl": "👨‍👧", - "family_man_girl_boy": "👨‍👧‍👦", - "family_man_girl_girl": "👨‍👧‍👧", - "family_woman_boy": "👩‍👦", - "family_woman_boy_boy": "👩‍👦‍👦", - "family_woman_girl": "👩‍👧", - "family_woman_girl_boy": "👩‍👧‍👦", - "family_woman_girl_girl": "👩‍👧‍👧", - "speaking_head": "🗣️", - "bust_in_silhouette": "👤", - "busts_in_silhouette": "👥", - "people_hugging": "🫂", - "footprints": "👣", - "monkey_face": "🐵", - "monkey": "🐒", - "gorilla": "🦍", - "orangutan": "🦧", - "dog": "🐶", - "dog2": "🐕", - "guide_dog": "🦮", - "service_dog": "🐕‍🦺", - "poodle": "🐩", - "wolf": "🐺", - "fox_face": "🦊", - "raccoon": "🦝", - "cat": "🐱", - "cat2": "🐈", - "black_cat": "🐈‍⬛", - "lion": "🦁", - "tiger": "🐯", - "tiger2": "🐅", - "leopard": "🐆", - "horse": "🐴", - "moose": "🫎", - "donkey": "🫏", - "racehorse": "🐎", - "unicorn": "🦄", - "zebra": "🦓", - "deer": "🦌", - "bison": "🦬", - "cow": "🐮", - "ox": "🐂", - "water_buffalo": "🐃", - "cow2": "🐄", - "pig": "🐷", - "pig2": "🐖", - "boar": "🐗", - "pig_nose": "🐽", - "ram": "🐏", - "sheep": "🐑", - "goat": "🐐", - "dromedary_camel": "🐪", - "camel": "🐫", - "llama": "🦙", - "giraffe": "🦒", - "elephant": "🐘", - "mammoth": "🦣", - "rhinoceros": "🦏", - "hippopotamus": "🦛", - "mouse": "🐭", - "mouse2": "🐁", - "rat": "🐀", - "hamster": "🐹", - "rabbit": "🐰", - "rabbit2": "🐇", - "chipmunk": "🐿️", - "beaver": "🦫", - "hedgehog": "🦔", - "bat": "🦇", - "bear": "🐻", - "polar_bear": "🐻‍❄️", - "koala": "🐨", - "panda_face": "🐼", - "sloth": "🦥", - "otter": "🦦", - "skunk": "🦨", - "kangaroo": "🦘", - "badger": "🦡", - "feet": "🐾", - "paw_prints": "🐾", - "turkey": "🦃", - "chicken": "🐔", - "rooster": "🐓", - "hatching_chick": "🐣", - "baby_chick": "🐤", - "hatched_chick": "🐥", - "bird": "🐦", - "penguin": "🐧", - "dove": "🕊️", - "eagle": "🦅", - "duck": "🦆", - "swan": "🦢", - "owl": "🦉", - "dodo": "🦤", - "feather": "🪶", - "flamingo": "🦩", - "peacock": "🦚", - "parrot": "🦜", - "wing": "🪽", - "black_bird": "🐦‍⬛", - "goose": "🪿", - "frog": "🐸", - "crocodile": "🐊", - "turtle": "🐢", - "lizard": "🦎", - "snake": "🐍", - "dragon_face": "🐲", - "dragon": "🐉", - "sauropod": "🦕", - "t_rex": "🦖", - "whale": "🐳", - "whale2": "🐋", - "dolphin": "🐬", - "flipper": "🐬", - "seal": "🦭", - "fish": "🐟", - "tropical_fish": "🐠", - "blowfish": "🐡", - "shark": "🦈", - "octopus": "🐙", - "shell": "🐚", - "coral": "🪸", - "jellyfish": "🪼", - "snail": "🐌", - "butterfly": "🦋", - "bug": "🐛", - "ant": "🐜", - "bee": "🐝", - "honeybee": "🐝", - "beetle": "🪲", - "lady_beetle": "🐞", - "cricket": "🦗", - "cockroach": "🪳", - "spider": "🕷️", - "spider_web": "🕸️", - "scorpion": "🦂", - "mosquito": "🦟", - "fly": "🪰", - "worm": "🪱", - "microbe": "🦠", - "bouquet": "💐", - "cherry_blossom": "🌸", - "white_flower": "💮", - "lotus": "🪷", - "rosette": "🏵️", - "rose": "🌹", - "wilted_flower": "🥀", - "hibiscus": "🌺", - "sunflower": "🌻", - "blossom": "🌼", - "tulip": "🌷", - "hyacinth": "🪻", - "seedling": "🌱", - "potted_plant": "🪴", - "evergreen_tree": "🌲", - "deciduous_tree": "🌳", - "palm_tree": "🌴", - "cactus": "🌵", - "ear_of_rice": "🌾", - "herb": "🌿", - "shamrock": "☘️", - "four_leaf_clover": "🍀", - "maple_leaf": "🍁", - "fallen_leaf": "🍂", - "leaves": "🍃", - "empty_nest": "🪹", - "nest_with_eggs": "🪺", - "mushroom": "🍄", - "grapes": "🍇", - "melon": "🍈", - "watermelon": "🍉", - "tangerine": "🍊", - "orange": "🍊", - "mandarin": "🍊", - "lemon": "🍋", - "banana": "🍌", - "pineapple": "🍍", - "mango": "🥭", - "apple": "🍎", - "green_apple": "🍏", - "pear": "🍐", - "peach": "🍑", - "cherries": "🍒", - "strawberry": "🍓", - "blueberries": "🫐", - "kiwi_fruit": "🥝", - "tomato": "🍅", - "olive": "🫒", - "coconut": "🥥", - "avocado": "🥑", - "eggplant": "🍆", - "potato": "🥔", - "carrot": "🥕", - "corn": "🌽", - "hot_pepper": "🌶️", - "bell_pepper": "🫑", - "cucumber": "🥒", - "leafy_green": "🥬", - "broccoli": "🥦", - "garlic": "🧄", - "onion": "🧅", - "peanuts": "🥜", - "beans": "🫘", - "chestnut": "🌰", - "ginger_root": "🫚", - "pea_pod": "🫛", - "bread": "🍞", - "croissant": "🥐", - "baguette_bread": "🥖", - "flatbread": "🫓", - "pretzel": "🥨", - "bagel": "🥯", - "pancakes": "🥞", - "waffle": "🧇", - "cheese": "🧀", - "meat_on_bone": "🍖", - "poultry_leg": "🍗", - "cut_of_meat": "🥩", - "bacon": "🥓", - "hamburger": "🍔", - "fries": "🍟", - "pizza": "🍕", - "hotdog": "🌭", - "sandwich": "🥪", - "taco": "🌮", - "burrito": "🌯", - "tamale": "🫔", - "stuffed_flatbread": "🥙", - "falafel": "🧆", - "egg": "🥚", - "fried_egg": "🍳", - "shallow_pan_of_food": "🥘", - "stew": "🍲", - "fondue": "🫕", - "bowl_with_spoon": "🥣", - "green_salad": "🥗", - "popcorn": "🍿", - "butter": "🧈", - "salt": "🧂", - "canned_food": "🥫", - "bento": "🍱", - "rice_cracker": "🍘", - "rice_ball": "🍙", - "rice": "🍚", - "curry": "🍛", - "ramen": "🍜", - "spaghetti": "🍝", - "sweet_potato": "🍠", - "oden": "🍢", - "sushi": "🍣", - "fried_shrimp": "🍤", - "fish_cake": "🍥", - "moon_cake": "🥮", - "dango": "🍡", - "dumpling": "🥟", - "fortune_cookie": "🥠", - "takeout_box": "🥡", - "crab": "🦀", - "lobster": "🦞", - "shrimp": "🦐", - "squid": "🦑", - "oyster": "🦪", - "icecream": "🍦", - "shaved_ice": "🍧", - "ice_cream": "🍨", - "doughnut": "🍩", - "cookie": "🍪", - "birthday": "🎂", - "cake": "🍰", - "cupcake": "🧁", - "pie": "🥧", - "chocolate_bar": "🍫", - "candy": "🍬", - "lollipop": "🍭", - "custard": "🍮", - "honey_pot": "🍯", - "baby_bottle": "🍼", - "milk_glass": "🥛", - "coffee": "☕", - "teapot": "🫖", - "tea": "🍵", - "sake": "🍶", - "champagne": "🍾", - "wine_glass": "🍷", - "cocktail": "🍸", - "tropical_drink": "🍹", - "beer": "🍺", - "beers": "🍻", - "clinking_glasses": "🥂", - "tumbler_glass": "🥃", - "pouring_liquid": "🫗", - "cup_with_straw": "🥤", - "bubble_tea": "🧋", - "beverage_box": "🧃", - "mate": "🧉", - "ice_cube": "🧊", - "chopsticks": "🥢", - "plate_with_cutlery": "🍽️", - "fork_and_knife": "🍴", - "spoon": "🥄", - "hocho": "🔪", - "knife": "🔪", - "jar": "🫙", - "amphora": "🏺", - "earth_africa": "🌍", - "earth_americas": "🌎", - "earth_asia": "🌏", - "globe_with_meridians": "🌐", - "world_map": "🗺️", - "japan": "🗾", - "compass": "🧭", - "mountain_snow": "🏔️", - "mountain": "⛰️", - "volcano": "🌋", - "mount_fuji": "🗻", - "camping": "🏕️", - "beach_umbrella": "🏖️", - "desert": "🏜️", - "desert_island": "🏝️", - "national_park": "🏞️", - "stadium": "🏟️", - "classical_building": "🏛️", - "building_construction": "🏗️", - "bricks": "🧱", - "rock": "🪨", - "wood": "🪵", - "hut": "🛖", - "houses": "🏘️", - "derelict_house": "🏚️", - "house": "🏠", - "house_with_garden": "🏡", - "office": "🏢", - "post_office": "🏣", - "european_post_office": "🏤", - "hospital": "🏥", - "bank": "🏦", - "hotel": "🏨", - "love_hotel": "🏩", - "convenience_store": "🏪", - "school": "🏫", - "department_store": "🏬", - "factory": "🏭", - "japanese_castle": "🏯", - "european_castle": "🏰", - "wedding": "💒", - "tokyo_tower": "🗼", - "statue_of_liberty": "🗽", - "church": "⛪", - "mosque": "🕌", - "hindu_temple": "🛕", - "synagogue": "🕍", - "shinto_shrine": "⛩️", - "kaaba": "🕋", - "fountain": "⛲", - "tent": "⛺", - "foggy": "🌁", - "night_with_stars": "🌃", - "cityscape": "🏙️", - "sunrise_over_mountains": "🌄", - "sunrise": "🌅", - "city_sunset": "🌆", - "city_sunrise": "🌇", - "bridge_at_night": "🌉", - "hotsprings": "♨️", - "carousel_horse": "🎠", - "playground_slide": "🛝", - "ferris_wheel": "🎡", - "roller_coaster": "🎢", - "barber": "💈", - "circus_tent": "🎪", - "steam_locomotive": "🚂", - "railway_car": "🚃", - "bullettrain_side": "🚄", - "bullettrain_front": "🚅", - "train2": "🚆", - "metro": "🚇", - "light_rail": "🚈", - "station": "🚉", - "tram": "🚊", - "monorail": "🚝", - "mountain_railway": "🚞", - "train": "🚋", - "bus": "🚌", - "oncoming_bus": "🚍", - "trolleybus": "🚎", - "minibus": "🚐", - "ambulance": "🚑", - "fire_engine": "🚒", - "police_car": "🚓", - "oncoming_police_car": "🚔", - "taxi": "🚕", - "oncoming_taxi": "🚖", - "car": "🚗", - "red_car": "🚗", - "oncoming_automobile": "🚘", - "blue_car": "🚙", - "pickup_truck": "🛻", - "truck": "🚚", - "articulated_lorry": "🚛", - "tractor": "🚜", - "racing_car": "🏎️", - "motorcycle": "🏍️", - "motor_scooter": "🛵", - "manual_wheelchair": "🦽", - "motorized_wheelchair": "🦼", - "auto_rickshaw": "🛺", - "bike": "🚲", - "kick_scooter": "🛴", - "skateboard": "🛹", - "roller_skate": "🛼", - "busstop": "🚏", - "motorway": "🛣️", - "railway_track": "🛤️", - "oil_drum": "🛢️", - "fuelpump": "⛽", - "wheel": "🛞", - "rotating_light": "🚨", - "traffic_light": "🚥", - "vertical_traffic_light": "🚦", - "stop_sign": "🛑", - "construction": "🚧", - "anchor": "⚓", - "ring_buoy": "🛟", - "boat": "⛵", - "sailboat": "⛵", - "canoe": "🛶", - "speedboat": "🚤", - "passenger_ship": "🛳️", - "ferry": "⛴️", - "motor_boat": "🛥️", - "ship": "🚢", - "airplane": "✈️", - "small_airplane": "🛩️", - "flight_departure": "🛫", - "flight_arrival": "🛬", - "parachute": "🪂", - "seat": "💺", - "helicopter": "🚁", - "suspension_railway": "🚟", - "mountain_cableway": "🚠", - "aerial_tramway": "🚡", - "artificial_satellite": "🛰️", - "rocket": "🚀", - "flying_saucer": "🛸", - "bellhop_bell": "🛎️", - "luggage": "🧳", - "hourglass": "⌛", - "hourglass_flowing_sand": "⏳", - "watch": "⌚", - "alarm_clock": "⏰", - "stopwatch": "⏱️", - "timer_clock": "⏲️", - "mantelpiece_clock": "🕰️", - "clock12": "🕛", - "clock1230": "🕧", - "clock1": "🕐", - "clock130": "🕜", - "clock2": "🕑", - "clock230": "🕝", - "clock3": "🕒", - "clock330": "🕞", - "clock4": "🕓", - "clock430": "🕟", - "clock5": "🕔", - "clock530": "🕠", - "clock6": "🕕", - "clock630": "🕡", - "clock7": "🕖", - "clock730": "🕢", - "clock8": "🕗", - "clock830": "🕣", - "clock9": "🕘", - "clock930": "🕤", - "clock10": "🕙", - "clock1030": "🕥", - "clock11": "🕚", - "clock1130": "🕦", - "new_moon": "🌑", - "waxing_crescent_moon": "🌒", - "first_quarter_moon": "🌓", - "moon": "🌔", - "waxing_gibbous_moon": "🌔", - "full_moon": "🌕", - "waning_gibbous_moon": "🌖", - "last_quarter_moon": "🌗", - "waning_crescent_moon": "🌘", - "crescent_moon": "🌙", - "new_moon_with_face": "🌚", - "first_quarter_moon_with_face": "🌛", - "last_quarter_moon_with_face": "🌜", - "thermometer": "🌡️", - "sunny": "☀️", - "full_moon_with_face": "🌝", - "sun_with_face": "🌞", - "ringed_planet": "🪐", - "star": "⭐", - "star2": "🌟", - "stars": "🌠", - "milky_way": "🌌", - "cloud": "☁️", - "partly_sunny": "⛅", - "cloud_with_lightning_and_rain": "⛈️", - "sun_behind_small_cloud": "🌤️", - "sun_behind_large_cloud": "🌥️", - "sun_behind_rain_cloud": "🌦️", - "cloud_with_rain": "🌧️", - "cloud_with_snow": "🌨️", - "cloud_with_lightning": "🌩️", - "tornado": "🌪️", - "fog": "🌫️", - "wind_face": "🌬️", - "cyclone": "🌀", - "rainbow": "🌈", - "closed_umbrella": "🌂", - "open_umbrella": "☂️", - "umbrella": "☔", - "parasol_on_ground": "⛱️", - "zap": "⚡", - "snowflake": "❄️", - "snowman_with_snow": "☃️", - "snowman": "⛄", - "comet": "☄️", - "fire": "🔥", - "droplet": "💧", - "ocean": "🌊", - "jack_o_lantern": "🎃", - "christmas_tree": "🎄", - "fireworks": "🎆", - "sparkler": "🎇", - "firecracker": "🧨", - "sparkles": "✨", - "balloon": "🎈", - "tada": "🎉", - "confetti_ball": "🎊", - "tanabata_tree": "🎋", - "bamboo": "🎍", - "dolls": "🎎", - "flags": "🎏", - "wind_chime": "🎐", - "rice_scene": "🎑", - "red_envelope": "🧧", - "ribbon": "🎀", - "gift": "🎁", - "reminder_ribbon": "🎗️", - "tickets": "🎟️", - "ticket": "🎫", - "medal_military": "🎖️", - "trophy": "🏆", - "medal_sports": "🏅", - "1st_place_medal": "🥇", - "2nd_place_medal": "🥈", - "3rd_place_medal": "🥉", - "soccer": "⚽", - "baseball": "⚾", - "softball": "🥎", - "basketball": "🏀", - "volleyball": "🏐", - "football": "🏈", - "rugby_football": "🏉", - "tennis": "🎾", - "flying_disc": "🥏", - "bowling": "🎳", - "cricket_game": "🏏", - "field_hockey": "🏑", - "ice_hockey": "🏒", - "lacrosse": "🥍", - "ping_pong": "🏓", - "badminton": "🏸", - "boxing_glove": "🥊", - "martial_arts_uniform": "🥋", - "goal_net": "🥅", - "golf": "⛳", - "ice_skate": "⛸️", - "fishing_pole_and_fish": "🎣", - "diving_mask": "🤿", - "running_shirt_with_sash": "🎽", - "ski": "🎿", - "sled": "🛷", - "curling_stone": "🥌", - "dart": "🎯", - "yo_yo": "🪀", - "kite": "🪁", - "gun": "🔫", - "8ball": "🎱", - "crystal_ball": "🔮", - "magic_wand": "🪄", - "video_game": "🎮", - "joystick": "🕹️", - "slot_machine": "🎰", - "game_die": "🎲", - "jigsaw": "🧩", - "teddy_bear": "🧸", - "pinata": "🪅", - "mirror_ball": "🪩", - "nesting_dolls": "🪆", - "spades": "♠️", - "hearts": "♥️", - "diamonds": "♦️", - "clubs": "♣️", - "chess_pawn": "♟️", - "black_joker": "🃏", - "mahjong": "🀄", - "flower_playing_cards": "🎴", - "performing_arts": "🎭", - "framed_picture": "🖼️", - "art": "🎨", - "thread": "🧵", - "sewing_needle": "🪡", - "yarn": "🧶", - "knot": "🪢", - "eyeglasses": "👓", - "dark_sunglasses": "🕶️", - "goggles": "🥽", - "lab_coat": "🥼", - "safety_vest": "🦺", - "necktie": "👔", - "shirt": "👕", - "tshirt": "👕", - "jeans": "👖", - "scarf": "🧣", - "gloves": "🧤", - "coat": "🧥", - "socks": "🧦", - "dress": "👗", - "kimono": "👘", - "sari": "🥻", - "one_piece_swimsuit": "🩱", - "swim_brief": "🩲", - "shorts": "🩳", - "bikini": "👙", - "womans_clothes": "👚", - "folding_hand_fan": "🪭", - "purse": "👛", - "handbag": "👜", - "pouch": "👝", - "shopping": "🛍️", - "school_satchel": "🎒", - "thong_sandal": "🩴", - "mans_shoe": "👞", - "shoe": "👞", - "athletic_shoe": "👟", - "hiking_boot": "🥾", - "flat_shoe": "🥿", - "high_heel": "👠", - "sandal": "👡", - "ballet_shoes": "🩰", - "boot": "👢", - "hair_pick": "🪮", - "crown": "👑", - "womans_hat": "👒", - "tophat": "🎩", - "mortar_board": "🎓", - "billed_cap": "🧢", - "military_helmet": "🪖", - "rescue_worker_helmet": "⛑️", - "prayer_beads": "📿", - "lipstick": "💄", - "ring": "💍", - "gem": "💎", - "mute": "🔇", - "speaker": "🔈", - "sound": "🔉", - "loud_sound": "🔊", - "loudspeaker": "📢", - "mega": "📣", - "postal_horn": "📯", - "bell": "🔔", - "no_bell": "🔕", - "musical_score": "🎼", - "musical_note": "🎵", - "notes": "🎶", - "studio_microphone": "🎙️", - "level_slider": "🎚️", - "control_knobs": "🎛️", - "microphone": "🎤", - "headphones": "🎧", - "radio": "📻", - "saxophone": "🎷", - "accordion": "🪗", - "guitar": "🎸", - "musical_keyboard": "🎹", - "trumpet": "🎺", - "violin": "🎻", - "banjo": "🪕", - "drum": "🥁", - "long_drum": "🪘", - "maracas": "🪇", - "flute": "🪈", - "iphone": "📱", - "calling": "📲", - "phone": "☎️", - "telephone": "☎️", - "telephone_receiver": "📞", - "pager": "📟", - "fax": "📠", - "battery": "🔋", - "low_battery": "🪫", - "electric_plug": "🔌", - "computer": "💻", - "desktop_computer": "🖥️", - "printer": "🖨️", - "keyboard": "⌨️", - "computer_mouse": "🖱️", - "trackball": "🖲️", - "minidisc": "💽", - "floppy_disk": "💾", - "cd": "💿", - "dvd": "📀", - "abacus": "🧮", - "movie_camera": "🎥", - "film_strip": "🎞️", - "film_projector": "📽️", - "clapper": "🎬", - "tv": "📺", - "camera": "📷", - "camera_flash": "📸", - "video_camera": "📹", - "vhs": "📼", - "mag": "🔍", - "mag_right": "🔎", - "candle": "🕯️", - "bulb": "💡", - "flashlight": "🔦", - "izakaya_lantern": "🏮", - "lantern": "🏮", - "diya_lamp": "🪔", - "notebook_with_decorative_cover": "📔", - "closed_book": "📕", - "book": "📖", - "open_book": "📖", - "green_book": "📗", - "blue_book": "📘", - "orange_book": "📙", - "books": "📚", - "notebook": "📓", - "ledger": "📒", - "page_with_curl": "📃", - "scroll": "📜", - "page_facing_up": "📄", - "newspaper": "📰", - "newspaper_roll": "🗞️", - "bookmark_tabs": "📑", - "bookmark": "🔖", - "label": "🏷️", - "moneybag": "💰", - "coin": "🪙", - "yen": "💴", - "dollar": "💵", - "euro": "💶", - "pound": "💷", - "money_with_wings": "💸", - "credit_card": "💳", - "receipt": "🧾", - "chart": "💹", - "envelope": "✉️", - "email": "📧", - "e_mail": "📧", - "incoming_envelope": "📨", - "envelope_with_arrow": "📩", - "outbox_tray": "📤", - "inbox_tray": "📥", - "package": "📦", - "mailbox": "📫", - "mailbox_closed": "📪", - "mailbox_with_mail": "📬", - "mailbox_with_no_mail": "📭", - "postbox": "📮", - "ballot_box": "🗳️", - "pencil2": "✏️", - "black_nib": "✒️", - "fountain_pen": "🖋️", - "pen": "🖊️", - "paintbrush": "🖌️", - "crayon": "🖍️", - "memo": "📝", - "pencil": "📝", - "briefcase": "💼", - "file_folder": "📁", - "open_file_folder": "📂", - "card_index_dividers": "🗂️", - "date": "📅", - "calendar": "📆", - "spiral_notepad": "🗒️", - "spiral_calendar": "🗓️", - "card_index": "📇", - "chart_with_upwards_trend": "📈", - "chart_with_downwards_trend": "📉", - "bar_chart": "📊", - "clipboard": "📋", - "pushpin": "📌", - "round_pushpin": "📍", - "paperclip": "📎", - "paperclips": "🖇️", - "straight_ruler": "📏", - "triangular_ruler": "📐", - "scissors": "✂️", - "card_file_box": "🗃️", - "file_cabinet": "🗄️", - "wastebasket": "🗑️", - "lock": "🔒", - "unlock": "🔓", - "lock_with_ink_pen": "🔏", - "closed_lock_with_key": "🔐", - "key": "🔑", - "old_key": "🗝️", - "hammer": "🔨", - "axe": "🪓", - "pick": "⛏️", - "hammer_and_pick": "⚒️", - "hammer_and_wrench": "🛠️", - "dagger": "🗡️", - "crossed_swords": "⚔️", - "bomb": "💣", - "boomerang": "🪃", - "bow_and_arrow": "🏹", - "shield": "🛡️", - "carpentry_saw": "🪚", - "wrench": "🔧", - "screwdriver": "🪛", - "nut_and_bolt": "🔩", - "gear": "⚙️", - "clamp": "🗜️", - "balance_scale": "⚖️", - "probing_cane": "🦯", - "link": "🔗", - "chains": "⛓️", - "hook": "🪝", - "toolbox": "🧰", - "magnet": "🧲", - "ladder": "🪜", - "alembic": "⚗️", - "test_tube": "🧪", - "petri_dish": "🧫", - "dna": "🧬", - "microscope": "🔬", - "telescope": "🔭", - "satellite": "📡", - "syringe": "💉", - "drop_of_blood": "🩸", - "pill": "💊", - "adhesive_bandage": "🩹", - "crutch": "🩼", - "stethoscope": "🩺", - "x_ray": "🩻", - "door": "🚪", - "elevator": "🛗", - "mirror": "🪞", - "window": "🪟", - "bed": "🛏️", - "couch_and_lamp": "🛋️", - "chair": "🪑", - "toilet": "🚽", - "plunger": "🪠", - "shower": "🚿", - "bathtub": "🛁", - "mouse_trap": "🪤", - "razor": "🪒", - "lotion_bottle": "🧴", - "safety_pin": "🧷", - "broom": "🧹", - "basket": "🧺", - "roll_of_paper": "🧻", - "bucket": "🪣", - "soap": "🧼", - "bubbles": "🫧", - "toothbrush": "🪥", - "sponge": "🧽", - "fire_extinguisher": "🧯", - "shopping_cart": "🛒", - "smoking": "🚬", - "coffin": "⚰️", - "headstone": "🪦", - "funeral_urn": "⚱️", - "nazar_amulet": "🧿", - "hamsa": "🪬", - "moyai": "🗿", - "placard": "🪧", - "identification_card": "🪪", - "atm": "🏧", - "put_litter_in_its_place": "🚮", - "potable_water": "🚰", - "wheelchair": "♿", - "mens": "🚹", - "womens": "🚺", - "restroom": "🚻", - "baby_symbol": "🚼", - "wc": "🚾", - "passport_control": "🛂", - "customs": "🛃", - "baggage_claim": "🛄", - "left_luggage": "🛅", - "warning": "⚠️", - "children_crossing": "🚸", - "no_entry": "⛔", - "no_entry_sign": "🚫", - "no_bicycles": "🚳", - "no_smoking": "🚭", - "do_not_litter": "🚯", - "non_potable_water": "🚱", - "no_pedestrians": "🚷", - "no_mobile_phones": "📵", - "underage": "🔞", - "radioactive": "☢️", - "biohazard": "☣️", - "arrow_up": "⬆️", - "arrow_upper_right": "↗️", - "arrow_right": "➡️", - "arrow_lower_right": "↘️", - "arrow_down": "⬇️", - "arrow_lower_left": "↙️", - "arrow_left": "⬅️", - "arrow_upper_left": "↖️", - "arrow_up_down": "↕️", - "left_right_arrow": "↔️", - "leftwards_arrow_with_hook": "↩️", - "arrow_right_hook": "↪️", - "arrow_heading_up": "⤴️", - "arrow_heading_down": "⤵️", - "arrows_clockwise": "🔃", - "arrows_counterclockwise": "🔄", - "back": "🔙", - "end": "🔚", - "on": "🔛", - "soon": "🔜", - "top": "🔝", - "place_of_worship": "🛐", - "atom_symbol": "⚛️", - "om": "🕉️", - "star_of_david": "✡️", - "wheel_of_dharma": "☸️", - "yin_yang": "☯️", - "latin_cross": "✝️", - "orthodox_cross": "☦️", - "star_and_crescent": "☪️", - "peace_symbol": "☮️", - "menorah": "🕎", - "six_pointed_star": "🔯", - "khanda": "🪯", - "aries": "♈", - "taurus": "♉", - "gemini": "♊", - "cancer": "♋", - "leo": "♌", - "virgo": "♍", - "libra": "♎", - "scorpius": "♏", - "sagittarius": "♐", - "capricorn": "♑", - "aquarius": "♒", - "pisces": "♓", - "ophiuchus": "⛎", - "twisted_rightwards_arrows": "🔀", - "repeat": "🔁", - "repeat_one": "🔂", - "arrow_forward": "▶️", - "fast_forward": "⏩", - "next_track_button": "⏭️", - "play_or_pause_button": "⏯️", - "arrow_backward": "◀️", - "rewind": "⏪", - "previous_track_button": "⏮️", - "arrow_up_small": "🔼", - "arrow_double_up": "⏫", - "arrow_down_small": "🔽", - "arrow_double_down": "⏬", - "pause_button": "⏸️", - "stop_button": "⏹️", - "record_button": "⏺️", - "eject_button": "⏏️", - "cinema": "🎦", - "low_brightness": "🔅", - "high_brightness": "🔆", - "signal_strength": "📶", - "wireless": "🛜", - "vibration_mode": "📳", - "mobile_phone_off": "📴", - "female_sign": "♀️", - "male_sign": "♂️", - "transgender_symbol": "⚧️", - "heavy_multiplication_x": "✖️", - "heavy_plus_sign": "➕", - "heavy_minus_sign": "➖", - "heavy_division_sign": "➗", - "heavy_equals_sign": "🟰", - "infinity": "♾️", - "bangbang": "‼️", - "interrobang": "⁉️", - "question": "❓", - "grey_question": "❔", - "grey_exclamation": "❕", - "exclamation": "❗", - "heavy_exclamation_mark": "❗", - "wavy_dash": "〰️", - "currency_exchange": "💱", - "heavy_dollar_sign": "💲", - "medical_symbol": "⚕️", - "recycle": "♻️", - "fleur_de_lis": "⚜️", - "trident": "🔱", - "name_badge": "📛", - "beginner": "🔰", - "o": "⭕", - "white_check_mark": "✅", - "ballot_box_with_check": "☑️", - "heavy_check_mark": "✔️", - "x": "❌", - "negative_squared_cross_mark": "❎", - "curly_loop": "➰", - "loop": "➿", - "part_alternation_mark": "〽️", - "eight_spoked_asterisk": "✳️", - "eight_pointed_black_star": "✴️", - "sparkle": "❇️", - "copyright": "©️", - "registered": "®️", - "tm": "™️", - "hash": "#️⃣", - "asterisk": "*️⃣", - "zero": "0️⃣", - "one": "1️⃣", - "two": "2️⃣", - "three": "3️⃣", - "four": "4️⃣", - "five": "5️⃣", - "six": "6️⃣", - "seven": "7️⃣", - "eight": "8️⃣", - "nine": "9️⃣", - "keycap_ten": "🔟", - "capital_abcd": "🔠", - "abcd": "🔡", - "symbols": "🔣", - "abc": "🔤", - "a": "🅰️", - "ab": "🆎", - "b": "🅱️", - "cl": "🆑", - "cool": "🆒", - "free": "🆓", - "information_source": "ℹ️", - "id": "🆔", - "m": "Ⓜ️", - "new": "🆕", - "ng": "🆖", - "o2": "🅾️", - "ok": "🆗", - "parking": "🅿️", - "sos": "🆘", - "up": "🆙", - "vs": "🆚", - "koko": "🈁", - "sa": "🈂️", - "u6708": "🈷️", - "u6709": "🈶", - "u6307": "🈯", - "ideograph_advantage": "🉐", - "u5272": "🈹", - "u7121": "🈚", - "u7981": "🈲", - "accept": "🉑", - "u7533": "🈸", - "u5408": "🈴", - "u7a7a": "🈳", - "congratulations": "㊗️", - "secret": "㊙️", - "u55b6": "🈺", - "u6e80": "🈵", - "red_circle": "🔴", - "orange_circle": "🟠", - "yellow_circle": "🟡", - "green_circle": "🟢", - "large_blue_circle": "🔵", - "purple_circle": "🟣", - "brown_circle": "🟤", - "black_circle": "⚫", - "white_circle": "⚪", - "red_square": "🟥", - "orange_square": "🟧", - "yellow_square": "🟨", - "green_square": "🟩", - "blue_square": "🟦", - "purple_square": "🟪", - "brown_square": "🟫", - "black_large_square": "⬛", - "white_large_square": "⬜", - "black_medium_square": "◼️", - "white_medium_square": "◻️", - "black_medium_small_square": "◾", - "white_medium_small_square": "◽", - "black_small_square": "▪️", - "white_small_square": "▫️", - "large_orange_diamond": "🔶", - "large_blue_diamond": "🔷", - "small_orange_diamond": "🔸", - "small_blue_diamond": "🔹", - "small_red_triangle": "🔺", - "small_red_triangle_down": "🔻", - "diamond_shape_with_a_dot_inside": "💠", - "radio_button": "🔘", - "white_square_button": "🔳", - "black_square_button": "🔲", - "checkered_flag": "🏁", - "triangular_flag_on_post": "🚩", - "crossed_flags": "🎌", - "black_flag": "🏴", - "white_flag": "🏳️", - "rainbow_flag": "🏳️‍🌈", - "transgender_flag": "🏳️‍⚧️", - "pirate_flag": "🏴‍☠️", - "ascension_island": "🇦🇨", - "andorra": "🇦🇩", - "united_arab_emirates": "🇦🇪", - "afghanistan": "🇦🇫", - "antigua_barbuda": "🇦🇬", - "anguilla": "🇦🇮", - "albania": "🇦🇱", - "armenia": "🇦🇲", - "angola": "🇦🇴", - "antarctica": "🇦🇶", - "argentina": "🇦🇷", - "american_samoa": "🇦🇸", - "austria": "🇦🇹", - "australia": "🇦🇺", - "aruba": "🇦🇼", - "aland_islands": "🇦🇽", - "azerbaijan": "🇦🇿", - "bosnia_herzegovina": "🇧🇦", - "barbados": "🇧🇧", - "bangladesh": "🇧🇩", - "belgium": "🇧🇪", - "burkina_faso": "🇧🇫", - "bulgaria": "🇧🇬", - "bahrain": "🇧🇭", - "burundi": "🇧🇮", - "benin": "🇧🇯", - "st_barthelemy": "🇧🇱", - "bermuda": "🇧🇲", - "brunei": "🇧🇳", - "bolivia": "🇧🇴", - "caribbean_netherlands": "🇧🇶", - "brazil": "🇧🇷", - "bahamas": "🇧🇸", - "bhutan": "🇧🇹", - "bouvet_island": "🇧🇻", - "botswana": "🇧🇼", - "belarus": "🇧🇾", - "belize": "🇧🇿", - "canada": "🇨🇦", - "cocos_islands": "🇨🇨", - "congo_kinshasa": "🇨🇩", - "central_african_republic": "🇨🇫", - "congo_brazzaville": "🇨🇬", - "switzerland": "🇨🇭", - "cote_divoire": "🇨🇮", - "cook_islands": "🇨🇰", - "chile": "🇨🇱", - "cameroon": "🇨🇲", - "cn": "🇨🇳", - "colombia": "🇨🇴", - "clipperton_island": "🇨🇵", - "costa_rica": "🇨🇷", - "cuba": "🇨🇺", - "cape_verde": "🇨🇻", - "curacao": "🇨🇼", - "christmas_island": "🇨🇽", - "cyprus": "🇨🇾", - "czech_republic": "🇨🇿", - "de": "🇩🇪", - "diego_garcia": "🇩🇬", - "djibouti": "🇩🇯", - "denmark": "🇩🇰", - "dominica": "🇩🇲", - "dominican_republic": "🇩🇴", - "algeria": "🇩🇿", - "ceuta_melilla": "🇪🇦", - "ecuador": "🇪🇨", - "estonia": "🇪🇪", - "egypt": "🇪🇬", - "western_sahara": "🇪🇭", - "eritrea": "🇪🇷", - "es": "🇪🇸", - "ethiopia": "🇪🇹", - "eu": "🇪🇺", - "european_union": "🇪🇺", - "finland": "🇫🇮", - "fiji": "🇫🇯", - "falkland_islands": "🇫🇰", - "micronesia": "🇫🇲", - "faroe_islands": "🇫🇴", - "fr": "🇫🇷", - "gabon": "🇬🇦", - "gb": "🇬🇧", - "uk": "🇬🇧", - "grenada": "🇬🇩", - "georgia": "🇬🇪", - "french_guiana": "🇬🇫", - "guernsey": "🇬🇬", - "ghana": "🇬🇭", - "gibraltar": "🇬🇮", - "greenland": "🇬🇱", - "gambia": "🇬🇲", - "guinea": "🇬🇳", - "guadeloupe": "🇬🇵", - "equatorial_guinea": "🇬🇶", - "greece": "🇬🇷", - "south_georgia_south_sandwich_islands": "🇬🇸", - "guatemala": "🇬🇹", - "guam": "🇬🇺", - "guinea_bissau": "🇬🇼", - "guyana": "🇬🇾", - "hong_kong": "🇭🇰", - "heard_mcdonald_islands": "🇭🇲", - "honduras": "🇭🇳", - "croatia": "🇭🇷", - "haiti": "🇭🇹", - "hungary": "🇭🇺", - "canary_islands": "🇮🇨", - "indonesia": "🇮🇩", - "ireland": "🇮🇪", - "israel": "🇮🇱", - "isle_of_man": "🇮🇲", - "india": "🇮🇳", - "british_indian_ocean_territory": "🇮🇴", - "iraq": "🇮🇶", - "iran": "🇮🇷", - "iceland": "🇮🇸", - "it": "🇮🇹", - "jersey": "🇯🇪", - "jamaica": "🇯🇲", - "jordan": "🇯🇴", - "jp": "🇯🇵", - "kenya": "🇰🇪", - "kyrgyzstan": "🇰🇬", - "cambodia": "🇰🇭", - "kiribati": "🇰🇮", - "comoros": "🇰🇲", - "st_kitts_nevis": "🇰🇳", - "north_korea": "🇰🇵", - "kr": "🇰🇷", - "kuwait": "🇰🇼", - "cayman_islands": "🇰🇾", - "kazakhstan": "🇰🇿", - "laos": "🇱🇦", - "lebanon": "🇱🇧", - "st_lucia": "🇱🇨", - "liechtenstein": "🇱🇮", - "sri_lanka": "🇱🇰", - "liberia": "🇱🇷", - "lesotho": "🇱🇸", - "lithuania": "🇱🇹", - "luxembourg": "🇱🇺", - "latvia": "🇱🇻", - "libya": "🇱🇾", - "morocco": "🇲🇦", - "monaco": "🇲🇨", - "moldova": "🇲🇩", - "montenegro": "🇲🇪", - "st_martin": "🇲🇫", - "madagascar": "🇲🇬", - "marshall_islands": "🇲🇭", - "macedonia": "🇲🇰", - "mali": "🇲🇱", - "myanmar": "🇲🇲", - "mongolia": "🇲🇳", - "macau": "🇲🇴", - "northern_mariana_islands": "🇲🇵", - "martinique": "🇲🇶", - "mauritania": "🇲🇷", - "montserrat": "🇲🇸", - "malta": "🇲🇹", - "mauritius": "🇲🇺", - "maldives": "🇲🇻", - "malawi": "🇲🇼", - "mexico": "🇲🇽", - "malaysia": "🇲🇾", - "mozambique": "🇲🇿", - "namibia": "🇳🇦", - "new_caledonia": "🇳🇨", - "niger": "🇳🇪", - "norfolk_island": "🇳🇫", - "nigeria": "🇳🇬", - "nicaragua": "🇳🇮", - "netherlands": "🇳🇱", - "norway": "🇳🇴", - "nepal": "🇳🇵", - "nauru": "🇳🇷", - "niue": "🇳🇺", - "new_zealand": "🇳🇿", - "oman": "🇴🇲", - "panama": "🇵🇦", - "peru": "🇵🇪", - "french_polynesia": "🇵🇫", - "papua_new_guinea": "🇵🇬", - "philippines": "🇵🇭", - "pakistan": "🇵🇰", - "poland": "🇵🇱", - "st_pierre_miquelon": "🇵🇲", - "pitcairn_islands": "🇵🇳", - "puerto_rico": "🇵🇷", - "palestinian_territories": "🇵🇸", - "portugal": "🇵🇹", - "palau": "🇵🇼", - "paraguay": "🇵🇾", - "qatar": "🇶🇦", - "reunion": "🇷🇪", - "romania": "🇷🇴", - "serbia": "🇷🇸", - "ru": "🇷🇺", - "rwanda": "🇷🇼", - "saudi_arabia": "🇸🇦", - "solomon_islands": "🇸🇧", - "seychelles": "🇸🇨", - "sudan": "🇸🇩", - "sweden": "🇸🇪", - "singapore": "🇸🇬", - "st_helena": "🇸🇭", - "slovenia": "🇸🇮", - "svalbard_jan_mayen": "🇸🇯", - "slovakia": "🇸🇰", - "sierra_leone": "🇸🇱", - "san_marino": "🇸🇲", - "senegal": "🇸🇳", - "somalia": "🇸🇴", - "suriname": "🇸🇷", - "south_sudan": "🇸🇸", - "sao_tome_principe": "🇸🇹", - "el_salvador": "🇸🇻", - "sint_maarten": "🇸🇽", - "syria": "🇸🇾", - "swaziland": "🇸🇿", - "tristan_da_cunha": "🇹🇦", - "turks_caicos_islands": "🇹🇨", - "chad": "🇹🇩", - "french_southern_territories": "🇹🇫", - "togo": "🇹🇬", - "thailand": "🇹🇭", - "tajikistan": "🇹🇯", - "tokelau": "🇹🇰", - "timor_leste": "🇹🇱", - "turkmenistan": "🇹🇲", - "tunisia": "🇹🇳", - "tonga": "🇹🇴", - "tr": "🇹🇷", - "trinidad_tobago": "🇹🇹", - "tuvalu": "🇹🇻", - "taiwan": "🇹🇼", - "tanzania": "🇹🇿", - "ukraine": "🇺🇦", - "uganda": "🇺🇬", - "us_outlying_islands": "🇺🇲", - "united_nations": "🇺🇳", - "us": "🇺🇸", - "uruguay": "🇺🇾", - "uzbekistan": "🇺🇿", - "vatican_city": "🇻🇦", - "st_vincent_grenadines": "🇻🇨", - "venezuela": "🇻🇪", - "british_virgin_islands": "🇻🇬", - "us_virgin_islands": "🇻🇮", - "vietnam": "🇻🇳", - "vanuatu": "🇻🇺", - "wallis_futuna": "🇼🇫", - "samoa": "🇼🇸", - "kosovo": "🇽🇰", - "yemen": "🇾🇪", - "mayotte": "🇾🇹", - "south_africa": "🇿🇦", - "zambia": "🇿🇲", - "zimbabwe": "🇿🇼", - "england": "🏴󠁧󠁢󠁥󠁮󠁧󠁿", - "scotland": "🏴󠁧󠁢󠁳󠁣󠁴󠁿", - "wales": "🏴󠁧󠁢󠁷󠁬󠁳󠁿" -} diff --git a/client/js/hooks/use-close-channel.ts b/client/js/hooks/use-close-channel.ts deleted file mode 100644 index 8c6cd3f0..00000000 --- a/client/js/hooks/use-close-channel.ts +++ /dev/null @@ -1,39 +0,0 @@ -import eventbus from "../eventbus"; -import socket from "../socket"; -import {ClientChan} from "../types"; -import {ChanType} from "../../../shared/types/chan"; - -export default function useCloseChannel(channel: ClientChan) { - return () => { - if (channel.type === ChanType.LOBBY) { - eventbus.emit( - "confirm-dialog", - { - title: "Remove network", - text: `Are you sure you want to quit and remove ${channel.name}? This cannot be undone.`, - button: "Remove network", - }, - (result: boolean) => { - if (!result) { - return; - } - - channel.closed = true; - socket.emit("input", { - target: Number(channel.id), - text: "/quit", - }); - } - ); - - return; - } - - channel.closed = true; - - socket.emit("input", { - target: Number(channel.id), - text: "/close", - }); - }; -} diff --git a/client/js/keybinds.ts b/client/js/keybinds.ts deleted file mode 100644 index 34615ef3..00000000 --- a/client/js/keybinds.ts +++ /dev/null @@ -1,259 +0,0 @@ -import Mousetrap from "mousetrap"; - -import {store} from "./store"; -import {switchToChannel, router, navigate} from "./router"; -import isChannelCollapsed from "./helpers/isChannelCollapsed"; -import isIgnoredKeybind from "./helpers/isIgnoredKeybind"; -import listenForTwoFingerSwipes from "./helpers/listenForTwoFingerSwipes"; -import {ClientChan} from "./types"; -import {ChanType} from "../../shared/types/chan"; - -// Switch to the next/previous window in the channel list. -Mousetrap.bind(["alt+up", "alt+down"], function (e, keys) { - if (isIgnoredKeybind(e)) { - return true; - } - - navigateWindow(keys.split("+").pop() === "up" ? -1 : 1); - - return false; -}); - -listenForTwoFingerSwipes(function (cardinalDirection: string) { - if (cardinalDirection === "e" || cardinalDirection === "w") { - navigateWindow(cardinalDirection === "e" ? -1 : 1); - } -}); - -function navigateWindow(direction: number) { - if (store.state.networks.length === 0) { - return; - } - - const flatChannels: ClientChan[] = []; - let index = -1; - - for (const network of store.state.networks) { - for (const channel of network.channels) { - if (isChannelCollapsed(network, channel)) { - continue; - } - - if (index === -1 && store.state.activeChannel?.channel === channel) { - index = flatChannels.length; - } - - flatChannels.push(channel); - } - } - - // Circular array, and a modulo bug workaround because in JS it stays negative - const length = flatChannels.length; - index = (((index + direction) % length) + length) % length; - - jumpToChannel(flatChannels[index]); -} - -// Switch to the next/previous lobby in the channel list -Mousetrap.bind(["alt+shift+up", "alt+shift+down"], function (e, keys) { - if (isIgnoredKeybind(e)) { - return true; - } - - const length = store.state.networks.length; - - if (length === 0) { - return false; - } - - const direction = keys.split("+").pop() === "up" ? -1 : 1; - let index = 0; - - // If we're in another window, jump to first lobby - if (store.state.activeChannel) { - index = store.state.networks.findIndex((n) => n === store.state.activeChannel?.network); - - // If we're in a channel, and it's not the lobby, jump to lobby of this network when going up - if (direction !== -1 || store.state.activeChannel?.channel.type === ChanType.LOBBY) { - index = (((index + direction) % length) + length) % length; - } - } - - jumpToChannel(store.state.networks[index].channels[0]); - - return false; -}); - -// Switch to the next/previous unread chat -Mousetrap.bind(["alt+mod+up", "alt+mod+down"], function (e, keys) { - if (isIgnoredKeybind(e)) { - return true; - } - - const channels = store.state.networks - .map((net) => - net.channels.filter( - (chan) => chan.unread || chan === store.state.activeChannel?.channel - ) - ) - .flat(); - - if (channels.length === 0) { - return; - } - - let index = channels.findIndex((chan) => chan === store.state.activeChannel?.channel); - - const length = channels.length; - const direction = keys.split("+").pop() === "up" ? -1 : 1; - index = (((index + direction) % length) + length) % length; - - jumpToChannel(channels[index]); - - return false; -}); - -// Jump to the first window with a highlight in it, or the first with unread -// activity if there are none with highlights. -Mousetrap.bind(["alt+a"], function (e) { - if (isIgnoredKeybind(e)) { - return true; - } - - let targetChannel; - - outer_loop: for (const network of store.state.networks) { - for (const chan of network.channels) { - if (chan.highlight) { - targetChannel = chan; - break outer_loop; - } - - if (chan.unread && !targetChannel) { - targetChannel = chan; - } - } - } - - if (targetChannel) { - jumpToChannel(targetChannel); - } - - return false; -}); - -// Show the help menu. -Mousetrap.bind(["alt+/"], function (e) { - if (isIgnoredKeybind(e)) { - return true; - } - - /* eslint-disable no-console */ - navigate("Help").catch((err) => console.log(err)); - return false; -}); - -function jumpToChannel(targetChannel: ClientChan) { - switchToChannel(targetChannel); - - const element = document.querySelector( - `#sidebar .channel-list-item[aria-controls="#chan-${targetChannel.id}"]` - ); - - if (element) { - scrollIntoViewNicely(element); - } -} - -// Ignored keys which should not automatically focus the input bar -const ignoredKeys = { - 8: true, // Backspace - 9: true, // Tab - 12: true, // Clear - 16: true, // Shift - 17: true, // Control - 18: true, // Alt - 19: true, // Pause - 20: true, // CapsLock - 27: true, // Escape - 35: true, // End - 36: true, // Home - 37: true, // ArrowLeft - 38: true, // ArrowUp - 39: true, // ArrowRight - 40: true, // ArrowDown - 45: true, // Insert - 46: true, // Delete - 112: true, // F1 - 113: true, // F2 - 114: true, // F3 - 115: true, // F4 - 116: true, // F5 - 117: true, // F6 - 118: true, // F7 - 119: true, // F8 - 120: true, // F9 - 121: true, // F10 - 122: true, // F11 - 123: true, // F12 - 144: true, // NumLock - 145: true, // ScrollLock - 224: true, // Meta -}; - -document.addEventListener("keydown", (e) => { - // Allow navigating back to the previous page when on the help screen. - if (e.key === "Escape" && router.currentRoute.value.name === "Help") { - router.go(-1); - return; - } - - // Ignore any key that uses alt modifier - // Ignore keys defined above - if (e.altKey || ignoredKeys[e.which]) { - return; - } - - // Ignore all ctrl keys except for ctrl+v to allow pasting - if ((e.ctrlKey || e.metaKey) && e.which !== 86) { - return; - } - - // Redirect pagedown/pageup keys to messages container so it scrolls - if (e.which === 33 || e.which === 34) { - const chat = document.querySelector(".window .chat-content .chat"); - - if (chat) { - (chat as HTMLDivElement).focus(); - } - - return; - } - - const tagName = (e.target as HTMLElement).tagName; - - // Ignore if we're already typing into or "; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; +})(); +var strundefined = typeof undefined; + + + +support.focusinBubbles = "onfocusin" in window; + + +var + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu)|click/, + rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)$/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + + var handleObjIn, eventHandle, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = data_priv.get( elem ); + + // Don't attach events to noData or text/comment nodes (but allow plain objects) + if ( !elemData ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !(events = elemData.events) ) { + events = elemData.events = {}; + } + if ( !(eventHandle = elemData.handle) ) { + eventHandle = elemData.handle = function( e ) { + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== strundefined && jQuery.event.triggered !== e.type ? + jQuery.event.dispatch.apply( elem, arguments ) : undefined; + }; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnotwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[t] ) || []; + type = origType = tmp[1]; + namespaces = ( tmp[2] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend({ + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join(".") + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !(handlers = events[ type ]) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener if the special events handler returns false + if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle, false ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var j, origCount, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = data_priv.hasData( elem ) && data_priv.get( elem ); + + if ( !elemData || !(events = elemData.events) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnotwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[t] ) || []; + type = origType = tmp[1]; + namespaces = ( tmp[2] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + delete elemData.handle; + data_priv.remove( elem, "events" ); + } + }, + + trigger: function( event, data, elem, onlyHandlers ) { + + var i, cur, tmp, bubbleType, ontype, handle, special, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : []; + + cur = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf(".") >= 0 ) { + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split("."); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf(":") < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join("."); + event.namespace_re = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === (elem.ownerDocument || document) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) { + + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( data_priv.get( cur, "events" ) || {} )[ event.type ] && data_priv.get( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && jQuery.acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) && + jQuery.acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name name as the event. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + elem[ type ](); + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + dispatch: function( event ) { + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( event ); + + var i, j, ret, matched, handleObj, + handlerQueue = [], + args = slice.call( arguments ), + handlers = ( data_priv.get( this, "events" ) || {} )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[0] = event; + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) { + + // Triggered event must either 1) have no namespace, or + // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). + if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) + .apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( (event.result = ret) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var i, matches, sel, handleObj, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Find delegate handlers + // Black-hole SVG instance trees (#13180) + // Avoid non-left-click bubbling in Firefox (#3861) + if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) { + + for ( ; cur !== this; cur = cur.parentNode || this ) { + + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.disabled !== true || event.type !== "click" ) { + matches = []; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matches[ sel ] === undefined ) { + matches[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) >= 0 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matches[ sel ] ) { + matches.push( handleObj ); + } + } + if ( matches.length ) { + handlerQueue.push({ elem: cur, handlers: matches }); + } + } + } + } + + // Add the remaining (directly-bound) handlers + if ( delegateCount < handlers.length ) { + handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) }); + } + + return handlerQueue; + }, + + // Includes some event props shared by KeyEvent and MouseEvent + props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), + + fixHooks: {}, + + keyHooks: { + props: "char charCode key keyCode".split(" "), + filter: function( event, original ) { + + // Add which for key events + if ( event.which == null ) { + event.which = original.charCode != null ? original.charCode : original.keyCode; + } + + return event; + } + }, + + mouseHooks: { + props: "button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "), + filter: function( event, original ) { + var eventDoc, doc, body, + button = original.button; + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && original.clientX != null ) { + eventDoc = event.target.ownerDocument || document; + doc = eventDoc.documentElement; + body = eventDoc.body; + + event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); + event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && button !== undefined ) { + event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); + } + + return event; + } + }, + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // Create a writable copy of the event object and normalize some properties + var i, prop, copy, + type = event.type, + originalEvent = event, + fixHook = this.fixHooks[ type ]; + + if ( !fixHook ) { + this.fixHooks[ type ] = fixHook = + rmouseEvent.test( type ) ? this.mouseHooks : + rkeyEvent.test( type ) ? this.keyHooks : + {}; + } + copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; + + event = new jQuery.Event( originalEvent ); + + i = copy.length; + while ( i-- ) { + prop = copy[ i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Support: Cordova 2.5 (WebKit) (#13255) + // All events should have a target; Cordova deviceready doesn't + if ( !event.target ) { + event.target = document; + } + + // Support: Safari 6.0+, Chrome < 28 + // Target should not be a text node (#504, #13143) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + return fixHook.filter ? fixHook.filter( event, originalEvent ) : event; + }, + + special: { + load: { + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + focus: { + // Fire native event if possible so blur/focus sequence is correct + trigger: function() { + if ( this !== safeActiveElement() && this.focus ) { + this.focus(); + return false; + } + }, + delegateType: "focusin" + }, + blur: { + trigger: function() { + if ( this === safeActiveElement() && this.blur ) { + this.blur(); + return false; + } + }, + delegateType: "focusout" + }, + click: { + // For checkbox, fire native event so checked state will be right + trigger: function() { + if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) { + this.click(); + return false; + } + }, + + // For cross-browser consistency, don't fire native .click() on links + _default: function( event ) { + return jQuery.nodeName( event.target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + }, + + simulate: function( type, elem, event, bubble ) { + // Piggyback on a donor event to simulate a different one. + // Fake originalEvent to avoid donor's stopPropagation, but if the + // simulated event prevents default then we do the same on the donor. + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true, + originalEvent: {} + } + ); + if ( bubble ) { + jQuery.event.trigger( e, null, elem ); + } else { + jQuery.event.dispatch.call( elem, e ); + } + if ( e.isDefaultPrevented() ) { + event.preventDefault(); + } + } +}; + +jQuery.removeEvent = function( elem, type, handle ) { + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle, false ); + } +}; + +jQuery.Event = function( src, props ) { + // Allow instantiation without the 'new' keyword + if ( !(this instanceof jQuery.Event) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + // Support: Android < 4.0 + src.returnValue === false ? + returnTrue : + returnFalse; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + + if ( e && e.preventDefault ) { + e.preventDefault(); + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if ( e && e.stopPropagation ) { + e.stopPropagation(); + } + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && e.stopImmediatePropagation ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Create mouseenter/leave events using mouseover/out and event-time checks +// Support: Chrome 15+ +jQuery.each({ + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mousenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || (related !== target && !jQuery.contains( target, related )) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +}); + +// Create "bubbling" focus and blur events +// Support: Firefox, Chrome, Safari +if ( !support.focusinBubbles ) { + jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler on the document while someone wants focusin/focusout + var handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + var doc = this.ownerDocument || this, + attaches = data_priv.access( doc, fix ); + + if ( !attaches ) { + doc.addEventListener( orig, handler, true ); + } + data_priv.access( doc, fix, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this, + attaches = data_priv.access( doc, fix ) - 1; + + if ( !attaches ) { + doc.removeEventListener( orig, handler, true ); + data_priv.remove( doc, fix ); + + } else { + data_priv.access( doc, fix, attaches ); + } + } + }; + }); +} + +jQuery.fn.extend({ + + on: function( types, selector, data, fn, /*INTERNAL*/ one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + this.on( type, selector, data, types[ type ], one ); + } + return this; + } + + if ( data == null && fn == null ) { + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return this; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return this.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + }); + }, + one: function( types, selector, data, fn ) { + return this.on( types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each(function() { + jQuery.event.remove( this, types, fn, selector ); + }); + }, + + trigger: function( type, data ) { + return this.each(function() { + jQuery.event.trigger( type, data, this ); + }); + }, + triggerHandler: function( type, data ) { + var elem = this[0]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +}); + + +var + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, + rtagName = /<([\w:]+)/, + rhtml = /<|&#?\w+;/, + rnoInnerhtml = /<(?:script|style|link)/i, + // checked="checked" or checked + rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, + rscriptType = /^$|\/(?:java|ecma)script/i, + rscriptTypeMasked = /^true\/(.*)/, + rcleanScript = /^\s*\s*$/g, + + // We have to close these tags to support XHTML (#13200) + wrapMap = { + + // Support: IE 9 + option: [ 1, "" ], + + thead: [ 1, "", "
" ], + col: [ 2, "", "
" ], + tr: [ 2, "", "
" ], + td: [ 3, "", "
" ], + + _default: [ 0, "", "" ] + }; + +// Support: IE 9 +wrapMap.optgroup = wrapMap.option; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +// Support: 1.x compatibility +// Manipulating tables requires a tbody +function manipulationTarget( elem, content ) { + return jQuery.nodeName( elem, "table" ) && + jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ? + + elem.getElementsByTagName("tbody")[0] || + elem.appendChild( elem.ownerDocument.createElement("tbody") ) : + elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = (elem.getAttribute("type") !== null) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + var match = rscriptTypeMasked.exec( elem.type ); + + if ( match ) { + elem.type = match[ 1 ]; + } else { + elem.removeAttribute("type"); + } + + return elem; +} + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + data_priv.set( + elems[ i ], "globalEval", !refElements || data_priv.get( refElements[ i ], "globalEval" ) + ); + } +} + +function cloneCopyEvent( src, dest ) { + var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; + + if ( dest.nodeType !== 1 ) { + return; + } + + // 1. Copy private data: events, handlers, etc. + if ( data_priv.hasData( src ) ) { + pdataOld = data_priv.access( src ); + pdataCur = data_priv.set( dest, pdataOld ); + events = pdataOld.events; + + if ( events ) { + delete pdataCur.handle; + pdataCur.events = {}; + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + } + + // 2. Copy user data + if ( data_user.hasData( src ) ) { + udataOld = data_user.access( src ); + udataCur = jQuery.extend( {}, udataOld ); + + data_user.set( dest, udataCur ); + } +} + +function getAll( context, tag ) { + var ret = context.getElementsByTagName ? context.getElementsByTagName( tag || "*" ) : + context.querySelectorAll ? context.querySelectorAll( tag || "*" ) : + []; + + return tag === undefined || tag && jQuery.nodeName( context, tag ) ? + jQuery.merge( [ context ], ret ) : + ret; +} + +// Support: IE >= 9 +function fixInput( src, dest ) { + var nodeName = dest.nodeName.toLowerCase(); + + // Fails to persist the checked state of a cloned checkbox or radio button. + if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + dest.checked = src.checked; + + // Fails to return the selected option to the default selected state when cloning options + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +jQuery.extend({ + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var i, l, srcElements, destElements, + clone = elem.cloneNode( true ), + inPage = jQuery.contains( elem.ownerDocument, elem ); + + // Support: IE >= 9 + // Fix Cloning issues + if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && + !jQuery.isXMLDoc( elem ) ) { + + // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + fixInput( srcElements[ i ], destElements[ i ] ); + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + cloneCopyEvent( srcElements[ i ], destElements[ i ] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + // Return the cloned set + return clone; + }, + + buildFragment: function( elems, context, scripts, selection ) { + var elem, tmp, tag, wrap, contains, j, + fragment = context.createDocumentFragment(), + nodes = [], + i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( jQuery.type( elem ) === "object" ) { + // Support: QtWebKit + // jQuery.merge because push.apply(_, arraylike) throws + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || fragment.appendChild( context.createElement("div") ); + + // Deserialize a standard representation + tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + tmp.innerHTML = wrap[ 1 ] + elem.replace( rxhtmlTag, "<$1>" ) + wrap[ 2 ]; + + // Descend through wrappers to the right content + j = wrap[ 0 ]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Support: QtWebKit + // jQuery.merge because push.apply(_, arraylike) throws + jQuery.merge( nodes, tmp.childNodes ); + + // Remember the top-level container + tmp = fragment.firstChild; + + // Fixes #12346 + // Support: Webkit, IE + tmp.textContent = ""; + } + } + } + + // Remove wrapper from fragment + fragment.textContent = ""; + + i = 0; + while ( (elem = nodes[ i++ ]) ) { + + // #4087 - If origin and destination elements are the same, and this is + // that element, do not do anything + if ( selection && jQuery.inArray( elem, selection ) !== -1 ) { + continue; + } + + contains = jQuery.contains( elem.ownerDocument, elem ); + + // Append to fragment + tmp = getAll( fragment.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( contains ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( (elem = tmp[ j++ ]) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + return fragment; + }, + + cleanData: function( elems ) { + var data, elem, type, key, + special = jQuery.event.special, + i = 0; + + for ( ; (elem = elems[ i ]) !== undefined; i++ ) { + if ( jQuery.acceptData( elem ) ) { + key = elem[ data_priv.expando ]; + + if ( key && (data = data_priv.cache[ key ]) ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + if ( data_priv.cache[ key ] ) { + // Discard any remaining `private` data + delete data_priv.cache[ key ]; + } + } + } + // Discard any remaining `user` data + delete data_user.cache[ elem[ data_user.expando ] ]; + } + } +}); + +jQuery.fn.extend({ + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().each(function() { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + this.textContent = value; + } + }); + }, null, value, arguments.length ); + }, + + append: function() { + return this.domManip( arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + }); + }, + + prepend: function() { + return this.domManip( arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + }); + }, + + before: function() { + return this.domManip( arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + }); + }, + + after: function() { + return this.domManip( arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + }); + }, + + remove: function( selector, keepData /* Internal Use Only */ ) { + var elem, + elems = selector ? jQuery.filter( selector, this ) : this, + i = 0; + + for ( ; (elem = elems[i]) != null; i++ ) { + if ( !keepData && elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem ) ); + } + + if ( elem.parentNode ) { + if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) { + setGlobalEval( getAll( elem, "script" ) ); + } + elem.parentNode.removeChild( elem ); + } + } + + return this; + }, + + empty: function() { + var elem, + i = 0; + + for ( ; (elem = this[i]) != null; i++ ) { + if ( elem.nodeType === 1 ) { + + // Prevent memory leaks + jQuery.cleanData( getAll( elem, false ) ); + + // Remove any remaining nodes + elem.textContent = ""; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map(function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + }); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined && elem.nodeType === 1 ) { + return elem.innerHTML; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { + + value = value.replace( rxhtmlTag, "<$1>" ); + + try { + for ( ; i < l; i++ ) { + elem = this[ i ] || {}; + + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch( e ) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var arg = arguments[ 0 ]; + + // Make the changes, replacing each context element with the new content + this.domManip( arguments, function( elem ) { + arg = this.parentNode; + + jQuery.cleanData( getAll( this ) ); + + if ( arg ) { + arg.replaceChild( elem, this ); + } + }); + + // Force removal if there was no new content (e.g., from empty arguments) + return arg && (arg.length || arg.nodeType) ? this : this.remove(); + }, + + detach: function( selector ) { + return this.remove( selector, true ); + }, + + domManip: function( args, callback ) { + + // Flatten any nested arrays + args = concat.apply( [], args ); + + var fragment, first, scripts, hasScripts, node, doc, + i = 0, + l = this.length, + set = this, + iNoClone = l - 1, + value = args[ 0 ], + isFunction = jQuery.isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( isFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return this.each(function( index ) { + var self = set.eq( index ); + if ( isFunction ) { + args[ 0 ] = value.call( this, index, self.html() ); + } + self.domManip( args, callback ); + }); + } + + if ( l ) { + fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + if ( first ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + // Support: QtWebKit + // jQuery.merge because push.apply(_, arraylike) throws + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( this[ i ], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !data_priv.access( node, "globalEval" ) && jQuery.contains( doc, node ) ) { + + if ( node.src ) { + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl ) { + jQuery._evalUrl( node.src ); + } + } else { + jQuery.globalEval( node.textContent.replace( rcleanScript, "" ) ); + } + } + } + } + } + } + + return this; + } +}); + +jQuery.each({ + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1, + i = 0; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); + + // Support: QtWebKit + // .get() because push.apply(_, arraylike) throws + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +}); + + +var iframe, + elemdisplay = {}; + +/** + * Retrieve the actual display of a element + * @param {String} name nodeName of the element + * @param {Object} doc Document object + */ +// Called only from within defaultDisplay +function actualDisplay( name, doc ) { + var style, + elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ), + + // getDefaultComputedStyle might be reliably used only on attached element + display = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ? + + // Use of this method is a temporary fix (more like optmization) until something better comes along, + // since it was removed from specification and supported only in FF + style.display : jQuery.css( elem[ 0 ], "display" ); + + // We don't have any data stored on the element, + // so use "detach" method as fast way to get rid of the element + elem.detach(); + + return display; +} + +/** + * Try to determine the default display value of an element + * @param {String} nodeName + */ +function defaultDisplay( nodeName ) { + var doc = document, + display = elemdisplay[ nodeName ]; + + if ( !display ) { + display = actualDisplay( nodeName, doc ); + + // If the simple way fails, read from inside an iframe + if ( display === "none" || !display ) { + + // Use the already-created iframe if possible + iframe = (iframe || jQuery( "